Commit 4197ae1e by Javier Miranda Committed by Arnaud Charlet

sem_res.adb (Resolve_Type_Conversion): In case of conversion to an abstract interface type...

2006-02-17  Javier Miranda  <miranda@adacore.com>

	* sem_res.adb (Resolve_Type_Conversion): In case of conversion to an
	abstract interface type, the static analysis is not enough to know if
	the interface is implemented or not by the source tagged type. Hence
	we must pass the work to the expander to generate the required code to
	evaluate the conversion at run-time.
	(Resolve_Equality_Op): Do not apply previous
	transformation if expansion is disasbled, to prevent anomalies when
	locating global references in a generic unit.

From-SVN: r111195
parent 08402a6d
......@@ -4962,8 +4962,9 @@ package body Sem_Res is
-- We apply the same conversion in the case one of the operands is
-- a private subtype of the type of the other.
if Ekind (T) = E_Anonymous_Access_Type
or else Is_Private_Type (T)
if Expander_Active
and then (Ekind (T) = E_Anonymous_Access_Type
or else Is_Private_Type (T))
then
if Etype (L) /= T then
Rewrite (L,
......@@ -6747,45 +6748,31 @@ package body Sem_Res is
Opnd_Type := Directly_Designated_Type (Opnd_Type);
end if;
declare
Save_Typ : constant Entity_Id := Opnd_Type;
begin
if Is_Class_Wide_Type (Opnd_Type) then
Opnd_Type := Etype (Opnd_Type);
end if;
-- Handle subtypes
if Is_Class_Wide_Type (Opnd_Type) then
Opnd_Type := Etype (Opnd_Type);
end if;
if Ekind (Opnd_Type) = E_Protected_Subtype
or else Ekind (Opnd_Type) = E_Task_Subtype
then
Opnd_Type := Etype (Opnd_Type);
end if;
-- Handle subtypes
if not Interface_Present_In_Ancestor
(Typ => Opnd_Type,
Iface => Target_Type)
then
-- The static analysis is not enough to know if the
-- interface is implemented or not. Hence we must pass the
-- work to the expander to generate the required code to
-- evaluate the conversion at run-time.
if Ekind (Opnd_Type) = E_Protected_Subtype
or else Ekind (Opnd_Type) = E_Task_Subtype
then
Opnd_Type := Etype (Opnd_Type);
end if;
if Is_Class_Wide_Type (Save_Typ)
and then Is_Interface (Save_Typ)
then
Expand_Interface_Conversion (N, Is_Static => False);
else
Error_Msg_NE
("(Ada 2005) does not implement interface }",
Operand, Target_Type);
end if;
if not Interface_Present_In_Ancestor
(Typ => Opnd_Type,
Iface => Target_Type)
then
-- The static analysis is not enough to know if the interface
-- is implemented or not. Hence we must pass the work to the
-- expander to generate the required code to evaluate the
-- conversion at run-time.
else
Expand_Interface_Conversion (N);
end if;
end;
Expand_Interface_Conversion (N, Is_Static => False);
else
Expand_Interface_Conversion (N);
end if;
end if;
end if;
end Resolve_Type_Conversion;
......
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