Hello,
I've got the following GNAT error:
$ gcc -c -gnat2022 -gnatl 2024/test_20240211_static_choice.adb
GNAT 13.2.0
1. procedure test_20240211_static_choice is
2.
3. package Maps is
4. type Map_Type is private
5. with Aggregate => (Empty => Empty_Map,
6. Add_Named => Add_To_Map);
7. procedure Add_To_Map (M : in out Map_Type; Key : in Integer; Value : in String);
8. Empty_Map : constant Map_Type;
9. private
10. type Map_Type is array (1..10) of String (1..10);
11. procedure Add_To_Map (M : in out Map_Type; Key : in Integer; Value : in String) is null;
12. Empty_Map : constant Map_Type := [1..10 => " "]; -- error: choice must be static
|
>>> error: choice must be static
13. end;
14.
15. begin
16. null;
17. end;
I wonder what more static it should be.
Any clue ?
Thanks, Pascal.
Source code:
procedure test_20240211_static_choice is
package Maps is
type Map_Type is private
with Aggregate => (Empty => Empty_Map,
Add_Named => Add_To_Map);
procedure Add_To_Map (M : in out Map_Type; Key : in Integer; Value : in String);
Empty_Map : constant Map_Type;
private
type Map_Type is array (1..10) of String (1..10);
procedure Add_To_Map (M : in out Map_Type; Key : in Integer; Value : in String) is null;
Empty_Map : constant Map_Type := [1..10 => " "]; --
error: choice must be static
end;
begin
null;
end;
Looks like a compiler bug to me. The nonsense message gives that away... :-)
"Randy Brukardt" <randy@rrsoftware.com> writes:
Looks like a compiler bug to me. The nonsense message gives that away...
:-)
GCC 14.0.1 says
1. procedure test_20240211_static_choice is
2.
3. package Maps is
4. type Map_Type is private
5. with Aggregate => (Empty => Empty_Map,
|
>>> error: aspect "Aggregate" can only be applied to non-array type
6. Add_Named => Add_To_Map);
7. procedure Add_To_Map (M : in out Map_Type; Key : in Integer;
8. Value : in String);
9. Empty_Map : constant Map_Type;
10. private
11. type Map_Type is array (1..10) of String (1..10);
12. procedure Add_To_Map (M : in out Map_Type; Key : in Integer;
13. Value : in String) is null;
14. Empty_Map : constant Map_Type := [1..10 => " "];
|
>>> error: choice must be static
15. end;
16.
17. begin
18. null;
19. end;
I think the first is because of ARM 4.3.5(2), "For a type other than an
array type, the following type-related operational aspect may be specified"[1] and the second is a "nonsense" consequence.
[1] http://www.ada-auth.org/standards/22rm/html/RM-4-3-5.html#p2
Ah, yes, didn't notice that part. One cannot give the Aggregate aspect on an array type, directly or indirectly. That's because container aggregates are designed to work like array aggregates, and we didn't want visibility to determine the interpretation of an aggregate (especially where the same syntax could have a different meaning in different visibility).. Thus, there can be no point where a single type can have both array aggregates and container aggregates.
Note that record aggregates and container aggregates are always syntactally different, and thus it is OK to have both in a single location (that's one
of the reasons that we adopted square brackets for container aggregates). That seemed important as the majority of private types are completed by record types, and not allowing record types in this context would be difficult to work around.
Sysop: | DaiTengu |
---|---|
Location: | Appleton, WI |
Users: | 991 |
Nodes: | 10 (0 / 10) |
Uptime: | 82:01:42 |
Calls: | 12,949 |
Calls today: | 3 |
Files: | 186,574 |
Messages: | 3,264,677 |