summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gnat.dg/lhs_view_convert.adb29
-rw-r--r--gcc/tree-nested.c14
4 files changed, 54 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 19115a8c39d..7cb1cf2396c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c2970775bfb..7aec66339d3 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 00000000000..e7947f033d8
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/lhs_view_convert.adb
@@ -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;
diff --git a/gcc/tree-nested.c b/gcc/tree-nested.c
index f26c9ba26ad..dbb146d0866 100644
--- a/gcc/tree-nested.c
+++ b/gcc/tree-nested.c
@@ -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))