diff options
author | Jason Merrill <jason@redhat.com> | 2011-08-30 00:30:27 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2011-08-30 00:30:27 -0400 |
commit | 25dd2fdd4040158f1802913cd8407a77b8d0441b (patch) | |
tree | 86ec0f52671506fefa86435571ec1ba88308fa0e | |
parent | f767e2446f6052a91cee171d05dd4f05d97a39a9 (diff) | |
download | gcc-25dd2fdd4040158f1802913cd8407a77b8d0441b.zip gcc-25dd2fdd4040158f1802913cd8407a77b8d0441b.tar.gz gcc-25dd2fdd4040158f1802913cd8407a77b8d0441b.tar.bz2 |
re PR c++/50209 ([C++0x] Braced-init-lists are rejected as function default arguments)
PR c++/50209
Core DR 994
* parser.c (cp_parser_default_argument): Use
cp_parser_initializer_clause.
(cp_parser_late_parsing_default_args): Likewise.
From-SVN: r178275
-rw-r--r-- | gcc/cp/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/parser.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/initlist58.C | 17 |
4 files changed, 39 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2e0d6ab..d42d89a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2011-08-29 Jason Merrill <jason@redhat.com> + + PR c++/50209 + Core DR 994 + * parser.c (cp_parser_default_argument): Use + cp_parser_initializer_clause. + (cp_parser_late_parsing_default_args): Likewise. + 2011-08-26 Jason Merrill <jason@redhat.com> Core DR 342 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 84b8c60..c862a7d 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -16535,6 +16535,7 @@ cp_parser_default_argument (cp_parser *parser, bool template_parm_p) tree default_argument = NULL_TREE; bool saved_greater_than_is_operator_p; bool saved_local_variables_forbidden_p; + bool non_constant_p; /* Make sure that PARSER->GREATER_THAN_IS_OPERATOR_P is set correctly. */ @@ -16548,7 +16549,9 @@ cp_parser_default_argument (cp_parser *parser, bool template_parm_p) if (template_parm_p) push_deferring_access_checks (dk_no_deferred); default_argument - = cp_parser_assignment_expression (parser, /*cast_p=*/false, NULL); + = cp_parser_initializer_clause (parser, &non_constant_p); + if (BRACE_ENCLOSED_INITIALIZER_P (default_argument)) + maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS); if (template_parm_p) pop_deferring_access_checks (); parser->greater_than_is_operator_p = saved_greater_than_is_operator_p; @@ -20731,6 +20734,7 @@ static void cp_parser_late_parsing_default_args (cp_parser *parser, tree fn) { bool saved_local_variables_forbidden_p; + bool non_constant_p; tree parm, parmdecl; /* While we're parsing the default args, we might (due to the @@ -20775,12 +20779,14 @@ cp_parser_late_parsing_default_args (cp_parser *parser, tree fn) start_lambda_scope (parmdecl); /* Parse the assignment-expression. */ - parsed_arg = cp_parser_assignment_expression (parser, /*cast_p=*/false, NULL); + parsed_arg = cp_parser_initializer_clause (parser, &non_constant_p); if (parsed_arg == error_mark_node) { cp_parser_pop_lexer (parser); continue; } + if (BRACE_ENCLOSED_INITIALIZER_P (parsed_arg)) + maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS); if (!processing_template_decl) parsed_arg = check_default_argument (TREE_VALUE (parm), parsed_arg); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 18b19ad..c5208af 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2011-08-29 Jason Merrill <jason@redhat.com> + + Core DR 994 + PR c++/50209 + * g++.dg/cpp0x/initlist58.C: New. + 2011-08-29 Janus Weil <janus@gcc.gnu.org> PR fortran/50225 diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist58.C b/gcc/testsuite/g++.dg/cpp0x/initlist58.C new file mode 100644 index 0000000..dfb9f0c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist58.C @@ -0,0 +1,17 @@ +// PR c++/50209 +// { dg-options -std=c++0x } + +struct S { int i,j; }; + +struct A +{ + static void f (S = {1,2}); +}; + +void f (S = {3,4}); + +int main() +{ + A::f(); + f(); +} |