diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -5520,8 +5520,9 @@ // Bases. for (const auto &Base : ClassDecl->bases()) { - // Bases are always records in a well-formed non-dependent class. const RecordType *RT = Base.getType()->getAs(); + if (!RT) + continue; // Remember direct virtual bases. if (Base.isVirtual()) { diff --git a/clang/test/SemaTemplate/temp_class_spec.cpp b/clang/test/SemaTemplate/temp_class_spec.cpp --- a/clang/test/SemaTemplate/temp_class_spec.cpp +++ b/clang/test/SemaTemplate/temp_class_spec.cpp @@ -361,3 +361,17 @@ }; } + +// Check that we do not crash on invalid code that leads to invalid base. +namespace { +template +class Foo {}; + +template +class Bar; + +template +class Bar<0> : public Foo { // expected-error{{partial specialization of 'Bar' does not use any of its template parameters}} + Bar() : Foo() {} +}; +} // namespace