diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-01-24 22:34:35 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-01-24 22:34:35 +0000 |
commit | 4b5a949834775b60f4e94c6ab9136c19104b48c8 (patch) | |
tree | 2806d2a1b6fe1ee814e98fb7a86dc8032aa1f29f /clang/lib/Parse/ParseDeclCXX.cpp | |
parent | 7449bda3d93e7c04615c667a605f3b690e39c25f (diff) | |
download | bcm5719-llvm-4b5a949834775b60f4e94c6ab9136c19104b48c8.tar.gz bcm5719-llvm-4b5a949834775b60f4e94c6ab9136c19104b48c8.zip |
Allow virt-specifiers after GNU attributes in member-declarators. GCC doesn't
allow this, and we should warn on it, but it turns out that people were already
relying on this.
We should introduce a -Wgcc-compat warning for this if the attributes are known
to GCC, but we don't currently track enough information about attributes to do
so reliably.
llvm-svn: 200045
Diffstat (limited to 'clang/lib/Parse/ParseDeclCXX.cpp')
-rw-r--r-- | clang/lib/Parse/ParseDeclCXX.cpp | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp index 86db40b28d8..083d682428e 100644 --- a/clang/lib/Parse/ParseDeclCXX.cpp +++ b/clang/lib/Parse/ParseDeclCXX.cpp @@ -1926,6 +1926,13 @@ void Parser::ParseCXXMemberDeclaratorBeforeInitializer( // If attributes exist after the declarator, but before an '{', parse them. MaybeParseGNUAttributes(DeclaratorInfo, &LateParsedAttrs); + + // For compatibility with code written to older Clang, also accept a + // virt-specifier *after* the GNU attributes. + // FIXME: If we saw any attributes that are known to GCC followed by a + // virt-specifier, issue a GCC-compat warning. + if (BitfieldSize.isUnset() && VS.isUnset()) + ParseOptionalCXX11VirtSpecifierSeq(VS, getCurrentClass().IsInterface); } /// ParseCXXClassMemberDeclaration - Parse a C++ class member declaration. @@ -2142,8 +2149,7 @@ void Parser::ParseCXXClassMemberDeclaration(AccessSpecifier AS, // If this has neither a name nor a bit width, something has gone seriously // wrong. Skip until the semi-colon or }. - if (!DeclaratorInfo.hasName() && !BitfieldSize.isInvalid() && - !BitfieldSize.isUsable()) { + if (!DeclaratorInfo.hasName() && BitfieldSize.isUnset()) { // If so, skip until the semi-colon or a }. SkipUntil(tok::r_brace, StopAtSemi | StopBeforeMatch); TryConsumeToken(tok::semi); @@ -2151,7 +2157,7 @@ void Parser::ParseCXXClassMemberDeclaration(AccessSpecifier AS, } // Check for a member function definition. - if (!BitfieldSize.isInvalid() && !BitfieldSize.isUsable()) { + if (BitfieldSize.isUnset()) { // MSVC permits pure specifier on inline functions defined at class scope. // Hence check for =0 before checking for function definition. if (getLangOpts().MicrosoftExt && Tok.is(tok::equal) && |