ahatanak updated this revision to Diff 310728. ahatanak added a comment. Rebase and ping.
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D78760/new/ https://reviews.llvm.org/D78760 Files: clang/lib/AST/DeclCXX.cpp clang/lib/Sema/SemaDeclCXX.cpp clang/test/SemaCXX/class.cpp Index: clang/test/SemaCXX/class.cpp =================================================================== --- clang/test/SemaCXX/class.cpp +++ clang/test/SemaCXX/class.cpp @@ -211,3 +211,30 @@ struct PR9989 { static int const PR9989_Member = sizeof PR9989_Member; }; + +namespace dependent_base_type { +struct B1 {}; + +template <class T> +struct S0 { + void m0() { + struct B0; // expected-note {{member is declared here}} + + struct D : B0, B1 { // expected-error {{implicit instantiation}} expected-note {{in instantiation of}} + }; + } +}; + +void test() { + S0<int>().m0(); // expected-note {{in instantiation of}} +} + +// clang used to crash compiling this code. +struct A {}; +template <typename T> +struct X { + struct B : A {}; + struct C : A, B {}; +}; + +} // namespace dependent_base_type Index: clang/lib/Sema/SemaDeclCXX.cpp =================================================================== --- clang/lib/Sema/SemaDeclCXX.cpp +++ clang/lib/Sema/SemaDeclCXX.cpp @@ -2648,6 +2648,9 @@ if (auto Rec = Type->getAs<RecordType>()) { auto Decl = Rec->getAsCXXRecordDecl(); + if (Decl->isDependentType()) + return; + // Iterate over its bases. for (const auto &BaseSpec : Decl->bases()) { QualType Base = Context.getCanonicalType(BaseSpec.getType()) Index: clang/lib/AST/DeclCXX.cpp =================================================================== --- clang/lib/AST/DeclCXX.cpp +++ clang/lib/AST/DeclCXX.cpp @@ -175,6 +175,8 @@ SmallVector<const CXXRecordDecl*, 8> WorkList = {StartRD}; while (!WorkList.empty()) { const CXXRecordDecl *RD = WorkList.pop_back_val(); + if (RD->isDependentType()) + continue; for (const CXXBaseSpecifier &BaseSpec : RD->bases()) { if (const CXXRecordDecl *B = BaseSpec.getType()->getAsCXXRecordDecl()) { if (!SeenBaseTypes.insert(B).second)
Index: clang/test/SemaCXX/class.cpp =================================================================== --- clang/test/SemaCXX/class.cpp +++ clang/test/SemaCXX/class.cpp @@ -211,3 +211,30 @@ struct PR9989 { static int const PR9989_Member = sizeof PR9989_Member; }; + +namespace dependent_base_type { +struct B1 {}; + +template <class T> +struct S0 { + void m0() { + struct B0; // expected-note {{member is declared here}} + + struct D : B0, B1 { // expected-error {{implicit instantiation}} expected-note {{in instantiation of}} + }; + } +}; + +void test() { + S0<int>().m0(); // expected-note {{in instantiation of}} +} + +// clang used to crash compiling this code. +struct A {}; +template <typename T> +struct X { + struct B : A {}; + struct C : A, B {}; +}; + +} // namespace dependent_base_type Index: clang/lib/Sema/SemaDeclCXX.cpp =================================================================== --- clang/lib/Sema/SemaDeclCXX.cpp +++ clang/lib/Sema/SemaDeclCXX.cpp @@ -2648,6 +2648,9 @@ if (auto Rec = Type->getAs<RecordType>()) { auto Decl = Rec->getAsCXXRecordDecl(); + if (Decl->isDependentType()) + return; + // Iterate over its bases. for (const auto &BaseSpec : Decl->bases()) { QualType Base = Context.getCanonicalType(BaseSpec.getType()) Index: clang/lib/AST/DeclCXX.cpp =================================================================== --- clang/lib/AST/DeclCXX.cpp +++ clang/lib/AST/DeclCXX.cpp @@ -175,6 +175,8 @@ SmallVector<const CXXRecordDecl*, 8> WorkList = {StartRD}; while (!WorkList.empty()) { const CXXRecordDecl *RD = WorkList.pop_back_val(); + if (RD->isDependentType()) + continue; for (const CXXBaseSpecifier &BaseSpec : RD->bases()) { if (const CXXRecordDecl *B = BaseSpec.getType()->getAsCXXRecordDecl()) { if (!SeenBaseTypes.insert(B).second)
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits