diff options
author | Chandler Carruth <chandlerc@gmail.com> | 2011-09-26 11:38:46 +0000 |
---|---|---|
committer | Chandler Carruth <chandlerc@gmail.com> | 2011-09-26 11:38:46 +0000 |
commit | e6d1dff47d17154e99a98c499ee399df70a4bcf1 (patch) | |
tree | b8c2873f5d18faf6a0e00d0cb1c7ac7668e70e4f /lib/Frontend/TextDiagnosticPrinter.cpp | |
parent | 0ef898865aaec8c99addee23d01e03c7abdbd2b3 (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.cpp | 15 |
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()), |