From 738a047ed6380efdfd4b64968881675347d7f915 Mon Sep 17 00:00:00 2001 From: "Oleksandr T." Date: Tue, 19 Nov 2024 11:38:49 +0200 Subject: [PATCH] [Clang] Skip shadow warnings for enum constants in distinct class scopes (#115656) Fixes #62588 --- clang/docs/ReleaseNotes.rst | 2 ++ clang/lib/Sema/SemaDecl.cpp | 11 ++++++++--- clang/test/SemaCXX/warn-shadow.cpp | 14 ++++++++++++++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index c402f8eb141d..4d6275fbc981 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -537,6 +537,8 @@ Improvements to Clang's diagnostics - Improved diagnostic message for ``__builtin_bit_cast`` size mismatch (#GH115870). +- Clang now omits shadow warnings for enum constants in separate class scopes (#GH62588). + Improvements to Clang's time-trace ---------------------------------- diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index a36ca61a1bef..be570f3a1829 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -8350,9 +8350,15 @@ void Sema::CheckShadow(NamedDecl *D, NamedDecl *ShadowedDecl, return; // Only warn about certain kinds of shadowing for class members. - if (NewDC && NewDC->isRecord()) { + if (NewDC) { // In particular, don't warn about shadowing non-class members. - if (!OldDC->isRecord()) + if (NewDC->isRecord() && !OldDC->isRecord()) + return; + + // Skip shadowing check if we're in a class scope, dealing with an enum + // constant in a different context. + DeclContext *ReDC = NewDC->getRedeclContext(); + if (ReDC->isRecord() && isa(D) && !OldDC->Equals(ReDC)) return; // TODO: should we warn about static data members shadowing @@ -8363,7 +8369,6 @@ void Sema::CheckShadow(NamedDecl *D, NamedDecl *ShadowedDecl, // shadowing context, but that's just a false negative. } - DeclarationName Name = R.getLookupName(); // Emit warning and note. diff --git a/clang/test/SemaCXX/warn-shadow.cpp b/clang/test/SemaCXX/warn-shadow.cpp index 2969bd39fed4..98a235a73c7e 100644 --- a/clang/test/SemaCXX/warn-shadow.cpp +++ b/clang/test/SemaCXX/warn-shadow.cpp @@ -307,3 +307,17 @@ void test4() { } }; // namespace structured_binding_tests + +namespace GH62588 { +class Outer { +public: + char *foo(); // expected-note {{previous declaration is here}} \ + // expected-note {{previous definition is here}} + enum Outer_E { foo }; // expected-error {{redefinition of 'foo'}} \ + // expected-warning {{declaration shadows a static data member of 'GH62588::Outer'}} + class Inner { + public: + enum Inner_E { foo }; // ok + }; +}; +} // namespace GH62588