From 25dd2fdd4040158f1802913cd8407a77b8d0441b Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Tue, 30 Aug 2011 00:30:27 -0400 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 8 ++++++++ gcc/cp/parser.c | 10 ++++++++-- gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/g++.dg/cpp0x/initlist58.C | 17 +++++++++++++++++ 4 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/initlist58.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2e0d6ab9305..d42d89a0a87 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2011-08-29 Jason Merrill + + 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 Core DR 342 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 84b8c608f95..c862a7d0e88 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 18b19adc581..c5208afe0e0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2011-08-29 Jason Merrill + + Core DR 994 + PR c++/50209 + * g++.dg/cpp0x/initlist58.C: New. + 2011-08-29 Janus Weil 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 00000000000..dfb9f0cd508 --- /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(); +}