diff options
author | Marc Glisse <marc.glisse@inria.fr> | 2014-01-02 23:30:43 +0100 |
---|---|---|
committer | Marc Glisse <glisse@gcc.gnu.org> | 2014-01-02 22:30:43 +0000 |
commit | 1a7630623b2bff751688f7a3a30efb8d254e83c1 (patch) | |
tree | 6b4ed11d3b069db745826d311eee00c9ab22b99f | |
parent | aa118a03c4d04ce703f4b77f1d845d611ffecf50 (diff) | |
download | gcc-1a7630623b2bff751688f7a3a30efb8d254e83c1.zip gcc-1a7630623b2bff751688f7a3a30efb8d254e83c1.tar.gz gcc-1a7630623b2bff751688f7a3a30efb8d254e83c1.tar.bz2 |
call.c (convert_like_real): Check complain.
2014-01-02 Marc Glisse <marc.glisse@inria.fr>
gcc/cp/
* call.c (convert_like_real): Check complain.
gcc/testsuite/
* g++.dg/cpp0x/initlist-explicit-sfinae.C: New file.
From-SVN: r206302
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/call.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/initlist-explicit-sfinae.C | 47 |
4 files changed, 57 insertions, 0 deletions
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 <marc.glisse@inria.fr> + * call.c (convert_like_real): Check complain. + +2014-01-02 Marc Glisse <marc.glisse@inria.fr> + 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 <marc.glisse@inria.fr> + * g++.dg/cpp0x/initlist-explicit-sfinae.C: New file. + +2014-01-02 Marc Glisse <marc.glisse@inria.fr> + 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<typename _Tp> +_Tp&& declval() noexcept; + +template<bool b> +struct bt { + static constexpr bool value = b; +}; + +template <typename To_, typename... From_> +class my_is_convertible_many { + private: + template <typename To> + struct indirector { + indirector(To); + }; + + template <typename To, typename... From> + struct tag {}; + + template <typename To, typename... From> + static auto test(tag<To, From...>) + -> decltype(indirector<To>({declval<From>()...}), bt<true>()); + static auto test(...) + -> bt<false>; + + public: + static constexpr bool value = decltype(test(tag<To_, From_...>()))::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<Test, A, A>::value,""); // true, correct + static_assert(!my_is_convertible_many<Test, B, B>::value,""); // false, correct + static_assert(!my_is_convertible_many<Test, C, C>::value,""); // error + return 0; +} |