[clang] 54be300 - [Clang] Fix Sema::ClassifyName so that it classifies EnumConstantDecl as NonType when they are brought into scope via using enum
Shafik Yaghmour via cfe-commits
cfe-commits at lists.llvm.org
Tue Nov 29 10:39:28 PST 2022
Author: Shafik Yaghmour
Date: 2022-11-29T10:39:21-08:00
New Revision: 54be300f7e0bc4edaf54e9289b2380bd210a37bc
URL: https://github.com/llvm/llvm-project/commit/54be300f7e0bc4edaf54e9289b2380bd210a37bc
DIFF: https://github.com/llvm/llvm-project/commit/54be300f7e0bc4edaf54e9289b2380bd210a37bc.diff
LOG: [Clang] Fix Sema::ClassifyName so that it classifies EnumConstantDecl as NonType when they are brought into scope via using enum
Currently Sema::ClassifyName(...) in some cases when an enumerator is brought
into scope via using enum during lookup it can end up being classified as an
OverloadSet. It looks like this was never accounted for when using enum support
was implemented and we need to add a check to allow an EnumConstantDecl to be
classified as NonType even when it is a class member.
This fixes:
https://github.com/llvm/llvm-project/issues/58057
https://github.com/llvm/llvm-project/issues/59014
https://github.com/llvm/llvm-project/issues/54746
Differential Revision: https://reviews.llvm.org/D138091
Added:
Modified:
clang/docs/ReleaseNotes.rst
clang/lib/Sema/SemaDecl.cpp
clang/test/SemaCXX/cxx20-using-enum.cpp
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index bf788ff51ab4..b4f217c92ffc 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -306,6 +306,11 @@ Bug Fixes
`Issue 58229 <https://github.com/llvm/llvm-project/issues/58229>`_
- The builtin type trait ``__is_aggregate`` now returns ``true`` for arrays of incomplete
types in accordance with the suggested fix for `LWG3823 <https://cplusplus.github.io/LWG/issue3823>`_
+- 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 <https://github.com/llvm/llvm-project/issues/58057>`_
+ `Issue 59014 <https://github.com/llvm/llvm-project/issues/59014>`_
+ `Issue 54746 <https://github.com/llvm/llvm-project/issues/54746>`_
Improvements to Clang's diagnostics
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index bac87c012723..2531e5230dda 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -1247,7 +1247,8 @@ Sema::NameClassification Sema::ClassifyName(Scope *S, CXXScopeSpec &SS,
// 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<EnumConstantDecl>(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
index 91dd0bac992f..872353aad8a0 100644
--- a/clang/test/SemaCXX/cxx20-using-enum.cpp
+++ b/clang/test/SemaCXX/cxx20-using-enum.cpp
@@ -240,4 +240,33 @@ TPLa<int> a;
} // 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
More information about the cfe-commits
mailing list