diff options
author | Richard Trieu <rtrieu@google.com> | 2015-08-27 23:38:45 +0000 |
---|---|---|
committer | Richard Trieu <rtrieu@google.com> | 2015-08-27 23:38:45 +0000 |
commit | a1d7ece05c9b4b33c45aea08efc5ac861052fed5 (patch) | |
tree | 95a6c623c8671985cf392a16a36d28ef71fd7313 /clang/lib/Frontend/DiagnosticRenderer.cpp | |
parent | c269ed511584d9044a4e28a25fa6a0d24df68a9f (diff) | |
download | bcm5719-llvm-a1d7ece05c9b4b33c45aea08efc5ac861052fed5.tar.gz bcm5719-llvm-a1d7ece05c9b4b33c45aea08efc5ac861052fed5.zip |
Fix macro backtrace printing.
Sometimes, a macro that expands to another macro name will not be printed in
the macro backtrace. This patch finds the missed macro expansions and prints
them. Fixes PR16799
llvm-svn: 246237
Diffstat (limited to 'clang/lib/Frontend/DiagnosticRenderer.cpp')
-rw-r--r-- | clang/lib/Frontend/DiagnosticRenderer.cpp | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/clang/lib/Frontend/DiagnosticRenderer.cpp b/clang/lib/Frontend/DiagnosticRenderer.cpp index 393d379048c..0c94083051d 100644 --- a/clang/lib/Frontend/DiagnosticRenderer.cpp +++ b/clang/lib/Frontend/DiagnosticRenderer.cpp @@ -399,13 +399,7 @@ void DiagnosticRenderer::emitSingleMacroExpansion( const SourceManager &SM) { // Find the spelling location for the macro definition. We must use the // spelling location here to avoid emitting a macro backtrace for the note. - SourceLocation SpellingLoc = Loc; - - // If this is the expansion of a macro argument, point the caret at the - // use of the argument in the definition of the macro, not the expansion. - if (SM.isMacroArgExpansion(Loc)) - SpellingLoc = SM.getImmediateExpansionRange(Loc).first; - SpellingLoc = SM.getSpellingLoc(SpellingLoc); + SourceLocation SpellingLoc = SM.getSpellingLoc(Loc); // Map the ranges into the FileID of the diagnostic location. SmallVector<CharSourceRange, 4> SpellingRanges; @@ -477,11 +471,23 @@ void DiagnosticRenderer::emitMacroExpansions(SourceLocation Loc, SmallVector<SourceLocation, 8> LocationStack; unsigned IgnoredEnd = 0; while (Loc.isMacroID()) { - LocationStack.push_back(Loc); + // If this is the expansion of a macro argument, point the caret at the + // use of the argument in the definition of the macro, not the expansion. + if (SM.isMacroArgExpansion(Loc)) + LocationStack.push_back(SM.getImmediateExpansionRange(Loc).first); + else + LocationStack.push_back(Loc); + if (checkRangesForMacroArgExpansion(Loc, Ranges, SM)) IgnoredEnd = LocationStack.size(); Loc = SM.getImmediateMacroCallerLoc(Loc); + + // Once the location no longer points into a macro, try stepping through + // the last found location. This sometimes produces additional useful + // backtraces. + if (Loc.isFileID()) + Loc = SM.getImmediateMacroCallerLoc(LocationStack.back()); assert(!Loc.isInvalid() && "must have a valid source location here"); } |