]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/44969 ([C++0x] <type_traits> std::is_constructible broken for fundamental...
authorPaolo Carlini <paolo.carlini@oracle.com>
Mon, 19 Jul 2010 10:27:58 +0000 (10:27 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Mon, 19 Jul 2010 10:27:58 +0000 (10:27 +0000)
/cp
2010-07-19  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/44969
* typeck.c (build_x_compound_expr_from_list): Add tsubst_flags_t
parameter.
* cp-tree.h: Adjust declaration.
* init.c (perform_member_init): Adjust caller.
* decl.c (grok_reference_init, cp_finish_decl): Likewise.
* typeck2.c (store_init_value): Likewise.
(build_functional_cast): Pass complain argument to
build_x_compound_expr_from_list.

/testsuite
2010-07-19  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/44969
* g++.dg/template/sfinae23.C: New.

From-SVN: r162303

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/decl.c
gcc/cp/init.c
gcc/cp/typeck.c
gcc/cp/typeck2.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/sfinae23.C [new file with mode: 0644]

index 79598d1d3cda9918c7b3ac2fe8c249f3f089b01e..63d24a2ac1214065a63bf97438b8bdc6a6bef661 100644 (file)
@@ -1,3 +1,15 @@
+2010-07-19  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/44969
+       * typeck.c (build_x_compound_expr_from_list): Add tsubst_flags_t
+       parameter.
+       * cp-tree.h: Adjust declaration.
+       * init.c (perform_member_init): Adjust caller.
+       * decl.c (grok_reference_init, cp_finish_decl): Likewise.
+       * typeck2.c (store_init_value): Likewise.
+       (build_functional_cast): Pass complain argument to
+       build_x_compound_expr_from_list.
+
 2010-07-16  Jason Merrill  <jason@redhat.com>
 
        PR c++/32505
index 13d43da7dbe83a9df87a721f559081e804512a40..155db4ce4a824eabdff5490ae6f4d3548513a271 100644 (file)
@@ -5462,7 +5462,8 @@ extern tree cp_build_unary_op                   (enum tree_code, tree, int,
 extern tree unary_complex_lvalue               (enum tree_code, tree);
 extern tree build_x_conditional_expr           (tree, tree, tree, 
                                                  tsubst_flags_t);
-extern tree build_x_compound_expr_from_list    (tree, expr_list_kind);
+extern tree build_x_compound_expr_from_list    (tree, expr_list_kind,
+                                                tsubst_flags_t);
 extern tree build_x_compound_expr_from_vec     (VEC(tree,gc) *, const char *);
 extern tree build_x_compound_expr              (tree, tree, tsubst_flags_t);
 extern tree build_compound_expr                 (location_t, tree, tree);
index ddc262b22b66b7789c09d3ce2111dcc95844b02f..3aaa20c0ed3823d778cdbcfead1f7b33b2031744 100644 (file)
@@ -4462,7 +4462,8 @@ grok_reference_init (tree decl, tree type, tree init, tree *cleanup)
     }
 
   if (TREE_CODE (init) == TREE_LIST)
-    init = build_x_compound_expr_from_list (init, ELK_INIT);
+    init = build_x_compound_expr_from_list (init, ELK_INIT,
+                                           tf_warning_or_error);
 
   if (TREE_CODE (TREE_TYPE (type)) != ARRAY_TYPE
       && TREE_CODE (TREE_TYPE (init)) == ARRAY_TYPE)
@@ -5683,7 +5684,8 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
          return;
        }
       if (TREE_CODE (init) == TREE_LIST)
-       init = build_x_compound_expr_from_list (init, ELK_INIT);
+       init = build_x_compound_expr_from_list (init, ELK_INIT,
+                                               tf_warning_or_error);
       if (describable_type (init))
        {
          type = TREE_TYPE (decl) = do_auto_deduction (type, init, auto_node);
index 5da8191a8f86618b24f36d16095474bf97740ed5..d796fd0822c00843be465085af2d404979d66c07 100644 (file)
@@ -525,7 +525,8 @@ perform_member_init (tree member, tree init)
       else if (TREE_CODE (init) == TREE_LIST)
        /* There was an explicit member initialization.  Do some work
           in that case.  */
-       init = build_x_compound_expr_from_list (init, ELK_MEM_INIT);
+       init = build_x_compound_expr_from_list (init, ELK_MEM_INIT,
+                                               tf_warning_or_error);
 
       if (init)
        finish_expr_stmt (cp_build_modify_expr (decl, INIT_EXPR, init,
index 12e76497df18962af81d8022e46f7716c9817a41..484d299f4626d76479d1dca08307dee1bbda240a 100644 (file)
@@ -5502,14 +5502,16 @@ build_x_conditional_expr (tree ifexp, tree op1, tree op2,
    that performs them all and returns the value of the last of them.  */
 
 tree
-build_x_compound_expr_from_list (tree list, expr_list_kind exp)
+build_x_compound_expr_from_list (tree list, expr_list_kind exp,
+                                tsubst_flags_t complain)
 {
   tree expr = TREE_VALUE (list);
 
   if (TREE_CHAIN (list))
     {
-      switch (exp)
-       {
+      if (complain & tf_error)
+       switch (exp)
+         {
          case ELK_INIT:
            permerror (input_location, "expression list treated as compound "
                                       "expression in initializer");
@@ -5524,11 +5526,11 @@ build_x_compound_expr_from_list (tree list, expr_list_kind exp)
            break;
          default:
            gcc_unreachable ();
-       }
+         }
 
       for (list = TREE_CHAIN (list); list; list = TREE_CHAIN (list))
        expr = build_x_compound_expr (expr, TREE_VALUE (list), 
-                                      tf_warning_or_error);
+                                      complain);
     }
 
   return expr;
index efe7030dabd2903d3fb4db49157b552f838b7f51..ce83d7c40b726c2bde52f73d82dfb3e63c575f2c 100644 (file)
@@ -737,7 +737,8 @@ store_init_value (tree decl, tree init, int flags)
        }
       else
        /* We get here with code like `int a (2);' */
-       init = build_x_compound_expr_from_list (init, ELK_INIT);
+       init = build_x_compound_expr_from_list (init, ELK_INIT,
+                                               tf_warning_or_error);
     }
 
   /* End of special C++ code.  */
@@ -1594,7 +1595,7 @@ build_functional_cast (tree exp, tree parms, tsubst_flags_t complain)
        return cp_convert (type, integer_zero_node);
 
       /* This must build a C cast.  */
-      parms = build_x_compound_expr_from_list (parms, ELK_FUNC_CAST);
+      parms = build_x_compound_expr_from_list (parms, ELK_FUNC_CAST, complain);
       return cp_build_c_cast (type, parms, complain);
     }
 
index 100d605e9ccd7b99cd70aa28f671d698e5b90214..c898a9eea1bf1df73d15d96253be0e2ce6485544 100644 (file)
@@ -1,3 +1,8 @@
+2010-07-19  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/44969
+       * g++.dg/template/sfinae23.C: New.
+
 2010-07-19  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        * lib/target-supports.exp (check_sse_os_support_available): New
diff --git a/gcc/testsuite/g++.dg/template/sfinae23.C b/gcc/testsuite/g++.dg/template/sfinae23.C
new file mode 100644 (file)
index 0000000..9e0197a
--- /dev/null
@@ -0,0 +1,23 @@
+// PR c++/44969
+// { dg-options "-std=c++0x" }
+
+template<typename Tp, typename... Args>
+  class mini_is_constructible
+  {
+    typedef char one;
+    typedef struct { char arr[2]; } two;
+
+    template<typename Tp1, typename... Args1>
+      static decltype(Tp1(Args1()...), one())
+      test(int);
+
+    template<typename, typename...>
+      static two test(...);
+
+  public:
+    static const bool value = sizeof(test<Tp, Args...>(0)) == 1;
+  };
+
+class A { };
+
+int Test[mini_is_constructible<int, A, A>::value ? -1 : 1];