aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorJohn David Anglin <dave.anglin@nrc-cnrc.gc.ca>2004-02-20 23:03:41 +0000
committerJohn David Anglin <danglin@gcc.gnu.org>2004-02-20 23:03:41 +0000
commit7a3e01c4081a6977a86fb44fe0aff6dece8dc44e (patch)
treee693ed8787dca895ea28148e27aa0074435fba6f /gcc/cp
parent0fed9ec7f33237c1fc8e633e6ede8a219672d761 (diff)
downloadgcc-7a3e01c4081a6977a86fb44fe0aff6dece8dc44e.zip
gcc-7a3e01c4081a6977a86fb44fe0aff6dece8dc44e.tar.gz
gcc-7a3e01c4081a6977a86fb44fe0aff6dece8dc44e.tar.bz2
re PR c++/12007 (Multiple inheritance float pass by value fails)
PR c++/12007 * dbxout.c (dbxout_parms): Check that DECL_RTL and DECL_INCOMING_RTL are set for parameters before outputing debugging information. * cp/method.c (use_thunk): Always clone function argument tree. From-SVN: r78192
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/method.c31
2 files changed, 20 insertions, 16 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index b07dcf3..d8f31c3 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2004-02-20 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
+
+ PR c++/12007
+ * method.c (use_thunk): Always clone function argument tree.
+
2004-02-20 Mark Mitchell <mark@codesourcery.com>
PR c++/14199
diff --git a/gcc/cp/method.c b/gcc/cp/method.c
index 802bf1d..bb34d82 100644
--- a/gcc/cp/method.c
+++ b/gcc/cp/method.c
@@ -331,7 +331,7 @@ make_alias_for_thunk (tree function)
void
use_thunk (tree thunk_fndecl, bool emit_p)
{
- tree function, alias;
+ tree a, t, function, alias;
tree virtual_offset;
HOST_WIDE_INT fixed_offset, virtual_value;
bool this_adjusting = DECL_THIS_THUNK_P (thunk_fndecl);
@@ -417,7 +417,20 @@ use_thunk (tree thunk_fndecl, bool emit_p)
/* The back-end expects DECL_INITIAL to contain a BLOCK, so we
create one. */
DECL_INITIAL (thunk_fndecl) = make_node (BLOCK);
- BLOCK_VARS (DECL_INITIAL (thunk_fndecl)) = DECL_ARGUMENTS (thunk_fndecl);
+
+ /* Set up cloned argument trees for the thunk. */
+ t = NULL_TREE;
+ for (a = DECL_ARGUMENTS (function); a; a = TREE_CHAIN (a))
+ {
+ tree x = copy_node (a);
+ TREE_CHAIN (x) = t;
+ DECL_CONTEXT (x) = thunk_fndecl;
+ SET_DECL_RTL (x, NULL_RTX);
+ t = x;
+ }
+ a = nreverse (t);
+ DECL_ARGUMENTS (thunk_fndecl) = a;
+ BLOCK_VARS (DECL_INITIAL (thunk_fndecl)) = a;
if (this_adjusting
&& targetm.asm_out.can_output_mi_thunk (thunk_fndecl, fixed_offset,
@@ -450,24 +463,10 @@ use_thunk (tree thunk_fndecl, bool emit_p)
just makes a call to the real function. Unfortunately, this
doesn't work for varargs. */
- tree a, t;
-
if (varargs_function_p (function))
error ("generic thunk code fails for method `%#D' which uses `...'",
function);
- /* Set up cloned argument trees for the thunk. */
- t = NULL_TREE;
- for (a = DECL_ARGUMENTS (function); a; a = TREE_CHAIN (a))
- {
- tree x = copy_node (a);
- TREE_CHAIN (x) = t;
- DECL_CONTEXT (x) = thunk_fndecl;
- SET_DECL_RTL (x, NULL_RTX);
- t = x;
- }
- a = nreverse (t);
- DECL_ARGUMENTS (thunk_fndecl) = a;
DECL_RESULT (thunk_fndecl) = NULL_TREE;
start_function (NULL_TREE, thunk_fndecl, NULL_TREE, SF_PRE_PARSED);