[cfe-commits] r91016 - in /cfe/trunk: lib/Parse/ParseStmt.cpp lib/Parse/RAIIObjectsForParser.h test/Parser/cxx-stmt.cpp

Chris Lattner sabre at nondot.org
Wed Dec 9 16:38:54 PST 2009


Author: lattner
Date: Wed Dec  9 18:38:54 2009
New Revision: 91016

URL: http://llvm.org/viewvc/llvm-project?rev=91016&view=rev
Log:
fix PR5740: a colon is sacred when parsing case statement expressions!

Modified:
    cfe/trunk/lib/Parse/ParseStmt.cpp
    cfe/trunk/lib/Parse/RAIIObjectsForParser.h
    cfe/trunk/test/Parser/cxx-stmt.cpp

Modified: cfe/trunk/lib/Parse/ParseStmt.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseStmt.cpp?rev=91016&r1=91015&r2=91016&view=diff

==============================================================================
--- cfe/trunk/lib/Parse/ParseStmt.cpp (original)
+++ cfe/trunk/lib/Parse/ParseStmt.cpp Wed Dec  9 18:38:54 2009
@@ -279,6 +279,11 @@
       ConsumeToken();
     }
     
+    /// We don't want to treat 'case x : y' as a potential typo for 'case x::y'.
+    /// Disable this form of error recovery while we're parsing the case
+    /// expression.
+    ColonProtectionRAIIObject ColonProtection(*this);
+    
     OwningExprResult LHS(ParseConstantExpression());
     if (LHS.isInvalid()) {
       SkipUntil(tok::colon);
@@ -298,6 +303,8 @@
         return StmtError();
       }
     }
+    
+    ColonProtection.restore();
 
     if (Tok.isNot(tok::colon)) {
       Diag(Tok, diag::err_expected_colon_after) << "'case'";

Modified: cfe/trunk/lib/Parse/RAIIObjectsForParser.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/RAIIObjectsForParser.h?rev=91016&r1=91015&r2=91016&view=diff

==============================================================================
--- cfe/trunk/lib/Parse/RAIIObjectsForParser.h (original)
+++ cfe/trunk/lib/Parse/RAIIObjectsForParser.h Wed Dec  9 18:38:54 2009
@@ -50,9 +50,15 @@
       P.ColonIsSacred = true;
     }
     
-    ~ColonProtectionRAIIObject() {
+    /// restore - This can be used to restore the state early, before the dtor
+    /// is run.
+    void restore() {
       P.ColonIsSacred = OldVal;
     }
+    
+    ~ColonProtectionRAIIObject() {
+      restore();
+    }
   };
   
 } // end namespace clang

Modified: cfe/trunk/test/Parser/cxx-stmt.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/cxx-stmt.cpp?rev=91016&r1=91015&r2=91016&view=diff

==============================================================================
--- cfe/trunk/test/Parser/cxx-stmt.cpp (original)
+++ cfe/trunk/test/Parser/cxx-stmt.cpp Wed Dec  9 18:38:54 2009
@@ -1,6 +1,6 @@
 // RUN: clang-cc -fsyntax-only -verify %s
 
-void f()
+void f1()
 {
   try {
     ;
@@ -10,7 +10,7 @@
   }
 }
 
-void g()
+void f2()
 {
   try; // expected-error {{expected '{'}}
 
@@ -24,7 +24,7 @@
   catch {} // expected-error {{expected '('}}
 }
 
-void h() try {
+void f3() try {
 } catch(...) {
 }
 
@@ -39,3 +39,16 @@
 
 A::A(char) : i(0) try {} // expected-error {{expected '{' or ','}}
 A::A(int j) try : i(j) {} catch(...) {}
+
+
+
+// PR5740
+struct Type { };
+
+enum { Type } Kind;
+void f4() {
+  int i = 0;
+  switch (Kind) {
+    case Type: i = 7; break;  // no error.
+  }
+}
\ No newline at end of file





More information about the cfe-commits mailing list