This is an incorrect node sharing for allocators built for a discriminated
type with default values. The fix was essentially present in the PR.
Tested on x86-64/Linux, applied on the mainline.
2025-10-05 Franck Behaghel <[email protected]>
PR ada/110314
* sem_ch4.adb (Analyze_Allocator): Add call to New_Copy_Tree.
2025-10-05 Franck Behaghel <[email protected]>
* gnat.dg/allocator3.adb: New test.
--
Eric Botcazoudiff --git a/gcc/ada/sem_ch4.adb b/gcc/ada/sem_ch4.adb
index 61a53f56a98..5704bf142c8 100644
--- a/gcc/ada/sem_ch4.adb
+++ b/gcc/ada/sem_ch4.adb
@@ -630,7 +630,8 @@ package body Sem_Ch4 is
begin
while Present (Discr) loop
- Append (Discriminant_Default_Value (Discr), Constr);
+ Append_To (Constr,
+ New_Copy_Tree (Discriminant_Default_Value (Discr)));
Next_Discriminant (Discr);
end loop;
-- { dg-do compile }
with Ada.Containers.Synchronized_Queue_Interfaces;
with Ada.Containers.Unbounded_Synchronized_Queues;
procedure Allocator3 is
package Queue_Interfaces is
new Ada.Containers.Synchronized_Queue_Interfaces (Integer);
package Synchronized_Queues is
new Ada.Containers.Unbounded_Synchronized_Queues (Queue_Interfaces);
subtype Queue is Synchronized_Queues.Queue;
type Access_Type is access all Queue;
Q1 : Access_Type := new Queue;
Q2 : Access_Type := new Queue;
begin
null;
end;