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

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@159089 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
John McCall 2012-06-23 22:30:04 +00:00
Родитель 33e6c2da2f
Коммит 1e12b3d777
2 изменённых файлов: 13 добавлений и 1 удалений

Просмотреть файл

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

Просмотреть файл

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