erik.pilkington updated this revision to Diff 157575. erik.pilkington added a comment.
Add the testcase @rjmccall requested. https://reviews.llvm.org/D49868 Files: clang/lib/Sema/SemaInit.cpp clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp Index: clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp =================================================================== --- clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp +++ clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp @@ -348,6 +348,31 @@ }; } +namespace rdar41903969 { +template <class T> struct A {}; +template <class T> struct B; +template <class T> struct C { + C(A<T>&); + C(B<T>&); +}; + +void foo(A<int> &a, B<int> &b) { + (void)C{b}; + (void)C{a}; +} + +template<typename T> struct X { + X(std::initializer_list<T>) = delete; + X(const X&); +}; + +template <class T> struct D : X<T> {}; + +void bar(D<int>& d) { + (void)X{d}; +} +} + #else // expected-no-diagnostics Index: clang/lib/Sema/SemaInit.cpp =================================================================== --- clang/lib/Sema/SemaInit.cpp +++ clang/lib/Sema/SemaInit.cpp @@ -9130,6 +9130,7 @@ Expr *E = ListInit->getInit(0); auto *RD = E->getType()->getAsCXXRecordDecl(); if (!isa<InitListExpr>(E) && RD && + isCompleteType(Kind.getLocation(), E->getType()) && isOrIsDerivedFromSpecializationOf(RD, Template)) TryListConstructors = false; }
Index: clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp =================================================================== --- clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp +++ clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp @@ -348,6 +348,31 @@ }; } +namespace rdar41903969 { +template <class T> struct A {}; +template <class T> struct B; +template <class T> struct C { + C(A<T>&); + C(B<T>&); +}; + +void foo(A<int> &a, B<int> &b) { + (void)C{b}; + (void)C{a}; +} + +template<typename T> struct X { + X(std::initializer_list<T>) = delete; + X(const X&); +}; + +template <class T> struct D : X<T> {}; + +void bar(D<int>& d) { + (void)X{d}; +} +} + #else // expected-no-diagnostics Index: clang/lib/Sema/SemaInit.cpp =================================================================== --- clang/lib/Sema/SemaInit.cpp +++ clang/lib/Sema/SemaInit.cpp @@ -9130,6 +9130,7 @@ Expr *E = ListInit->getInit(0); auto *RD = E->getType()->getAsCXXRecordDecl(); if (!isa<InitListExpr>(E) && RD && + isCompleteType(Kind.getLocation(), E->getType()) && isOrIsDerivedFromSpecializationOf(RD, Template)) TryListConstructors = false; }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits