diff options
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/pack9.adb | 18 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/pack9.ads | 18 | ||||
-rw-r--r-- | gcc/tree-sra.c | 1 |
5 files changed, 46 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d7e50ad6a1a..d373b1bf314 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2008-05-27 Eric Botcazou <ebotcazou@adacore.com> + + * tree-sra.c (sra_type_can_be_decomposed_p) <RECORD_TYPE>: Make sure + that the bitfield is of integral type before testing its precision. + 2008-05-27 Trevor Smigiel <trevor_smigiel@playstation.sony.com> Sa Liu <saliu@de.ibm.com> diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a34e1a19b56..d1eb120f035 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2008-05-27 Eric Botcazou <ebotcazou@adacore.com> + + * gnat.dg/pack9.ad[sb]: New test. + 2008-05-27 Arnaud Charlet <charlet@adacore.com> * gnat.dg/sync1.ad[sb]: New test. diff --git a/gcc/testsuite/gnat.dg/pack9.adb b/gcc/testsuite/gnat.dg/pack9.adb new file mode 100644 index 00000000000..894ecd6bb06 --- /dev/null +++ b/gcc/testsuite/gnat.dg/pack9.adb @@ -0,0 +1,18 @@ +-- { dg-do compile } +-- { dg-options "-O2 -gnatp -cargs --param sra-max-structure-size=24 --param sra-max-structure-count=6 -fdump-tree-final_cleanup" } + +package body Pack9 is + + procedure Copy (X, Y : R2_Ptr) is + T : R2 := Y.all; + begin + if T.I2 /= Y.I2 then + raise Program_Error; + end if; + X.all := T; + end; + +end Pack9; + +-- { dg-final { scan-tree-dump-not "__gnat_rcheck" "final_cleanup" } } +-- { dg-final { cleanup-tree-dump "final_cleanup" } } diff --git a/gcc/testsuite/gnat.dg/pack9.ads b/gcc/testsuite/gnat.dg/pack9.ads new file mode 100644 index 00000000000..00202a97fa9 --- /dev/null +++ b/gcc/testsuite/gnat.dg/pack9.ads @@ -0,0 +1,18 @@ +package Pack9 is + + type R1 is record + I : Integer; + C : Character; + end record; + + type R2 is record + I1, I2 : Integer; + A : R1; + end record; + pragma Pack(R2); + + type R2_Ptr is access all R2; + + procedure Copy (X, Y : R2_Ptr); + +end Pack9; diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index 9e15f928bf3..244219ffe79 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -268,6 +268,7 @@ sra_type_can_be_decomposed_p (tree type) { /* Reject incorrectly represented bit fields. */ if (DECL_BIT_FIELD (t) + && INTEGRAL_TYPE_P (TREE_TYPE (t)) && (tree_low_cst (DECL_SIZE (t), 1) != TYPE_PRECISION (TREE_TYPE (t)))) goto fail; |