From 07a64c021a8fbd6df4d411b9852cfa95afb1cf08 Mon Sep 17 00:00:00 2001 From: Arnaud Charlet Date: Fri, 20 Feb 2015 10:08:30 +0100 Subject: [PATCH] [multiple changes] 2015-02-20 Robert Dewar * sem_res.adb: Minor reformatting. * exp_ch9.adb (Build_Protected_Spec): Copy Aliased setting when building spec. * sem_ch13.adb (Analyze_Aspect_Specifications): Exclude Boolean aspects from circuitry setting delay required to false if the argument is an integer literal. 2015-02-20 Ed Schonberg * einfo.ads. einfo.adb (Partial_View_Has_Unknown_Discr): New flag on type entities, to enforce AI12-0133: default initialization of types whose partial view has unknown discriminants does not get an invariant check, because clients of the unit can never declare objects of such types. * sem_ch3.adb (Find_Type_Name); Set new flag Partial_View_Has_Unknown_Discr when needed. * exp_ch3.adb (Expand_N_Object_Declaration): Use flag to suppress generation of invariant call on default-initialized object. From-SVN: r220836 --- gcc/ada/ChangeLog | 21 +++++++++++++++++++++ gcc/ada/einfo.adb | 15 +++++++++++++-- gcc/ada/einfo.ads | 10 ++++++++++ gcc/ada/exp_ch3.adb | 9 ++++++--- gcc/ada/exp_ch9.adb | 5 +++-- gcc/ada/sem_ch13.adb | 27 +++++++++++++++++++-------- gcc/ada/sem_ch3.adb | 7 +++++++ gcc/ada/sem_res.adb | 6 +++--- 8 files changed, 82 insertions(+), 18 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 874779e44ea..bcc6d85aca8 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,24 @@ +2015-02-20 Robert Dewar + + * sem_res.adb: Minor reformatting. + * exp_ch9.adb (Build_Protected_Spec): Copy Aliased setting when + building spec. + * sem_ch13.adb (Analyze_Aspect_Specifications): Exclude Boolean + aspects from circuitry setting delay required to false if the + argument is an integer literal. + +2015-02-20 Ed Schonberg + + * einfo.ads. einfo.adb (Partial_View_Has_Unknown_Discr): New flag + on type entities, to enforce AI12-0133: default initialization + of types whose partial view has unknown discriminants does not + get an invariant check, because clients of the unit can never + declare objects of such types. + * sem_ch3.adb (Find_Type_Name); Set new flag + Partial_View_Has_Unknown_Discr when needed. + * exp_ch3.adb (Expand_N_Object_Declaration): Use flag to suppress + generation of invariant call on default-initialized object. + 2015-02-08 Eric Botcazou * gcc-interface/decl.c (gnat_to_gnu_param): Do not strip the padding diff --git a/gcc/ada/einfo.adb b/gcc/ada/einfo.adb index cfed66fe7c2..35c8c9fbba8 100644 --- a/gcc/ada/einfo.adb +++ b/gcc/ada/einfo.adb @@ -576,8 +576,7 @@ package body Einfo is -- Is_Checked_Ghost_Entity Flag277 -- Is_Ignored_Ghost_Entity Flag278 -- Contains_Ignored_Ghost_Code Flag279 - - -- (unused) Flag280 + -- Partial_View_Has_Unknown_Discr Flag280 -- (unused) Flag281 -- (unused) Flag282 @@ -2739,6 +2738,12 @@ package body Einfo is return Elist9 (Id); end Part_Of_Constituents; + function Partial_View_Has_Unknown_Discr (Id : E) return B is + begin + pragma Assert (Is_Type (Id)); + return Flag280 (Id); + end Partial_View_Has_Unknown_Discr; + function Pending_Access_Types (Id : E) return L is begin pragma Assert (Is_Type (Id)); @@ -5632,6 +5637,12 @@ package body Einfo is Set_Elist9 (Id, V); end Set_Part_Of_Constituents; + procedure Set_Partial_View_Has_Unknown_Discr (Id : E; V : B := True) is + begin + pragma Assert (Is_Type (Id)); + Set_Flag280 (Id, V); + end Set_Partial_View_Has_Unknown_Discr; + procedure Set_Pending_Access_Types (Id : E; V : L) is begin pragma Assert (Is_Type (Id)); diff --git a/gcc/ada/einfo.ads b/gcc/ada/einfo.ads index ae714da56d3..85a7931325b 100644 --- a/gcc/ada/einfo.ads +++ b/gcc/ada/einfo.ads @@ -3578,6 +3578,11 @@ package Einfo is -- Present in abstract state entities. Contains all constituents that are -- subject to indicator Part_Of (both aspect and option variants). +-- Partial_View_Has_Unknown_Discr (Flag280) +-- Present on types entities. Indicates that the partial view of a type +-- has unknown discriminants. A default initialization of an object of +-- the type does not require an invariant check (AI12-0133). + -- Pending_Access_Types (Elist15) -- Defined in all types. Set for incomplete, private, Taft-amendment -- types, and their corresponding full views. This list contains all @@ -5358,6 +5363,7 @@ package Einfo is -- Must_Have_Preelab_Init (Flag208) -- Optimize_Alignment_Space (Flag241) -- Optimize_Alignment_Time (Flag242) + -- Partial_View_Has_Unknown_Discr (Flag280) -- Size_Depends_On_Discriminant (Flag177) -- Size_Known_At_Compile_Time (Flag92) -- Strict_Alignment (Flag145) (base type only) @@ -6877,6 +6883,7 @@ package Einfo is function Packed_Array_Impl_Type (Id : E) return E; function Parent_Subtype (Id : E) return E; function Part_Of_Constituents (Id : E) return L; + function Partial_View_Has_Unknown_Discr (Id : E) return B; function Pending_Access_Types (Id : E) return L; function Postcondition_Proc (Id : E) return E; function Prival (Id : E) return E; @@ -7524,6 +7531,7 @@ package Einfo is procedure Set_Packed_Array_Impl_Type (Id : E; V : E); procedure Set_Parent_Subtype (Id : E; V : E); procedure Set_Part_Of_Constituents (Id : E; V : L); + procedure Set_Partial_View_Has_Unknown_Discr (Id : E; V : B := True); procedure Set_Pending_Access_Types (Id : E; V : L); procedure Set_Postcondition_Proc (Id : E; V : E); procedure Set_Prival (Id : E; V : E); @@ -8323,6 +8331,7 @@ package Einfo is pragma Inline (Parameter_Mode); pragma Inline (Parent_Subtype); pragma Inline (Part_Of_Constituents); + pragma Inline (Partial_View_Has_Unknown_Discr); pragma Inline (Pending_Access_Types); pragma Inline (Postcondition_Proc); pragma Inline (Prival); @@ -8769,6 +8778,7 @@ package Einfo is pragma Inline (Set_Packed_Array_Impl_Type); pragma Inline (Set_Parent_Subtype); pragma Inline (Set_Part_Of_Constituents); + pragma Inline (Partial_View_Has_Unknown_Discr); pragma Inline (Set_Pending_Access_Types); pragma Inline (Set_Postcondition_Proc); pragma Inline (Set_Prival); diff --git a/gcc/ada/exp_ch3.adb b/gcc/ada/exp_ch3.adb index a8e4137fbda..095e23368b3 100644 --- a/gcc/ada/exp_ch3.adb +++ b/gcc/ada/exp_ch3.adb @@ -5503,10 +5503,13 @@ package body Exp_Ch3 is Ensure_Freeze_Node (Def_Id); Set_Has_Delayed_Freeze (Def_Id); Set_Is_Frozen (Def_Id, False); - Append_Freeze_Action (Def_Id, - Make_Invariant_Call (New_Occurrence_Of (Def_Id, Loc))); - else + if not Partial_View_Has_Unknown_Discr (Typ) then + Append_Freeze_Action (Def_Id, + Make_Invariant_Call (New_Occurrence_Of (Def_Id, Loc))); + end if; + + elsif not Partial_View_Has_Unknown_Discr (Typ) then Insert_After (N, Make_Invariant_Call (New_Occurrence_Of (Def_Id, Loc))); end if; diff --git a/gcc/ada/exp_ch9.adb b/gcc/ada/exp_ch9.adb index 7f26a8cb1fe..361952ba9fc 100644 --- a/gcc/ada/exp_ch9.adb +++ b/gcc/ada/exp_ch9.adb @@ -4032,8 +4032,9 @@ package body Exp_Ch9 is Make_Parameter_Specification (Loc, Defining_Identifier => Make_Defining_Identifier (Sloc (Formal), Chars (Formal)), - In_Present => In_Present (Parent (Formal)), - Out_Present => Out_Present (Parent (Formal)), + Aliased_Present => Aliased_Present (Parent (Formal)), + In_Present => In_Present (Parent (Formal)), + Out_Present => Out_Present (Parent (Formal)), Parameter_Type => New_Occurrence_Of (Etype (Formal), Loc)); if Unprotected then diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb index 7d0ca02d6fc..56aee5a5cac 100644 --- a/gcc/ada/sem_ch13.adb +++ b/gcc/ada/sem_ch13.adb @@ -1621,14 +1621,25 @@ package body Sem_Ch13 is -- do not delay, since we know the value cannot change. -- This optimization catches most rep clause cases. - if (Present (Expr) and then Nkind (Expr) = N_Integer_Literal) - or else (A_Id in Boolean_Aspects and then No (Expr)) - then - Delay_Required := False; - else - Delay_Required := True; - Set_Has_Delayed_Rep_Aspects (E); - end if; + -- For Boolean aspects, don't delay if no expression + + if A_Id in Boolean_Aspects and then No (Expr) then + Delay_Required := False; + + -- For non-Boolean aspects, don't delay if integer literal + + elsif A_Id not in Boolean_Aspects + and then Present (Expr) + and then Nkind (Expr) = N_Integer_Literal + then + Delay_Required := False; + + -- All other cases are delayed + + else + Delay_Required := True; + Set_Has_Delayed_Rep_Aspects (E); + end if; end case; -- Processing based on specific aspect diff --git a/gcc/ada/sem_ch3.adb b/gcc/ada/sem_ch3.adb index 5aa5fe0475c..a017734438f 100644 --- a/gcc/ada/sem_ch3.adb +++ b/gcc/ada/sem_ch3.adb @@ -16459,6 +16459,13 @@ package body Sem_Ch3 is Set_Has_Private_Declaration (Prev); Set_Has_Private_Declaration (Id); + -- AI12-0133 : indicate whether we have a partial view with + -- unknown discriminants, in which case initialization of objects + -- of the type do not receive an invariant check. + + Set_Partial_View_Has_Unknown_Discr + (Prev, Has_Unknown_Discriminants (Id)); + -- Preserve aspect and iterator flags that may have been set on -- the partial view. diff --git a/gcc/ada/sem_res.adb b/gcc/ada/sem_res.adb index b51a2806e14..851e0a6608d 100644 --- a/gcc/ada/sem_res.adb +++ b/gcc/ada/sem_res.adb @@ -3091,9 +3091,9 @@ package body Sem_Res is -- This must be determined before the actual is resolved and expanded -- because if needed the transient scope must be introduced earlier. - ------------------------------ - -- Check_Aliased_Parameter -- - ------------------------------ + ----------------------------- + -- Check_Aliased_Parameter -- + ----------------------------- procedure Check_Aliased_Parameter is Nominal_Subt : Entity_Id; -- 2.30.2