Blame SOURCES/gcc32-c++-pass-by-invisible-ref.patch

6f1b0c
2004-12-01  Alexandre Oliva  <aoliva@redhat.com>
6f1b0c
6f1b0c
	* calls.c (initialize_argument_information): Treat NOP_EXPR
6f1b0c
	of TARGET_EXPR the same as TARGET_EXPR itself.
6f1b0c
6f1b0c
2005-01-03  Jakub Jelinek  <jakub@redhat.com>
6f1b0c
6f1b0c
	* g++.dg/other/destruct1.C: New test.
6f1b0c
6f1b0c
--- gcc/calls.c.jj	2003-09-16 16:57:44.000000000 +0200
6f1b0c
+++ gcc/calls.c	2005-01-03 11:00:11.604022891 +0100
6f1b0c
@@ -1239,7 +1239,10 @@ initialize_argument_information (num_act
6f1b0c
 					   args[i].tree_value);
6f1b0c
 	      type = build_pointer_type (type);
6f1b0c
 	    }
6f1b0c
-	  else if (TREE_CODE (args[i].tree_value) == TARGET_EXPR)
6f1b0c
+	  else if (TREE_CODE (args[i].tree_value) == TARGET_EXPR
6f1b0c
+		   || (TREE_CODE (args[i].tree_value) == NOP_EXPR
6f1b0c
+		       && (TREE_CODE (TREE_OPERAND (args[i].tree_value, 0))
6f1b0c
+			   == TARGET_EXPR)))
6f1b0c
 	    {
6f1b0c
 	      /* In the V3 C++ ABI, parameters are destroyed in the caller.
6f1b0c
 		 We implement this by passing the address of the temporary
6f1b0c
--- gcc/testsuite/g++.dg/other/destruct1.C.jj	2005-01-03 11:02:26.440730539 +0100
6f1b0c
+++ gcc/testsuite/g++.dg/other/destruct1.C	2005-01-03 11:02:44.971392180 +0100
6f1b0c
@@ -0,0 +1,41 @@
6f1b0c
+// { dg-do run }
6f1b0c
+
6f1b0c
+int i, j, k;
6f1b0c
+extern "C" void abort ();
6f1b0c
+
6f1b0c
+struct S
6f1b0c
+{
6f1b0c
+  S () { ++i; }
6f1b0c
+  S (const S &x) { ++k; }
6f1b0c
+  S &operator= (const S &x) { abort (); return *this; }
6f1b0c
+  ~S () { ++j; }
6f1b0c
+};
6f1b0c
+
6f1b0c
+const S foo ()
6f1b0c
+{
6f1b0c
+  S s;
6f1b0c
+  return s;
6f1b0c
+}
6f1b0c
+
6f1b0c
+S bar (S x)
6f1b0c
+{
6f1b0c
+  return S ();
6f1b0c
+}
6f1b0c
+
6f1b0c
+S baz (S x)
6f1b0c
+{
6f1b0c
+  return x;
6f1b0c
+}
6f1b0c
+
6f1b0c
+void test ()
6f1b0c
+{
6f1b0c
+  S a = bar (foo ());
6f1b0c
+  S b = baz (foo ());
6f1b0c
+}
6f1b0c
+
6f1b0c
+int main ()
6f1b0c
+{
6f1b0c
+  test ();
6f1b0c
+  if (i != 3 || j != 4 || k != 1)
6f1b0c
+    abort ();
6f1b0c
+}