From: Marc Glisse Date: Thu, 2 Jan 2014 22:30:43 +0000 (+0100) Subject: call.c (convert_like_real): Check complain. X-Git-Tag: releases/gcc-4.9.0~1856 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=1a7630623b2bff751688f7a3a30efb8d254e83c1;p=thirdparty%2Fgcc.git call.c (convert_like_real): Check complain. 2014-01-02 Marc Glisse gcc/cp/ * call.c (convert_like_real): Check complain. gcc/testsuite/ * g++.dg/cpp0x/initlist-explicit-sfinae.C: New file. From-SVN: r206302 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 01a01ab8c43c..97e2d74c32b0 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,7 @@ +2014-01-02 Marc Glisse + + * call.c (convert_like_real): Check complain. + 2014-01-02 Marc Glisse PR c++/59378 diff --git a/gcc/cp/call.c b/gcc/cp/call.c index f9c566d6401f..bff987140574 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -5934,6 +5934,8 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum, && !(BRACE_ENCLOSED_INITIALIZER_P (expr) && CONSTRUCTOR_IS_DIRECT_INIT (expr))) { + if (!(complain & tf_error)) + return error_mark_node; error ("converting to %qT from initializer list would use " "explicit constructor %qD", totype, convfn); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fad02af88de2..12036de0e988 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2014-01-02 Marc Glisse + + * g++.dg/cpp0x/initlist-explicit-sfinae.C: New file. + 2014-01-02 Marc Glisse PR c++/59378 diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-explicit-sfinae.C b/gcc/testsuite/g++.dg/cpp0x/initlist-explicit-sfinae.C new file mode 100644 index 000000000000..a2ced71a75ec --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist-explicit-sfinae.C @@ -0,0 +1,47 @@ +// { dg-do compile } +// { dg-options -std=c++11 } +template +_Tp&& declval() noexcept; + +template +struct bt { + static constexpr bool value = b; +}; + +template +class my_is_convertible_many { + private: + template + struct indirector { + indirector(To); + }; + + template + struct tag {}; + + template + static auto test(tag) + -> decltype(indirector({declval()...}), bt()); + static auto test(...) + -> bt; + + public: + static constexpr bool value = decltype(test(tag()))::value; +}; + +struct A {}; +struct B {}; +struct C {}; + +struct Test { + Test(A, A); + //Test(B, B); + explicit Test(C, C); +}; + +int main() { + static_assert(my_is_convertible_many::value,""); // true, correct + static_assert(!my_is_convertible_many::value,""); // false, correct + static_assert(!my_is_convertible_many::value,""); // error + return 0; +}