diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2008-06-28 08:10:48 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2008-06-28 08:10:48 +0000 |
commit | 3a9fdb4742b21c0a3c27f18c5e4e94bab6f9e64c (patch) | |
tree | 932ddfed0aacd02009ebc3478c2801f45dbeb4f4 /lib/Parse/ParseDeclCXX.cpp | |
parent | ad74a758189180b8ab8faea648e4766c3bfd7fcb (diff) |
Handle unnamed bitfields when parsing C++ classes.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@52855 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Parse/ParseDeclCXX.cpp')
-rw-r--r-- | lib/Parse/ParseDeclCXX.cpp | 56 |
1 files changed, 30 insertions, 26 deletions
diff --git a/lib/Parse/ParseDeclCXX.cpp b/lib/Parse/ParseDeclCXX.cpp index 718cea9586..c84b5e7de6 100644 --- a/lib/Parse/ParseDeclCXX.cpp +++ b/lib/Parse/ParseDeclCXX.cpp @@ -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; + } + + 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); + 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)) { |