From: hainque Date: Tue, 12 Jun 2007 13:32:27 +0000 (+0000) Subject: * tree-nested.c (convert_local_reference): Handle VIEW_CONVERT_EXPR. X-Git-Url: http://git.sourceforge.jp/view?a=commitdiff_plain;h=528571a4a3b948f6e06e8b23fc9c501de91da1ce;p=pf3gnuchains%2Fgcc-fork.git * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@125646 138bc75d-0d04-0410-961f-82ee72b054a4 --- 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 + + * 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 * 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 + + * gnat.dg/lhs_view_convert.adb: New test. + 2007-06-12 Richard Guenther 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))