Handle unnamed bitfields when parsing C++ classes.

llvm-svn: 52855
This commit is contained in:
Argyrios Kyrtzidis 2008-06-28 08:10:48 +00:00
parent 3cffa471d9
commit f4ebe9ea4f
2 changed files with 31 additions and 26 deletions

View File

@ -412,38 +412,41 @@ Parser::DeclTy *Parser::ParseCXXClassMemberDeclaration(AccessSpecifier AS) {
}
}
// Parse the first declarator.
Declarator DeclaratorInfo(DS, Declarator::MemberContext);
ParseDeclarator(DeclaratorInfo);
// Error parsing the declarator?
if (DeclaratorInfo.getIdentifier() == 0) {
// If so, skip until the semi-colon or a }.
SkipUntil(tok::r_brace, true);
if (Tok.is(tok::semi))
ConsumeToken();
return 0;
}
// function-definition:
if (Tok.is(tok::l_brace)) {
if (!DeclaratorInfo.isFunctionDeclarator()) {
Diag(Tok, diag::err_func_def_no_params);
ConsumeBrace();
if (Tok.isNot(tok::colon)) {
// Parse the first declarator.
ParseDeclarator(DeclaratorInfo);
// Error parsing the declarator?
if (DeclaratorInfo.getIdentifier() == 0) {
// If so, skip until the semi-colon or a }.
SkipUntil(tok::r_brace, true);
if (Tok.is(tok::semi))
ConsumeToken();
return 0;
}
if (DS.getStorageClassSpec() == DeclSpec::SCS_typedef) {
Diag(Tok, diag::err_function_declared_typedef);
// This recovery skips the entire function body. It would be nice
// to simply call ParseCXXInlineMethodDef() below, however Sema
// assumes the declarator represents a function, not a typedef.
ConsumeBrace();
SkipUntil(tok::r_brace, true);
return 0;
}
// function-definition:
if (Tok.is(tok::l_brace)) {
if (!DeclaratorInfo.isFunctionDeclarator()) {
Diag(Tok, diag::err_func_def_no_params);
ConsumeBrace();
SkipUntil(tok::r_brace, true);
return 0;
}
return ParseCXXInlineMethodDef(AS, DeclaratorInfo);
if (DS.getStorageClassSpec() == DeclSpec::SCS_typedef) {
Diag(Tok, diag::err_function_declared_typedef);
// This recovery skips the entire function body. It would be nice
// to simply call ParseCXXInlineMethodDef() below, however Sema
// assumes the declarator represents a function, not a typedef.
ConsumeBrace();
SkipUntil(tok::r_brace, true);
return 0;
}
return ParseCXXInlineMethodDef(AS, DeclaratorInfo);
}
}
// member-declarator-list:
@ -510,7 +513,8 @@ Parser::DeclTy *Parser::ParseCXXClassMemberDeclaration(AccessSpecifier AS) {
if (Tok.is(tok::kw___attribute))
DeclaratorInfo.AddAttributes(ParseAttributes());
ParseDeclarator(DeclaratorInfo);
if (Tok.isNot(tok::colon))
ParseDeclarator(DeclaratorInfo);
}
if (Tok.is(tok::semi)) {

View File

@ -8,6 +8,7 @@ protected:
struct S {};
enum {};
int; // expected-error {{error: declaration does not declare anything}}
int : 1, : 2;
public:
void m() {