On 3/16/06, Richard Guenther <[EMAIL PROTECTED]> wrote:
> On 3/16/06, Laurent GUERBY <[EMAIL PROTECTED]> wrote:
> > procedure T2 is
> > type R is range 1 .. 10;
> > type T is array (R) of Integer;
> > I : R;
> > X : T;
> > begin
> > X (I) := 0;
> > end T2;
> >
> > The Ada FE will insert an explicit check, as seen when using
> > gcc -c -gnatdg t2.adb:
> >
> > [constraint_error when not (interfaces__unsigned_32!(i) >= 1 and then
> > interfaces__unsigned_32!(i) <= 10) "invalid data"]
> >
> > Will the ME or FE remove the check?
>
> Yes it will - as we see from -O0 -fdump-tree-original:
>
> if ((interfaces__unsigned_32) i == 0 || i > 10)
> {
> __gnat_rcheck_06 ("t2.adb", 7);
> }
> else
> {
>
> }
>
> it uses a regular NOP/CONVERT_EXPR which VRP happily will see through
> (validly so).
> It also misses the conversion for the i>10 check completely. It needs to
> print
>
> if (VIEW_CONVERT_EXPR<interfaces__unsigned_32>(i) == 0
> || VIEW_CONVERT_EXPR<interfaces__unsigned_32>(i) > 10)
>
> So, this is a bug in gigi here.
The above was for 4.1.0 - with mainline gigi now generates
if (i == 0 || i > 10)
{
__gnat_rcheck_06 ("t2.adb", 7);
}
else
{
}
x[(<unnamed type>) (t2__TrB) i]{lb: 1 sz: 4} = 0;
huh? That's even more bogus.
Richard.