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(); 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 +class Foo +{ + struct Base : T + { }; + + struct Derived : Base, T + { }; +}; \ No newline at end of file