aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArnaud Charlet <charlet@gcc.gnu.org>2011-09-05 14:58:26 +0200
committerArnaud Charlet <charlet@gcc.gnu.org>2011-09-05 14:58:26 +0200
commit7109f4f52da4ea189b04aeb29a077d140855cb52 (patch)
tree066827c96ac7d0b966728b9e27ebe3f6ed3cef82
parent66dc8075f33117924fc1596721708e979912e20e (diff)
downloadgcc-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/ChangeLog12
-rw-r--r--gcc/ada/lib-xref-alfa.adb15
-rw-r--r--gcc/ada/sem_res.adb13
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));