From: Aaron Ballman Date: Thu, 19 Jul 2012 03:12:23 +0000 (+0000) Subject: Relaxed enumeration constant naming rules for scoped enumerators so they no longer... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f81678707e936cf04a2a9f7c21d51a77ffc1f6c9;p=clang 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@160490 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 4041ccf9d3..6c6aeb1ab1 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -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( 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 = diff --git a/test/SemaCXX/enum-scoped.cpp b/test/SemaCXX/enum-scoped.cpp index ebe9245358..a1f911d79d 100644 --- a/test/SemaCXX/enum-scoped.cpp +++ b/test/SemaCXX/enum-scoped.cpp @@ -245,3 +245,10 @@ namespace test10 { int m = g(); int n = g(); // expected-note {{here}} } + +namespace pr13128 { + // This should compile cleanly + class C { + enum class E { C }; + }; +}