aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJavier Miranda <miranda@adacore.com>2006-02-17 17:08:28 +0100
committerArnaud Charlet <charlet@gcc.gnu.org>2006-02-17 17:08:28 +0100
commit4197ae1e5611c7db9d272cce81507865c4d59d65 (patch)
tree79854d884bf8111343b5d92c9c4f2272801a0cb6
parent08402a6d65a25da348c28c0a539dd0923ff976d6 (diff)
downloadgcc-4197ae1e5611c7db9d272cce81507865c4d59d65.zip
gcc-4197ae1e5611c7db9d272cce81507865c4d59d65.tar.gz
gcc-4197ae1e5611c7db9d272cce81507865c4d59d65.tar.bz2
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
-rw-r--r--gcc/ada/sem_res.adb61
1 files changed, 24 insertions, 37 deletions
diff --git a/gcc/ada/sem_res.adb b/gcc/ada/sem_res.adb
index 1a8766a..1a9ab72 100644
--- a/gcc/ada/sem_res.adb
+++ b/gcc/ada/sem_res.adb
@@ -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;