aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2008-05-27 11:00:38 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2008-05-27 11:00:38 +0000
commit469dfae932684a783566ae5f1654504fcf8ffd54 (patch)
treed87a910aa92849bb44796633b36b39da56efa712 /gcc
parent3b3c04308eef477c84841ef6090ad28e71315220 (diff)
downloadgcc-469dfae932684a783566ae5f1654504fcf8ffd54.zip
gcc-469dfae932684a783566ae5f1654504fcf8ffd54.tar.gz
gcc-469dfae932684a783566ae5f1654504fcf8ffd54.tar.bz2
tree-sra.c (sra_type_can_be_decomposed_p): Make sure that the bitfield is of integral type before testing its precision.
* tree-sra.c (sra_type_can_be_decomposed_p) <RECORD_TYPE>: Make sure that the bitfield is of integral type before testing its precision. From-SVN: r136009
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gnat.dg/pack9.adb18
-rw-r--r--gcc/testsuite/gnat.dg/pack9.ads18
-rw-r--r--gcc/tree-sra.c1
5 files changed, 46 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d7e50ad..d373b1b 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 a34e1a1..d1eb120 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 0000000..894ecd6
--- /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 0000000..00202a9
--- /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 9e15f92..244219f 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;