diff options
author | Arnaud Charlet <charlet@gcc.gnu.org> | 2011-09-05 14:58:26 +0200 |
---|---|---|
committer | Arnaud Charlet <charlet@gcc.gnu.org> | 2011-09-05 14:58:26 +0200 |
commit | 7109f4f52da4ea189b04aeb29a077d140855cb52 (patch) | |
tree | 066827c96ac7d0b966728b9e27ebe3f6ed3cef82 | |
parent | 66dc8075f33117924fc1596721708e979912e20e (diff) | |
download | gcc-7109f4f52da4ea189b04aeb29a077d140855cb52.zip gcc-7109f4f52da4ea189b04aeb29a077d140855cb52.tar.gz gcc-7109f4f52da4ea189b04aeb29a077d140855cb52.tar.bz2 |
[multiple changes]
2011-09-05 Bob Duff <duff@adacore.com>
* 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 <kanig@adacore.com>
* lib-xref-alfa.adb (Is_Alfa_Reference): Never declare effects on
objects of task type or protected type.
From-SVN: r178531
-rw-r--r-- | gcc/ada/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/ada/lib-xref-alfa.adb | 15 | ||||
-rw-r--r-- | gcc/ada/sem_res.adb | 13 |
3 files changed, 36 insertions, 4 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 2bfd148a..05246c4 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,15 @@ +2011-09-05 Bob Duff <duff@adacore.com> + + * 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 <kanig@adacore.com> + + * lib-xref-alfa.adb (Is_Alfa_Reference): Never declare effects on + objects of task type or protected type. + 2011-09-05 Ed Schonberg <schonberg@adacore.com> * 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 ce95463..a2ea0e6 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 0a15075..1d3c018 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)); |