diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 6581d4c604eb2..4ef8fd66545e7 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -20264,9 +20264,10 @@ Decl *Sema::ActOnEnumConstant(Scope *S, Decl *theEnumDecl, Decl *lastEnumConst, // different from T: // - every enumerator of every member of class T that is an unscoped // enumerated type - if (getLangOpts().CPlusPlus && !TheEnumDecl->isScoped()) - DiagnoseClassNameShadow(TheEnumDecl->getDeclContext(), - DeclarationNameInfo(Id, IdLoc)); + if (getLangOpts().CPlusPlus && !TheEnumDecl->isScoped() && + DiagnoseClassNameShadow(TheEnumDecl->getDeclContext(), + DeclarationNameInfo(Id, IdLoc))) + return nullptr; EnumConstantDecl *New = CheckEnumConstant(TheEnumDecl, LastEnumConst, IdLoc, Id, Val); diff --git a/clang/test/CXX/class/class.mem/p13.cpp b/clang/test/CXX/class/class.mem/p13.cpp index d947586c41940..a30aa5d0b2ee3 100644 --- a/clang/test/CXX/class/class.mem/p13.cpp +++ b/clang/test/CXX/class/class.mem/p13.cpp @@ -114,3 +114,12 @@ template struct CtorDtorName : B { CtorDtorName(); ~CtorDtorName(); // expected-error {{identifier 'CtorDtorName' after '~' in destructor name does not name a type}} }; + +struct S { // expected-note {{'S' declared here}} + enum E { + R = 11, + S = 12 // expected-error {{member 'S' has the same name as its class}} + }; + static_assert(E::R == 11, "E::R is not 11"); + static_assert(E::S == 12, "E::S is not 12"); // expected-error {{no member named 'S' in 'S::E'}} +};