From f81678707e936cf04a2a9f7c21d51a77ffc1f6c9 Mon Sep 17 00:00:00 2001 From: Aaron Ballman Date: Thu, 19 Jul 2012 03:12:23 +0000 Subject: [PATCH] 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 --- lib/Sema/SemaDecl.cpp | 18 ++++++++++++------ test/SemaCXX/enum-scoped.cpp | 7 +++++++ 2 files changed, 19 insertions(+), 6 deletions(-) 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 }; + }; +} -- 2.40.0