diff mbox

C++ PATCH for c++/50209 (DR 994, allow initializer-list default args)

Message ID 4E5C66C1.6050003@redhat.com
State New
Headers show

Commit Message

Jason Merrill Aug. 30, 2011, 4:27 a.m. UTC
DR 994 added default arguments to the set of places that a 
brace-enclosed initializer list can appear in C++11.  This patch 
implements that.

Tested x86_64-pc-linux-gnu, applying to trunk.
diff mbox

Patch

commit 5ba9be05f72a270674e434e447d50c4b8f6d30f8
Author: Jason Merrill <jason@redhat.com>
Date:   Mon Aug 29 00:54:22 2011 -0400

    	PR c++/50209
    	Core DR 994
    	* parser.c (cp_parser_default_argument): Use
    	cp_parser_initializer_clause.
    	(cp_parser_late_parsing_default_args): Likewise.

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/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();
+}