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:
parent
1eb1ad6c36
commit
9717080968
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue