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 86c6d31605b..ae051b34e8c 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 c167bc4f670..dc1e182c16f 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 a50160189cd..10325d74427 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2008-05-17 Eric Botcazou + + * gnat.dg/bit_packed_array3.adb: New test. + 2008-05-17 Eric Botcazou * gnat.dg/warn4.adb: New test. 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 00000000000..0b121efdc5f --- /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.30.2