[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