r201965 - Fix crash when both ExpectAndConsume and ConsumeAnyToken emit diagnostics

Alp Toker alp at nuanti.com
Sat Feb 22 19:45:03 PST 2014


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}}





More information about the cfe-commits mailing list