summaryrefslogtreecommitdiffstats
path: root/clang/lib/Frontend/DiagnosticRenderer.cpp
diff options
context:
space:
mode:
authorRichard Trieu <rtrieu@google.com>2015-08-27 23:38:45 +0000
committerRichard Trieu <rtrieu@google.com>2015-08-27 23:38:45 +0000
commita1d7ece05c9b4b33c45aea08efc5ac861052fed5 (patch)
tree95a6c623c8671985cf392a16a36d28ef71fd7313 /clang/lib/Frontend/DiagnosticRenderer.cpp
parentc269ed511584d9044a4e28a25fa6a0d24df68a9f (diff)
downloadbcm5719-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.cpp22
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");
}
OpenPOWER on IntegriCloud