-- C460013.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 ACAA 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. -- -- Notice -- -- The ACAA has created and maintains the Ada Conformity Assessment Test -- Suite for the purpose of conformity assessments conducted in accordance -- with the International Standard ISO/IEC 18009 - Ada: Conformity -- assessment of a language processor. This test suite should not be used -- to make claims of conformance unless used in accordance with -- ISO/IEC 18009 and any applicable ACAA procedures. -- --* -- -- OBJECTIVE: -- Check that if the target subtype excludes null, the value is not -- null. Check access parameters, which null-excluding if: -- (1) not null is given in their definition; or -- (2) the access parameter is controlling. -- -- CHANGE HISTORY: -- 18 Dec 2006 RLB Initial version. -- 05 Jan 2007 RLB Corrected syntax error. -- 14 Mar 2007 RLB Made Amendment-only version. -- --! with Ada.Exceptions; use Ada.Exceptions; with Report; use Report; procedure C460013 is package Nest1 is type Doggie is tagged record Cnt : Natural; end record; type Doggie_Access is access all Doggie; procedure Controlled (P : access Doggie); -- Always null-excluding. end Nest1; package Nest2 is type Kitty is record Cnt : Natural; end record; type Kitty_Access is access all Kitty; procedure Include (P : access Kitty); -- Not null-excluding (would have been in Ada 95). procedure Exclude (P : not null access Kitty); -- Always null-excluding. end Nest2; package body Nest1 is procedure Controlled (P : access Doggie) is begin if P.Cnt /= Ident_Int(4) then Failed ("Bad value in null-excluding controlling parameter"); -- else OK end if; exception when Constraint_Error => -- Dereference of null Failed ("Null allowed in null-excluding controlling parameter"); end Controlled; end Nest1; package body Nest2 is procedure Include (P : access Kitty) is begin if P.Cnt /= Ident_Int(31) then Failed ("Bad value in access parameter"); -- else OK end if; exception when Constraint_Error => -- Dereference of null null; end Include; procedure Exclude (P : not null access Kitty) is begin if P.Cnt /= Ident_Int(80) then Failed ("Bad value in explicit null-excluding parameter"); -- else OK end if; exception when Constraint_Error => -- Dereference of null Failed ("Null allowed in explicit null-excluding parameter"); end Exclude; end Nest2; Shep : aliased Nest1.Doggie := (Cnt => 4); Frisky : aliased Nest2.Kitty := (Cnt => 80); Snuggles : aliased Nest2.Kitty := (Cnt => 31); begin Test ("C460013", "Check that if the target subtype excludes null, the value is not" & " null - access parameter cases"); declare Ptr : Nest1.Doggie_Access := Shep'Access; begin begin Nest1.Controlled (Ptr); -- OK. exception when A: others => Failed ("Unexpected exception " & Exception_Name (A) & " raised (1A) - " & Exception_Message (A)); end; Ptr := null; begin Nest1.Controlled (Ptr); Failed ("Null allowed for null-excluding controlling access parameter (1)"); exception when Constraint_Error => null; when B: others => Failed ("Unexpected exception " & Exception_Name (B) & " raised (1B) - " & Exception_Message (B)); end; end; declare Ptr : Nest2.Kitty_Access := Frisky'Access; begin begin Nest2.Exclude (Ptr); -- OK. exception when C: others => Failed ("Unexpected exception " & Exception_Name (C) & " raised (2A) - " & Exception_Message (C)); end; Ptr := null; begin Nest2.Exclude (Ptr); Failed ("Null allowed for null-excluding access parameter (2)"); exception when Constraint_Error => null; when D: others => Failed ("Unexpected exception " & Exception_Name (D) & " raised (2B) - " & Exception_Message (D)); end; end; declare Ptr : Nest2.Kitty_Access := Snuggles'Access; begin begin Nest2.Include (Ptr); -- OK. exception when E: others => Failed ("Unexpected exception " & Exception_Name (E) & " raised (3A) - " & Exception_Message (E)); end; Ptr := null; begin Nest2.Include (Ptr); exception when Constraint_Error => Failed ("Null not allowed for normal access parameter"); -- This is Ada 95 semantics. when F: others => Failed ("Unexpected exception " & Exception_Name (F) & " raised (3B) - " & Exception_Message (F)); end; end; Result; end C460013;