From a5d83d61416423fd29146e2743e2d68a467131b8 Mon Sep 17 00:00:00 2001 From: Arnaud Charlet Date: Mon, 14 Jun 2010 12:09:30 +0200 Subject: [PATCH] [multiple changes] 2010-06-14 Robert Dewar * opt.ads, sem.adb, sem_elab.adb: Minor reformatting 2010-06-14 Robert Dewar * exp_aggr.adb (Has_Address_Clause): Moved to Exp_Util, and there it is renamed as Has_Following_Address_Clause. * exp_ch3.adb (Needs_Simple_Initialization): Add Consider_IS argument to allow the caller to avoid Initialize_Scalars having an effect. (Expand_N_Object_Declaration): Do not do Initialize_Scalars stuff for scalars with an address clause specified. * exp_ch3.ads (Needs_Simple_Initialization): Add Consider_IS argument to allow the caller to avoid Initialize_Scalars having an effect. * exp_util.adb (Has_Following_Address_Clause): Moved here from Exp_Aggr (where it was called Has_Address_Clause). * exp_util.ads (Has_Following_Address_Clause): Moved here from Exp_Aggr (where it was called Has_Address_Clause). * freeze.adb (Warn_Overlay): Suppress message about overlaying causing problems for Initialize_Scalars (since we no longer initialize objects with an address clause. 2010-06-14 Robert Dewar * exp_prag.adb (Expand_Pragma_Check): Set Loc of generated code from condition. 2010-06-14 Gary Dismukes * sem_ch6.adb (Analyze_Subprogram_Body_Helper): Set Debug_Info_Needed on the entity of an implicitly generated postcondition procedure. 2010-06-14 Thomas Quinot * sem_ch7.adb (Preserve_Full_Attributes): Propagate Discriminant_Constraint elist from full view to private view. From-SVN: r160720 --- gcc/ada/ChangeLog | 37 +++++++++++++++++++++++++++++++++++++ gcc/ada/exp_aggr.adb | 45 +++++++++------------------------------------ gcc/ada/exp_ch3.adb | 18 ++++++++++++++---- gcc/ada/exp_ch3.ads | 8 ++++++-- gcc/ada/exp_prag.adb | 2 +- gcc/ada/exp_util.adb | 31 +++++++++++++++++++++++++++++++ gcc/ada/exp_util.ads | 5 +++++ gcc/ada/freeze.adb | 8 +++++--- gcc/ada/opt.ads | 4 ++-- gcc/ada/sem.adb | 1 - gcc/ada/sem_ch6.adb | 5 ++++- gcc/ada/sem_ch7.adb | 4 ++++ gcc/ada/sem_elab.adb | 2 +- 13 files changed, 119 insertions(+), 51 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 85fd581..3b5d5f6 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,5 +1,42 @@ 2010-06-14 Robert Dewar + * opt.ads, sem.adb, sem_elab.adb: Minor reformatting + +2010-06-14 Robert Dewar + + * exp_aggr.adb (Has_Address_Clause): Moved to Exp_Util, and there it + is renamed as Has_Following_Address_Clause. + * exp_ch3.adb (Needs_Simple_Initialization): Add Consider_IS argument + to allow the caller to avoid Initialize_Scalars having an effect. + (Expand_N_Object_Declaration): Do not do Initialize_Scalars stuff for + scalars with an address clause specified. + * exp_ch3.ads (Needs_Simple_Initialization): Add Consider_IS argument + to allow the caller to avoid Initialize_Scalars having an effect. + * exp_util.adb (Has_Following_Address_Clause): Moved here from Exp_Aggr + (where it was called Has_Address_Clause). + * exp_util.ads (Has_Following_Address_Clause): Moved here from Exp_Aggr + (where it was called Has_Address_Clause). + * freeze.adb (Warn_Overlay): Suppress message about overlaying causing + problems for Initialize_Scalars (since we no longer initialize objects + with an address clause. + +2010-06-14 Robert Dewar + + * exp_prag.adb (Expand_Pragma_Check): Set Loc of generated code from + condition. + +2010-06-14 Gary Dismukes + + * sem_ch6.adb (Analyze_Subprogram_Body_Helper): Set Debug_Info_Needed + on the entity of an implicitly generated postcondition procedure. + +2010-06-14 Thomas Quinot + + * sem_ch7.adb (Preserve_Full_Attributes): Propagate + Discriminant_Constraint elist from full view to private view. + +2010-06-14 Robert Dewar + * sem_res.adb: Minor reformatting 2010-06-14 Ed Schonberg diff --git a/gcc/ada/exp_aggr.adb b/gcc/ada/exp_aggr.adb index 6e3edc1..dc6c8bb 100644 --- a/gcc/ada/exp_aggr.adb +++ b/gcc/ada/exp_aggr.adb @@ -4122,12 +4122,6 @@ package body Exp_Aggr is -- array sub-aggregate we start the computation from. Dim is the -- dimension corresponding to the sub-aggregate. - function Has_Address_Clause (D : Node_Id) return Boolean; - -- If the aggregate is the expression in an object declaration, it - -- cannot be expanded in place. This function does a lookahead in the - -- current declarative part to find an address clause for the object - -- being declared. - function In_Place_Assign_OK return Boolean; -- Simple predicate to determine whether an aggregate assignment can -- be done in place, because none of the new values can depend on the @@ -4435,35 +4429,6 @@ package body Exp_Aggr is end Compute_Others_Present; ------------------------ - -- Has_Address_Clause -- - ------------------------ - - function Has_Address_Clause (D : Node_Id) return Boolean is - Id : constant Entity_Id := Defining_Identifier (D); - Decl : Node_Id; - - begin - Decl := Next (D); - while Present (Decl) loop - if Nkind (Decl) = N_At_Clause - and then Chars (Identifier (Decl)) = Chars (Id) - then - return True; - - elsif Nkind (Decl) = N_Attribute_Definition_Clause - and then Chars (Decl) = Name_Address - and then Chars (Name (Decl)) = Chars (Id) - then - return True; - end if; - - Next (Decl); - end loop; - - return False; - end Has_Address_Clause; - - ------------------------ -- In_Place_Assign_OK -- ------------------------ @@ -5162,6 +5127,8 @@ package body Exp_Aggr is Build_Activation_Chain_Entity (N); end if; + -- Should document these individual tests ??? + if not Has_Default_Init_Comps (N) and then Comes_From_Source (Parent (N)) and then Nkind (Parent (N)) = N_Object_Declaration @@ -5170,7 +5137,13 @@ package body Exp_Aggr is and then N = Expression (Parent (N)) and then not Is_Bit_Packed_Array (Typ) and then not Has_Controlled_Component (Typ) - and then not Has_Address_Clause (Parent (N)) + + -- If the aggregate is the expression in an object declaration, it + -- cannot be expanded in place. Lookahead in the current declarative + -- part to find an address clause for the object being declared. If + -- one is present, we cannot build in place. Unclear comment??? + + and then not Has_Following_Address_Clause (Parent (N)) then Tmp := Defining_Identifier (Parent (N)); Set_No_Initialization (Parent (N)); diff --git a/gcc/ada/exp_ch3.adb b/gcc/ada/exp_ch3.adb index 83fc7e3..e36c8dc 100644 --- a/gcc/ada/exp_ch3.adb +++ b/gcc/ada/exp_ch3.adb @@ -4466,7 +4466,10 @@ package body Exp_Ch3 is -- it will be assigned subsequently. In particular, there is no point -- in applying Initialize_Scalars to such a temporary. - elsif Needs_Simple_Initialization (Typ) + elsif Needs_Simple_Initialization + (Typ, + Initialize_Scalars + and then not Has_Following_Address_Clause (N)) and then not Is_Internal (Def_Id) and then not Has_Init_Expression (N) then @@ -8145,7 +8148,14 @@ package body Exp_Ch3 is -- Needs_Simple_Initialization -- --------------------------------- - function Needs_Simple_Initialization (T : Entity_Id) return Boolean is + function Needs_Simple_Initialization + (T : Entity_Id; + Consider_IS : Boolean := True) return Boolean + is + Consider_IS_NS : constant Boolean := + Normalize_Scalars + or (Initialize_Scalars and Consider_IS); + begin -- Check for private type, in which case test applies to the underlying -- type of the private type. @@ -8167,7 +8177,7 @@ package body Exp_Ch3 is -- types. elsif Is_Access_Type (T) - or else (Init_Or_Norm_Scalars and then (Is_Scalar_Type (T))) + or else (Consider_IS_NS and then (Is_Scalar_Type (T))) then return True; @@ -8176,7 +8186,7 @@ package body Exp_Ch3 is -- expanding an aggregate (since in the latter case they will be -- filled with appropriate initializing values before they are used). - elsif Init_Or_Norm_Scalars + elsif Consider_IS_NS and then (Root_Type (T) = Standard_String or else Root_Type (T) = Standard_Wide_String diff --git a/gcc/ada/exp_ch3.ads b/gcc/ada/exp_ch3.ads index 6738ae9..9b838b0 100644 --- a/gcc/ada/exp_ch3.ads +++ b/gcc/ada/exp_ch3.ads @@ -126,14 +126,18 @@ package Exp_Ch3 is -- then tags components located at variable positions of Target are -- initialized. - function Needs_Simple_Initialization (T : Entity_Id) return Boolean; + function Needs_Simple_Initialization + (T : Entity_Id; + Consider_IS : Boolean := True) return Boolean; -- Certain types need initialization even though there is no specific -- initialization routine. In this category are access types (which need -- initializing to null), packed array types whose implementation is a -- modular type, and all scalar types if Normalize_Scalars is set, as well -- as private types whose underlying type is present and meets any of these -- criteria. Finally, descendants of String and Wide_String also need - -- initialization in Initialize/Normalize_Scalars mode. + -- initialization in Initialize/Normalize_Scalars mode. Consider_IS is + -- normally True. If it is False, the Initialize_Scalars is not considered + -- in determining whether simple initialization is needed. function Get_Simple_Init_Val (T : Entity_Id; diff --git a/gcc/ada/exp_prag.adb b/gcc/ada/exp_prag.adb index 6bddf96..7ff2f77 100644 --- a/gcc/ada/exp_prag.adb +++ b/gcc/ada/exp_prag.adb @@ -269,8 +269,8 @@ package body Exp_Prag is -------------------------- procedure Expand_Pragma_Check (N : Node_Id) is - Loc : constant Source_Ptr := Sloc (N); Cond : constant Node_Id := Arg2 (N); + Loc : constant Source_Ptr := Sloc (Cond); Nam : constant Name_Id := Chars (Arg1 (N)); Msg : Node_Id; diff --git a/gcc/ada/exp_util.adb b/gcc/ada/exp_util.adb index c450b67..1fc19da 100644 --- a/gcc/ada/exp_util.adb +++ b/gcc/ada/exp_util.adb @@ -2143,6 +2143,37 @@ package body Exp_Util is return False; end Has_Controlled_Coextensions; + ------------------------ + -- Has_Address_Clause -- + ------------------------ + + -- Should this function check the private part in a package ??? + + function Has_Following_Address_Clause (D : Node_Id) return Boolean is + Id : constant Entity_Id := Defining_Identifier (D); + Decl : Node_Id; + + begin + Decl := Next (D); + while Present (Decl) loop + if Nkind (Decl) = N_At_Clause + and then Chars (Identifier (Decl)) = Chars (Id) + then + return True; + + elsif Nkind (Decl) = N_Attribute_Definition_Clause + and then Chars (Decl) = Name_Address + and then Chars (Name (Decl)) = Chars (Id) + then + return True; + end if; + + Next (Decl); + end loop; + + return False; + end Has_Following_Address_Clause; + -------------------- -- Homonym_Number -- -------------------- diff --git a/gcc/ada/exp_util.ads b/gcc/ada/exp_util.ads index 1f3c9e8..b036338 100644 --- a/gcc/ada/exp_util.ads +++ b/gcc/ada/exp_util.ads @@ -444,6 +444,11 @@ package Exp_Util is -- Determine whether a record type has anonymous access discriminants with -- a controlled designated type. + function Has_Following_Address_Clause (D : Node_Id) return Boolean; + -- D is the node for an object declaration. This function searches the + -- current declarative part to look for an address clause for the object + -- being declared, and returns True if one is found. + function Homonym_Number (Subp : Entity_Id) return Nat; -- Here subp is the entity for a subprogram. This routine returns the -- homonym number used to disambiguate overloaded subprograms in the same diff --git a/gcc/ada/freeze.adb b/gcc/ada/freeze.adb index c963936..e29904f 100644 --- a/gcc/ada/freeze.adb +++ b/gcc/ada/freeze.adb @@ -5659,16 +5659,18 @@ package body Freeze is -- We only give the warning for non-imported entities of a type for -- which a non-null base init proc is defined, or for objects of access - -- types with implicit null initialization, or when Initialize_Scalars + -- types with implicit null initialization, or when Normalize_Scalars -- applies and the type is scalar or a string type (the latter being -- tested for because predefined String types are initialized by inline - -- code rather than by an init_proc). + -- code rather than by an init_proc). Note that we do not give the + -- warning for Initialize_Scalars, since we suppressed initialization + -- in this case. if Present (Expr) and then not Is_Imported (Ent) and then (Has_Non_Null_Base_Init_Proc (Typ) or else Is_Access_Type (Typ) - or else (Init_Or_Norm_Scalars + or else (Normalize_Scalars and then (Is_Scalar_Type (Typ) or else Is_String_Type (Typ)))) then diff --git a/gcc/ada/opt.ads b/gcc/ada/opt.ads index 9013d7d..4581116 100644 --- a/gcc/ada/opt.ads +++ b/gcc/ada/opt.ads @@ -183,8 +183,8 @@ package Opt is Bind_For_Library : Boolean := False; -- GNATBIND - -- Set to True if the binder needs to generate a file designed for - -- building a library. May be set to True by Gnatbind.Scan_Bind_Arg. + -- Set to True if the binder needs to generate a file designed for building + -- a library. May be set to True by Gnatbind.Scan_Bind_Arg. Bind_Only : Boolean := False; -- GNATMAKE, GPRMAKE, GPRBUILD diff --git a/gcc/ada/sem.adb b/gcc/ada/sem.adb index 2dd4c3a..79cb3ee 100644 --- a/gcc/ada/sem.adb +++ b/gcc/ada/sem.adb @@ -1936,7 +1936,6 @@ package body Sem is if Is_Child_Unit (Cunit_Entity (Main_Unit)) then Child := Cunit_Entity (Main_Unit); - while Is_Child_Unit (Child) loop Parent_CU := Cunit (Get_Cunit_Entity_Unit_Number (Scope (Child))); diff --git a/gcc/ada/sem_ch6.adb b/gcc/ada/sem_ch6.adb index 97e3823..16cd009 100644 --- a/gcc/ada/sem_ch6.adb +++ b/gcc/ada/sem_ch6.adb @@ -2030,10 +2030,13 @@ package body Sem_Ch6 is end if; end if; - -- Mark presence of postcondition proc in current scope + -- Mark presence of postcondition procedure in current scope and mark + -- the procedure itself as needing debug info. The latter is important + -- when analyzing decision coverage (for example, for MC/DC coverage). if Chars (Body_Id) = Name_uPostconditions then Set_Has_Postconditions (Current_Scope); + Set_Debug_Info_Needed (Body_Id); end if; -- Place subprogram on scope stack, and make formals visible. If there diff --git a/gcc/ada/sem_ch7.adb b/gcc/ada/sem_ch7.adb index 27505f2..c4310cd 100644 --- a/gcc/ada/sem_ch7.adb +++ b/gcc/ada/sem_ch7.adb @@ -2032,6 +2032,10 @@ package body Sem_Ch7 is end if; Set_Has_Discriminants (Priv, Has_Discriminants (Full)); + if Has_Discriminants (Full) then + Set_Discriminant_Constraint (Priv, + Discriminant_Constraint (Full)); + end if; end if; end Preserve_Full_Attributes; diff --git a/gcc/ada/sem_elab.adb b/gcc/ada/sem_elab.adb index ebe5947..a07e983 100644 --- a/gcc/ada/sem_elab.adb +++ b/gcc/ada/sem_elab.adb @@ -1892,7 +1892,7 @@ package body Sem_Elab is elsif In_Task_Activation then return; - -- Nothing to do if call is within a generic unit. + -- Nothing to do if call is within a generic unit elsif Inside_A_Generic then return; -- 2.7.4