expr.c (expand_expr_real_1): Always return 0 for the extraction of a bit-field of...
authorEric Botcazou <ebotcazou@adacore.com>
Tue, 10 Dec 2013 11:07:28 +0000 (11:07 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 10 Dec 2013 11:07:28 +0000 (11:07 +0000)
* expr.c (expand_expr_real_1) <normal_inner_ref>: Always return 0 for
the extraction of a bit-field of null size.

From-SVN: r205855

gcc/ChangeLog
gcc/expr.c

index 110c0a0..73f2974 100644 (file)
@@ -1,3 +1,8 @@
+2013-12-10  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * expr.c (expand_expr_real_1) <normal_inner_ref>: Always return 0 for
+       the extraction of a bit-field of null size.
+
 2013-12-10  Marek Polacek  <polacek@redhat.com>
 
        PR sanitizer/59437
index f173d03..19df9dc 100644 (file)
@@ -10157,6 +10157,8 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
                if (target == 0)
                  target = assign_temp (type, 1, 1);
 
+               /* ??? Unlike the similar test a few lines below, this one is
+                  very likely obsolete.  */
                if (bitsize == 0)
                  return target;
 
@@ -10177,6 +10179,13 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
                return target;
              }
 
+           /* If we have nothing to extract, the result will be 0 for targets
+              with SHIFT_COUNT_TRUNCATED == 0 and garbage otherwise.  Always
+              return 0 for the sake of consistency, as reading a zero-sized
+              bitfield is valid in Ada and the value is fully specified.  */
+           if (bitsize == 0)
+             return const0_rtx;
+
            op0 = validize_mem (op0);
 
            if (MEM_P (op0) && REG_P (XEXP (op0, 0)))