diff options
author | Jason Merrill <jason@redhat.com> | 2009-08-19 13:14:33 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2009-08-19 13:14:33 -0400 |
commit | 595de3023df632cbcdb4e89daf749d3acbcdd748 (patch) | |
tree | 275bb6c8182e33d4221c2ad1e90ddfac0e1309a1 | |
parent | dc0c6451cd5551fe2f1cac817acf62e71ab73423 (diff) | |
download | gcc-595de3023df632cbcdb4e89daf749d3acbcdd748.zip gcc-595de3023df632cbcdb4e89daf749d3acbcdd748.tar.gz gcc-595de3023df632cbcdb4e89daf749d3acbcdd748.tar.bz2 |
re PR c++/41119 (Revision 150805 failed 447.dealII in SPEC CPU 2006)
PR c++/41119
PR c++/41120
* decl2.c (mark_used): Increment function_depth during synthesis.
* parser.c (cp_parser_default_argument): Not here.
From-SVN: r150939
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/decl2.c | 9 | ||||
-rw-r--r-- | gcc/cp/parser.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/other/gc4.C | 14 |
5 files changed, 35 insertions, 8 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 630814a..7112a67 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2009-08-19 Jason Merrill <jason@redhat.com> + + PR c++/41119 + PR c++/41120 + * decl2.c (mark_used): Increment function_depth during synthesis. + * parser.c (cp_parser_default_argument): Not here. + 2009-08-19 Jakub Jelinek <jakub@redhat.com> * method.c (use_thunk): Call free_after_compilation after diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index e4ed963..225cd9d 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -3948,7 +3948,16 @@ mark_used (tree decl) && !DECL_THUNK_P (decl) && ! DECL_INITIAL (decl)) { + /* Synthesizing an implicitly defined member function will result in + garbage collection. We must treat this situation as if we were + within the body of a function so as to avoid collecting live data + on the stack (such as overload resolution candidates). + + ??? Now that inlining is done unit-at-a-time, we ought to defer + synthesis like we do templates. */ + ++function_depth; synthesize_method (decl); + --function_depth; /* If we've already synthesized the method we don't need to do the instantiation test below. */ } diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index e64d0bf..a3e9f0e 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -14615,12 +14615,6 @@ cp_parser_default_argument (cp_parser *parser, bool template_parm_p) appear in a default argument. */ saved_local_variables_forbidden_p = parser->local_variables_forbidden_p; parser->local_variables_forbidden_p = true; - /* The default argument expression may cause implicitly - defined member functions to be synthesized, which will - result in garbage collection. We must treat this - situation as if we were within the body of function so as - to avoid collecting live data on the stack. */ - ++function_depth; /* Parse the assignment-expression. */ if (template_parm_p) push_deferring_access_checks (dk_no_deferred); @@ -14628,8 +14622,6 @@ cp_parser_default_argument (cp_parser *parser, bool template_parm_p) = cp_parser_assignment_expression (parser, /*cast_p=*/false, NULL); if (template_parm_p) pop_deferring_access_checks (); - /* Restore saved state. */ - --function_depth; parser->greater_than_is_operator_p = saved_greater_than_is_operator_p; parser->local_variables_forbidden_p = saved_local_variables_forbidden_p; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e766efc..a292949 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-08-19 Jason Merrill <jason@redhat.com> + + PR c++/41120 + * g++.dg/other/gc4.C: New. + 2009-08-18 Michael Matz <matz@suse.de> * gfortran.dg/vect/vect-gems.f90: New test. diff --git a/gcc/testsuite/g++.dg/other/gc4.C b/gcc/testsuite/g++.dg/other/gc4.C new file mode 100644 index 0000000..50c16b3 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/gc4.C @@ -0,0 +1,14 @@ +// PR c++/41120 +// { dg-options "--param ggc-min-heapsize=0 --param ggc-min-expand=0" } + +struct A +{ + A(); +}; + +struct B +{ + A a; +}; + +B b; |