diff options
author | Chris Lattner <sabre@nondot.org> | 2008-06-21 19:39:06 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-06-21 19:39:06 +0000 |
commit | 5a6ddbf295d2ea1c28cfb67d82db22f3893ede6f (patch) | |
tree | c7568aa7f57f05d9e0744bff2440f663c0566f34 /lib/Parse/ParseDecl.cpp | |
parent | 63e9d5673791096589c601528e857e00a13050ff (diff) |
add parser and sema support for the funny ObjC '@defs' thing.
Patch by David Chisnall!
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@52586 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Parse/ParseDecl.cpp')
-rw-r--r-- | lib/Parse/ParseDecl.cpp | 47 |
1 files changed, 34 insertions, 13 deletions
diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index 46246e64ba..95344c438e 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -707,7 +707,7 @@ ParseStructDeclaration(DeclSpec &DS, /// struct-declaration-list: /// struct-declaration /// struct-declaration-list struct-declaration -/// [OBC] '@' 'defs' '(' class-name ')' [TODO] +/// [OBC] '@' 'defs' '(' class-name ')' /// void Parser::ParseStructUnionBody(SourceLocation RecordLoc, unsigned TagType, DeclTy *TagDecl) { @@ -736,18 +736,39 @@ void Parser::ParseStructUnionBody(SourceLocation RecordLoc, // Parse all the comma separated declarators. DeclSpec DS; FieldDeclarators.clear(); - ParseStructDeclaration(DS, FieldDeclarators); - - // Convert them all to fields. - for (unsigned i = 0, e = FieldDeclarators.size(); i != e; ++i) { - FieldDeclarator &FD = FieldDeclarators[i]; - // Install the declarator into the current TagDecl. - DeclTy *Field = Actions.ActOnField(CurScope, - DS.getSourceRange().getBegin(), - FD.D, FD.BitfieldSize); - FieldDecls.push_back(Field); - } - + if (!Tok.is(tok::at)) { + ParseStructDeclaration(DS, FieldDeclarators); + + // Convert them all to fields. + for (unsigned i = 0, e = FieldDeclarators.size(); i != e; ++i) { + FieldDeclarator &FD = FieldDeclarators[i]; + // Install the declarator into the current TagDecl. + DeclTy *Field = Actions.ActOnField(CurScope, + DS.getSourceRange().getBegin(), + FD.D, FD.BitfieldSize); + FieldDecls.push_back(Field); + } + } else { // Handle @defs + ConsumeToken(); + if (!Tok.isObjCAtKeyword(tok::objc_defs)) { + Diag(Tok, diag::err_unexpected_at); + SkipUntil(tok::semi, true, true); + continue; + } + ConsumeToken(); + ExpectAndConsume(tok::l_paren, diag::err_expected_lparen); + if (!Tok.is(tok::identifier)) { + Diag(Tok, diag::err_expected_ident); + SkipUntil(tok::semi, true, true); + continue; + } + llvm::SmallVector<DeclTy*, 16> Fields; + Actions.ActOnDefs(CurScope, Tok.getLocation(), Tok.getIdentifierInfo(), + Fields); + FieldDecls.insert(FieldDecls.end(), Fields.begin(), Fields.end()); + ConsumeToken(); + ExpectAndConsume(tok::r_paren, diag::err_expected_rparen); + } if (Tok.is(tok::semi)) { ConsumeToken(); |