aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/sem_ch6.adb
diff options
context:
space:
mode:
authorArnaud Charlet <charlet@gcc.gnu.org>2004-03-29 14:03:27 +0200
committerArnaud Charlet <charlet@gcc.gnu.org>2004-03-29 14:03:27 +0200
commit2820d220585177ca4e2e3136bf8ff255303ba6db (patch)
treeb41024c63720bbb6fd3edef3c99d72097d058a4e /gcc/ada/sem_ch6.adb
parent63041e68a4c1b6043872652c07223117ebfb07f7 (diff)
downloadgcc-2820d220585177ca4e2e3136bf8ff255303ba6db.zip
gcc-2820d220585177ca4e2e3136bf8ff255303ba6db.tar.gz
gcc-2820d220585177ca4e2e3136bf8ff255303ba6db.tar.bz2
[multiple changes]
2004-03-29 Javier Miranda <miranda@gnat.com> * checks.adb (Null_Exclusion_Static_Checks): New subprogram (Install_Null_Excluding_Check): Local subprogram that determines whether an access node requires a runtime access check and if so inserts the appropriate run-time check. (Apply_Access_Check): Call Install_Null_Excluding check if required (Apply_Constraint_Check): Call Install_Null_Excluding check if required * checks.ads: (Null_Exclusion_Static_Checks): New subprogram * einfo.ads: Fix typo in comment * exp_ch3.adb (Build_Assignment): Generate conversion to the null-excluding type to force the corresponding run-time check. (Expand_N_Object_Declaration): Generate conversion to the null-excluding type to force the corresponding run-time check. * exp_ch5.adb (Expand_N_Assignment_Statement): Generate conversion to the null-excluding type to force the corresponding run-time check. * exp_ch6.adb (Expand_Call): Do not generate the run-time check in case of access types unless they have the null-excluding attribute. * sprint.adb (Sprint_Node_Actual): Give support to the null-exclusing part. * exp_util.ads: Fix typo in comment * par.adb (P_Null_Exclusion): New subprogram (P_Subtype_Indication): New formal that indicates if the null-excluding part has been scanned-out and it was present * par-ch3.adb, par-ch4.adb, par-ch6.adb: Give support to AI-231 * sem_aggr.adb: (Check_Can_Never_Be_Null): New subprogram (Aggregate_Constraint_Checks): Generate conversion to the null-excluding type to force the corresponding run-time check (Resolve_Aggregate): Propagate the null-excluding attribute to the array components (Resolve_Array_Aggregate): Carry out some static checks (Resolve_Record_Aggregate.Get_Value): Carry out some static check * sem_ch3.adb (Access_Definition): In Ada 0Y the Can_Never_Be_Null attribute must be set only if specified by means of the null-excluding part. In addition, we must also propagate the access-constant attribute if present. (Access_Subprogram_Declaration, Access_Type_Declaration, Analyze_Component_Declaration, Analyze_Object_Declaration, Array_Type_Declaration, Process_Discriminants, Analyze_Subtype_Declaration): Propagate the null-excluding attribute and carry out some static checks. (Build_Derived_Access_Type): Set the null-excluding attribute (Derived_Type_Declaration, Process_Subtype): Carry out some static checks. * sem_ch4.adb (Analyze_Allocator): Carry out some static checks * sem_ch5.adb (Analyze_Assignment): Carry out some static checks * sem_ch6.adb (Process_Formals): Carry out some static checks. (Set_Actual_Subtypes): Generate null-excluding subtype if the null-excluding part was present; it is not required to be done here in case of anonymous access types. (Set_Formal_Mode): Ada 0Y allows anonymous access to have the null value. * sem_res.adb (Resolve_Actuals): Carry out some static check (Resolve_Null): Allow null in anonymous access * sinfo.adb: New subprogram Null_Exclusion_Present All_Present and Constant_Present available on access_definition nodes * sinfo.ads: New flag Null_Exclusion_Present on subtype_declaration, object_declaration, derived_type_definition, component_definition, discriminant_specification, access_to_object_definition, access_function_definition, allocator, access_procedure_definition, access_definition, parameter_specification, All_Present and Constant_Present flags available on access_definition nodes. 2004-03-29 Robert Dewar <dewar@gnat.com> * fname.adb, fname.ads, fname-sf.adb, fname-uf.adb, fname-uf.ads, gnat1drv.adb, lib.adb, lib.ads, lib-load.adb, lib-writ.adb, opt.ads, osint.adb, osint.ads, osint-c.adb, par.adb, par-ch10.adb, par-load.adb, par-prag.adb, sfn_scan.adb, sfn_scan.ads, sinput-l.adb, sinput-l.ads, switch-c.adb, sem_prag.adb: Updates to handle multiple units/file * par.adb: Change test for s-rpc to s-rp for detecting rpc and children * par.adb, memtrack.adb, prj-makr.adb, prj-part.adb, sem_util.adb: Minor reformatting * sem_ch12.adb: Add comment for previous change 2004-03-29 Laurent Pautet <pautet@act-europe.fr> * osint.adb (Executable_Prefix): Set Exec_Name to the current executable name when not initialized. Otherwise, use its current value. * osint.ads (Exec_Name): Move Exec_Name from body to spec in order to initialize it to another executable name than the current one. This allows to configure paths for an executable name (gnatmake) different from the current one (gnatdist). 2004-03-29 Ed Schonberg <schonberg@gnat.com> * exp_ch6.adb (Expand_Call): A call to a function declared in the current unit cannot be inlined if it appears in the body of a withed unit, to avoid order of elaboration problems in gigi. * exp_ch9.adb (Build_Protected_Sub_Specification): Generate debugging information for protected (wrapper) operation as well, to simplify gdb use. * sem_ch6.adb (Analyze_Subprogram_Body): For a private operation in a protected body, indicate that the entity for the generated spec comes from source, to ensure that references are properly generated for it. (Build_Body_To_Inline): Do not inline a function that returns a controlled type. * sem_prag.adb (Process_Convention): If subprogram is overloaded, only apply convention to homonyms that are declared explicitly. * sem_res.adb (Make_Call_Into_Operator): If the operation is a function that renames an equality operator and the operands are overloaded, resolve them with the declared formal types, before rewriting as an operator. 2004-03-29 GNAT Script <nobody@gnat.com> * Make-lang.in: Makefile automatically updated From-SVN: r80055
Diffstat (limited to 'gcc/ada/sem_ch6.adb')
-rw-r--r--gcc/ada/sem_ch6.adb112
1 files changed, 101 insertions, 11 deletions
diff --git a/gcc/ada/sem_ch6.adb b/gcc/ada/sem_ch6.adb
index 1382485..bd2a07f 100644
--- a/gcc/ada/sem_ch6.adb
+++ b/gcc/ada/sem_ch6.adb
@@ -970,8 +970,15 @@ package body Sem_Ch6 is
Make_Subprogram_Declaration (Loc,
Specification => New_Spec);
Insert_Before (N, Decl);
- Analyze (Decl);
Spec_Id := Defining_Unit_Name (New_Spec);
+
+ -- Indicate that the entity comes from source, to ensure that
+ -- cross-reference information is properly generated.
+ -- The body itself is rewritten during expansion, and the
+ -- body entity will not appear in calls to the operation.
+
+ Set_Comes_From_Source (Spec_Id, True);
+ Analyze (Decl);
Set_Has_Completion (Spec_Id);
Set_Convention (Spec_Id, Convention_Protected);
end;
@@ -1724,6 +1731,8 @@ package body Sem_Ch6 is
-- Functions that return unconstrained composite types will require
-- secondary stack handling, and cannot currently be inlined.
+ -- Ditto for functions that return controlled types, where controlled
+ -- actions interfere in complex ways with inlining.
elsif Ekind (Subp) = E_Function
and then not Is_Scalar_Type (Etype (Subp))
@@ -1733,6 +1742,13 @@ package body Sem_Ch6 is
Cannot_Inline
("cannot inline & (unconstrained return type)?", N, Subp);
return;
+
+ elsif Ekind (Subp) = E_Function
+ and then Controlled_Type (Etype (Subp))
+ then
+ Cannot_Inline
+ ("cannot inline & (controlled return type)?", N, Subp);
+ return;
end if;
if Present (Declarations (N))
@@ -4845,7 +4861,7 @@ package body Sem_Ch6 is
and then Ekind (Root_Type (Formal_Type)) =
E_Incomplete_Type)
then
- -- Ada0Y (AI-50217): Incomplete tagged types that are made
+ -- Ada 0Y (AI-50217): Incomplete tagged types that are made
-- visible through a limited with_clause are valid formal
-- types.
@@ -4934,6 +4950,18 @@ package body Sem_Ch6 is
end if;
end if;
+
+ -- Ada 0Y (AI-231): Static checks
+
+ Ptype := Parameter_Type (Param_Spec);
+
+ if Extensions_Allowed
+ and then Nkind (Ptype) /= N_Access_Definition
+ and then (Null_Exclusion_Present (Parent (Formal))
+ or else Can_Never_Be_Null (Entity (Ptype)))
+ then
+ Null_Exclusion_Static_Checks (Param_Spec);
+ end if;
end if;
Next (Param_Spec);
@@ -4976,12 +5004,13 @@ package body Sem_Ch6 is
-------------------------
procedure Set_Actual_Subtypes (N : Node_Id; Subp : Entity_Id) is
- Loc : constant Source_Ptr := Sloc (N);
- Decl : Node_Id;
- Formal : Entity_Id;
- T : Entity_Id;
- First_Stmt : Node_Id := Empty;
- AS_Needed : Boolean;
+ Loc : constant Source_Ptr := Sloc (N);
+ Decl : Node_Id;
+ Formal : Entity_Id;
+ T : Entity_Id;
+ First_Stmt : Node_Id := Empty;
+ AS_Needed : Boolean;
+ Null_Exclusion : Boolean := False;
begin
-- If this is an emtpy initialization procedure, no need to create
@@ -5036,6 +5065,17 @@ package body Sem_Ch6 is
then
AS_Needed := True;
+ -- Ada 0Y (AI-231)
+
+ elsif Extensions_Allowed
+ and then Is_Access_Type (T)
+ and then Null_Exclusion_Present (Parent (Formal))
+ and then Nkind (Parameter_Type (Parent (Formal)))
+ /= N_Access_Definition
+ then
+ AS_Needed := True;
+ Null_Exclusion := True;
+
-- All other cases do not need an actual subtype
else
@@ -5047,7 +5087,39 @@ package body Sem_Ch6 is
if AS_Needed then
- if Nkind (N) = N_Accept_Statement then
+ -- Ada 0Y (AI-231): Generate actual null-excluding subtype
+
+ if Extensions_Allowed
+ and then Null_Exclusion
+ then
+ declare
+ Loc : constant Source_Ptr := Sloc (Formal);
+ Anon : constant Entity_Id :=
+ Make_Defining_Identifier (Loc,
+ New_Internal_Name ('S'));
+ Ptype : constant Node_Id
+ := Parameter_Type (Parent (Formal));
+ begin
+ -- T == Etype (Formal)
+ Set_Is_Internal (Anon);
+ Decl :=
+ Make_Subtype_Declaration (Loc,
+ Defining_Identifier => Anon,
+ Null_Exclusion_Present => True,
+ Subtype_Indication =>
+ New_Occurrence_Of (Etype (Ptype), Loc));
+ Mark_Rewrite_Insertion (Decl);
+ Prepend (Decl, Declarations (Parent (N)));
+
+ Rewrite (Ptype, New_Occurrence_Of (Anon, Loc));
+ Mark_Rewrite_Insertion (Ptype);
+ -- Set_Scope (Anon, Scope (Scope (Formal)));
+
+ Set_Etype (Formal, Anon);
+ Set_Null_Exclusion_Present (Parent (Formal), False);
+ end;
+
+ elsif Nkind (N) = N_Accept_Statement then
-- If expansion is active, The formal is replaced by a local
-- variable that renames the corresponding entry of the
@@ -5081,6 +5153,16 @@ package body Sem_Ch6 is
Analyze (Decl);
+ -- Ada 0Y (AI-231): Previous analysis leaves the entity of the
+ -- null-excluding subtype declaration associated with the internal
+ -- scope; because this declaration has been inserted before the
+ -- subprogram we associate it now with the enclosing scope.
+
+ if Null_Exclusion then
+ Set_Scope (Defining_Identifier (Decl),
+ Scope (Scope (Formal)));
+ end if;
+
-- We need to freeze manually the generated type when it is
-- inserted anywhere else than in a declarative part.
@@ -5141,8 +5223,16 @@ package body Sem_Ch6 is
-- set Can_Never_Be_Null, since there is no way to change the value.
if Nkind (Parameter_Type (Spec)) = N_Access_Definition then
- Set_Is_Known_Non_Null (Formal_Id);
- Set_Can_Never_Be_Null (Formal_Id);
+
+ -- Ada 0Y (AI-231): This behaviour has been modified in Ada 0Y.
+ -- It is only forced if the null_exclusion appears.
+
+ if not Extensions_Allowed
+ or else Null_Exclusion_Present (Spec)
+ then
+ Set_Is_Known_Non_Null (Formal_Id);
+ Set_Can_Never_Be_Null (Formal_Id);
+ end if;
end if;
Set_Mechanism (Formal_Id, Default_Mechanism);