]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
call.c (convert_like_real): Check complain.
authorMarc Glisse <marc.glisse@inria.fr>
Thu, 2 Jan 2014 22:30:43 +0000 (23:30 +0100)
committerMarc Glisse <glisse@gcc.gnu.org>
Thu, 2 Jan 2014 22:30:43 +0000 (22:30 +0000)
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

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/initlist-explicit-sfinae.C [new file with mode: 0644]

index 01a01ab8c43c88e994b24cdbe9fae2158a5f95f1..97e2d74c32b0320cb3a01d7484c70296f820ed9b 100644 (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
index f9c566d6401fc43c54ea03bcdcada85e447b2653..bff987140574bf01ab20d1e515f1dd85b653812c 100644 (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);
          }
index fad02af88de296e69f86028dd99e09c52465f90f..12036de0e9884c1a0d907fe3d50ac7ded4d5430a 100644 (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
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 (file)
index 0000000..a2ced71
--- /dev/null
@@ -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;
+}