aboutsummaryrefslogtreecommitdiff
path: root/lib/Frontend/TextDiagnosticPrinter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Frontend/TextDiagnosticPrinter.cpp')
-rw-r--r--lib/Frontend/TextDiagnosticPrinter.cpp70
1 files changed, 29 insertions, 41 deletions
diff --git a/lib/Frontend/TextDiagnosticPrinter.cpp b/lib/Frontend/TextDiagnosticPrinter.cpp
index b9987deaf6..214ee44eee 100644
--- a/lib/Frontend/TextDiagnosticPrinter.cpp
+++ b/lib/Frontend/TextDiagnosticPrinter.cpp
@@ -322,12 +322,9 @@ public:
const SourceManager &SM,
const LangOptions &LangOpts,
const DiagnosticOptions &DiagOpts,
- unsigned Columns,
- unsigned MacroSkipStart,
- unsigned MacroSkipEnd)
+ unsigned Columns)
: Printer(Printer), OS(OS), SM(SM), LangOpts(LangOpts), DiagOpts(DiagOpts),
- Columns(Columns), MacroSkipStart(MacroSkipStart),
- MacroSkipEnd(MacroSkipEnd) {
+ Columns(Columns), MacroSkipStart(0), MacroSkipEnd(0) {
}
/// \brief Emit the caret diagnostic text.
@@ -341,23 +338,25 @@ public:
/// \param Loc The location for this caret.
/// \param Ranges The underlined ranges for this code snippet.
/// \param Hints The FixIt hints active for this diagnostic.
+ /// \param MacroSkipEnd The depth to stop skipping macro expansions.
/// \param OnMacroInst The current depth of the macro expansion stack.
void Emit(SourceLocation Loc,
SmallVectorImpl<CharSourceRange>& Ranges,
ArrayRef<FixItHint> Hints,
+ unsigned &MacroDepth,
unsigned OnMacroInst = 0) {
assert(!Loc.isInvalid() && "must have a valid source location here");
// If this is a file source location, directly emit the source snippet and
- // caret line.
- if (Loc.isFileID())
- return EmitSnippetAndCaret(Loc, Ranges, Hints);
+ // caret line. Also record the macro depth reached.
+ if (Loc.isFileID()) {
+ assert(MacroDepth == 0 && "We shouldn't hit a leaf node twice!");
+ MacroDepth = OnMacroInst;
+ EmitSnippetAndCaret(Loc, Ranges, Hints);
+ return;
+ }
// Otherwise recurse through each macro expansion layer.
- // Whether to suppress printing this macro expansion.
- bool Suppressed = (OnMacroInst >= MacroSkipStart &&
- OnMacroInst < MacroSkipEnd);
-
// When processing macros, skip over the expansions leading up to
// a macro argument, and trace the argument's expansion stack instead.
Loc = skipToMacroArgExpansion(SM, Loc);
@@ -365,11 +364,22 @@ public:
SourceLocation OneLevelUp = getImmediateMacroCallerLoc(SM, Loc);
// FIXME: Map ranges?
- Emit(OneLevelUp, Ranges, Hints, OnMacroInst + 1);
+ Emit(OneLevelUp, Ranges, Hints, MacroDepth, OnMacroInst + 1);
// Map the location.
Loc = getImmediateMacroCalleeLoc(SM, Loc);
+ unsigned MacroSkipStart = 0, MacroSkipEnd = 0;
+ if (MacroDepth > DiagOpts.MacroBacktraceLimit) {
+ MacroSkipStart = DiagOpts.MacroBacktraceLimit / 2 +
+ DiagOpts.MacroBacktraceLimit % 2;
+ MacroSkipEnd = MacroDepth - DiagOpts.MacroBacktraceLimit / 2;
+ }
+
+ // Whether to suppress printing this macro expansion.
+ bool Suppressed = (OnMacroInst >= MacroSkipStart &&
+ OnMacroInst < MacroSkipEnd);
+
// Map the ranges.
for (SmallVectorImpl<CharSourceRange>::iterator I = Ranges.begin(),
E = Ranges.end();
@@ -757,16 +767,15 @@ void TextDiagnosticPrinter::EmitCaretDiagnostic(
SmallVectorImpl<CharSourceRange>& Ranges,
const SourceManager &SM,
ArrayRef<FixItHint> Hints,
- unsigned Columns,
- unsigned MacroSkipStart,
- unsigned MacroSkipEnd) {
+ unsigned Columns) {
assert(LangOpts && "Unexpected diagnostic outside source file processing");
assert(DiagOpts && "Unexpected diagnostic without options set");
+
// FIXME: Remove this method and have clients directly build and call Emit on
// the CaretDiagnostic object.
- CaretDiagnostic CaretDiag(*this, OS, SM, *LangOpts, *DiagOpts,
- Columns, MacroSkipStart, MacroSkipEnd);
- CaretDiag.Emit(Loc, Ranges, Hints);
+ CaretDiagnostic CaretDiag(*this, OS, SM, *LangOpts, *DiagOpts, Columns);
+ unsigned MacroDepth = 0;
+ CaretDiag.Emit(Loc, Ranges, Hints, MacroDepth);
}
/// \brief Skip over whitespace in the string, starting at the given
@@ -1235,31 +1244,10 @@ void TextDiagnosticPrinter::HandleDiagnostic(Diagnostic::Level Level,
Ranges.push_back(Hint.RemoveRange);
}
- const SourceManager &SM = LastLoc.getManager();
- unsigned MacroInstSkipStart = 0, MacroInstSkipEnd = 0;
- if (DiagOpts && DiagOpts->MacroBacktraceLimit && !LastLoc.isFileID()) {
- // Compute the length of the macro-expansion backtrace, so that we
- // can establish which steps in the macro backtrace we'll skip.
- SourceLocation Loc = LastLoc;
- unsigned Depth = 0;
- do {
- ++Depth;
- Loc = skipToMacroArgExpansion(SM, Loc);
- Loc = getImmediateMacroCallerLoc(SM, Loc);
- } while (!Loc.isFileID());
-
- if (Depth > DiagOpts->MacroBacktraceLimit) {
- MacroInstSkipStart = DiagOpts->MacroBacktraceLimit / 2 +
- DiagOpts->MacroBacktraceLimit % 2;
- MacroInstSkipEnd = Depth - DiagOpts->MacroBacktraceLimit / 2;
- }
- }
-
EmitCaretDiagnostic(LastLoc, Ranges, LastLoc.getManager(),
llvm::makeArrayRef(Info.getFixItHints(),
Info.getNumFixItHints()),
- DiagOpts->MessageLength,
- MacroInstSkipStart, MacroInstSkipEnd);
+ DiagOpts->MessageLength);
}
OS.flush();