[clang] Do not crash when CXXRecordDecl has a non-CXXRecordDecl base.
authorAdam Czachorowski <adamcz@google.com>
Thu, 14 Jan 2021 19:54:16 +0000 (20:54 +0100)
committerAdam Czachorowski <adamcz@google.com>
Thu, 14 Jan 2021 20:20:06 +0000 (21:20 +0100)
This can happen on some invalid code, like the included test case.

Differential Revision: https://reviews.llvm.org/D94704

clang/lib/Sema/SemaDeclCXX.cpp
clang/test/SemaTemplate/temp_class_spec.cpp

index 27679ac..8bfaa46 100644 (file)
@@ -5520,8 +5520,9 @@ Sema::MarkBaseAndMemberDestructorsReferenced(SourceLocation Location,
 
   // Bases.
   for (const auto &Base : ClassDecl->bases()) {
-    // Bases are always records in a well-formed non-dependent class.
     const RecordType *RT = Base.getType()->getAs<RecordType>();
+    if (!RT)
+      continue;
 
     // Remember direct virtual bases.
     if (Base.isVirtual()) {
index 8a07fd7..f92c52e 100644 (file)
@@ -361,3 +361,17 @@ namespace PR6181 {
   };
   
 }
+
+// Check that we do not crash on invalid code that leads to invalid base.
+namespace {
+template <typename X>
+class Foo {};
+
+template <int Y>
+class Bar;
+
+template <typename Z>
+class Bar<0> : public Foo<Z> { // expected-error{{partial specialization of 'Bar' does not use any of its template parameters}}
+  Bar() : Foo<Z>() {}
+};
+} // namespace