From 67437d5b5df323841758f4fecd2ed28f8c1f68a2 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Tue, 9 Dec 1997 07:26:26 +0000 Subject: [PATCH] decl.c (copy_args_p): Handle copy elision for types with virtual bases. * decl.c (copy_args_p): Handle copy elision for types with virtual bases. * call.c (build_over_call): Likewise. From-SVN: r17022 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/call.c | 5 ++++- gcc/cp/decl.c | 3 +++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2b9a24f2435..66df1a76777 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +Mon Dec 8 23:17:13 1997 Jason Merrill + + * decl.c (copy_args_p): Handle copy elision for types with virtual + bases. + * call.c (build_over_call): Likewise. + Sun Dec 7 22:38:12 1997 Mark Mitchell * pt.c (lookup_template_function): Copy the template arguments, diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 827e9040227..64f3a97531d 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -5502,7 +5502,10 @@ build_over_call (fn, convs, args, flags) && copy_args_p (fn)) { tree targ; - arg = TREE_VALUE (TREE_CHAIN (converted_args)); + arg = TREE_CHAIN (converted_args); + if (TYPE_USES_VIRTUAL_BASECLASSES (DECL_CONTEXT (fn))) + arg = TREE_CHAIN (arg); + arg = TREE_VALUE (arg); /* Pull out the real argument, disregarding const-correctness. */ targ = arg; diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 4bcb79c6420..7ece1d33d38 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -10280,6 +10280,9 @@ copy_args_p (d) tree d; { tree t = FUNCTION_ARG_CHAIN (d); + if (DECL_CONSTRUCTOR_P (d) + && TYPE_USES_VIRTUAL_BASECLASSES (DECL_CONTEXT (d))) + t = TREE_CHAIN (t); if (t && TREE_CODE (TREE_VALUE (t)) == REFERENCE_TYPE && (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_VALUE (t))) == DECL_CLASS_CONTEXT (d)) -- 2.30.2