diff options
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/slice2.adb | 13 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/slice2.ads | 14 | ||||
-rw-r--r-- | gcc/tree-sra.c | 4 |
5 files changed, 37 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2e4a1907503..99d4f89697d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2007-09-19 Eric Botcazou <ebotcazou@adacore.com> + + * tree-sra.c (decide_block_copy): Decide if there are groups. + 2007-09-19 Roman Zippel <zippel@linux-m68k.org> * config/m68k/m68k.c (output_move_himode): Remove jump table diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 36d6ceef2d2..b36320df6ea 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2007-09-19 Eric Botcazou <ebotcazou@adacore.com> + + * gnat.dg/slice2.ad[sb]: New testcase. + 2007-09-19 Nick Clifton <nickc@redhat.com> * gcc.dg/cpp/assert4.c: Fix expected h8300 preprocessor define. diff --git a/gcc/testsuite/gnat.dg/slice2.adb b/gcc/testsuite/gnat.dg/slice2.adb new file mode 100644 index 00000000000..ab73074313e --- /dev/null +++ b/gcc/testsuite/gnat.dg/slice2.adb @@ -0,0 +1,13 @@ +-- { dg-do compile }
+-- { dg-options "-O" }
+
+package body Slice2 is
+
+ function F (I : R1) return R2 is
+ Val : R2;
+ begin
+ Val.Text (1 .. 8) := I.Text (1 .. 8);
+ return Val;
+ end F;
+
+end Slice2;
diff --git a/gcc/testsuite/gnat.dg/slice2.ads b/gcc/testsuite/gnat.dg/slice2.ads new file mode 100644 index 00000000000..f1b8674fb8e --- /dev/null +++ b/gcc/testsuite/gnat.dg/slice2.ads @@ -0,0 +1,14 @@ +package Slice2 is
+
+ type R1 is record
+ Text : String (1 .. 30);
+ end record;
+
+ type R2 is record
+ Text : String (1 .. 8);
+ B : Boolean := True;
+ end record;
+
+ function F (I : R1) return R2;
+
+end Slice2;
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index 4a3924b6a64..b1d2acc3019 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -1491,8 +1491,8 @@ decide_block_copy (struct sra_elt *elt) return false; } - /* Don't decide if we've no uses. */ - if (elt->n_uses == 0 && elt->n_copies == 0) + /* Don't decide if we've no uses and no groups. */ + if (elt->n_uses == 0 && elt->n_copies == 0 && elt->groups == NULL) ; else if (!elt->is_scalar) |