From 1e17e15ae532b05910a7fc0c599a01839dd1b032 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Sat, 17 May 2008 13:06:21 +0000 Subject: [PATCH] fold-const.c (fold_unary): Fold the cast into a BIT_AND_EXPR only for an INTEGER_TYPE. * fold-const.c (fold_unary) : Fold the cast into a BIT_AND_EXPR only for an INTEGER_TYPE. From-SVN: r135467 --- gcc/ChangeLog | 6 ++++- gcc/fold-const.c | 3 +-- gcc/testsuite/ChangeLog | 4 +++ gcc/testsuite/gnat.dg/bit_packed_array3.adb | 40 +++++++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gnat.dg/bit_packed_array3.adb diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 86c6d31..ae051b3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2008-05-17 Eric Botcazou + + * fold-const.c (fold_unary) : Fold the cast into + a BIT_AND_EXPR only for an INTEGER_TYPE. + 2008-05-16 David S. Miller * config/sparc/linux.h (NO_PROFILE_COUNTERS): Undef before @@ -23,7 +28,6 @@ (df_simulate_one_insn_backwards): Renamed to df_simulate_one_insn. (df_simulate_one_insn_forwards): Removed. - 2008-05-16 Doug Kwan * real.c (real_to_decimal, real_to_hexadecimal): Distinguish diff --git a/gcc/fold-const.c b/gcc/fold-const.c index c167bc4..dc1e182 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -7864,8 +7864,7 @@ fold_unary (enum tree_code code, tree type, tree op0) /* Convert (T)(x & c) into (T)x & (T)c, if c is an integer constants (if x has signed type, the sign bit cannot be set in c). This folds extension into the BIT_AND_EXPR. */ - if (INTEGRAL_TYPE_P (type) - && TREE_CODE (type) != BOOLEAN_TYPE + if (TREE_CODE (type) == INTEGER_TYPE && TREE_CODE (op0) == BIT_AND_EXPR && TREE_CODE (TREE_OPERAND (op0, 1)) == INTEGER_CST) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a501601..10325d7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,9 @@ 2008-05-17 Eric Botcazou + * gnat.dg/bit_packed_array3.adb: New test. + +2008-05-17 Eric Botcazou + * gnat.dg/warn4.adb: New test. 2008-05-16 Paul Thomas diff --git a/gcc/testsuite/gnat.dg/bit_packed_array3.adb b/gcc/testsuite/gnat.dg/bit_packed_array3.adb new file mode 100644 index 0000000..0b121ef --- /dev/null +++ b/gcc/testsuite/gnat.dg/bit_packed_array3.adb @@ -0,0 +1,40 @@ +-- { dg-do run } +-- { dg-options "-O2 -gnatp" } + +procedure Bit_Packed_Array3 is + + type Bitmap_T is array (1 .. 10) of Boolean; + pragma Pack (Bitmap_T); + + type Maps_T is record + M1 : Bitmap_T; + end record; + pragma Pack (Maps_T); + for Maps_T'Size use 10; + pragma Suppress_Initialization (Maps_T); + + Tmap : constant Bitmap_T := (others => True); + Fmap : constant Bitmap_T := (others => False); + Amap : constant Bitmap_T := + (1 => False, 2 => True, 3 => False, 4 => True, 5 => False, + 6 => True, 7 => False, 8 => True, 9 => False, 10 => True); + + function Some_Maps return Maps_T is + Value : Maps_T := (M1 => Amap); + begin + return Value; + end; + pragma Inline (Some_Maps); + + Maps : Maps_T; +begin + Maps := Some_Maps; + + for I in Maps.M1'Range loop + if (I mod 2 = 0 and then not Maps.M1 (I)) + or else (I mod 2 /= 0 and then Maps.M1 (I)) + then + raise Program_Error; + end if; + end loop; +end; -- 2.7.4