From c754ffcc4c79086eb49f534db5d353a8041a9c12 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 21 Feb 2014 16:53:46 -0500 Subject: re PR c++/60185 (ICE with invalid default parameter) PR c++/60185 * parser.c (cp_parser_default_argument): Clear current_class_ptr/current_class_ref like tsubst_default_argument. From-SVN: r208029 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/parser.c | 16 ++++++++++++++++ gcc/testsuite/g++.dg/overload/defarg5.C | 4 ++-- gcc/testsuite/g++.dg/template/defarg17.C | 9 +++++++++ 4 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/defarg17.C (limited to 'gcc') diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index dd926da..ceecb8a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2014-02-21 Jason Merrill + PR c++/60185 + * parser.c (cp_parser_default_argument): Clear + current_class_ptr/current_class_ref like tsubst_default_argument. + PR c++/60252 * lambda.c (maybe_resolve_dummy): Check lambda_function rather than current_binding_level. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 7bbdf90..47a67c4 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -18633,8 +18633,24 @@ cp_parser_default_argument (cp_parser *parser, bool template_parm_p) /* Parse the assignment-expression. */ if (template_parm_p) push_deferring_access_checks (dk_no_deferred); + tree saved_class_ptr = NULL_TREE; + tree saved_class_ref = NULL_TREE; + /* The "this" pointer is not valid in a default argument. */ + if (cfun) + { + saved_class_ptr = current_class_ptr; + cp_function_chain->x_current_class_ptr = NULL_TREE; + saved_class_ref = current_class_ref; + cp_function_chain->x_current_class_ref = NULL_TREE; + } default_argument = cp_parser_initializer (parser, &is_direct_init, &non_constant_p); + /* Restore the "this" pointer. */ + if (cfun) + { + cp_function_chain->x_current_class_ptr = saved_class_ptr; + cp_function_chain->x_current_class_ref = saved_class_ref; + } if (BRACE_ENCLOSED_INITIALIZER_P (default_argument)) maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS); if (template_parm_p) diff --git a/gcc/testsuite/g++.dg/overload/defarg5.C b/gcc/testsuite/g++.dg/overload/defarg5.C index 06ea6bf..d022b0c 100644 --- a/gcc/testsuite/g++.dg/overload/defarg5.C +++ b/gcc/testsuite/g++.dg/overload/defarg5.C @@ -2,6 +2,6 @@ struct A { - int i; - A() { void foo(int=i); } // { dg-error "this" } + int i; // { dg-message "" } + A() { void foo(int=i); } // { dg-error "" } }; diff --git a/gcc/testsuite/g++.dg/template/defarg17.C b/gcc/testsuite/g++.dg/template/defarg17.C new file mode 100644 index 0000000..38d68d4 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/defarg17.C @@ -0,0 +1,9 @@ +// PR c++/60185 + +template struct A +{ + int i; // { dg-message "" } + A() { void foo(int=i); } // { dg-error "" } +}; + +A<0> a; -- cgit v1.1