This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug middle-end/56474] [4.8 regression] bogus Storage_Error raised for record containing empty zero-based array
- From: "ebotcazou at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Mon, 04 Mar 2013 11:29:16 +0000
- Subject: [Bug middle-end/56474] [4.8 regression] bogus Storage_Error raised for record containing empty zero-based array
- Auto-submitted: auto-generated
- References: <bug-56474-4@http.gcc.gnu.org/bugzilla/>
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.