Author: Matheus Izvekov
Date: 2025-09-21T18:16:46Z
New Revision: 290f5b5639717d12765401c2f51311d47c894990

URL: 
https://github.com/llvm/llvm-project/commit/290f5b5639717d12765401c2f51311d47c894990
DIFF: 
https://github.com/llvm/llvm-project/commit/290f5b5639717d12765401c2f51311d47c894990.diff

LOG: [clang] fix using enum redecl in template regression (#159996)

This fixes a regression reported here:
https://github.com/llvm/llvm-project/pull/155313#issuecomment-3315883183

Since this regression was never released, there are no release notes.

Added: 
    

Modified: 
    clang/lib/Sema/SemaCXXScopeSpec.cpp
    clang/test/SemaCXX/cxx20-using-enum.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/Sema/SemaCXXScopeSpec.cpp 
b/clang/lib/Sema/SemaCXXScopeSpec.cpp
index e89243b9d767a..97ba1a510cee4 100644
--- a/clang/lib/Sema/SemaCXXScopeSpec.cpp
+++ b/clang/lib/Sema/SemaCXXScopeSpec.cpp
@@ -220,10 +220,11 @@ bool Sema::RequireCompleteDeclContext(CXXScopeSpec &SS,
 ///
 bool Sema::RequireCompleteEnumDecl(EnumDecl *EnumD, SourceLocation L,
                                    CXXScopeSpec *SS) {
-  if (EnumD->isCompleteDefinition()) {
+  if (EnumDecl *Def = EnumD->getDefinition();
+      Def && Def->isCompleteDefinition()) {
     // If we know about the definition but it is not visible, complain.
     NamedDecl *SuggestedDef = nullptr;
-    if (!hasReachableDefinition(EnumD, &SuggestedDef,
+    if (!hasReachableDefinition(Def, &SuggestedDef,
                                 /*OnlyNeedComplete*/ false)) {
       // If the user is going to see an error here, recover by making the
       // definition visible.

diff  --git a/clang/test/SemaCXX/cxx20-using-enum.cpp 
b/clang/test/SemaCXX/cxx20-using-enum.cpp
index 775b65c5a8d8e..0ae6f4c9a07b6 100644
--- a/clang/test/SemaCXX/cxx20-using-enum.cpp
+++ b/clang/test/SemaCXX/cxx20-using-enum.cpp
@@ -288,4 +288,14 @@ struct S {
   };
 };
 }
+
+namespace Redecl {
+  enum class A : int { X };
+  enum class A : int;
+  template <class> struct B {
+    using enum A;
+    using Z = decltype(X);
+  };
+  template struct B<int>;
+} // namespace Redecl
 #endif


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to