Commit 9cca32af by Javier Miranda Committed by Arnaud Charlet

sem_disp.adb (Check_Controlling_Formals): Anonymous access types used in…

sem_disp.adb (Check_Controlling_Formals): Anonymous access types used in controlling parameters exclude null because it...

2005-09-01  Javier Miranda  <miranda@adacore.com>
	    Ed Schonberg  <schonberg@adacore.com>

	* sem_disp.adb (Check_Controlling_Formals): Anonymous access types
	used in controlling parameters exclude null because it is necessary to
	read the tag to dispatch, and null has no tag.
	(Override_Dispatching_Operation): If the previous operation is inherited
	from an interface, it becomes hidden  and does not participate in later
	name resolution.

From-SVN: r103885
parent 725393ea
...@@ -115,6 +115,15 @@ package body Sem_Disp is ...@@ -115,6 +115,15 @@ package body Sem_Disp is
if Ctrl_Type = Typ then if Ctrl_Type = Typ then
Set_Is_Controlling_Formal (Formal); Set_Is_Controlling_Formal (Formal);
-- Ada 2005 (AI-231):Anonymous access types used in controlling
-- parameters exclude null because it is necessary to read the
-- tag to dispatch, and null has no tag.
if Ekind (Etype (Formal)) = E_Anonymous_Access_Type then
Set_Can_Never_Be_Null (Etype (Formal));
Set_Is_Known_Non_Null (Etype (Formal));
end if;
-- Check that the parameter's nominal subtype statically -- Check that the parameter's nominal subtype statically
-- matches the first subtype. -- matches the first subtype.
...@@ -784,14 +793,7 @@ package body Sem_Disp is ...@@ -784,14 +793,7 @@ package body Sem_Disp is
then then
Old_Spec := Corresponding_Spec (Old_Bod); Old_Spec := Corresponding_Spec (Old_Bod);
Set_Has_Completion (Old_Spec, False); Set_Has_Completion (Old_Spec, False);
if Exception_Mechanism = Front_End_ZCX_Exceptions then
Set_Has_Subprogram_Descriptor (Old_Spec, False);
Set_Handler_Records (Old_Spec, No_List);
Set_Is_Eliminated (Old_Spec);
end if;
end if; end if;
end if; end if;
end loop; end loop;
...@@ -1212,10 +1214,12 @@ package body Sem_Disp is ...@@ -1212,10 +1214,12 @@ package body Sem_Disp is
return; return;
end if; end if;
-- Ada 2005 (AI-251): Do not replace subprograms corresponding to -- Ada 2005 (AI-251): Do not replace subprograms inherited from
-- abstract interfaces. They will be used later to generate the -- abstract interfaces. They will be used later to generate the
-- corresponding thunks to initialize the Vtable (see subprogram -- corresponding thunks to initialize the Vtable (see subprogram
-- Freeze_Subprogram) -- Freeze_Subprogram). The inherited operation itself must also
-- become hidden, to avoid spurious ambiguities; name resolution
-- must pick up only the operation that implements it,
if Is_Interface_Subprogram (Prev_Op) then if Is_Interface_Subprogram (Prev_Op) then
Set_DT_Position (Prev_Op, DT_Position (Alias (Prev_Op))); Set_DT_Position (Prev_Op, DT_Position (Alias (Prev_Op)));
...@@ -1224,6 +1228,7 @@ package body Sem_Disp is ...@@ -1224,6 +1228,7 @@ package body Sem_Disp is
Set_Abstract_Interface_Alias (Prev_Op, Alias (Prev_Op)); Set_Abstract_Interface_Alias (Prev_Op, Alias (Prev_Op));
Set_Alias (Prev_Op, New_Op); Set_Alias (Prev_Op, New_Op);
Set_Is_Internal (Prev_Op); Set_Is_Internal (Prev_Op);
Set_Is_Hidden (Prev_Op);
-- Override predefined primitive operations -- Override predefined primitive operations
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment