1-- { dg-do compile } 2-- { dg-options "-gnat2020" } 3 4procedure Delta_Aggr is 5 type T1 is tagged record 6 F1, F2, F3 : Integer := 0; 7 end record; 8 9 function Make (X : Integer) return T1 is 10 begin 11 return (10, 20, 30); 12 end Make; 13 14 package Pkg is 15 type T2 is new T1 with private; 16 X, Y : constant T2; 17 function Make (X : Integer) return T2; 18 private 19 type T2 is new T1 with 20 record 21 F4 : Integer := 0; 22 end record; 23 X : constant T2 := (0, 0, 0, 0); 24 Y : constant T2 := (1, 2, 0, 0); 25 end Pkg; 26 27 package body Pkg is 28 function Make (X : Integer) return T2 is 29 begin 30 return (X, X ** 2, X ** 3, X ** 4); 31 end Make; 32 end Pkg; 33 34 use Pkg; 35 36 Z : T2 := (Y with delta F1 => 111); 37 38 -- a legal delta aggregate whose type is a private extension 39 pragma Assert (Y = (X with delta F1 => 1, F2 => 2)); 40 pragma assert (Y.F2 = X.F1); 41 42begin 43 Z := (X with delta F1 => 1); 44 45 -- The base of the delta aggregate can be overloaded, in which case 46 -- the candidate interpretations for the aggregate are those of the 47 -- base, to be resolved from context. 48 49 Z := (Make (2) with delta F1 => 1); 50 null; 51end Delta_Aggr; 52