aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2011-08-30 00:30:27 -0400
committerJason Merrill <jason@gcc.gnu.org>2011-08-30 00:30:27 -0400
commit25dd2fdd4040158f1802913cd8407a77b8d0441b (patch)
tree86ec0f52671506fefa86435571ec1ba88308fa0e
parentf767e2446f6052a91cee171d05dd4f05d97a39a9 (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--gcc/cp/parser.c10
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/initlist58.C17
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();
+}