]> granicus.if.org Git - clang/commitdiff
fix PR3798 by ignoring all diagnostics generated while repreprocessing a file in...
authorChris Lattner <sabre@nondot.org>
Fri, 13 Mar 2009 21:44:46 +0000 (21:44 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 13 Mar 2009 21:44:46 +0000 (21:44 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66961 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Lex/Preprocessor.h
lib/Rewrite/HTMLRewrite.cpp
test/Misc/emit-html.c

index 28aad1a7bb38d6a292b6b2d108a0ccbe3d0f24bb..17e2c2f8a02607a5d12ad93efa1bfb5037030a94 100644 (file)
@@ -197,6 +197,9 @@ public:
   ~Preprocessor();
 
   Diagnostic &getDiagnostics() const { return *Diags; }
+  void setDiagnostics(Diagnostic &D) { Diags = &D; }
+
+  
   const LangOptions &getLangOptions() const { return Features; }
   TargetInfo &getTargetInfo() const { return Target; }
   FileManager &getFileManager() const { return FileMgr; }
index 380f7da7438007379f3ed49cae20571066c1bdcc..9bb5d7cfd33d329cd03b7b560aecda1a3f75c34c 100644 (file)
@@ -424,6 +424,17 @@ void html::SyntaxHighlight(Rewriter &R, FileID FID, Preprocessor &PP) {
   }
 }
 
+namespace {
+/// IgnoringDiagClient - This is a diagnostic client that just ignores all
+/// diags.
+class IgnoringDiagClient : public DiagnosticClient {
+  void HandleDiagnostic(Diagnostic::Level DiagLevel,
+                        const DiagnosticInfo &Info) {
+    // Just ignore it.
+  }
+};
+}
+
 /// HighlightMacros - This uses the macro table state from the end of the
 /// file, to re-expand macros and insert (into the HTML) information about the
 /// macro expansions.  This won't be perfectly perfect, but it will be
@@ -466,6 +477,14 @@ void html::HighlightMacros(Rewriter &R, FileID FID, Preprocessor& PP) {
     if (Tok.is(tok::eof)) break;
   }
   
+  // Temporarily change the diagnostics object so that we ignore any generated
+  // diagnostics from this pass.
+  IgnoringDiagClient TmpDC;
+  Diagnostic TmpDiags(&TmpDC);
+  
+  Diagnostic *OldDiags = &PP.getDiagnostics();
+  PP.setDiagnostics(TmpDiags);
+  
   // Inform the preprocessor that we don't want comments.
   PP.SetCommentRetentionState(false, false);
 
@@ -542,6 +561,9 @@ void html::HighlightMacros(Rewriter &R, FileID FID, Preprocessor& PP) {
     HighlightRange(R, LLoc.first, LLoc.second,
                    "<span class='macro'>", Expansion.c_str());
   }
+
+  // Restore diagnostics object back to its own thing.
+  PP.setDiagnostics(*OldDiags);
 }
 
 void html::HighlightMacros(Rewriter &R, FileID FID,
index c4a184584bf5b4d604f82e50953480b5de6be959..8c6556e3e5e577825dea0a3b2ae7782d9d797262 100644 (file)
@@ -9,3 +9,10 @@ int main(int argc, char **argv) {
   return F(argc, 1);
 }
 
+// PR3798
+#define FOR_ALL_FILES(f,i) i
+
+#if 0
+  FOR_ALL_FILES(f) { }
+#endif
+