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 struct B { + using enum A; + using Z = decltype(X); + }; + template struct B; +} // namespace Redecl #endif