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.

Reply via email to