aboutsummaryrefslogtreecommitdiff
path: root/lib/Frontend/TextDiagnosticPrinter.cpp
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2011-09-26 11:38:46 +0000
committerChandler Carruth <chandlerc@gmail.com>2011-09-26 11:38:46 +0000
commite6d1dff47d17154e99a98c499ee399df70a4bcf1 (patch)
treeb8c2873f5d18faf6a0e00d0cb1c7ac7668e70e4f /lib/Frontend/TextDiagnosticPrinter.cpp
parent0ef898865aaec8c99addee23d01e03c7abdbd2b3 (diff)
Hoist and beef up the asserts about the level of infrastructure expected
when working with a diagnostic attached to a source location. Also comment more thoroughly why its important to handle non-location diagnostic messages separately. Finally, hoist the creation of the TextDiagnostic object up to the beginning of the location-based diagnostics. This paves the way for sinking more and more of the logic into this class. When everything below this constructor is sunk into the TextDiagnostic class it should be sufficiently "feature complete" to accomplish my two goals: 1) Have the printing of a macro expansion note use the exact same code as any other note. 2) Be able to implement clang_formatDiagnostic in terms of this class. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@140526 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Frontend/TextDiagnosticPrinter.cpp')
-rw-r--r--lib/Frontend/TextDiagnosticPrinter.cpp15
1 files changed, 10 insertions, 5 deletions
diff --git a/lib/Frontend/TextDiagnosticPrinter.cpp b/lib/Frontend/TextDiagnosticPrinter.cpp
index 062419d11e..1f6ea30c7d 100644
--- a/lib/Frontend/TextDiagnosticPrinter.cpp
+++ b/lib/Frontend/TextDiagnosticPrinter.cpp
@@ -1189,6 +1189,9 @@ void TextDiagnosticPrinter::HandleDiagnostic(DiagnosticsEngine::Level Level,
OS << Prefix << ": ";
// Use a dedicated, simpler path for diagnostics without a valid location.
+ // This is important as if the location is missing, we may be emitting
+ // diagnostics in a context that lacks language options, a source manager, or
+ // other infrastructure necessary when emitting more rich diagnostics.
if (!Info.getLocation().isValid()) {
printDiagnosticLevel(OS, Level, DiagOpts->ShowColors);
printDiagnosticMessage(OS, Level, DiagMessageStream.str(),
@@ -1198,7 +1201,14 @@ void TextDiagnosticPrinter::HandleDiagnostic(DiagnosticsEngine::Level Level,
return;
}
+ // Assert that the rest of our infrastructure is setup properly.
+ assert(LangOpts && "Unexpected diagnostic outside source file processing");
+ assert(DiagOpts && "Unexpected diagnostic without options set");
+ assert(Info.hasSourceManager() &&
+ "Unexpected diagnostic with no source manager");
const SourceManager &SM = Info.getSourceManager();
+ TextDiagnostic TextDiag(*this, OS, SM, *LangOpts, *DiagOpts);
+
PresumedLoc PLoc = getDiagnosticPresumedLoc(SM, Info.getLocation());
// First, if this diagnostic is not in the main file, print out the
@@ -1243,11 +1253,6 @@ void TextDiagnosticPrinter::HandleDiagnostic(DiagnosticsEngine::Level Level,
Ranges.push_back(Hint.RemoveRange);
}
- assert(LangOpts && "Unexpected diagnostic outside source file processing");
- assert(DiagOpts && "Unexpected diagnostic without options set");
-
- TextDiagnostic TextDiag(*this, OS, Info.getSourceManager(),
- *LangOpts, *DiagOpts);
unsigned MacroDepth = 0;
TextDiag.Emit(LastLoc, Ranges, llvm::makeArrayRef(Info.getFixItHints(),
Info.getNumFixItHints()),