aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorArnaud Charlet <charlet@gcc.gnu.org>2013-04-11 14:38:20 +0200
committerArnaud Charlet <charlet@gcc.gnu.org>2013-04-11 14:38:20 +0200
commit83851b239b0dd1af4fe3ba4c8d0ce7b74c82803d (patch)
tree2006f8c14d7772427d0df93a4483c5b7fa2bd8db /gcc
parente6425869abeaf52c2c23e924140baa6c28dc9118 (diff)
downloadgcc-83851b239b0dd1af4fe3ba4c8d0ce7b74c82803d.zip
gcc-83851b239b0dd1af4fe3ba4c8d0ce7b74c82803d.tar.gz
gcc-83851b239b0dd1af4fe3ba4c8d0ce7b74c82803d.tar.bz2
[multiple changes]
2013-04-11 Thomas Quinot <quinot@adacore.com> * sem_util.adb (Set_Entity_With_Style_Check): Fix logic of check for implementation defined identifiers. 2013-04-11 Yannick Moy <moy@adacore.com> * checks.adb (Apply_Type_Conversion_Checks): Add an explanation of why range check and length are put on different nodes. * exp_ch4.adb (Apply_Type_Conversion_Checks): Remove check marks when doing their expansion. From-SVN: r197776
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/ChangeLog12
-rw-r--r--gcc/ada/checks.adb4
-rw-r--r--gcc/ada/exp_ch4.adb13
-rw-r--r--gcc/ada/sem_util.adb5
4 files changed, 31 insertions, 3 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 2032950..cb50285 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,15 @@
+2013-04-11 Thomas Quinot <quinot@adacore.com>
+
+ * sem_util.adb (Set_Entity_With_Style_Check): Fix logic of
+ check for implementation defined identifiers.
+
+2013-04-11 Yannick Moy <moy@adacore.com>
+
+ * checks.adb (Apply_Type_Conversion_Checks): Add an explanation
+ of why range check and length are put on different nodes.
+ * exp_ch4.adb (Apply_Type_Conversion_Checks): Remove check marks
+ when doing their expansion.
+
2013-04-11 Ed Schonberg <schonberg@adacore.com>
* sem_util.ads, sem_util.adb (Get_Incomplete_View_Of_Ancestor):
diff --git a/gcc/ada/checks.adb b/gcc/ada/checks.adb
index 05a0c6f..640f012 100644
--- a/gcc/ada/checks.adb
+++ b/gcc/ada/checks.adb
@@ -3248,7 +3248,9 @@ package body Checks is
-- expansion, to take into accounts changes of representation. The
-- checks become range checks on the base type or length checks on the
-- subtype, depending on whether the target type is unconstrained or
- -- constrained.
+ -- constrained. Note that the range check is put on the expression of a
+ -- type conversion, while the length check is put on the type conversion
+ -- itself.
elsif Is_Array_Type (Target_Type) then
if Is_Constrained (Target_Type) then
diff --git a/gcc/ada/exp_ch4.adb b/gcc/ada/exp_ch4.adb
index be011f8..480151d 100644
--- a/gcc/ada/exp_ch4.adb
+++ b/gcc/ada/exp_ch4.adb
@@ -10053,6 +10053,19 @@ package body Exp_Ch4 is
-- Start of processing for Expand_N_Type_Conversion
begin
+ -- First remove check marks put by the semantic analysis on the type
+ -- conversion between array types. The front end expands these checks
+ -- explicitly, so they should not be set in the tree passed to the back
+ -- end.
+
+ if Is_Array_Type (Target_Type) then
+ if Is_Constrained (Target_Type) then
+ Set_Do_Length_Check (N, False);
+ else
+ Set_Do_Range_Check (Operand, False);
+ end if;
+ end if;
+
-- Nothing at all to do if conversion is to the identical type so remove
-- the conversion completely, it is useless, except that it may carry
-- an Assignment_OK attribute, which must be propagated to the operand.
diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb
index 071bdd5..2892c88 100644
--- a/gcc/ada/sem_util.adb
+++ b/gcc/ada/sem_util.adb
@@ -13419,9 +13419,10 @@ package body Sem_Util is
-- the entities within it).
if (Is_Implementation_Defined (Val)
+ or else
+ Is_Implementation_Defined (Scope (Val)))
and then not (Ekind_In (Val, E_Package, E_Generic_Package)
- and then Is_Library_Level_Entity (Val)))
- or else Is_Implementation_Defined (Scope (Val))
+ and then Is_Library_Level_Entity (Val))
then
Check_Restriction (No_Implementation_Identifiers, N);
end if;