Author: alp
Date: Sat Feb 22 21:45:03 2014
New Revision: 201965

URL: http://llvm.org/viewvc/llvm-project?rev=201965&view=rev
Log:
Fix crash when both ExpectAndConsume and ConsumeAnyToken emit diagnostics

The DiagnosticBuilder's lifetime in parser typo recovery was overlapping with
the subsequent consume which can itself emit PP diagnostics.

Patch by Olivier Goffart!

Added:
    cfe/trunk/test/Parser/diag-crash.c
Modified:
    cfe/trunk/lib/Parse/Parser.cpp

Modified: cfe/trunk/lib/Parse/Parser.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/Parser.cpp?rev=201965&r1=201964&r2=201965&view=diff
==============================================================================
--- cfe/trunk/lib/Parse/Parser.cpp (original)
+++ cfe/trunk/lib/Parse/Parser.cpp Sat Feb 22 21:45:03 2014
@@ -118,18 +118,20 @@ bool Parser::ExpectAndConsume(tok::Token
   // Detect common single-character typos and resume.
   if (IsCommonTypo(ExpectedTok, Tok)) {
     SourceLocation Loc = Tok.getLocation();
-    DiagnosticBuilder DB = Diag(Loc, DiagID);
-    DB << FixItHint::CreateReplacement(SourceRange(Loc),
-                                       getPunctuatorSpelling(ExpectedTok));
-    if (DiagID == diag::err_expected)
-      DB << ExpectedTok;
-    else if (DiagID == diag::err_expected_after)
-      DB << Msg << ExpectedTok;
-    else
-      DB << Msg;
-    ConsumeAnyToken();
+    {
+      DiagnosticBuilder DB = Diag(Loc, DiagID);
+      DB << FixItHint::CreateReplacement(
+                SourceRange(Loc), tok::getPunctuatorSpelling(ExpectedTok));
+      if (DiagID == diag::err_expected)
+        DB << ExpectedTok;
+      else if (DiagID == diag::err_expected_after)
+        DB << Msg << ExpectedTok;
+      else
+        DB << Msg;
+    }
 
     // Pretend there wasn't a problem.
+    ConsumeAnyToken();
     return false;
   }
 

Added: cfe/trunk/test/Parser/diag-crash.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/diag-crash.c?rev=201965&view=auto
==============================================================================
--- cfe/trunk/test/Parser/diag-crash.c (added)
+++ cfe/trunk/test/Parser/diag-crash.c Sat Feb 22 21:45:03 2014
@@ -0,0 +1,6 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+// Avoid preprocessor diag crash caused by a parser diag left in flight.
+
+int foo: // expected-error {{expected ';' after top level declarator}}
+#endif   // expected-error {{#endif without #if}}


_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to