[prev in list] [next in list] [prev in thread] [next in thread] 

List:       cfe-commits
Subject:    [PATCH] Fix crash when both Parser::ExpectAndConsume and ConsumeAnyToken throw a diagnostic
From:       Olivier Goffart <ogoffart () kde ! org>
Date:       2014-02-22 14:08:36
Message-ID: 1648800.tqm015sBqI () finn
[Download RAW message or body]

Hi,

I believe this is a regression from r198270


["0001-Fix-crash-when-both-Parser-ExpectAndConsume-and-Cons.patch" (0001-Fix-crash-when-both-Parser-ExpectAndConsume-and-Cons.patch)]

From 932cf946fb9d1b99219532a2675cf859346ae21c Mon Sep 17 00:00:00 2001
From: Olivier Goffart <ogoffart@woboq.com>
Date: Sat, 22 Feb 2014 15:02:32 +0100
Subject: [PATCH] Fix crash when both Parser::ExpectAndConsume and
 ConsumeAnyToken throw a diagnostic

The diagnostic engine gets confuse on what is the current diagnostic
---
 lib/Parse/Parser.cpp     | 20 +++++++++++---------
 test/Parser/diag-crash.c |  5 +++++
 2 files changed, 16 insertions(+), 9 deletions(-)
 create mode 100644 test/Parser/diag-crash.c

diff --git a/lib/Parse/Parser.cpp b/lib/Parse/Parser.cpp
index 71f5b84..8158e11 100644
--- a/lib/Parse/Parser.cpp
+++ b/lib/Parse/Parser.cpp
@@ -118,15 +118,17 @@ bool Parser::ExpectAndConsume(tok::TokenKind ExpectedTok, unsigned DiagID,
   // 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;
+    {
+      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();
 
     // Pretend there wasn't a problem.
diff --git a/test/Parser/diag-crash.c b/test/Parser/diag-crash.c
new file mode 100644
index 0000000..cb985a2
--- /dev/null
+++ b/test/Parser/diag-crash.c
@@ -0,0 +1,5 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+// Don't crash if the preprocessor is throwing a diagnostic from Parser::ExceptAndConsume
+int foo: // expected-error {{expected ';' after top level declarator}}
+#endif   // expected-error {{#endif without #if}}
\ No newline at end of file
-- 
1.9.0



_______________________________________________
cfe-commits mailing list
cfe-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic