From 58a9d876fccd9c28dd4d5eb346cd2c695a3406fc Mon Sep 17 00:00:00 2001 From: Arnaud Charlet Date: Mon, 20 Apr 2009 15:11:19 +0200 Subject: [PATCH] [multiple changes] 2009-04-20 Ed Schonberg * exp_util.adb (Expand_Subtype_From_Expr): use the underlying_record_view when available, to create the proper constrained subtype for an object of a derived type with unknown discriminants. 2009-04-20 Javier Miranda * exp_ch6.ad (Expand_Inlined_Call): Avoid generation of temporaries for formals that have pragma unreferenced. From-SVN: r146414 --- gcc/ada/ChangeLog | 11 +++++++++++ gcc/ada/exp_ch6.adb | 11 +++++++++++ gcc/ada/exp_util.adb | 19 ++++++++++++++++--- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 28c42dad7c6..65cd4e8e5dd 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,14 @@ +2009-04-20 Ed Schonberg + + * exp_util.adb (Expand_Subtype_From_Expr): use the + underlying_record_view when available, to create the proper constrained + subtype for an object of a derived type with unknown discriminants. + +2009-04-20 Javier Miranda + + * exp_ch6.adb (Expand_Inlined_Call): Avoid generation of temporaries for + formals that have pragma unreferenced. + 2009-04-20 Pascal Obry * a-direct.adb (To_Lower_If_Case_Insensitive): Removed. diff --git a/gcc/ada/exp_ch6.adb b/gcc/ada/exp_ch6.adb index 82311e1bc60..989dc1acdb5 100644 --- a/gcc/ada/exp_ch6.adb +++ b/gcc/ada/exp_ch6.adb @@ -3670,6 +3670,16 @@ package body Exp_Ch6 is return; end if; + -- Avoid generation of temporaries for unreferenced formals + + -- What is going on here ??? test below is for *PRAGMA* unreferenced + -- not for an unreferenced formal. Is this a bug fix, or simply an + -- optimization. Needs comment fix and explanation ??? + + if Has_Pragma_Unreferenced (F) then + goto Continue; + end if; + -- If the argument may be a controlling argument in a call within -- the inlined body, we must preserve its classwide nature to insure -- that dynamic dispatching take place subsequently. If the formal @@ -3790,6 +3800,7 @@ package body Exp_Ch6 is Set_Renamed_Object (F, Temp); end if; + <> Next_Formal (F); Next_Actual (A); end loop; diff --git a/gcc/ada/exp_util.adb b/gcc/ada/exp_util.adb index 8205735d5a5..8e5479738c8 100644 --- a/gcc/ada/exp_util.adb +++ b/gcc/ada/exp_util.adb @@ -1328,15 +1328,28 @@ package body Exp_Util is then null; - -- Nothing to be done for derived types with unknown discriminants if - -- the parent type also has unknown discriminants. + -- Case of derived type with unknown discriminants where the parent type + -- also has unknown discriminants. elsif Is_Record_Type (Unc_Type) and then not Is_Class_Wide_Type (Unc_Type) and then Has_Unknown_Discriminants (Unc_Type) and then Has_Unknown_Discriminants (Underlying_Type (Unc_Type)) then - null; + -- Nothing to be done if no underlying record view available + + if No (Underlying_Record_View (Unc_Type)) then + null; + + -- Otherwise use the Underlying_Record_View to create the proper + -- constrained subtype for an object of a derived type with unknown + -- discriminants. + + else + Remove_Side_Effects (Exp); + Rewrite (Subtype_Indic, + Make_Subtype_From_Expr (Exp, Underlying_Record_View (Unc_Type))); + end if; -- In Ada95, Nothing to be done if the type of the expression is -- limited, because in this case the expression cannot be copied,