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:
parent
aa118a03c4
commit
1a7630623b
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
47
gcc/testsuite/g++.dg/cpp0x/initlist-explicit-sfinae.C
Normal file
47
gcc/testsuite/g++.dg/cpp0x/initlist-explicit-sfinae.C
Normal 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;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user