jkorous-apple updated this revision to Diff 129631. jkorous-apple added a comment.
Fixed test based on Aaron's comments. 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,9 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s +// expected-no-diagnostics + +template <typename T> class Foo { + struct Base : T {}; + + // Test that this code no longer causes a crash in Sema. rdar://23291875 + struct Derived : Base, T {}; +}; Index: Sema/SemaDeclCXX.cpp =================================================================== --- Sema/SemaDeclCXX.cpp +++ Sema/SemaDeclCXX.cpp @@ -2417,9 +2417,16 @@ // 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();
Index: SemaCXX/base-class-ambiguity-check.cpp =================================================================== --- /dev/null +++ SemaCXX/base-class-ambiguity-check.cpp @@ -0,0 +1,9 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s +// expected-no-diagnostics + +template <typename T> class Foo { + struct Base : T {}; + + // Test that this code no longer causes a crash in Sema. rdar://23291875 + struct Derived : Base, T {}; +}; Index: Sema/SemaDeclCXX.cpp =================================================================== --- Sema/SemaDeclCXX.cpp +++ Sema/SemaDeclCXX.cpp @@ -2417,9 +2417,16 @@ // 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();
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits