aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2021-03-02 17:58:46 +0100
committerEric Botcazou <ebotcazou@adacore.com>2021-03-02 18:00:09 +0100
commit168b75ff54b4e70650b8709816edff13f93e737a (patch)
tree251d6f96b18c4eeaf8a7be5ce10a875cc7c7d8dc
parentf8e4d7a6597fa81ff927156a5f5d10b7fdaa0bc0 (diff)
downloadgcc-168b75ff54b4e70650b8709816edff13f93e737a.zip
gcc-168b75ff54b4e70650b8709816edff13f93e737a.tar.gz
gcc-168b75ff54b4e70650b8709816edff13f93e737a.tar.bz2
Fix PR ada/99095
This is a regression present on the mainline and 10 branch, where we fail to make the bounds explicit for the return value of a function returning an unconstrained array of a limited record type. gcc/ada/ PR ada/99095 * sem_ch8.adb (Check_Constrained_Object): Restrict again the special optimization for limited types to non-array types except in the case of an extended return statement. gcc/testsuite/ * gnat.dg/limited5.adb: New test.
-rw-r--r--gcc/ada/sem_ch8.adb10
-rw-r--r--gcc/testsuite/gnat.dg/limited5.adb17
2 files changed, 26 insertions, 1 deletions
diff --git a/gcc/ada/sem_ch8.adb b/gcc/ada/sem_ch8.adb
index 4689ae4..efff714 100644
--- a/gcc/ada/sem_ch8.adb
+++ b/gcc/ada/sem_ch8.adb
@@ -830,11 +830,19 @@ package body Sem_Ch8 is
-- that are used in iterators. This is an optimization, but it
-- also prevents typing anomalies when the prefix is further
-- expanded.
+
-- 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_Limited_Type (Typ) then
+ -- Note also that we need to build the constrained subtype for an
+ -- array in order to make the bounds explicit in most cases, but
+ -- not if the object comes from an extended return statement, as
+ -- this would create dangling references to them later on.
+
+ elsif Is_Limited_Type (Typ)
+ and then (not Is_Array_Type (Typ) or else Is_Return_Object (Id))
+ then
null;
else
diff --git a/gcc/testsuite/gnat.dg/limited5.adb b/gcc/testsuite/gnat.dg/limited5.adb
new file mode 100644
index 0000000..ded8aa3
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/limited5.adb
@@ -0,0 +1,17 @@
+-- { dg-do compile }
+
+procedure Limited5 is
+
+ type Command is limited null record;
+ type Command_Array is array (Positive range <>) of Command;
+
+ function To_Commands return Command_Array is
+ begin
+ return Result : Command_Array (1 .. 2);
+ end To_Commands;
+
+ The_Commands : aliased Command_Array := To_Commands;
+
+begin
+ null;
+end;