diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -306,6 +306,11 @@ `Issue 58229 `_ - The builtin type trait ``__is_aggregate`` now returns ``true`` for arrays of incomplete types in accordance with the suggested fix for `LWG3823 `_ +- Fix bug with using enum that could lead to enumerators being treated as if + they were part of an overload set. This fixes + `Issue 58067 `_ + `Issue 59014 `_ + `Issue 54746 `_ Improvements to Clang's diagnostics ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -1247,7 +1247,8 @@ // member accesses, as we need to defer certain access checks until we know // the context. bool ADL = UseArgumentDependentLookup(SS, Result, NextToken.is(tok::l_paren)); - if (Result.isSingleResult() && !ADL && !FirstDecl->isCXXClassMember()) + if (Result.isSingleResult() && !ADL && + (!FirstDecl->isCXXClassMember() || isa(FirstDecl))) return NameClassification::NonType(Result.getRepresentativeDecl()); // Otherwise, this is an overload set that we will need to resolve later. diff --git a/clang/test/SemaCXX/cxx20-using-enum.cpp b/clang/test/SemaCXX/cxx20-using-enum.cpp --- a/clang/test/SemaCXX/cxx20-using-enum.cpp +++ b/clang/test/SemaCXX/cxx20-using-enum.cpp @@ -240,4 +240,33 @@ } // namespace Thirteen +namespace GH58057 { +struct Wrap { +enum Things { + Value1, + Value2 +}; +}; + +using enum Wrap::Things; + +int f() { + return (Value1 | Value2); +} +} + +namespace GH59014 { +struct X { + enum Masks {Mask = 1,Shift = 0}; +}; + +void f(int a) { + using enum X::Masks; + + auto u = (Mask); + auto v = (Mask << Shift); + void (~(Mask)); +} +} + #endif