summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-12-10 00:38:54 +0000
committerChris Lattner <sabre@nondot.org>2009-12-10 00:38:54 +0000
commit125c0ee5c7769c3db19838ac7184bb705d746aef (patch)
treebf1dc7cc7a57621783c4fca0fa2c42c6d92b50ed /clang/lib
parent793c75a28f4a0ae9d62215b8ff853bd4749033c0 (diff)
downloadbcm5719-llvm-125c0ee5c7769c3db19838ac7184bb705d746aef.tar.gz
bcm5719-llvm-125c0ee5c7769c3db19838ac7184bb705d746aef.zip
fix PR5740: a colon is sacred when parsing case statement expressions!
llvm-svn: 91016
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Parse/ParseStmt.cpp7
-rw-r--r--clang/lib/Parse/RAIIObjectsForParser.h8
2 files changed, 14 insertions, 1 deletions
diff --git a/clang/lib/Parse/ParseStmt.cpp b/clang/lib/Parse/ParseStmt.cpp
index f0de3f53456..5267ef0eccc 100644
--- a/clang/lib/Parse/ParseStmt.cpp
+++ b/clang/lib/Parse/ParseStmt.cpp
@@ -279,6 +279,11 @@ Parser::OwningStmtResult Parser::ParseCaseStatement(AttributeList *Attr) {
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 @@ Parser::OwningStmtResult Parser::ParseCaseStatement(AttributeList *Attr) {
return StmtError();
}
}
+
+ ColonProtection.restore();
if (Tok.isNot(tok::colon)) {
Diag(Tok, diag::err_expected_colon_after) << "'case'";
diff --git a/clang/lib/Parse/RAIIObjectsForParser.h b/clang/lib/Parse/RAIIObjectsForParser.h
index d18d2f80263..bacdf29c8ae 100644
--- a/clang/lib/Parse/RAIIObjectsForParser.h
+++ b/clang/lib/Parse/RAIIObjectsForParser.h
@@ -50,9 +50,15 @@ namespace clang {
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
OpenPOWER on IntegriCloud