summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gnat.dg/slice2.adb13
-rw-r--r--gcc/testsuite/gnat.dg/slice2.ads14
-rw-r--r--gcc/tree-sra.c4
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)