+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
&& !(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);
}
--- /dev/null
+// { 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;
+}