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 Botcazou
diff --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;

Reply via email to