[clang] 290f5b5 - [clang] fix using enum redecl in template regression (#159996)
via cfe-commits
cfe-commits at lists.llvm.org
Sun Sep 21 11:16:50 PDT 2025
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
More information about the cfe-commits
mailing list