diff options
author | Jason Merrill <jason@redhat.com> | 2014-10-01 13:21:08 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2014-10-01 13:21:08 -0400 |
commit | 662bb4b85ea6f0ccf1871b480554f6197133de1b (patch) | |
tree | 3bfd046542fe98e955bf5aba6a88e70bace92cba | |
parent | a710f1f83caee6e647bebf6b45743b276ac55cbf (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/method.c | 4 | ||||
-rw-r--r-- | gcc/cp/parser.c | 5 | ||||
-rw-r--r-- | gcc/cp/pt.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/is_trivially_constructible3.C | 8 |
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>(); |