[PATCH] D41897: Fixing a crash in Sema.

Jan Korous via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Jan 10 04:03:04 PST 2018


jkorous-apple created this revision.
jkorous-apple added a reviewer: arphaman.

The original code is checking for inaccessible base classes but does not expect inheriting from template parameters (or dependent types in general) as these are not modelled by CXXRecord.

Issue was at this line since getAsCXXRecord() returned nullptr:

  bool found
          = Class->isDerivedFrom(CanonicalBase->getAsCXXRecordDecl(), Paths);


https://reviews.llvm.org/D41897

Files:
  Sema/SemaDeclCXX.cpp
  SemaCXX/base-class-ambiguity-check.cpp


Index: SemaCXX/base-class-ambiguity-check.cpp
===================================================================
--- /dev/null
+++ SemaCXX/base-class-ambiguity-check.cpp
@@ -0,0 +1,11 @@
+// RUN: %clang_cc1 -fsyntax-only %s
+
+template<typename T>
+class Foo
+{
+        struct Base : T
+        { };
+
+        struct Derived : Base, T
+        { };
+};
\ No newline at end of file
Index: Sema/SemaDeclCXX.cpp
===================================================================
--- Sema/SemaDeclCXX.cpp
+++ Sema/SemaDeclCXX.cpp
@@ -2417,9 +2417,17 @@
   // Attach the remaining base class specifiers to the derived class.
   Class->setBases(Bases.data(), NumGoodBases);
 
+  // Check that the only base classes that are duplicate are virtual.
   for (unsigned idx = 0; idx < NumGoodBases; ++idx) {
     // Check whether this direct base is inaccessible due to ambiguity.
     QualType BaseType = Bases[idx]->getType();
+
+    // Skip all dependent types in templates being used as base specifiers.
+    // Checks below assume that base specifier is a CXXRecord.
+    if (BaseType->isDependentType()) {
+      continue;
+    }
+
     CanQualType CanonicalBase = Context.getCanonicalType(BaseType)
       .getUnqualifiedType();
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D41897.129238.patch
Type: text/x-patch
Size: 1230 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180110/a9c0be5d/attachment.bin>


More information about the cfe-commits mailing list