From 1a7630623b2bff751688f7a3a30efb8d254e83c1 Mon Sep 17 00:00:00 2001 From: Marc Glisse Date: Thu, 2 Jan 2014 23:30:43 +0100 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 4 ++ gcc/cp/call.c | 2 + gcc/testsuite/ChangeLog | 4 ++ .../g++.dg/cpp0x/initlist-explicit-sfinae.C | 47 ++++++++++++++++++++++ 4 files changed, 57 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp0x/initlist-explicit-sfinae.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 01a01ab..97e2d74 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2014-01-02 Marc Glisse + * call.c (convert_like_real): Check complain. + +2014-01-02 Marc Glisse + PR c++/59378 * typeck.c (build_x_vec_perm_expr): Handle non-dependent arguments in templates. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index f9c566d..bff9871 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 fad02af..12036de 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,9 @@ 2014-01-02 Marc Glisse + * g++.dg/cpp0x/initlist-explicit-sfinae.C: New file. + +2014-01-02 Marc Glisse + PR c++/59378 * g++.dg/ext/pr59378.C: New file. 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 0000000..a2ced71 --- /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; +} -- 2.7.4