From 200e747f8baa3645a0d745278d1455312dc230d2 Mon Sep 17 00:00:00 2001 From: jason Date: Tue, 30 Aug 2011 04:30:27 +0000 Subject: [PATCH] PR c++/50209 Core DR 994 * parser.c (cp_parser_default_argument): Use cp_parser_initializer_clause. (cp_parser_late_parsing_default_args): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@178275 138bc75d-0d04-0410-961f-82ee72b054a4 --- 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 2e0d6ab..d42d89a 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 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 + + 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 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(); +} -- 2.7.4