https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117569
Bug ID: 117569
Summary: Predicate involving array indexing won’t compile in
generic
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: ada
Assignee: unassigned at gcc dot gnu.org
Reporter: simon at pushface dot org
CC: dkm at gcc dot gnu.org
Target Milestone: ---
This code
pragma Extensions_Allowed (On);
generic
package Main is
type Data is record
X, Y : Positive;
E : Integer;
end record;
type ArrayInput is array (Positive range 1 .. <>) of Data with
Dynamic_Predicate =>
(for all I in 2 .. ArrayInput'Last =>
ArrayInput (I).X < ArrayInput (I - 1).X or
ArrayInput (I - 1).Y < ArrayInput (I).Y);
end Main;
fails with
GNAT 15.0.0 20241110 (experimental)
Copyright 1992-2024, Free Software Foundation, Inc.
Compiling: main.ads
Source file time stamp: 2024-11-12 16:53:01
Compiled at: 2024-11-13 17:27:33
1. pragma Extensions_Allowed (On);
2. generic
3. package Main is
4. type Data is record
5. X, Y : Positive;
6. E : Integer;
7. end record;
8. type ArrayInput is array (Positive range 1 .. <>) of Data with
9. Dynamic_Predicate =>
10. (for all I in 2 .. ArrayInput'Last =>
11. ArrayInput (I).X < ArrayInput (I - 1).X or
1 2
>>> error: reference to current instance of type does not denote a type
(RM 8.6)
>>> error: reference to current instance of type does not denote a type
(RM 8.6)
12. ArrayInput (I - 1).Y < ArrayInput (I).Y);
1 2
>>> error: reference to current instance of type does not denote a type
(RM 8.6)
>>> error: reference to current instance of type does not denote a type
(RM 8.6)
13. end Main;
The code compiles without error if 'generic' is removed.
A simpler example fails similarly:
1. generic
2. package main2 is
3. type Data is record
4. X,Y: Positive;
5. end record;
6. type ArrayInput is array (Positive range <>) of Data with
7. Dynamic_Predicate =>
8. (for all I in ArrayInput'First + 1 .. ArrayInput'Last =>
9. ArrayInput (I).X < ArrayInput (I - 1).X or
1 2
>>> error: reference to current instance of type does not denote a type
(RM 8.6)
>>> error: reference to current instance of type does not denote a type
(RM 8.6)
10. ArrayInput (I - 1).Y < ArrayInput (I).Y);
1 2
>>> error: reference to current instance of type does not denote a type
(RM 8.6)
>>> error: reference to current instance of type does not denote a type
(RM 8.6)
11. end main2;
With GCC 13 and 14 the compilation fails differently:
7. Dynamic_Predicate =>
8. (for all I in ArrayInput'First + 1 .. ArrayInput'Last =>
9. ArrayInput (I).X < ArrayInput (I - 1).X or
1 2
>>> error: invalid prefix in selected component "X"
>>> error: invalid prefix in selected component "X"
10. ArrayInput (I - 1).Y < ArrayInput (I).Y);
1 2
>>> error: invalid prefix in selected component "Y"
>>> error: invalid prefix in selected component "Y"
11. end main2;