Added Parser::ParseStructDeclaration() as a result of refactoring Parser::ParseStructUnionBody().

Motivation: Objective-C can now share this rule. It also makes Parser::ParseStructUnionBody()
a bit smaller/cleaner..

llvm-svn: 41201
This commit is contained in:
Steve Naroff 2007-08-20 22:28:22 +00:00
parent 1eb1ad6c36
commit 9717080968
2 changed files with 82 additions and 74 deletions

View File

@ -599,16 +599,7 @@ void Parser::ParseStructUnionSpecifier(DeclSpec &DS) {
Diag(StartLoc, diag::err_invalid_decl_spec_combination, PrevSpec); Diag(StartLoc, diag::err_invalid_decl_spec_combination, PrevSpec);
} }
/// ParseStructDeclaration
/// ParseStructUnionBody
/// struct-contents:
/// struct-declaration-list
/// [EXT] empty
/// [GNU] "struct-declaration-list" without terminatoring ';'
/// struct-declaration-list:
/// struct-declaration
/// struct-declaration-list struct-declaration
/// [OBC] '@' 'defs' '(' class-name ')' [TODO]
/// struct-declaration: /// struct-declaration:
/// specifier-qualifier-list struct-declarator-list ';' /// specifier-qualifier-list struct-declarator-list ';'
/// [GNU] __extension__ struct-declaration /// [GNU] __extension__ struct-declaration
@ -623,30 +614,8 @@ void Parser::ParseStructUnionSpecifier(DeclSpec &DS) {
/// declarator[opt] ':' constant-expression /// declarator[opt] ':' constant-expression
/// [GNU] declarator[opt] ':' constant-expression attributes[opt] /// [GNU] declarator[opt] ':' constant-expression attributes[opt]
/// ///
void Parser::ParseStructUnionBody(SourceLocation RecordLoc, void Parser::ParseStructDeclaration(DeclTy *TagDecl,
unsigned TagType, DeclTy *TagDecl) { llvm::SmallVector<DeclTy*, 32> &FieldDecls) {
SourceLocation LBraceLoc = ConsumeBrace();
// Empty structs are an extension in C (C99 6.7.2.1p7), but are allowed in
// C++.
if (Tok.getKind() == tok::r_brace)
Diag(Tok, diag::ext_empty_struct_union_enum,
DeclSpec::getSpecifierName((DeclSpec::TST)TagType));
llvm::SmallVector<DeclTy*, 32> FieldDecls;
// While we still have something to read, read the declarations in the struct.
while (Tok.getKind() != tok::r_brace &&
Tok.getKind() != tok::eof) {
// Each iteration of this loop reads one struct-declaration.
// Check for extraneous top-level semicolon.
if (Tok.getKind() == tok::semi) {
Diag(Tok, diag::ext_extra_struct_semi);
ConsumeToken();
continue;
}
// FIXME: When __extension__ is specified, disable extension diagnostics. // FIXME: When __extension__ is specified, disable extension diagnostics.
if (Tok.getKind() == tok::kw___extension__) if (Tok.getKind() == tok::kw___extension__)
ConsumeToken(); ConsumeToken();
@ -662,7 +631,7 @@ void Parser::ParseStructUnionBody(SourceLocation RecordLoc,
if (Tok.getKind() == tok::semi) { if (Tok.getKind() == tok::semi) {
Diag(SpecQualLoc, diag::w_no_declarators); Diag(SpecQualLoc, diag::w_no_declarators);
ConsumeToken(); ConsumeToken();
continue; return;
} }
// Read struct-declarators until we find the semicolon. // Read struct-declarators until we find the semicolon.
@ -709,6 +678,43 @@ void Parser::ParseStructUnionBody(SourceLocation RecordLoc,
if (Tok.getKind() == tok::kw___attribute) if (Tok.getKind() == tok::kw___attribute)
DeclaratorInfo.AddAttributes(ParseAttributes()); DeclaratorInfo.AddAttributes(ParseAttributes());
} }
return;
}
/// ParseStructUnionBody
/// struct-contents:
/// struct-declaration-list
/// [EXT] empty
/// [GNU] "struct-declaration-list" without terminatoring ';'
/// struct-declaration-list:
/// struct-declaration
/// struct-declaration-list struct-declaration
/// [OBC] '@' 'defs' '(' class-name ')' [TODO]
///
void Parser::ParseStructUnionBody(SourceLocation RecordLoc,
unsigned TagType, DeclTy *TagDecl) {
SourceLocation LBraceLoc = ConsumeBrace();
// Empty structs are an extension in C (C99 6.7.2.1p7), but are allowed in
// C++.
if (Tok.getKind() == tok::r_brace)
Diag(Tok, diag::ext_empty_struct_union_enum,
DeclSpec::getSpecifierName((DeclSpec::TST)TagType));
llvm::SmallVector<DeclTy*, 32> FieldDecls;
// While we still have something to read, read the declarations in the struct.
while (Tok.getKind() != tok::r_brace &&
Tok.getKind() != tok::eof) {
// Each iteration of this loop reads one struct-declaration.
// Check for extraneous top-level semicolon.
if (Tok.getKind() == tok::semi) {
Diag(Tok, diag::ext_extra_struct_semi);
ConsumeToken();
continue;
}
ParseStructDeclaration(TagDecl, FieldDecls);
if (Tok.getKind() == tok::semi) { if (Tok.getKind() == tok::semi) {
ConsumeToken(); ConsumeToken();

View File

@ -359,6 +359,8 @@ private:
void ParseStructUnionSpecifier(DeclSpec &DS); void ParseStructUnionSpecifier(DeclSpec &DS);
void ParseStructUnionBody(SourceLocation StartLoc, unsigned TagType, void ParseStructUnionBody(SourceLocation StartLoc, unsigned TagType,
DeclTy *TagDecl); DeclTy *TagDecl);
void ParseStructDeclaration(DeclTy *TagDecl,
llvm::SmallVector<DeclTy*, 32> &FieldDecls);
bool isDeclarationSpecifier() const; bool isDeclarationSpecifier() const;
bool isTypeSpecifierQualifier() const; bool isTypeSpecifierQualifier() const;