re PR c++/63362 (The c++11 triviality-traits need front-end help)
authorJason Merrill <jason@redhat.com>
Wed, 1 Oct 2014 17:21:08 +0000 (13:21 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 1 Oct 2014 17:21:08 +0000 (13:21 -0400)
PR c++/63362
* method.c (constructible_expr): Handle value-init of non-class.
* parser.c (cp_parser_trait_expr): Allow pack expansion.
* pt.c (tsubst_copy_and_build): Handle pack expansion.

From-SVN: r215772

gcc/cp/ChangeLog
gcc/cp/method.c
gcc/cp/parser.c
gcc/cp/pt.c
gcc/testsuite/g++.dg/ext/is_trivially_constructible3.C [new file with mode: 0644]

index 9a9fc34256945f775f4ff46fc0ad48cdfd5b8b25..a3cfa05e23d19bb7c0c6741f2545a6e7f8e1b912 100644 (file)
@@ -1,5 +1,10 @@
 2014-10-01  Jason Merrill  <jason@redhat.com>
 
+       PR c++/63362
+       * method.c (constructible_expr): Handle value-init of non-class.
+       * parser.c (cp_parser_trait_expr): Allow pack expansion.
+       * pt.c (tsubst_copy_and_build): Handle pack expansion.
+
        PR c++/63362
        * class.c (type_has_non_user_provided_default_constructor): Rename
        from type_has_user_provided_default_constructor, reverse sense.
index 9a2bd0f1055c8561f9640ab52228bd5c3748d345..882898658ddcbde84e6ad1afc6b39c7781845ce7 100644 (file)
@@ -1077,7 +1077,9 @@ constructible_expr (tree to, tree from)
     }
   else
     {
-      if (TREE_CHAIN (from))
+      if (from == NULL_TREE)
+       return build_value_init (to, tf_none);
+      else if (TREE_CHAIN (from))
        return error_mark_node; // too many initializers
       from = build_stub_object (TREE_VALUE (from));
       expr = perform_direct_initialization_if_possible (to, from,
index e4aaf53fa6c8759cd6efbcd0012135b1cf35540d..01b2fadfe0176ec0417c5db78dfddc989f077cc4 100644 (file)
@@ -8780,6 +8780,11 @@ cp_parser_trait_expr (cp_parser* parser, enum rid keyword)
        {
          cp_lexer_consume_token (parser->lexer);
          tree elt = cp_parser_type_id (parser);
+         if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS))
+           {
+             cp_lexer_consume_token (parser->lexer);
+             elt = make_pack_expansion (elt);
+           }
          if (elt == error_mark_node)
            return error_mark_node;
          type2 = tree_cons (NULL_TREE, elt, type2);
index 9dd61f3608baa1e7f37af4b51415cb93221c36cd..f03e74cd514d1c857a4aaea94ffe855b843d2c42 100644 (file)
@@ -15487,7 +15487,9 @@ tsubst_copy_and_build (tree t,
                             complain, in_decl);
 
        tree type2 = TRAIT_EXPR_TYPE2 (t);
-       if (type2)
+       if (type2 && TREE_CODE (type2) == TREE_LIST)
+         type2 = RECUR (type2);
+       else if (type2)
          type2 = tsubst (type2, args, complain, in_decl);
        
        RETURN (finish_trait_expr (TRAIT_EXPR_KIND (t), type1, type2));
diff --git a/gcc/testsuite/g++.dg/ext/is_trivially_constructible3.C b/gcc/testsuite/g++.dg/ext/is_trivially_constructible3.C
new file mode 100644 (file)
index 0000000..02a678a
--- /dev/null
@@ -0,0 +1,8 @@
+// { dg-do compile { target c++11 } }
+
+template <class T, class... Args> void bar() {
+  static_assert(__is_trivially_constructible(T, Args...), "");
+}
+
+template void bar<int>();
+template void bar<int,int>();