Recognize GNU attributes after 'enum class'. Fixes the libc++ build.

llvm-svn: 159089
This commit is contained in:
John McCall 2012-06-23 22:30:04 +00:00
parent 4b06b1a0ee
commit beae29a5f4
2 changed files with 13 additions and 1 deletions

View File

@ -2976,15 +2976,22 @@ void Parser::ParseEnumSpecifier(SourceLocation StartLoc, DeclSpec &DS,
SourceLocation ScopedEnumKWLoc;
bool IsScopedUsingClassTag = false;
// In C++11, recognize 'enum class' and 'enum struct'.
if (getLangOpts().CPlusPlus0x &&
(Tok.is(tok::kw_class) || Tok.is(tok::kw_struct))) {
Diag(Tok, diag::warn_cxx98_compat_scoped_enum);
IsScopedUsingClassTag = Tok.is(tok::kw_class);
ScopedEnumKWLoc = ConsumeToken();
// Attributes are not allowed between these keywords. Diagnose,
// but then just treat them like they appeared in the right place.
ProhibitAttributes(attrs);
// Recovery: assume that the attributes came after the tag.
// They are allowed afterwards, though.
MaybeParseGNUAttributes(attrs);
MaybeParseCXX0XAttributes(attrs);
while (Tok.is(tok::kw___declspec))
ParseMicrosoftDeclSpec(attrs);
}
// C++11 [temp.explicit]p12:

View File

@ -207,3 +207,8 @@ void baz () {
for ([[]] int n : { 1, 2, 3 }) {
}
}
enum class __attribute__((visibility("hidden"))) SecretKeepers {
one, /* rest are deprecated */ two, three
};
enum class [[]] EvenMoreSecrets {};