aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/call.c2
-rw-r--r--gcc/testsuite/g++.old-deja/g++.other/dtor11.C34
3 files changed, 39 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 88f8c8d..635105c 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,9 @@
2000-10-22 Mark Mitchell <mark@codesourcery.com>
+ * 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 af79984..c31333e 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 0000000..ffb7c5a
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.other/dtor11.C
@@ -0,0 +1,34 @@
+// Origin: Mark Mitchell <mark@codesourcery.com>
+
+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);
+}