https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101062

--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
--- gcc/expr.c.jj       2021-06-14 12:27:02.000000000 +0200
+++ gcc/expr.c  2021-06-14 22:18:56.852524237 +0200
@@ -5120,15 +5120,18 @@ get_bit_range (poly_uint64_pod *bitstart
               poly_int64_pod *bitpos, tree *offset)
 {
   poly_int64 bitoffset;
-  tree field, repr;

   gcc_assert (TREE_CODE (exp) == COMPONENT_REF);

-  field = TREE_OPERAND (exp, 1);
-  repr = DECL_BIT_FIELD_REPRESENTATIVE (field);
-  /* If we do not have a DECL_BIT_FIELD_REPRESENTATIVE there is no
-     need to limit the range we can access.  */
-  if (!repr)
+  tree field = TREE_OPERAND (exp, 1);
+  tree repr = DECL_BIT_FIELD_REPRESENTATIVE (field);
+  tree type = TREE_TYPE (TREE_OPERAND (exp, 0));
+  /* If we do not have a DECL_BIT_FIELD_REPRESENTATIVE (except for bitfields
+     in unions) there is no need to limit the range we can access.  */
+  if (!repr
+      && (TREE_CODE (type) != UNION_TYPE
+          || !TYPE_SIZE (type)
+         || !tree_fits_poly_uint64_p (TYPE_SIZE (type))))
     {
       *bitstart = *bitend = 0;
       return;
@@ -5153,6 +5156,14 @@ get_bit_range (poly_uint64_pod *bitstart
        }
     }

+  /* For bitfields in unions, return bitsize of the whole union.  */
+  if (!repr)
+    {
+      *bitstart = *bitpos;
+      *bitend = *bitstart + tree_to_poly_uint64 (TYPE_SIZE (type)) - 1;
+      return;
+    }
+
   /* Compute the adjustment to bitpos from the offset of the field
      relative to the representative.  DECL_FIELD_OFFSET of field and
      repr are the same by construction if they are not constants,

fixes it for me.

Reply via email to