From 02458cc74236718edd74f3d4bd6cc259ebbba5ca Mon Sep 17 00:00:00 2001 From: Javier Miranda Date: Fri, 13 Dec 2019 09:04:43 +0000 Subject: [PATCH] [Ada] Adding support for unsupported type conversion in CCG 2019-12-13 Javier Miranda 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 | 5 +++++ gcc/ada/exp_ch4.adb | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 69176db196a..dde5372e80f 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2019-12-13 Javier Miranda + + * exp_ch4.adb (Expand_N_Unchecked_Type_Conversion): Generate an + extra temporary for cases unsupported by the C backend. + 2019-12-13 Steve Baird * einfo.ads: Correct comment for Derived_Type_Link to reflect diff --git a/gcc/ada/exp_ch4.adb b/gcc/ada/exp_ch4.adb index 19558236e0c..28d48ab7f8b 100644 --- a/gcc/ada/exp_ch4.adb +++ b/gcc/ada/exp_ch4.adb @@ -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 -- 2.30.2