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
This commit is contained in:
Marc Glisse 2014-01-02 23:30:43 +01:00 committed by Marc Glisse
parent aa118a03c4
commit 1a7630623b
4 changed files with 57 additions and 0 deletions

View File

@ -1,3 +1,7 @@
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

View File

@ -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);
}

View File

@ -1,3 +1,7 @@
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

View File

@ -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;
}