2525#include " clang/AST/StmtCXX.h"
2626#include " clang/AST/TypeLoc.h"
2727#include " llvm/Support/raw_ostream.h"
28+ #include < optional>
2829
2930extern clang::tooling::UnifiedPath DpctInstallPath;
3031namespace clang {
@@ -552,9 +553,16 @@ void ExprAnalysis::analyzeExpr(const DeclRefExpr *DRE) {
552553 RefString = DRE ->getNameInfo ().getAsString ();
553554 }
554555 if (auto TemplateDecl = dyn_cast<NonTypeTemplateParmDecl>(DRE ->getDecl ()))
555- if (ConstExprExpanding) {
556- addReplacement (0 /* FIXME*/ , TemplateDecl->getNameAsString (),
557- TemplateDecl->getIndex ());
556+ if (ConstExprExpansionInfo) {
557+ auto Loc = ConstExprExpansionInfo.value ().first .find (
558+ TemplateDecl->getNameAsString ());
559+ // TODO: more than 1 substrings matched
560+ if (Loc != std::string::npos) {
561+ // Offset is relative to the final migrated string
562+ addReplacement (Loc + ConstExprExpansionInfo.value ().second ,
563+ TemplateDecl->getNameAsString (),
564+ TemplateDecl->getIndex ());
565+ }
558566 } else
559567 addReplacement (DRE , TemplateDecl->getIndex ());
560568 else if (const auto *VD = dyn_cast<VarDecl>(DRE ->getDecl ());
@@ -569,9 +577,9 @@ void ExprAnalysis::analyzeExpr(const DeclRefExpr *DRE) {
569577 // TODO: more than 1 substrings matched
570578 if (Loc != std::string::npos) {
571579 addReplacement (Loc, VDStr.size (), VDInitStr);
572- ConstExprExpanding = true ;
580+ ConstExprExpansionInfo = std::make_pair (VDInitStr, Loc) ;
573581 dispatch (VD ->getInit ());
574- ConstExprExpanding = false ;
582+ ConstExprExpansionInfo = std:: nullopt ;
575583 }
576584 }
577585 } else if (auto ECD = dyn_cast<EnumConstantDecl>(DRE ->getDecl ())) {
0 commit comments