This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug middle-end/56474] [4.8 regression] bogus Storage_Error raised for record containing empty zero-based array


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.

> Adding kludges like that might work, but I'd rather try to fix callers
> to "ask more intelligent questions".  That is,
> 
> +         /* ??? We make an exception for 0 - 1 because it's an idiom
> +            used in length calculations for zero-based arrays.  */
> +         if (integer_zerop (arg0) && integer_onep (arg1))
> +           overflowable = 1;
> 
> the length of an array is max-index - min-index + 1.  What's the call
> stack of this testcases case triggering the overflow?

Yes, the formula for the upper bound is designed to yield a length of zero if
the upper bound is lower than the lower bound.

size_binop is called from ada/gcc-interface/decl.c:gnat_to_gnu_entity.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]