From: Javier Miranda Date: Tue, 31 Dec 2019 13:28:35 +0000 (-0500) Subject: [Ada] CCG: regressions on ACATS c460007, c46013a, cd1009d X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=646204de717040064c18c189e29a32d0d33fd08b;p=gcc.git [Ada] CCG: regressions on ACATS c460007, c46013a, cd1009d 2020-06-02 Javier Miranda gcc/ada/ * exp_ch4.adb (Generate_Temporary): New subprogram of Discrete_Range_Check that generates a temporary to facilitate the C backend the code generation of the unchecked conversion since the size of the source type may differ from the size of the target type. --- diff --git a/gcc/ada/exp_ch4.adb b/gcc/ada/exp_ch4.adb index 0a9ecb8e7c3..2d63f7ee04b 100644 --- a/gcc/ada/exp_ch4.adb +++ b/gcc/ada/exp_ch4.adb @@ -11144,6 +11144,51 @@ package body Exp_Ch4 is Expr : Node_Id; Ityp : Entity_Id; + procedure Generate_Temporary; + -- Generate a temporary to facilitate in the C backend the code + -- generation of the unchecked conversion since the size of the + -- source type may differ from the size of the target type. + + ------------------------ + -- Generate_Temporary -- + ------------------------ + + procedure Generate_Temporary is + begin + if Esize (Etype (Expr)) < Esize (Etype (Ityp)) then + declare + Exp_Type : constant Entity_Id := Ityp; + Def_Id : constant Entity_Id := + Make_Temporary (Loc, 'R', Expr); + E : Node_Id; + Res : Node_Id; + + begin + Set_Is_Internal (Def_Id); + Set_Etype (Def_Id, Exp_Type); + Res := New_Occurrence_Of (Def_Id, Loc); + + E := + Make_Object_Declaration (Loc, + Defining_Identifier => Def_Id, + Object_Definition => New_Occurrence_Of + (Exp_Type, Loc), + Constant_Present => True, + Expression => Relocate_Node (Expr)); + + Set_Assignment_OK (E); + Insert_Action (Expr, E); + + Set_Assignment_OK (Res, Assignment_OK (Expr)); + + Rewrite (Expr, Res); + Analyze_And_Resolve (Expr, Exp_Type); + end; + end if; + end Generate_Temporary; + + -- Start of processing for Discrete_Range_Check + begin -- Nothing to do if conversion was rewritten @@ -11180,6 +11225,13 @@ package body Exp_Ch4 is Ityp := Standard_Integer; end if; + -- Generate a temporary with the large type to facilitate in the C + -- backend the code generation for the unchecked conversion. + + if Modify_Tree_For_C then + Generate_Temporary; + end if; + Set_Do_Range_Check (Expr, False); Rewrite (Expr, Unchecked_Convert_To (Ityp, Expr)); end if;