This revision was automatically updated to reflect the committed changes. Closed by commit rC324780: [NFC] Extract method to SourceManager for traversing the macro "stack" (authored by george.karpenkov, committed by ). Herald added a subscriber: cfe-commits.
Repository: rC Clang https://reviews.llvm.org/D42458 Files: include/clang/Basic/SourceManager.h lib/Basic/SourceManager.cpp lib/Edit/Commit.cpp lib/Sema/SemaChecking.cpp Index: lib/Sema/SemaChecking.cpp =================================================================== --- lib/Sema/SemaChecking.cpp +++ lib/Sema/SemaChecking.cpp @@ -9357,11 +9357,8 @@ // Venture through the macro stacks to get to the source of macro arguments. // The new location is a better location than the complete location that was // passed in. - while (S.SourceMgr.isMacroArgExpansion(Loc)) - Loc = S.SourceMgr.getImmediateMacroCallerLoc(Loc); - - while (S.SourceMgr.isMacroArgExpansion(CC)) - CC = S.SourceMgr.getImmediateMacroCallerLoc(CC); + Loc = S.SourceMgr.getTopMacroCallerLoc(Loc); + CC = S.SourceMgr.getTopMacroCallerLoc(CC); // __null is usually wrapped in a macro. Go up a macro if that is the case. if (NullKind == Expr::NPCK_GNUNull && Loc.isMacroID()) { Index: lib/Edit/Commit.cpp =================================================================== --- lib/Edit/Commit.cpp +++ lib/Edit/Commit.cpp @@ -225,8 +225,7 @@ isAtStartOfMacroExpansion(loc, &loc); const SourceManager &SM = SourceMgr; - while (SM.isMacroArgExpansion(loc)) - loc = SM.getImmediateSpellingLoc(loc); + loc = SM.getTopMacroCallerLoc(loc); if (loc.isMacroID()) if (!isAtStartOfMacroExpansion(loc, &loc)) @@ -256,8 +255,7 @@ isAtEndOfMacroExpansion(loc, &loc); const SourceManager &SM = SourceMgr; - while (SM.isMacroArgExpansion(loc)) - loc = SM.getImmediateSpellingLoc(loc); + loc = SM.getTopMacroCallerLoc(loc); if (loc.isMacroID()) if (!isAtEndOfMacroExpansion(loc, &loc)) Index: lib/Basic/SourceManager.cpp =================================================================== --- lib/Basic/SourceManager.cpp +++ lib/Basic/SourceManager.cpp @@ -955,6 +955,12 @@ return Expansion.getExpansionLocRange(); } +SourceLocation SourceManager::getTopMacroCallerLoc(SourceLocation Loc) const { + while (isMacroArgExpansion(Loc)) + Loc = getImmediateSpellingLoc(Loc); + return Loc; +} + /// getExpansionRange - Given a SourceLocation object, return the range of /// tokens covered by the expansion in the ultimate file. std::pair<SourceLocation,SourceLocation> Index: include/clang/Basic/SourceManager.h =================================================================== --- include/clang/Basic/SourceManager.h +++ include/clang/Basic/SourceManager.h @@ -1646,6 +1646,9 @@ return getImmediateExpansionRange(Loc).first; } + /// \return Location of the top-level macro caller. + SourceLocation getTopMacroCallerLoc(SourceLocation Loc) const; + private: friend class ASTReader; friend class ASTWriter;
Index: lib/Sema/SemaChecking.cpp =================================================================== --- lib/Sema/SemaChecking.cpp +++ lib/Sema/SemaChecking.cpp @@ -9357,11 +9357,8 @@ // Venture through the macro stacks to get to the source of macro arguments. // The new location is a better location than the complete location that was // passed in. - while (S.SourceMgr.isMacroArgExpansion(Loc)) - Loc = S.SourceMgr.getImmediateMacroCallerLoc(Loc); - - while (S.SourceMgr.isMacroArgExpansion(CC)) - CC = S.SourceMgr.getImmediateMacroCallerLoc(CC); + Loc = S.SourceMgr.getTopMacroCallerLoc(Loc); + CC = S.SourceMgr.getTopMacroCallerLoc(CC); // __null is usually wrapped in a macro. Go up a macro if that is the case. if (NullKind == Expr::NPCK_GNUNull && Loc.isMacroID()) { Index: lib/Edit/Commit.cpp =================================================================== --- lib/Edit/Commit.cpp +++ lib/Edit/Commit.cpp @@ -225,8 +225,7 @@ isAtStartOfMacroExpansion(loc, &loc); const SourceManager &SM = SourceMgr; - while (SM.isMacroArgExpansion(loc)) - loc = SM.getImmediateSpellingLoc(loc); + loc = SM.getTopMacroCallerLoc(loc); if (loc.isMacroID()) if (!isAtStartOfMacroExpansion(loc, &loc)) @@ -256,8 +255,7 @@ isAtEndOfMacroExpansion(loc, &loc); const SourceManager &SM = SourceMgr; - while (SM.isMacroArgExpansion(loc)) - loc = SM.getImmediateSpellingLoc(loc); + loc = SM.getTopMacroCallerLoc(loc); if (loc.isMacroID()) if (!isAtEndOfMacroExpansion(loc, &loc)) Index: lib/Basic/SourceManager.cpp =================================================================== --- lib/Basic/SourceManager.cpp +++ lib/Basic/SourceManager.cpp @@ -955,6 +955,12 @@ return Expansion.getExpansionLocRange(); } +SourceLocation SourceManager::getTopMacroCallerLoc(SourceLocation Loc) const { + while (isMacroArgExpansion(Loc)) + Loc = getImmediateSpellingLoc(Loc); + return Loc; +} + /// getExpansionRange - Given a SourceLocation object, return the range of /// tokens covered by the expansion in the ultimate file. std::pair<SourceLocation,SourceLocation> Index: include/clang/Basic/SourceManager.h =================================================================== --- include/clang/Basic/SourceManager.h +++ include/clang/Basic/SourceManager.h @@ -1646,6 +1646,9 @@ return getImmediateExpansionRange(Loc).first; } + /// \return Location of the top-level macro caller. + SourceLocation getTopMacroCallerLoc(SourceLocation Loc) const; + private: friend class ASTReader; friend class ASTWriter;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits