[cfe-commits] r91037 - in /cfe/trunk: lib/Parse/ParseDecl.cpp lib/Parse/ParseDeclCXX.cpp test/Parser/cxx-decl.cpp
Chris Lattner
sabre at nondot.org
Wed Dec 9 17:59:24 PST 2009
Author: lattner
Date: Wed Dec 9 19:59:24 2009
New Revision: 91037
URL: http://llvm.org/viewvc/llvm-project?rev=91037&view=rev
Log:
fix incorrect parsing of bitfields pointed out by Doug. I chose
to use ColonProtectionRAIIObject in the C codepath even though it
won't matter for consistency.
Modified:
cfe/trunk/lib/Parse/ParseDecl.cpp
cfe/trunk/lib/Parse/ParseDeclCXX.cpp
cfe/trunk/test/Parser/cxx-decl.cpp
Modified: cfe/trunk/lib/Parse/ParseDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=91037&r1=91036&r2=91037&view=diff
==============================================================================
--- cfe/trunk/lib/Parse/ParseDecl.cpp (original)
+++ cfe/trunk/lib/Parse/ParseDecl.cpp Wed Dec 9 19:59:24 2009
@@ -1,4 +1,3 @@
-
//===--- ParseDecl.cpp - Declaration Parsing ------------------------------===//
//
// The LLVM Compiler Infrastructure
@@ -1545,8 +1544,11 @@
/// struct-declarator: declarator
/// struct-declarator: declarator[opt] ':' constant-expression
- if (Tok.isNot(tok::colon))
+ if (Tok.isNot(tok::colon)) {
+ // Don't parse FOO:BAR as if it were a typo for FOO::BAR.
+ ColonProtectionRAIIObject X(*this);
ParseDeclarator(DeclaratorInfo.D);
+ }
if (Tok.is(tok::colon)) {
ConsumeToken();
Modified: cfe/trunk/lib/Parse/ParseDeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDeclCXX.cpp?rev=91037&r1=91036&r2=91037&view=diff
==============================================================================
--- cfe/trunk/lib/Parse/ParseDeclCXX.cpp (original)
+++ cfe/trunk/lib/Parse/ParseDeclCXX.cpp Wed Dec 9 19:59:24 2009
@@ -1090,11 +1090,13 @@
return ParseCXXClassMemberDeclaration(AS, TemplateInfo);
}
+ // Don't parse FOO:BAR as if it were a typo for FOO::BAR.
+ ColonProtectionRAIIObject X(*this);
+
CXX0XAttributeList AttrList;
// Optional C++0x attribute-specifier
- if (getLang().CPlusPlus0x && isCXX0XAttributeSpecifier()) {
+ if (getLang().CPlusPlus0x && isCXX0XAttributeSpecifier())
AttrList = ParseCXX0XAttributes();
- }
if (Tok.is(tok::kw_using)) {
// FIXME: Check for template aliases
@@ -1138,6 +1140,9 @@
ParsingDeclarator DeclaratorInfo(*this, DS, Declarator::MemberContext);
if (Tok.isNot(tok::colon)) {
+ // Don't parse FOO:BAR as if it were a typo for FOO::BAR.
+ ColonProtectionRAIIObject X(*this);
+
// Parse the first declarator.
ParseDeclarator(DeclaratorInfo);
// Error parsing the declarator?
Modified: cfe/trunk/test/Parser/cxx-decl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/cxx-decl.cpp?rev=91037&r1=91036&r2=91037&view=diff
==============================================================================
--- cfe/trunk/test/Parser/cxx-decl.cpp (original)
+++ cfe/trunk/test/Parser/cxx-decl.cpp Wed Dec 9 19:59:24 2009
@@ -2,6 +2,8 @@
int x(*g); // expected-error {{use of undeclared identifier 'g'}}
+struct Type { };
+
// PR4451 - We should recover well from the typo of '::' as ':' in a2.
namespace y {
@@ -31,3 +33,10 @@
return 1 ? P->x : P->y;
}
};
+
+enum { fooenum = 1 };
+
+struct a {
+ int Type : fooenum;
+};
+
More information about the cfe-commits
mailing list