]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[Ada] CCG: regressions on ACATS c460007, c46013a, cd1009d
authorJavier Miranda <miranda@adacore.com>
Tue, 31 Dec 2019 13:28:35 +0000 (08:28 -0500)
committerPierre-Marie de Rodat <derodat@adacore.com>
Tue, 2 Jun 2020 08:58:28 +0000 (04:58 -0400)
2020-06-02  Javier Miranda  <miranda@adacore.com>

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.

gcc/ada/exp_ch4.adb

index 0a9ecb8e7c338dd9da00e590e4fc305278b5be2e..2d63f7ee04b1240e1547bc3fc21e6999aed8e44a 100644 (file)
@@ -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;