These two patches try to fix handling of zero-precision integer types (created by struct { int : 0; };). Currently they get assigned TYPE_MIN/MAX_VALUEs but clearly a zero-precision integer type does not have a single valid value. Of course for these nothing should look at TYPE_MIN/MAX_VALUE you'd think ... Clearly you are wrong. See the patch below which bootstrapped and tested on x86_64-unknown-linux-gnu for all languages in the attempt to apply the 2nd patch (still testing).
Objections? Thanks, Richard. Index: gcc/stor-layout.c =================================================================== --- gcc/stor-layout.c (revision 203744) +++ gcc/stor-layout.c (working copy) @@ -2054,7 +2054,7 @@ layout_type (tree type) case BOOLEAN_TYPE: /* Used for Java, Pascal, and Chill. */ if (TYPE_PRECISION (type) == 0) - TYPE_PRECISION (type) = 1; /* default to one byte/boolean. */ + gcc_unreachable (); /* ... fall through ... */ @@ -2062,7 +2062,7 @@ layout_type (tree type) case ENUMERAL_TYPE: if (TREE_CODE (TYPE_MIN_VALUE (type)) == INTEGER_CST && tree_int_cst_sgn (TYPE_MIN_VALUE (type)) >= 0) - TYPE_UNSIGNED (type) = 1; + gcc_assert (TYPE_UNSIGNED (type)); SET_TYPE_MODE (type, smallest_mode_for_size (TYPE_PRECISION (type), MODE_INT)); 2013-10-17 Richard Biener <rguent...@suse.de> * stor-layout.c (layout_type): Do not change TYPE_PRECISION or TYPE_UNSIGNED of integral types. (set_min_and_max_values_for_integral_type): Leave TYPE_MIN/MAX_VALUE NULL_TREE for zero-precision integral types. Index: gcc/stor-layout.c =================================================================== --- gcc/stor-layout.c (revision 203744) +++ gcc/stor-layout.c (working copy) @@ -2052,18 +2052,9 @@ layout_type (tree type) of the language-specific code. */ gcc_unreachable (); - case BOOLEAN_TYPE: /* Used for Java, Pascal, and Chill. */ - if (TYPE_PRECISION (type) == 0) - TYPE_PRECISION (type) = 1; /* default to one byte/boolean. */ - - /* ... fall through ... */ - + case BOOLEAN_TYPE: case INTEGER_TYPE: case ENUMERAL_TYPE: - if (TREE_CODE (TYPE_MIN_VALUE (type)) == INTEGER_CST - && tree_int_cst_sgn (TYPE_MIN_VALUE (type)) >= 0) - TYPE_UNSIGNED (type) = 1; - SET_TYPE_MODE (type, smallest_mode_for_size (TYPE_PRECISION (type), MODE_INT)); TYPE_SIZE (type) = bitsize_int (GET_MODE_BITSIZE (TYPE_MODE (type))); @@ -2520,6 +2511,12 @@ set_min_and_max_values_for_integral_type tree min_value; tree max_value; + /* For bitfields with zero width we end up creating integer types + with zero precision. Don't assign any minimum/maximum values + to those types, they don't have any valid value. */ + if (precision < 1) + return; + if (is_unsigned) { min_value = build_int_cst (type, 0);