aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Glisse <marc.glisse@inria.fr>2014-01-02 23:30:43 +0100
committerMarc Glisse <glisse@gcc.gnu.org>2014-01-02 22:30:43 +0000
commit1a7630623b2bff751688f7a3a30efb8d254e83c1 (patch)
tree6b4ed11d3b069db745826d311eee00c9ab22b99f
parentaa118a03c4d04ce703f4b77f1d845d611ffecf50 (diff)
downloadgcc-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/ChangeLog4
-rw-r--r--gcc/cp/call.c2
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/initlist-explicit-sfinae.C47
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;
+}