forked from OSchip/llvm-project
Fix a little bug in the handling of enumeration types with a fixed
underlying type: we weren't parsing unnamed enumeration types with a fixed underlying type. llvm-svn: 126184
This commit is contained in:
parent
a78f193e7e
commit
6cd5ae4dfa
|
@ -57,6 +57,8 @@ def ext_enumerator_list_comma : Extension<
|
||||||
"feature">;
|
"feature">;
|
||||||
def err_enumerator_list_missing_comma : Error<
|
def err_enumerator_list_missing_comma : Error<
|
||||||
"missing ',' between enumerators">;
|
"missing ',' between enumerators">;
|
||||||
|
def err_enumerator_unnamed_no_def : Error<
|
||||||
|
"unnamed enumeration must be a definition">;
|
||||||
|
|
||||||
def ext_gnu_indirect_goto : Extension<
|
def ext_gnu_indirect_goto : Extension<
|
||||||
"use of GNU indirect-goto extension">, InGroup<GNU>;
|
"use of GNU indirect-goto extension">, InGroup<GNU>;
|
||||||
|
|
|
@ -1975,6 +1975,7 @@ void Parser::ParseEnumSpecifier(SourceLocation StartLoc, DeclSpec &DS,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool AllowFixedUnderlyingType = getLang().CPlusPlus0x;
|
||||||
bool IsScopedEnum = false;
|
bool IsScopedEnum = false;
|
||||||
bool IsScopedUsingClassTag = false;
|
bool IsScopedUsingClassTag = false;
|
||||||
|
|
||||||
|
@ -1986,7 +1987,8 @@ void Parser::ParseEnumSpecifier(SourceLocation StartLoc, DeclSpec &DS,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Must have either 'enum name' or 'enum {...}'.
|
// Must have either 'enum name' or 'enum {...}'.
|
||||||
if (Tok.isNot(tok::identifier) && Tok.isNot(tok::l_brace)) {
|
if (Tok.isNot(tok::identifier) && Tok.isNot(tok::l_brace) &&
|
||||||
|
(AllowFixedUnderlyingType && Tok.isNot(tok::colon))) {
|
||||||
Diag(Tok, diag::err_expected_ident_lbrace);
|
Diag(Tok, diag::err_expected_ident_lbrace);
|
||||||
|
|
||||||
// Skip the rest of this declarator, up until the comma or semicolon.
|
// Skip the rest of this declarator, up until the comma or semicolon.
|
||||||
|
@ -2013,7 +2015,7 @@ void Parser::ParseEnumSpecifier(SourceLocation StartLoc, DeclSpec &DS,
|
||||||
TypeResult BaseType;
|
TypeResult BaseType;
|
||||||
|
|
||||||
// Parse the fixed underlying type.
|
// Parse the fixed underlying type.
|
||||||
if (getLang().CPlusPlus0x && Tok.is(tok::colon)) {
|
if (AllowFixedUnderlyingType && Tok.is(tok::colon)) {
|
||||||
bool PossibleBitfield = false;
|
bool PossibleBitfield = false;
|
||||||
if (getCurScope()->getFlags() & Scope::ClassScope) {
|
if (getCurScope()->getFlags() & Scope::ClassScope) {
|
||||||
// If we're in class scope, this can either be an enum declaration with
|
// If we're in class scope, this can either be an enum declaration with
|
||||||
|
@ -2092,6 +2094,14 @@ void Parser::ParseEnumSpecifier(SourceLocation StartLoc, DeclSpec &DS,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!Name && TUK != Sema::TUK_Definition) {
|
||||||
|
Diag(Tok, diag::err_enumerator_unnamed_no_def);
|
||||||
|
|
||||||
|
// Skip the rest of this declarator, up until the comma or semicolon.
|
||||||
|
SkipUntil(tok::comma, true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
bool Owned = false;
|
bool Owned = false;
|
||||||
bool IsDependent = false;
|
bool IsDependent = false;
|
||||||
SourceLocation TSTLoc = NameLoc.isValid()? NameLoc : StartLoc;
|
SourceLocation TSTLoc = NameLoc.isValid()? NameLoc : StartLoc;
|
||||||
|
|
|
@ -96,3 +96,10 @@ enum Redeclare6 : short; // expected-error{{redeclared with different underlying
|
||||||
enum class Redeclare7; // expected-note{{previous use is here}} expected-note{{previous use is here}}
|
enum class Redeclare7; // expected-note{{previous use is here}} expected-note{{previous use is here}}
|
||||||
enum class Redeclare7 : short; // expected-error{{redeclared with different underlying type}}
|
enum class Redeclare7 : short; // expected-error{{redeclared with different underlying type}}
|
||||||
enum class Redeclare7 : short; // expected-error{{redeclared with different underlying type}}
|
enum class Redeclare7 : short; // expected-error{{redeclared with different underlying type}}
|
||||||
|
|
||||||
|
enum : long {
|
||||||
|
long_enum_val = 10000
|
||||||
|
};
|
||||||
|
|
||||||
|
enum : long x; // expected-error{{unnamed enumeration must be a definition}} \
|
||||||
|
// expected-warning{{declaration does not declare anything}}
|
||||||
|
|
Loading…
Reference in New Issue