From eddd02199620f12bea2bb3f3f94f896ad788ccf3 Mon Sep 17 00:00:00 2001 From: Evgeny Mankov Date: Fri, 28 Apr 2017 21:45:36 +0300 Subject: [PATCH] * [HIPIFY] [FIX] Replacement error: enum cudaMemcpyKind kind -> hipMemcpyKindyKind kind https://github.com/GPUOpen-ProfessionalCompute-Tools/HIP/issues/72 [Solution] [Workaround] Offset calculation for enum VarDecl as param decl, declared with enum type specifier. [Result] enum cudaMemcpyKind kind -> enum hipMemcpyKind kind [ToDo] Test on terminal qualifiers (const, etc). --- hipify-clang/src/Cuda2Hip.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/hipify-clang/src/Cuda2Hip.cpp b/hipify-clang/src/Cuda2Hip.cpp index f0fa8331dc..35c930f3af 100644 --- a/hipify-clang/src/Cuda2Hip.cpp +++ b/hipify-clang/src/Cuda2Hip.cpp @@ -2812,8 +2812,19 @@ private: if ((name_unqualified.find(' ') == StringRef::npos && name.find(' ') == StringRef::npos) || name.empty()) { name = name_unqualified; } - SourceLocation sl = enumConstantDecl->getLocStart(); + // Workaround for enum VarDecl as param decl, declared with enum type specifier + // Example: void func(enum cudaMemcpyKind kind); + //------------------------------------------------- SourceManager *SM = Result.SourceManager; + SourceLocation sl(enumConstantDecl->getLocStart()); + SourceLocation end(enumConstantDecl->getLocEnd()); + size_t repLength = SM->getCharacterData(end) - SM->getCharacterData(sl); + StringRef sfull = StringRef(SM->getCharacterData(sl), repLength); + size_t offset = sfull.find(name); + if (offset > 0) { + sl = sl.getLocWithOffset(offset); + } + //------------------------------------------------- const auto found = N.cuda2hipRename.find(name); if (found != N.cuda2hipRename.end()) { updateCounters(found->second, name.str());