aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2014-10-01 13:21:08 -0400
committerJason Merrill <jason@gcc.gnu.org>2014-10-01 13:21:08 -0400
commit662bb4b85ea6f0ccf1871b480554f6197133de1b (patch)
tree3bfd046542fe98e955bf5aba6a88e70bace92cba
parenta710f1f83caee6e647bebf6b45743b276ac55cbf (diff)
downloadgcc-662bb4b85ea6f0ccf1871b480554f6197133de1b.zip
gcc-662bb4b85ea6f0ccf1871b480554f6197133de1b.tar.gz
gcc-662bb4b85ea6f0ccf1871b480554f6197133de1b.tar.bz2
re PR c++/63362 (The c++11 triviality-traits need front-end help)
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
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/method.c4
-rw-r--r--gcc/cp/parser.c5
-rw-r--r--gcc/cp/pt.c4
-rw-r--r--gcc/testsuite/g++.dg/ext/is_trivially_constructible3.C8
5 files changed, 24 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 9a9fc34..a3cfa05 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,6 +1,11 @@
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.
(default_init_uninitialized_part, explain_non_literal_class): Adjust.
diff --git a/gcc/cp/method.c b/gcc/cp/method.c
index 9a2bd0f..8828986 100644
--- a/gcc/cp/method.c
+++ b/gcc/cp/method.c
@@ -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,
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index e4aaf53..01b2fad 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -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);
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 9dd61f3..f03e74c 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -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
index 0000000..02a678a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/is_trivially_constructible3.C
@@ -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>();