1--  { dg-do run }
2
3with System.Storage_Elements; use System.Storage_Elements;
4with Ada.Unchecked_Deallocation;
5
6procedure Allocator_Maxalign1 is
7
8   Max_Alignment : constant := Standard'Maximum_Alignment;
9
10   type Block is record
11      X : Integer;
12   end record;
13   for Block'Alignment use Standard'Maximum_Alignment;
14
15   type Block_Access is access all Block;
16   procedure Free is new Ada.Unchecked_Deallocation (Block, Block_Access);
17
18   N_Blocks : constant := 500;
19   Blocks   : array (1 .. N_Blocks) of Block_Access;
20begin
21   if Block'Alignment /= Max_Alignment then
22      raise Program_Error;
23   end if;
24
25   for K in 1 .. 4 loop
26
27      for I in Blocks'Range loop
28         Blocks (I) := new Block;
29         if Blocks (I).all'Address mod Block'Alignment /= 0 then
30            raise Program_Error;
31         end if;
32         Blocks(I).all.X := I;
33      end loop;
34
35      for I in Blocks'Range loop
36         Free (Blocks (I));
37      end loop;
38
39   end loop;
40
41end;
42
43