From: Argyrios Kyrtzidis Date: Sat, 28 Jun 2008 08:10:48 +0000 (+0000) Subject: Handle unnamed bitfields when parsing C++ classes. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3a9fdb4742b21c0a3c27f18c5e4e94bab6f9e64c;p=clang Handle unnamed bitfields when parsing C++ classes. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@52855 91177308-0d34-0410-b5e6-96231b3b80d8 --- 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)) { diff --git a/test/Parser/cxx-class.cpp b/test/Parser/cxx-class.cpp index f0b419d494..6d030bdc57 100644 --- a/test/Parser/cxx-class.cpp +++ b/test/Parser/cxx-class.cpp @@ -8,6 +8,7 @@ protected: struct S {}; enum {}; int; // expected-error {{error: declaration does not declare anything}} + int : 1, : 2; public: void m() {