aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada
diff options
context:
space:
mode:
authorEd Schonberg <schonberg@adacore.com>2019-07-10 09:02:47 +0000
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>2019-07-10 09:02:47 +0000
commitc14dc27e91ccd6bdc86ac0b875892396dc84a985 (patch)
tree4979f01bbad8ef0e0eca5da05e71825604d6d14d /gcc/ada
parent179682a55cbe229442cf3886e338148be0b12a96 (diff)
downloadgcc-c14dc27e91ccd6bdc86ac0b875892396dc84a985.zip
gcc-c14dc27e91ccd6bdc86ac0b875892396dc84a985.tar.gz
gcc-c14dc27e91ccd6bdc86ac0b875892396dc84a985.tar.bz2
[Ada] Crash on aggregate for limited type in extended return
This patch fixes a compiler abort on an extended return statement whose expression is an aggregate (to be built in place) for a discriminated record with a limited component. The build-in-place mechanism creates an access type and a renaming declaration through which individual components are assigned. The renamed object is constrained because it is limited, and the renaming declaration does not need to create a local subtype indication for it, which may lead to type mismatches in the back-end, and is in any case redundant. This patch extends this optimization to the case of records that are limited only because of a limitied component, and not because they are explicit declared limited. 2019-07-10 Ed Schonberg <schonberg@adacore.com> gcc/ada/ * sem_ch8.adb (Check_Constrained_Object): A record that is limited because of the presence of a limited component is constrained, and no subtype indiciation needs to be created for it, just as is the case for declared limited records. gcc/testsuite/ * gnat.dg/limited3.adb, gnat.dg/limited3_pkg.adb, gnat.dg/limited3_pkg.ads: New testcase. From-SVN: r273350
Diffstat (limited to 'gcc/ada')
-rw-r--r--gcc/ada/ChangeLog7
-rw-r--r--gcc/ada/sem_ch8.adb13
2 files changed, 16 insertions, 4 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index e781181..6e9ba85 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,10 @@
+2019-07-10 Ed Schonberg <schonberg@adacore.com>
+
+ * sem_ch8.adb (Check_Constrained_Object): A record that is
+ limited because of the presence of a limited component is
+ constrained, and no subtype indiciation needs to be created for
+ it, just as is the case for declared limited records.
+
2019-07-10 Yannick Moy <moy@adacore.com>
* sem_aux.adb, sem_aux.ads (Is_Protected_Operation): New
diff --git a/gcc/ada/sem_ch8.adb b/gcc/ada/sem_ch8.adb
index 03b6235..58abc9c 100644
--- a/gcc/ada/sem_ch8.adb
+++ b/gcc/ada/sem_ch8.adb
@@ -802,12 +802,17 @@ package body Sem_Ch8 is
null;
-- If a record is limited its size is invariant. This is the case
- -- in particular with record types with an access discirminant
+ -- in particular with record types with an access discriminant
-- that are used in iterators. This is an optimization, but it
-- also prevents typing anomalies when the prefix is further
- -- expanded. Limited types with discriminants are included.
-
- elsif Is_Limited_Record (Typ)
+ -- expanded. This also applies to limited types with access
+ -- discriminants.
+ -- Note that we cannot just use the Is_Limited_Record flag because
+ -- it does not apply to records with limited components, for which
+ -- this syntactic flag is not set, but whose size is also fixed.
+
+ elsif (Is_Record_Type (Typ)
+ and then Is_Limited_Type (Typ))
or else
(Ekind (Typ) = E_Limited_Private_Type
and then Has_Discriminants (Typ)