sem_ch11.adb (Analyze_Exception_Handlers): Add barrier to avoid the use of entity Exception_Occurrence if...

2007-04-20  Javier Miranda  <miranda@adacore.com>
	    Hristian Kirtchev  <kirtchev@adacore.com>
	    Gary Dismukes  <dismukes@adacore.com>

	* sem_ch11.adb (Analyze_Exception_Handlers): Add barrier to avoid the
	use of entity Exception_Occurrence if it is not available in the
	target run-time.

	* sem_ch9.adb (Analyze_Protected_Type, Analyze_Task_Type): When
	concurrent types are declared within an Ada 2005 generic, build their
	corresponding record types since they are needed for overriding-related
	semantic checks.
	(Analyze_Protected_Type): Rearrange and simplify code for testing that a
	protected type does not implement a task interface or a nonlimited
	interface.
	(Analyze_Task_Type): Rearrange and simplify code for testing that a task
	type does not implement a protected interface or a nonlimited interface.
	(Single_Task_Declaration, Single_Protected_Declaration): use original
	entity for variable declaration, to ensure that debugging information
	is correcty generated.
	(Analyze_Protected_Type, Analyze_Task_Type): Do not call expander
	routines if the expander is not active.
	(Analyze_Task_Body): Mark all handlers to stop optimization of local
	raise, since special things happen for task exception handlers.

	* sem_disp.adb (Check_Controlling_Formals): Add type retrieval for
	concurrent types declared within a generic.
	(Check_Dispatching_Operation): Do not emit warning about late interface
	operations in the context of an instance.
	(Check_Dispatching_Call): Remove restriction against calling a
	dispatching operation with a limited controlling result.
	(Check_Dispatching_Operation): Replace calls to Fill_DT_Entry and
	Register_Interface_DT_Entry by calls to Register_Primitive.
	(Check_Dispatching_Formals): Handle properly a function with a
	controlling access result.

From-SVN: r125448
This commit is contained in:
Javier Miranda 2007-06-06 12:42:51 +02:00 committed by Arnaud Charlet
parent fcd1d957e5
commit 8909e1edc6
3 changed files with 136 additions and 76 deletions

View file

@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
-- Copyright (C) 1992-2006, Free Software Foundation, Inc. --
-- Copyright (C) 1992-2007, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@ -30,6 +30,7 @@ with Einfo; use Einfo;
with Errout; use Errout;
with Lib; use Lib;
with Lib.Xref; use Lib.Xref;
with Namet; use Namet;
with Nlists; use Nlists;
with Nmake; use Nmake;
with Opt; use Opt;
@ -203,7 +204,7 @@ package body Sem_Ch11 is
(E_Block, Current_Scope, Sloc (Choice), 'E');
end if;
New_Scope (H_Scope);
Push_Scope (H_Scope);
Set_Etype (H_Scope, Standard_Void_Type);
-- Set the Finalization Chain entity to Error means that it
@ -217,7 +218,11 @@ package body Sem_Ch11 is
Enter_Name (Choice);
Set_Ekind (Choice, E_Variable);
Set_Etype (Choice, RTE (RE_Exception_Occurrence));
if RTE_Available (RE_Exception_Occurrence) then
Set_Etype (Choice, RTE (RE_Exception_Occurrence));
end if;
Generate_Definition (Choice);
-- Set source assigned flag, since in effect this field is

View file

@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
-- Copyright (C) 1992-2006, Free Software Foundation, Inc. --
-- Copyright (C) 1992-2007, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@ -33,6 +33,7 @@ with Elists; use Elists;
with Freeze; use Freeze;
with Itypes; use Itypes;
with Lib.Xref; use Lib.Xref;
with Namet; use Namet;
with Nlists; use Nlists;
with Nmake; use Nmake;
with Opt; use Opt;
@ -53,6 +54,7 @@ with Snames; use Snames;
with Stand; use Stand;
with Sinfo; use Sinfo;
with Style;
with Targparm; use Targparm;
with Tbuild; use Tbuild;
with Uintp; use Uintp;
@ -259,7 +261,7 @@ package body Sem_Ch9 is
Set_Accept_Address (Accept_Id, New_Elmt_List);
if Present (Formals) then
New_Scope (Accept_Id);
Push_Scope (Accept_Id);
Process_Formals (Formals, N);
Create_Extra_Formals (Accept_Id);
End_Scope;
@ -418,7 +420,7 @@ package body Sem_Ch9 is
-- Analyze statements if present
if Present (Stats) then
New_Scope (Entry_Nam);
Push_Scope (Entry_Nam);
Install_Declarations (Entry_Nam);
Set_Actual_Subtypes (N, Current_Scope);
@ -571,7 +573,6 @@ package body Sem_Ch9 is
procedure Analyze_Delay_Relative (N : Node_Id) is
E : constant Node_Id := Expression (N);
begin
Check_Restriction (No_Relative_Delay, N);
Tasking_Used := True;
@ -730,7 +731,7 @@ package body Sem_Ch9 is
end if;
Exp_Ch9.Expand_Entry_Barrier (N, Entry_Name);
New_Scope (Entry_Name);
Push_Scope (Entry_Name);
Exp_Ch9.Expand_Entry_Body_Declarations (N);
Install_Declarations (Entry_Name);
@ -847,7 +848,7 @@ package body Sem_Ch9 is
if Present (Formals) then
Set_Scope (Id, Current_Scope);
New_Scope (Id);
Push_Scope (Id);
Process_Formals (Formals, Parent (N));
End_Scope;
end if;
@ -912,7 +913,7 @@ package body Sem_Ch9 is
if Present (Formals) then
Set_Scope (Id, Current_Scope);
New_Scope (Id);
Push_Scope (Id);
Process_Formals (Formals, N);
Create_Extra_Formals (Id);
End_Scope;
@ -961,7 +962,7 @@ package body Sem_Ch9 is
Set_Ekind (Loop_Id, E_Loop);
Set_Scope (Loop_Id, Current_Scope);
New_Scope (Loop_Id);
Push_Scope (Loop_Id);
Enter_Name (Iden);
Set_Ekind (Iden, E_Entry_Index_Parameter);
Set_Etype (Iden, Etype (Def));
@ -1018,7 +1019,7 @@ package body Sem_Ch9 is
Spec_Id := Etype (Spec_Id);
end if;
New_Scope (Spec_Id);
Push_Scope (Spec_Id);
Set_Corresponding_Spec (N, Spec_Id);
Set_Corresponding_Body (Parent (Spec_Id), Body_Id);
Set_Has_Completion (Spec_Id);
@ -1127,7 +1128,7 @@ package body Sem_Ch9 is
Set_Etype (T, T);
Set_Has_Delayed_Freeze (T, True);
Set_Stored_Constraint (T, No_Elist);
New_Scope (T);
Push_Scope (T);
-- Ada 2005 (AI-345)
@ -1149,19 +1150,15 @@ package body Sem_Ch9 is
Freeze_Before (N, Etype (Iface));
-- Ada 2005 (AI-345): Protected types can only implement
-- limited, synchronized or protected interfaces.
-- limited, synchronized, or protected interfaces (note that
-- the predicate Is_Limited_Interface includes synchronized
-- and protected interfaces).
if Is_Limited_Interface (Iface_Typ)
or else Is_Protected_Interface (Iface_Typ)
or else Is_Synchronized_Interface (Iface_Typ)
then
null;
elsif Is_Task_Interface (Iface_Typ) then
if Is_Task_Interface (Iface_Typ) then
Error_Msg_N ("(Ada 2005) protected type cannot implement a "
& "task interface", Iface);
else
elsif not Is_Limited_Interface (Iface_Typ) then
Error_Msg_N ("(Ada 2005) protected type cannot implement a "
& "non-limited interface", Iface);
end if;
@ -1214,6 +1211,17 @@ package body Sem_Ch9 is
Set_Is_Constrained (T, not Has_Discriminants (T));
-- Perform minimal expansion of the protected type while inside of a
-- generic. The corresponding record is needed for various semantic
-- checks.
if Ada_Version >= Ada_05
and then Inside_A_Generic
then
Insert_After_And_Analyze (N,
Build_Corresponding_Record (N, T, Sloc (T)));
end if;
Analyze (Protected_Definition (N));
-- Protected types with entries are controlled (because of the
@ -1264,8 +1272,10 @@ package body Sem_Ch9 is
-- may be subtypes of the partial view. Skip if errors are present,
-- to prevent cascaded messages.
if Serious_Errors_Detected = 0 then
Exp_Ch9.Expand_N_Protected_Type_Declaration (N);
if Serious_Errors_Detected = 0
and then Expander_Active
then
Expand_N_Protected_Type_Declaration (N);
Process_Full_View (N, T, Def_Id);
end if;
end if;
@ -1444,6 +1454,13 @@ package body Sem_Ch9 is
Generate_Reference (Entry_Id, Entry_Name);
if Present (First_Formal (Entry_Id)) then
if VM_Target = JVM_Target then
Error_Msg_N
("arguments unsupported in requeue statement",
First_Formal (Entry_Id));
return;
end if;
Check_Subtype_Conformant (Enclosing, Entry_Id, Name (N));
-- Processing for parameters accessed by the requeue
@ -1613,7 +1630,7 @@ package body Sem_Ch9 is
T : Entity_Id;
T_Decl : Node_Id;
O_Decl : Node_Id;
O_Name : constant Entity_Id := New_Copy (Id);
O_Name : constant Entity_Id := Id;
begin
Generate_Definition (Id);
@ -1669,7 +1686,7 @@ package body Sem_Ch9 is
T : Entity_Id;
T_Decl : Node_Id;
O_Decl : Node_Id;
O_Name : constant Entity_Id := New_Copy (Id);
O_Name : constant Entity_Id := Id;
begin
Generate_Definition (Id);
@ -1688,6 +1705,14 @@ package body Sem_Ch9 is
Task_Definition => Relocate_Node (Task_Definition (N)),
Interface_List => Interface_List (N));
-- We use the original defining identifier of the single task in the
-- generated object declaration, so that debugging information can
-- be attached to it when compiling with -gnatD. The parent of the
-- entity is the new object declaration. The single_task_declaration
-- is not used further in semantics or code generation, but is scanned
-- when generating debug information, and therefore needs the updated
-- Sloc information for the entity (see Sprint).
O_Decl :=
Make_Object_Declaration (Loc,
Defining_Identifier => O_Name,
@ -1721,6 +1746,7 @@ package body Sem_Ch9 is
procedure Analyze_Task_Body (N : Node_Id) is
Body_Id : constant Entity_Id := Defining_Identifier (N);
HSS : constant Node_Id := Handled_Statement_Sequence (N);
Last_E : Entity_Id;
Spec_Id : Entity_Id;
@ -1779,7 +1805,7 @@ package body Sem_Ch9 is
Spec_Id := Etype (Spec_Id);
end if;
New_Scope (Spec_Id);
Push_Scope (Spec_Id);
Set_Corresponding_Spec (N, Spec_Id);
Set_Corresponding_Body (Parent (Spec_Id), Body_Id);
Set_Has_Completion (Spec_Id);
@ -1800,7 +1826,24 @@ package body Sem_Ch9 is
end if;
end if;
Analyze (Handled_Statement_Sequence (N));
-- Mark all handlers as not suitable for local raise optimization,
-- since this optimization causes difficulties in a task context.
if Present (Exception_Handlers (HSS)) then
declare
Handlr : Node_Id;
begin
Handlr := First (Exception_Handlers (HSS));
while Present (Handlr) loop
Set_Local_Raise_Not_OK (Handlr);
Next (Handlr);
end loop;
end;
end if;
-- Now go ahead and complete analysis of the task body
Analyze (HSS);
Check_Completion (Body_Id);
Check_References (Body_Id);
Check_References (Spec_Id);
@ -1824,7 +1867,7 @@ package body Sem_Ch9 is
end loop;
end;
Process_End_Label (Handled_Statement_Sequence (N), 't', Ref_Id);
Process_End_Label (HSS, 't', Ref_Id);
End_Scope;
end Analyze_Task_Body;
@ -1887,7 +1930,7 @@ package body Sem_Ch9 is
Set_Etype (T, T);
Set_Has_Delayed_Freeze (T, True);
Set_Stored_Constraint (T, No_Elist);
New_Scope (T);
Push_Scope (T);
-- Ada 2005 (AI-345)
@ -1909,19 +1952,15 @@ package body Sem_Ch9 is
Freeze_Before (N, Etype (Iface));
-- Ada 2005 (AI-345): Task types can only implement limited,
-- synchronized or task interfaces.
-- synchronized, or task interfaces (note that the predicate
-- Is_Limited_Interface includes synchronized and task
-- interfaces).
if Is_Limited_Interface (Iface_Typ)
or else Is_Synchronized_Interface (Iface_Typ)
or else Is_Task_Interface (Iface_Typ)
then
null;
elsif Is_Protected_Interface (Iface_Typ) then
if Is_Protected_Interface (Iface_Typ) then
Error_Msg_N ("(Ada 2005) task type cannot implement a " &
"protected interface", Iface);
else
elsif not Is_Limited_Interface (Iface_Typ) then
Error_Msg_N ("(Ada 2005) task type cannot implement a " &
"non-limited interface", Iface);
end if;
@ -1978,6 +2017,15 @@ package body Sem_Ch9 is
Set_Is_Constrained (T, not Has_Discriminants (T));
-- Perform minimal expansion of the task type while inside a generic
-- context. The corresponding record is needed for various semantic
-- checks.
if Inside_A_Generic then
Insert_After_And_Analyze (N,
Build_Corresponding_Record (N, T, Sloc (T)));
end if;
if Present (Task_Definition (N)) then
Analyze_Task_Definition (Task_Definition (N));
end if;
@ -2006,8 +2054,10 @@ package body Sem_Ch9 is
-- may be subtypes of the partial view. Skip if errors are present,
-- to prevent cascaded messages.
if Serious_Errors_Detected = 0 then
Exp_Ch9.Expand_N_Task_Type_Declaration (N);
if Serious_Errors_Detected = 0
and then Expander_Active
then
Expand_N_Task_Type_Declaration (N);
Process_Full_View (N, T, Def_Id);
end if;
end if;

View file

@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
-- Copyright (C) 1992-2006, Free Software Foundation, Inc. --
-- Copyright (C) 1992-2007, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@ -29,11 +29,10 @@ with Debug; use Debug;
with Elists; use Elists;
with Einfo; use Einfo;
with Exp_Disp; use Exp_Disp;
with Exp_Ch6; use Exp_Ch6;
with Exp_Ch7; use Exp_Ch7;
with Exp_Tss; use Exp_Tss;
with Errout; use Errout;
with Hostparm; use Hostparm;
with Namet; use Namet;
with Nlists; use Nlists;
with Nmake; use Nmake;
with Opt; use Opt;
@ -48,6 +47,7 @@ with Sem_Util; use Sem_Util;
with Snames; use Snames;
with Stand; use Stand;
with Sinfo; use Sinfo;
with Targparm; use Targparm;
with Tbuild; use Tbuild;
with Uintp; use Uintp;
@ -102,6 +102,17 @@ package body Sem_Disp is
Ctrl_Type := Check_Controlling_Type (Etype (Formal), Subp);
if Present (Ctrl_Type) then
-- When the controlling type is concurrent and declared within a
-- generic or inside an instance, use its corresponding record
-- type.
if Is_Concurrent_Type (Ctrl_Type)
and then Present (Corresponding_Record_Type (Ctrl_Type))
then
Ctrl_Type := Corresponding_Record_Type (Ctrl_Type);
end if;
if Ctrl_Type = Typ then
Set_Is_Controlling_Formal (Formal);
@ -162,8 +173,17 @@ package body Sem_Disp is
Set_Has_Controlling_Result (Subp);
-- Check that result subtype statically matches first subtype
-- (Ada 2005) : Subp may have a controlling access result.
if not Subtypes_Statically_Match (Typ, Etype (Subp)) then
if Subtypes_Statically_Match (Typ, Etype (Subp))
or else (Ekind (Etype (Subp)) = E_Anonymous_Access_Type
and then
Subtypes_Statically_Match
(Typ, Designated_Type (Etype (Subp))))
then
null;
else
Error_Msg_N
("result subtype does not match controlling type", Subp);
end if;
@ -257,12 +277,12 @@ package body Sem_Disp is
----------------------------
procedure Check_Dispatching_Call (N : Node_Id) is
Loc : constant Source_Ptr := Sloc (N);
Actual : Node_Id;
Formal : Entity_Id;
Control : Node_Id := Empty;
Func : Entity_Id;
Subp_Entity : Entity_Id;
Loc : constant Source_Ptr := Sloc (N);
Indeterm_Ancestor_Call : Boolean := False;
Indeterm_Ctrl_Type : Entity_Id;
@ -436,25 +456,6 @@ package body Sem_Disp is
Set_Controlling_Argument (N, Control);
Check_Restriction (No_Dispatching_Calls, N);
-- Ada 2005 (AI-318-02): Check current implementation restriction
-- that a dispatching call cannot be made to a primitive function
-- with a limited result type. This restriction can be removed
-- once calls to limited functions with class-wide results are
-- supported. ???
if Ada_Version = Ada_05
and then Nkind (N) = N_Function_Call
then
Func := Entity (Name (N));
if Has_Controlling_Result (Func)
and then Is_Limited_Type (Etype (Func))
then
Error_Msg_N ("(Ada 2005) limited function call in this" &
" context is not yet implemented", N);
end if;
end if;
else
-- The call is not dispatching, so check that there aren't any
-- tag-indeterminate abstract calls left.
@ -479,7 +480,7 @@ package body Sem_Disp is
Func := Empty;
-- Only other possibility is a qualified expression whose
-- consituent expression is itself a call.
-- constituent expression is itself a call.
else
Func :=
@ -596,6 +597,7 @@ package body Sem_Disp is
and then Is_Interface (Typ)
and then not Is_Derived_Type (Typ)
and then not Is_Generic_Type (Typ)
and then not In_Instance
then
Error_Msg_N ("?declaration of& is too late!", Subp);
Error_Msg_NE
@ -738,8 +740,9 @@ package body Sem_Disp is
Set_DT_Position (Subp, DT_Position (Old_Subp));
if not Restriction_Active (No_Dispatching_Calls) then
Insert_After (Subp_Body,
Fill_DT_Entry (Sloc (Subp_Body), Subp));
Register_Primitive (Sloc (Subp_Body),
Prim => Subp,
Ins_Nod => Subp_Body);
end if;
end if;
end if;
@ -752,7 +755,7 @@ package body Sem_Disp is
Subp);
end if;
-- If the type is not frozen yet and we are not in the overridding
-- If the type is not frozen yet and we are not in the overriding
-- case it looks suspiciously like an attempt to define a primitive
-- operation.
@ -769,7 +772,7 @@ package body Sem_Disp is
end if;
-- Now, we are sure that the scope is a package spec. If the subprogram
-- is declared after the freezing point ot the type that's an error
-- is declared after the freezing point of the type that's an error
elsif Is_Frozen (Tagged_Type) and then not Has_Dispatching_Parent then
Error_Msg_N ("this primitive operation is declared too late", Subp);
@ -819,13 +822,15 @@ package body Sem_Disp is
and then Present (Abstract_Interface_Alias (Prim))
and then Alias (Prim) = Subp
then
Register_Interface_DT_Entry (Subp_Body, Prim);
Register_Primitive (Sloc (Prim),
Prim => Prim,
Ins_Nod => Subp_Body);
end if;
Next_Elmt (Elmt);
end loop;
-- Redisplay the contents of the updated dispatch table.
-- Redisplay the contents of the updated dispatch table
if Debug_Flag_ZZ then
Write_Str ("Late overriding: ");
@ -1322,7 +1327,7 @@ package body Sem_Disp is
and then Has_Abstract_Interfaces (Tagged_Type)
then
-- Ada 2005 (AI-251): Update the attribute alias of all the aliased
-- entities of the overriden primitive to reference New_Op, and also
-- entities of the overridden primitive to reference New_Op, and also
-- propagate them the new value of the attribute
-- Is_Abstract_Subprogram.
@ -1429,11 +1434,11 @@ package body Sem_Disp is
Next_Actual (Arg);
end loop;
-- Expansion of dispatching calls is suppressed when Java_VM, because
-- the JVM back end directly handles the generation of dispatching
-- Expansion of dispatching calls is suppressed when VM_Target, because
-- the VM back-ends directly handle the generation of dispatching
-- calls and would have to undo any expansion to an indirect call.
if not Java_VM then
if VM_Target = No_VM then
Expand_Dispatching_Call (Call_Node);
end if;
end Propagate_Tag;