From 583ca5a08d1de95538ffdb57c43a0babd1630d51 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Mon, 23 Oct 2000 06:36:37 +0000 Subject: [PATCH] call.c (standard_conversion): Use RVALUE_CONVs for all expressions that satisfy lvalue_p... * call.c (standard_conversion): Use RVALUE_CONVs for all expressions that satisfy lvalue_p, not just those that satisfy real_lvalue_p. From-SVN: r37013 --- gcc/cp/ChangeLog | 4 +++ gcc/cp/call.c | 2 +- gcc/testsuite/g++.old-deja/g++.other/dtor11.C | 34 +++++++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.old-deja/g++.other/dtor11.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 88f8c8dc75d..635105c732f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2000-10-22 Mark Mitchell + * call.c (standard_conversion): Use RVALUE_CONVs for all + expressions that satisfy lvalue_p, not just those that satisfy + real_lvalue_p. + * optimize.c (copy_body_r): Don't treat CALL_EXPRs specially. * typeck.c (c_sizeof): Return an expression of `size_t' type, diff --git a/gcc/cp/call.c b/gcc/cp/call.c index af79984a396..c31333e9608 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -685,7 +685,7 @@ standard_conversion (to, from, expr) fcode = TREE_CODE (from); conv = build_conv (LVALUE_CONV, from, conv); } - else if (fromref || (expr && real_lvalue_p (expr))) + else if (fromref || (expr && lvalue_p (expr))) conv = build_conv (RVALUE_CONV, from, conv); /* Allow conversion between `__complex__' data types */ diff --git a/gcc/testsuite/g++.old-deja/g++.other/dtor11.C b/gcc/testsuite/g++.old-deja/g++.other/dtor11.C new file mode 100644 index 00000000000..ffb7c5a85c4 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.other/dtor11.C @@ -0,0 +1,34 @@ +// Origin: Mark Mitchell + +extern "C" void abort (); + +int j; + +struct S { + S () { ++j; } + S (const S&) { ++j; } + ~S () { + if (--j < 0) + abort (); + } +}; + +struct T { + void g (S) { + }; +}; + +struct U { + int i; + S s; +}; + +U u; + +U f () { return u; } + +int main () +{ + T t; + t.g (f ().s); +}