blob: 856c910f92df53b366d630283f0ba392586b680e [file] [log] [blame]
-- C3A0015.A
--
-- Grant of Unlimited Rights
--
-- The Ada Conformity Assessment Authority (ACAA) holds unlimited
-- rights in the software and documentation contained herein. Unlimited
-- rights are the same as those granted by the U.S. Government for older
-- parts of the Ada Conformity Assessment Test Suite, and are defined
-- in DFAR 252.227-7013(a)(19). By making this public release, the ACAA
-- intends to confer upon all recipients unlimited rights equal to those
-- held by the ACAA. These rights include rights to use, duplicate,
-- release or disclose the released technical data and computer software
-- in whole or in part, in any manner and for any purpose whatsoever, and
-- to have or permit others to do so.
--
-- DISCLAIMER
--
-- ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR
-- DISCLOSED ARE AS IS. THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED
-- WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE
-- SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE
-- OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A
-- PARTICULAR PURPOSE OF SAID MATERIAL.
--*
--
-- OBJECTIVE:
-- Check that a derived access type has the same storage pool as its
-- parent. (Defect Report 8652/0012, Technical Corrigendum 3.10(7/1)).
--
-- CHANGE HISTORY:
-- 24 JAN 2001 PHL Initial version.
-- 29 JUN 2001 RLB Reformatted for ACATS.
--
--!
with System.Storage_Elements;
use System.Storage_Elements;
with System.Storage_Pools;
use System.Storage_Pools;
package C3A0015_0 is
type Pool (Storage_Size : Storage_Count) is new Root_Storage_Pool with
record
First_Free : Storage_Count := 1;
Contents : Storage_Array (1 .. Storage_Size);
end record;
procedure Allocate (Pool : in out C3A0015_0.Pool;
Storage_Address : out System.Address;
Size_In_Storage_Elements : in Storage_Count;
Alignment : in Storage_Count);
procedure Deallocate (Pool : in out C3A0015_0.Pool;
Storage_Address : in System.Address;
Size_In_Storage_Elements : in Storage_Count;
Alignment : in Storage_Count);
function Storage_Size (Pool : in C3A0015_0.Pool) return Storage_Count;
end C3A0015_0;
package body C3A0015_0 is
use System;
procedure Allocate (Pool : in out C3A0015_0.Pool;
Storage_Address : out System.Address;
Size_In_Storage_Elements : in Storage_Count;
Alignment : in Storage_Count) is
Unaligned_Address : constant System.Address :=
Pool.Contents (Pool.First_Free)'Address;
Unalignment : Storage_Count;
begin
Unalignment := Unaligned_Address mod Alignment;
if Unalignment = 0 then
Storage_Address := Unaligned_Address;
Pool.First_Free := Pool.First_Free + Size_In_Storage_Elements;
else
Storage_Address :=
Pool.Contents (Pool.First_Free + Alignment - Unalignment)'
Address;
Pool.First_Free := Pool.First_Free + Size_In_Storage_Elements +
Alignment - Unalignment;
end if;
end Allocate;
procedure Deallocate (Pool : in out C3A0015_0.Pool;
Storage_Address : in System.Address;
Size_In_Storage_Elements : in Storage_Count;
Alignment : in Storage_Count) is
begin
if Storage_Address + Size_In_Storage_Elements =
Pool.Contents (Pool.First_Free)'Address then
-- Only deallocate if the block is at the end.
Pool.First_Free := Pool.First_Free - Size_In_Storage_Elements;
end if;
end Deallocate;
function Storage_Size (Pool : in C3A0015_0.Pool) return Storage_Count is
begin
return Pool.Storage_Size;
end Storage_Size;
end C3A0015_0;
with Ada.Exceptions;
use Ada.Exceptions;
with Ada.Unchecked_Deallocation;
with Report;
use Report;
with System.Storage_Elements;
use System.Storage_Elements;
with C3A0015_0;
procedure C3A0015 is
type Standard_Pool is access Float;
type Derived_Standard_Pool is new Standard_Pool;
type Derived_Derived_Standard_Pool is new Derived_Standard_Pool;
type User_Defined_Pool is access Integer;
type Derived_User_Defined_Pool is new User_Defined_Pool;
type Derived_Derived_User_Defined_Pool is new Derived_User_Defined_Pool;
My_Pool : C3A0015_0.Pool (1024);
for User_Defined_Pool'Storage_Pool use My_Pool;
generic
type Designated is private;
Value : Designated;
type Acc is access Designated;
type Derived_Acc is new Acc;
procedure Check (Subtest : String; User_Defined_Pool : Boolean);
procedure Check (Subtest : String; User_Defined_Pool : Boolean) is
procedure Deallocate is
new Ada.Unchecked_Deallocation (Object => Designated,
Name => Acc);
procedure Deallocate is
new Ada.Unchecked_Deallocation (Object => Designated,
Name => Derived_Acc);
First_Free : Storage_Count;
X : Acc;
Y : Derived_Acc;
begin
if User_Defined_Pool then
First_Free := My_Pool.First_Free;
end if;
X := new Designated'(Value);
if User_Defined_Pool and then First_Free >= My_Pool.First_Free then
Failed (Subtest &
" - Allocation didn't consume storage in the pool - 1");
else
First_Free := My_Pool.First_Free;
end if;
Y := Derived_Acc (X);
if User_Defined_Pool and then First_Free /= My_Pool.First_Free then
Failed (Subtest &
" - Conversion did consume storage in the pool - 1");
end if;
if Y.all /= Value then
Failed (Subtest &
" - Incorrect allocation/conversion of access values - 1");
end if;
Deallocate (Y);
if User_Defined_Pool and then First_Free <= My_Pool.First_Free then
Failed (Subtest &
" - Deallocation didn't release storage from the pool - 1");
else
First_Free := My_Pool.First_Free;
end if;
Y := new Designated'(Value);
if User_Defined_Pool and then First_Free >= My_Pool.First_Free then
Failed (Subtest &
" - Allocation didn't consume storage in the pool - 2");
else
First_Free := My_Pool.First_Free;
end if;
X := Acc (Y);
if User_Defined_Pool and then First_Free /= My_Pool.First_Free then
Failed (Subtest &
" - Conversion did consume storage in the pool - 2");
end if;
if X.all /= Value then
Failed (Subtest &
" - Incorrect allocation/conversion of access values - 2");
end if;
Deallocate (X);
if User_Defined_Pool and then First_Free <= My_Pool.First_Free then
Failed (Subtest &
" - Deallocation didn't release storage from the pool - 2");
end if;
exception
when E: others =>
Failed (Subtest & " - Exception " & Exception_Name (E) &
" raised - " & Exception_Message (E));
end Check;
begin
Test ("C3A0015", "Check that a dervied access type has the same " &
"storage pool as its parent");
Comment ("Access types using the standard storage pool");
Std:
declare
procedure Check1 is
new Check (Designated => Float,
Value => 3.0,
Acc => Standard_Pool,
Derived_Acc => Derived_Standard_Pool);
procedure Check2 is
new Check (Designated => Float,
Value => 4.0,
Acc => Standard_Pool,
Derived_Acc => Derived_Derived_Standard_Pool);
procedure Check3 is
new Check (Designated => Float,
Value => 5.0,
Acc => Derived_Standard_Pool,
Derived_Acc => Derived_Derived_Standard_Pool);
begin
Check1 ("Standard_Pool/Derived_Standard_Pool",
User_Defined_Pool => False);
Check2 ("Standard_Pool/Derived_Derived_Standard_Pool",
User_Defined_Pool => False);
Check3 ("Derived_Standard_Pool/Derived_Derived_Standard_Pool",
User_Defined_Pool => False);
end Std;
Comment ("Access types using a user-defined storage pool");
User:
declare
procedure Check1 is
new Check (Designated => Integer,
Value => 17,
Acc => User_Defined_Pool,
Derived_Acc => Derived_User_Defined_Pool);
procedure Check2 is
new Check (Designated => Integer,
Value => 18,
Acc => User_Defined_Pool,
Derived_Acc => Derived_Derived_User_Defined_Pool);
procedure Check3 is
new Check (Designated => Integer,
Value => 19,
Acc => Derived_User_Defined_Pool,
Derived_Acc => Derived_Derived_User_Defined_Pool);
begin
Check1 ("User_Defined_Pool/Derived_User_Defined_Pool",
User_Defined_Pool => True);
Check2 ("User_Defined_Pool/Derived_Derived_User_Defined_Pool",
User_Defined_Pool => True);
Check3
("Derived_User_Defined_Pool/Derived_Derived_User_Defined_Pool",
User_Defined_Pool => True);
end User;
Result;
end C3A0015;