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:
Aaron Ballman 2012-07-19 03:12:23 +00:00
parent 18eff57031
commit 24a1047c8c
2 changed files with 19 additions and 6 deletions

View File

@ -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 =

View File

@ -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 };
};
}