From: Jan Korous Date: Sat, 13 Jan 2018 15:24:16 +0000 (+0000) Subject: [Sema] Fix crash for type-dependent base classes X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=58416cde3f6f8ece48412d170621a80c71b68b05;p=clang [Sema] Fix crash for type-dependent base classes git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@322438 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index f0a176b14c..6873feb780 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -2417,9 +2417,16 @@ bool Sema::AttachBaseSpecifiers(CXXRecordDecl *Class, // 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 the base specifier is a CXXRecord. + if (BaseType->isDependentType()) + continue; + CanQualType CanonicalBase = Context.getCanonicalType(BaseType) .getUnqualifiedType(); diff --git a/test/SemaCXX/base-class-ambiguity-check.cpp b/test/SemaCXX/base-class-ambiguity-check.cpp new file mode 100644 index 0000000000..fc1c4c2cea --- /dev/null +++ b/test/SemaCXX/base-class-ambiguity-check.cpp @@ -0,0 +1,9 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s +// expected-no-diagnostics + +template class Foo { + struct Base : T {}; + + // Test that this code no longer causes a crash in Sema. rdar://23291875 + struct Derived : Base, T {}; +};