From 7109f4f52da4ea189b04aeb29a077d140855cb52 Mon Sep 17 00:00:00 2001 From: Arnaud Charlet Date: Mon, 5 Sep 2011 14:58:26 +0200 Subject: [PATCH] [multiple changes] 2011-09-05 Bob Duff * sem_res.adb (Resolve_Intrinsic_Operator): Use unchecked conversions instead of normal type conversions in all cases where a type conversion would be illegal. In particular, use unchecked conversions when the operand types are private. 2011-09-05 Johannes Kanig * lib-xref-alfa.adb (Is_Alfa_Reference): Never declare effects on objects of task type or protected type. From-SVN: r178531 --- gcc/ada/ChangeLog | 12 ++++++++++++ gcc/ada/lib-xref-alfa.adb | 15 +++++++++++++++ gcc/ada/sem_res.adb | 13 +++++++++---- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 2bfd148a259..05246c42b05 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,15 @@ +2011-09-05 Bob Duff + + * sem_res.adb (Resolve_Intrinsic_Operator): Use unchecked + conversions instead of normal type conversions in all cases where a + type conversion would be illegal. In particular, use unchecked + conversions when the operand types are private. + +2011-09-05 Johannes Kanig + + * lib-xref-alfa.adb (Is_Alfa_Reference): Never declare effects on + objects of task type or protected type. + 2011-09-05 Ed Schonberg * sem_ch6.adb (Analyze_Expression_Function): If the expression diff --git a/gcc/ada/lib-xref-alfa.adb b/gcc/ada/lib-xref-alfa.adb index ce9546327f3..a2ea0e6c623 100644 --- a/gcc/ada/lib-xref-alfa.adb +++ b/gcc/ada/lib-xref-alfa.adb @@ -620,7 +620,22 @@ package body Alfa is return False; when others => + + -- Objects of Task type or protected type are not Alfa + -- references. + + if Present (Etype (E)) then + case Ekind (Etype (E)) is + when E_Task_Type | E_Protected_Type => + return False; + + when others => + null; + end case; + end if; + return Typ = 'r' or else Typ = 'm'; + end case; end Is_Alfa_Reference; diff --git a/gcc/ada/sem_res.adb b/gcc/ada/sem_res.adb index 0a15075994c..1d3c018ec5a 100644 --- a/gcc/ada/sem_res.adb +++ b/gcc/ada/sem_res.adb @@ -7145,6 +7145,8 @@ package body Sem_Res is return Res; end Convert_Operand; + -- Start of processing for Resolve_Intrinsic_Operator + begin -- We must preserve the original entity in a generic setting, so that -- the legality of the operation can be verified in an instance. @@ -7162,11 +7164,14 @@ package body Sem_Res is Set_Entity (N, Op); Set_Is_Overloaded (N, False); - -- If the operand type is private, rewrite with suitable conversions on - -- the operands and the result, to expose the proper underlying numeric - -- type. + -- If the result or operand types are private, rewrite with unchecked + -- conversions on the operands and the result, to expose the proper + -- underlying numeric type. - if Is_Private_Type (Typ) then + if Is_Private_Type (Typ) + or else Is_Private_Type (Etype (Left_Opnd (N))) + or else Is_Private_Type (Etype (Right_Opnd (N))) + then Arg1 := Convert_Operand (Left_Opnd (N)); -- Unchecked_Convert_To (Btyp, Left_Opnd (N));