http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56474
--- Comment #8 from rguenther at suse dot de <rguenther at suse dot de> 2013-03-04 15:12:25 UTC --- On Mon, 4 Mar 2013, ebotcazou at gcc dot gnu.org wrote: > > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56474 > > --- Comment #7 from Eric Botcazou <ebotcazou at gcc dot gnu.org> 2013-03-04 > 11:29:16 UTC --- > > What will the result be used for in this case? The result, usizetype_max, > > is certainly not 0 - 1 == -1 as it is unsigned. > > It's used for the upper bound of variable-sized arrays: > > /* Finally we use (hb >= lb) ? hb : lb - 1 for the upper bound > in all the other cases. Note that, here as well as above, > the condition used in the comparison must be equivalent to > the condition (length != 0). This is relied upon in order > to optimize array comparisons in compare_arrays. */ > else > gnu_high > = build_cond_expr (sizetype, > build_binary_op (GE_EXPR, > boolean_type_node, > gnu_orig_max, > gnu_orig_min), > gnu_max, > size_binop (MINUS_EXPR, gnu_min, > size_one_node)); > > The result wraps around but that's fine; we just don't want the overflow. Hm, if hb < lb - what kind of pair do you expect? The only case where lb - 1 is the "upper bound" (whatever upper bound is for an empty array ...) - isn't lb - 1 always equal to hb in that case, thus are not hb and lb one element apart for empty arrays (length == 0)? So just do ... gnu_high = gnu_orig_max; ? Maybe I'm missign something ... Richard.