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.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@91037 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2009-12-10 01:59:24 +00:00
Родитель 864143fe14
Коммит a1efc8c8c6
3 изменённых файлов: 20 добавлений и 4 удалений

Просмотреть файл

@ -1,4 +1,3 @@
//===--- ParseDecl.cpp - Declaration Parsing ------------------------------===//
//
// The LLVM Compiler Infrastructure
@ -1545,8 +1544,11 @@ ParseStructDeclaration(DeclSpec &DS, FieldCallback &Fields) {
/// 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();

Просмотреть файл

@ -1090,11 +1090,13 @@ void Parser::ParseCXXClassMemberDeclaration(AccessSpecifier AS,
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 @@ void Parser::ParseCXXClassMemberDeclaration(AccessSpecifier AS,
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?

Просмотреть файл

@ -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 @@ class someclass {
return 1 ? P->x : P->y;
}
};
enum { fooenum = 1 };
struct a {
int Type : fooenum;
};