https://github.com/shafik updated https://github.com/llvm/llvm-project/pull/143754
>From 41e1b10a325aef9d7535b222e4c4ca909463d7fd Mon Sep 17 00:00:00 2001 From: Shafik Yaghmour <shafik.yaghm...@intel.com> Date: Tue, 10 Jun 2025 18:56:12 -0700 Subject: [PATCH 1/3] [Clang][Sema] Check the return value of DiagnoseClassNameShadow in ActOnEnumConstant Static analysis flagged that we were not checking the return value of DiagnoseClassNameShadow when we did so everywhere else. Modifying this case to match how other places uses it makes sense and does not change behavior. Likely if this check fails later actions will fail as well but it is more correct to exit early. --- clang/lib/Sema/SemaDecl.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index bbd63372c168b..cfb58e33980d2 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -20134,9 +20134,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); >From 66990b51b6dfc053e2152767b0df8f05da184a68 Mon Sep 17 00:00:00 2001 From: Shafik Yaghmour <shafik.yaghm...@intel.com> Date: Fri, 15 Aug 2025 14:00:02 -0700 Subject: [PATCH 2/3] Adding test to confirm we don't create enumerator that shadows. --- clang/test/CXX/class/class.mem/p13.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/clang/test/CXX/class/class.mem/p13.cpp b/clang/test/CXX/class/class.mem/p13.cpp index d947586c41940..c534eb2f23530 100644 --- a/clang/test/CXX/class/class.mem/p13.cpp +++ b/clang/test/CXX/class/class.mem/p13.cpp @@ -114,3 +114,12 @@ template<typename B> struct CtorDtorName : B { CtorDtorName(); ~CtorDtorName(); // expected-error {{identifier 'CtorDtorName' after '~' in destructor name does not name a type}} }; + +struct S { + 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'}} +}; >From 5d88b1754db0de08fedb7176d5fcbc8d71f47f85 Mon Sep 17 00:00:00 2001 From: Shafik Yaghmour <shafik.yaghm...@intel.com> Date: Fri, 15 Aug 2025 19:54:02 -0700 Subject: [PATCH 3/3] Update test after merging w/ main. --- clang/test/CXX/class/class.mem/p13.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/clang/test/CXX/class/class.mem/p13.cpp b/clang/test/CXX/class/class.mem/p13.cpp index c534eb2f23530..a30aa5d0b2ee3 100644 --- a/clang/test/CXX/class/class.mem/p13.cpp +++ b/clang/test/CXX/class/class.mem/p13.cpp @@ -115,11 +115,11 @@ template<typename B> struct CtorDtorName : B { ~CtorDtorName(); // expected-error {{identifier 'CtorDtorName' after '~' in destructor name does not name a type}} }; -struct S { +struct S { // expected-note {{'S' declared here}} enum E { R = 11, - S = 12 // expected-error{{member 'S' has the same name as its class}} + 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'}} + static_assert(E::S == 12, "E::S is not 12"); // expected-error {{no member named 'S' in 'S::E'}} }; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits