Relaxed enumeration constant naming rules for scoped enumerators so they no longer emit a diagnostic when the enumeration's name matches that of the class. Fixes PR13128.
llvm-svn: 160490
This commit is contained in:
parent
18eff57031
commit
24a1047c8c
|
@ -10406,15 +10406,21 @@ Decl *Sema::ActOnEnumConstant(Scope *S, Decl *theEnumDecl, Decl *lastEnumConst,
|
|||
}
|
||||
}
|
||||
|
||||
// C++ [class.mem]p13:
|
||||
// If T is the name of a class, then each of the following shall have a
|
||||
// name different from T:
|
||||
// - every enumerator of every member of class T that is an enumerated
|
||||
// type
|
||||
// C++ [class.mem]p15:
|
||||
// If T is the name of a class, then each of the following shall have a name
|
||||
// different from T:
|
||||
// - every enumerator of every member of class T that is an unscoped
|
||||
// enumerated type
|
||||
//
|
||||
// C++ [dcl.enum]p10:
|
||||
// Each enum-name and each unscoped enumerator is declared in the scope that
|
||||
// immediately contains the enum-specifier. Each scoped enumerator is declared
|
||||
// in the scope of the enumeration.
|
||||
if (CXXRecordDecl *Record
|
||||
= dyn_cast<CXXRecordDecl>(
|
||||
TheEnumDecl->getDeclContext()->getRedeclContext()))
|
||||
if (Record->getIdentifier() && Record->getIdentifier() == Id)
|
||||
if (!TheEnumDecl->isScoped() &&
|
||||
Record->getIdentifier() && Record->getIdentifier() == Id)
|
||||
Diag(IdLoc, diag::err_member_name_of_class) << Id;
|
||||
|
||||
EnumConstantDecl *New =
|
||||
|
|
|
@ -245,3 +245,10 @@ namespace test10 {
|
|||
int m = g<int>();
|
||||
int n = g<short>(); // expected-note {{here}}
|
||||
}
|
||||
|
||||
namespace pr13128 {
|
||||
// This should compile cleanly
|
||||
class C {
|
||||
enum class E { C };
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue