re PR c++/2781 (bad code generated for reference call with -O2 (regression from 2...
authorNathan Sidwell <nathan@codesourcery.com>
Sun, 20 May 2001 13:41:34 +0000 (13:41 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Sun, 20 May 2001 13:41:34 +0000 (13:41 +0000)
cp:
PR c++/2781
* optimize.c (update_cloned_parm): Copy addressability and other
flags.
testsuite:
* g++.old-deja/g++.other/optimize1.C: New test.

From-SVN: r42344

gcc/cp/ChangeLog
gcc/cp/optimize.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.old-deja/g++.other/optimize1.C [new file with mode: 0644]

index 42d2ae174a5c2ac1476a4e9245eafed18da0bad3..a05a3acea858bb0b4bd26b4a2c268992d88a85e0 100644 (file)
@@ -1,3 +1,9 @@
+2001-05-20  Nathan Sidwell  <nathan@codesourcery.com>
+
+       PR c++/2781
+       * optimize.c (update_cloned_parm): Copy addressability and other
+       flags.
+
 2001-05-20  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
 
        * pt.c (determine_specialization): Ignore artificial functions.
index 5b0298779b73d64a5a339df58994f8d9cc2682e2..b6b03b9423d57edd3912201e1eaa63d06b369fe5 100644 (file)
@@ -1021,12 +1021,19 @@ update_cloned_parm (parm, cloned_parm)
      tree cloned_parm;
 {
   DECL_ABSTRACT_ORIGIN (cloned_parm) = parm;
+
+  /* We may have taken its address. */
+  TREE_ADDRESSABLE (cloned_parm) = TREE_ADDRESSABLE (parm);
+
+  /* The definition might have different constness. */
+  TREE_READONLY (cloned_parm) = TREE_READONLY (parm);
+  
+  TREE_USED (cloned_parm) = TREE_USED (parm);
   
   /* The name may have changed from the declaration. */
   DECL_NAME (cloned_parm) = DECL_NAME (parm);
   DECL_SOURCE_FILE (cloned_parm) = DECL_SOURCE_FILE (parm);
   DECL_SOURCE_LINE (cloned_parm) = DECL_SOURCE_LINE (parm);
-  
 }
 
 /* FN is a function that has a complete body.  Clone the body as
index a39d8cca15c04d503bfb43964c6d5a739ad610aa..79d4f0a763f4e1f84774aa2f1adf5e8a5b92ed49 100644 (file)
@@ -1,3 +1,7 @@
+2001-05-20  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * g++.old-deja/g++.other/optimize1.C: New test.
+
 2001-05-20  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
 
        * g++.old-deja/g++.pt/spec41.C: New test.
diff --git a/gcc/testsuite/g++.old-deja/g++.other/optimize1.C b/gcc/testsuite/g++.old-deja/g++.other/optimize1.C
new file mode 100644 (file)
index 0000000..bff78dc
--- /dev/null
@@ -0,0 +1,70 @@
+// Special g++ Options: -O2
+// 
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 18 May 2001 <nathan@codesourcery.com>
+
+// Bug 2781. We forgot to copy addressability information when
+// cloning.
+
+struct B
+{
+  B(int v1);
+  void Member (int v1);
+  static void Static (int v1);
+};
+
+struct D : B
+{
+  D (int v1);
+};
+
+void xswap(int& x1) ;
+
+int xxx = 0;
+
+B::B(int v1) 
+{
+  xswap(v1);
+  xxx = v1;
+}
+
+void B::Member(int v1) 
+{
+  xswap(v1);
+  xxx = v1;
+}
+
+void B::Static(int v1) 
+{
+  xswap(v1);
+  xxx = v1;
+}
+
+D::D(int v1)
+  : B (v1)
+{
+}
+
+void xswap (int& x1) { x1 = 2; }
+
+int main ()
+{
+  B p (1);
+
+  if (xxx != 2)
+    return 1;
+
+  D q (1);
+  if (xxx != 2)
+    return 2;
+  
+  p.Member (1);
+  if (xxx != 2)
+    return 3;
+
+  p.Static (1);
+  if (xxx != 2)
+    return 4;
+
+  return 0;
+}