diff options
author | Mark Mitchell <mark@codesourcery.com> | 2000-05-24 21:43:42 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2000-05-24 21:43:42 +0000 |
commit | f5e846c84cf16462f139fbe475ef40c477118111 (patch) | |
tree | a2e82baf04352a994fb25663c70965aa05e4b6ac | |
parent | 0d0cd4416983022d5bd65c29b4368069f55684d6 (diff) | |
download | gcc-f5e846c84cf16462f139fbe475ef40c477118111.zip gcc-f5e846c84cf16462f139fbe475ef40c477118111.tar.gz gcc-f5e846c84cf16462f139fbe475ef40c477118111.tar.bz2 |
calls.c (expand_call): Handle cleanups in tail-recursion arguments analagously to cleanups in sibling...
* calls.c (expand_call): Handle cleanups in tail-recursion
arguments analagously to cleanups in sibling calls.
From-SVN: r34143
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/calls.c | 17 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.eh/crash4.C | 14 |
3 files changed, 33 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a832f3e..27b5554 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2000-05-24 Mark Mitchell <mark@codesourcery.com> + + * calls.c (expand_call): Handle cleanups in tail-recursion + arguments analagously to cleanups in sibling calls. + 2000-05-24 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> * simplify-rtx.c: Rename macro SIGN_EXTEND to HWI_SIGN_EXTEND. diff --git a/gcc/calls.c b/gcc/calls.c index 7cf8971..1c2c2ea 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -2400,7 +2400,7 @@ expand_call (exp, target, ignore) break; case 1: /* Mildly unsafe. */ - args[i].tree_value = unsave_expr (args[i].tree_value); + args[i].tree_value = unsave_expr (args[i].tree_value); break; case 2: /* Wildly unsafe. */ @@ -2444,9 +2444,20 @@ expand_call (exp, target, ignore) made until after RTL generation for the entire function is complete. */ start_sequence (); - + /* If expanding any of the arguments creates cleanups, we can't + do a tailcall. So, we'll need to pop the pending cleanups + list. If, however, all goes well, and there are no cleanups + then the call to expand_start_target_temps will have no + effect. */ + expand_start_target_temps (); if (optimize_tail_recursion (actparms, get_last_insn ())) - tail_recursion_insns = get_insns (); + { + if (any_pending_cleanups (1)) + try_tail_call = try_tail_recursion = 0; + else + tail_recursion_insns = get_insns (); + } + expand_end_target_temps (); end_sequence (); /* Restore the original pending stack adjustment for the sibling and diff --git a/gcc/testsuite/g++.old-deja/g++.eh/crash4.C b/gcc/testsuite/g++.old-deja/g++.eh/crash4.C new file mode 100644 index 0000000..573149f --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.eh/crash4.C @@ -0,0 +1,14 @@ +// Build don't link: +// Origin: Nathan Sidwell <nathan@codesourcery.com> +// Special g++ Options: -O2 + +struct A +{ + A (int) { } + ~A () { } + int get () const { return 0; } +}; + +void f (const A &s) { + f (s.get ()); +} |