> C/C++ empty arrays (int a[0]) now use a signed TYPE_DOMAIN with bounds [0,
> -1] for example (that was my original motivation to make hopefully all of
> the middle-end
> work with ssizetype TYPE_DOMAINs at least). The tree.c range-type build
> helpers accept all integral types now (but most FEs use sizetype or
> ssizetype).
Using ssizetype in Ada would already be a net progress, I'll investigate.
> ISTR also doing some Ada adjustments but they may have been dumped for
> "interesting" changes to stor-layout.c instead:
>
> /* ??? When it is obvious that the range is signed
> represent it using ssizetype. */
> if (TREE_CODE (lb) == INTEGER_CST
> && TREE_CODE (ub) == INTEGER_CST
> && TYPE_UNSIGNED (TREE_TYPE (lb))
> && tree_int_cst_lt (ub, lb))
> {
> lb = wide_int_to_tree (ssizetype,
> offset_int::from (lb, SIGNED));
> ub = wide_int_to_tree (ssizetype,
> offset_int::from (ub, SIGNED));
> }
> length
> = fold_convert (sizetype,
> size_binop (PLUS_EXPR,
> build_int_cst (TREE_TYPE (lb),
> 1), size_binop (MINUS_EXPR, ub, lb))); }
>
> /* ??? We have no way to distinguish a null-sized array from an
> array spanning the whole sizetype range, so we arbitrarily
> decide that [0, -1] is the only valid representation. */
> if (integer_zerop (length)
> && TREE_OVERFLOW (length)
> && integer_zerop (lb))
> length = size_zero_node;
IIRC the first one is yours and the second one is mine. :-) But, yes, they
clearly should go and be replaced by changes in gigi.
--
Eric Botcazou