tree-nested.c (convert_local_reference): Handle VIEW_CONVERT_EXPR.
authorOlivier Hainque <hainque@adacore.com>
Tue, 12 Jun 2007 13:32:27 +0000 (13:32 +0000)
committerOlivier Hainque <hainque@gcc.gnu.org>
Tue, 12 Jun 2007 13:32:27 +0000 (13:32 +0000)
* tree-nested.c (convert_local_reference): Handle VIEW_CONVERT_EXPR.
Request walking the subtrees only, leaving the current is_lhs/val_only
untouched.
(convert_non_local_reference): Likewise.

testsuite/
* gnat.dg/lhs_view_convert.adb: New test.

From-SVN: r125646

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/lhs_view_convert.adb [new file with mode: 0644]
gcc/tree-nested.c

index 19115a8c39d32c2083125cd9c638c4e6bc80d22f..7cb1cf2396cd44f7a2407ec4d0e29023f4b83cca 100644 (file)
@@ -1,3 +1,10 @@
+2007-06-12  Olivier Hainque  <hainque@adacore.com>
+
+       * tree-nested.c (convert_local_reference): Handle VIEW_CONVERT_EXPR.
+       Request walking the subtrees only, leaving the current is_lhs/val_only
+       untouched.
+       (convert_non_local_reference): Likewise.
+       
 2007-06-12  Nathan Sidwell  <nathan@codesourcery.com>
 
        * config/m68k/m68k-devices.def (52221, 52223, 5253): New.
index c2970775bfb9b8a9a291b54878dc630f5a2563a3..7aec66339d3e44dd4615dcca1e0852ff8c2ae7f0 100644 (file)
@@ -1,3 +1,7 @@
+2007-06-12  Olivier Hainque  <hainque@adacore.com>
+
+       * gnat.dg/lhs_view_convert.adb: New test.
+
 2007-06-12  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/15353
diff --git a/gcc/testsuite/gnat.dg/lhs_view_convert.adb b/gcc/testsuite/gnat.dg/lhs_view_convert.adb
new file mode 100644 (file)
index 0000000..e7947f0
--- /dev/null
@@ -0,0 +1,29 @@
+-- { dg-do run }
+-- { dg-options "-gnatp" }
+
+procedure Lhs_View_Convert is
+
+   type Root is tagged record
+      RV : Natural;
+   end record;
+
+   type Derived is new Root with null record;
+
+   Root_Instance : Root := (RV => 1);
+
+   Derived_Instance : Derived;
+
+   procedure Process is
+      X : Natural := Derived_Instance.RV;
+   begin
+      null;
+   end;
+begin
+   Derived_Instance.RV := 2;
+   
+   Root (Derived_Instance) := Root (Root_Instance);
+   
+   if Derived_Instance.RV /= Root_Instance.RV then
+      raise Program_Error;
+   end if;
+end;
index f26c9ba26ad2629a8fd5b182fee325e04f04b083..dbb146d0866f193898a7c0479fa2e87a275c2f34 100644 (file)
@@ -1035,6 +1035,13 @@ convert_nonlocal_reference (tree *tp, int *walk_subtrees, void *data)
       walk_tree (tp, convert_nonlocal_reference, wi, NULL);
       break;
 
+    case VIEW_CONVERT_EXPR:
+      /* Just request to look at the subtrees, leaving val_only and lhs
+        untouched.  This might actually be for !val_only + lhs, in which
+        case we don't want to force a replacement by a temporary.  */
+      *walk_subtrees = 1;
+      break;
+
     case OMP_PARALLEL:
       save_suppress = info->suppress_expansion;
       if (convert_nonlocal_omp_clauses (&OMP_PARALLEL_CLAUSES (t), wi))
@@ -1313,6 +1320,13 @@ convert_local_reference (tree *tp, int *walk_subtrees, void *data)
       wi->val_only = save_val_only;
       break;
 
+    case VIEW_CONVERT_EXPR:
+      /* Just request to look at the subtrees, leaving val_only and lhs
+        untouched.  This might actually be for !val_only + lhs, in which
+        case we don't want to force a replacement by a temporary.  */
+      *walk_subtrees = 1;
+      break;
+
     case OMP_PARALLEL:
       save_suppress = info->suppress_expansion;
       if (convert_local_omp_clauses (&OMP_PARALLEL_CLAUSES (t), wi))