>
> IMHO it was always wrong/fragile for backends to look at the actual arguments
> to
> decide on the calling convention. The backends should _solely_ rely on
> gimple_call_fntype and its TYPE_ARG_TYPES here.
>
> Of course then there are varargs ... (not sure if we hit this here).
Yep, you have varargs and K&R prototypes, so it can't work this way.
>
> But yes, the VIEW_CONVERT "stripping" is a bit fragile and I don't remember
> what exactly we gain from it (when not done on registers).
I guess gain is really limited to Ada - there are very few cases we do VCE
otherwise.
(I think we could do more of them). We can make useless_type_conversion
NOP/CONVERT
only. That in fact makes quite a sense because those are types with gimple
operations
on it. Perhaps also VCE on vectors, but not VCE in general.
Honza
>
> But I also don't see where we do the stripping mentioned on memory references.
> The match.pd pattern doesn't apply to memory, only in the GENERIC path
> which is guarded with exact type equality. So I can't see where we end up
> stripping the V_C_E.
>
> There is one bogus case still in fold-const.c:
>
> case VIEW_CONVERT_EXPR:
> if (TREE_CODE (op0) == MEM_REF)
> /* ??? Bogus for aligned types. */
> return fold_build2_loc (loc, MEM_REF, type,
> TREE_OPERAND (op0, 0), TREE_OPERAND (op0, 1));
>
> return NULL_TREE;
>
> that comment is only in my local tree ... (we lose alignment info that is
> on the original MEM_REF type which may be a smaller one).
>
> Richard.
>
> > Honza
> >>
> >>
> >> * gnat.dg/discr44.adb: New test.
> >>
> >> --
> >> Eric Botcazou
> >
> >> -- { dg-do run }
> >> -- { dg-options "-gnatws" }
> >>
> >> procedure Discr44 is
> >>
> >> function Ident (I : Integer) return Integer is
> >> begin
> >> return I;
> >> end;
> >>
> >> type Int is range 1 .. 10;
> >>
> >> type Str is array (Int range <>) of Character;
> >>
> >> type Parent (D1, D2 : Int; B : Boolean) is record
> >> S : Str (D1 .. D2);
> >> end record;
> >>
> >> type Derived (D : Int) is new Parent (D1 => D, D2 => D, B => False);
> >>
> >> X1 : Derived (D => Int (Ident (7)));
> >>
> >> begin
> >> if X1.D /= 7 then
> >> raise Program_Error;
> >> end if;
> >> end;
> >