]> granicus.if.org Git - clang/commitdiff
Hoist and beef up the asserts about the level of infrastructure expected
authorChandler Carruth <chandlerc@gmail.com>
Mon, 26 Sep 2011 11:38:46 +0000 (11:38 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Mon, 26 Sep 2011 11:38:46 +0000 (11:38 +0000)
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

lib/Frontend/TextDiagnosticPrinter.cpp

index 062419d11e06fa2ca7841a04755160cfbd180548..1f6ea30c7d9d016b2f61140ad2d2c9fde9f474a1 100644 (file)
@@ -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()),