[Ada] Adding support for unsupported type conversion in CCG
authorJavier Miranda <miranda@adacore.com>
Fri, 13 Dec 2019 09:04:43 +0000 (09:04 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Fri, 13 Dec 2019 09:04:43 +0000 (09:04 +0000)
2019-12-13  Javier Miranda  <miranda@adacore.com>

gcc/ada/

* exp_ch4.adb (Expand_N_Unchecked_Type_Conversion): Generate an
extra temporary for cases unsupported by the C backend.

From-SVN: r279356

gcc/ada/ChangeLog
gcc/ada/exp_ch4.adb

index 69176db196a4d9d117e84e790a939be98866b243..dde5372e80f0328a196655e7bab804e0dfe9dae7 100644 (file)
@@ -1,3 +1,8 @@
+2019-12-13  Javier Miranda  <miranda@adacore.com>
+
+       * exp_ch4.adb (Expand_N_Unchecked_Type_Conversion): Generate an
+       extra temporary for cases unsupported by the C backend.
+
 2019-12-13  Steve Baird  <baird@adacore.com>
 
        * einfo.ads: Correct comment for Derived_Type_Link to reflect
index 19558236e0cf5b91d08c3063e8a98829cde5a22a..28d48ab7f8b98ce05a14d73a795d168d8cafded8 100644 (file)
@@ -12471,6 +12471,27 @@ package body Exp_Ch4 is
          end;
       end if;
 
+      --  Generate an extra temporary for cases unsupported by the C backend
+
+      if Modify_Tree_For_C then
+         declare
+            Source     : constant Node_Id := Unqual_Conv (Expression (N));
+            Source_Typ : Entity_Id        := Get_Full_View (Etype (Source));
+
+         begin
+            if Is_Packed_Array (Source_Typ) then
+               Source_Typ := Packed_Array_Impl_Type (Source_Typ);
+            end if;
+
+            if Nkind (Source) = N_Function_Call
+              and then (Is_Composite_Type (Etype (Source))
+                          or else Is_Composite_Type (Target_Type))
+            then
+               Force_Evaluation (Source);
+            end if;
+         end;
+      end if;
+
       --  Nothing to do if conversion is safe
 
       if Safe_Unchecked_Type_Conversion (N) then