view gcc/testsuite/ada/acats/tests/cxb/cxb3014.a @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 04ced10e8804
children
line wrap: on
line source

-- CXB3014.A
--
--                             Grant of Unlimited Rights
--
--     Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,
--     F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained 
--     unlimited rights in the software and documentation contained herein.
--     Unlimited rights are defined in DFAR 252.227-7013(a)(19).  By making 
--     this public release, the Government intends to confer upon all 
--     recipients unlimited rights  equal to those held by the Government.  
--     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 the Function Value with Pointer and Element 
--      parameters will return an Element_Array result of correct size 
--      and content (up to and including the first "terminator" Element). 
--
--      Check that the Function Value with Pointer and Length parameters 
--      will return an Element_Array result of appropriate size and content
--      (the first Length elements pointed to by the parameter Ref).
--
--      Check that both versions of Function Value will propagate 
--      Interfaces.C.Strings.Dereference_Error when the value of
--      the Ref pointer parameter is null.
--
-- TEST DESCRIPTION:
--      This test tests that both versions of Function Value from the 
--      generic package Interfaces.C.Pointers are available and produce
--      correct results.  The generic package is instantiated with size_t,
--      char, char_array, and nul as actual parameters, and subtests are
--      performed on each of the Value functions resulting from this
--      instantiation.
--      For both function versions, a test is performed where a portion of
--      a char_array is to be returned as the function result.  Likewise,
--      a test is performed where each version of the function returns the
--      entire char_array referenced by the in parameter Ref.
--      Finally, both versions of Function Value are called with a null
--      pointer reference, to ensure that Dereference_Error is raised in
--      this case.
--      
--      This test assumes that the following characters are all included
--      in the implementation defined type Interfaces.C.char:
--      ' ', 'a'..'z', and 'A'..'Z'.
--      
-- APPLICABILITY CRITERIA: 
--      This test is applicable to all implementations that provide 
--      packages Interfaces.C.Strings and Interfaces.C.Pointers.  If an 
--      implementation provides packages Interfaces.C.Strings and 
--      Interfaces.C.Pointers, this test must compile, execute, and 
--      report "PASSED".
--
--       
-- CHANGE HISTORY:
--      19 Oct 95   SAIC    Initial prerelease version.
--      13 May 96   SAIC    Incorporated reviewer comments for ACVC 2.1.
--      23 Oct 96   SAIC    Incorporated reviewer comments.
--
--!

with Report;
with Interfaces.C.Strings;                                    -- N/A => ERROR
with Interfaces.C.Pointers;                                   -- N/A => ERROR

procedure CXB3014 is

begin

   Report.Test ("CXB3014", "Check that versions of the Value function "  &
                           "from package Interfaces.C.Pointers produce " &
                           "correct results");

   Test_Block:
   declare

      use type Interfaces.C.char, Interfaces.C.size_t;

      Char_a : constant Interfaces.C.char := 'a';
      Char_j : constant Interfaces.C.char := 'j';
      Char_z : constant Interfaces.C.char := 'z';

      subtype Lower_Case_chars is Interfaces.C.char range Char_a..Char_z;
      subtype Char_Range       is Interfaces.C.size_t range 0..26;

      Local_nul       : aliased Interfaces.C.char := Interfaces.C.nul;
      TC_Array_Size   : Interfaces.C.size_t := 20;

      TC_String_1     : constant String := "abcdefghij";
      TC_String_2     : constant String := "abcdefghijklmnopqrstuvwxyz";
      TC_String_3     : constant String := "abcdefghijklmnopqrst";
      TC_String_4     : constant String := "abcdefghijklmnopqrstuvwxyz";
      TC_Blank_String : constant String := "                          ";

      TC_Char_Array   : Interfaces.C.char_array(Char_Range) :=
                          Interfaces.C.To_C(TC_String_2, True);

      TC_Char_Array_1 : Interfaces.C.char_array(0..9);
      TC_Char_Array_2 : Interfaces.C.char_array(Char_Range);
      TC_Char_Array_3 : Interfaces.C.char_array(0..TC_Array_Size-1);
      TC_Char_Array_4 : Interfaces.C.char_array(Char_Range);

      package Char_Pointers is new 
        Interfaces.C.Pointers (Index              => Interfaces.C.size_t,
                               Element            => Interfaces.C.char,
                               Element_Array      => Interfaces.C.char_array,
                               Default_Terminator => Interfaces.C.nul);

      Char_Ptr : Char_Pointers.Pointer;

      use type Char_Pointers.Pointer;

   begin

      -- Check that the Function Value with Pointer and Terminator Element 
      -- parameters will return an Element_Array result of appropriate size 
      -- and content (up to and including the first "terminator" Element.) 

      Char_Ptr := TC_Char_Array(0)'Access;

      -- Provide a new Terminator char in the call of Function Value.
      -- This call should return only a portion (the first 10 chars) of
      -- the referenced char_array, up to and including the char 'j'.

      TC_Char_Array_1 := Char_Pointers.Value(Ref        => Char_Ptr,
                                             Terminator => Char_j);

      if Interfaces.C.To_Ada(TC_Char_Array_1, False) /= TC_String_1 or
         Interfaces.C.Is_Nul_Terminated(TC_Char_Array_1)
      then
         Report.Failed("Incorrect result from Function Value with Ref " &
                       "and Terminator parameters, when supplied with " &
                       "a non-default Terminator char");
      end if;

      -- Use the default Terminator char in the call of Function Value.
      -- This call should return the entire char_array, including the 
      -- terminating nul char.

      TC_Char_Array_2 := Char_Pointers.Value(Char_Ptr);

      if Interfaces.C.To_Ada(TC_Char_Array_2, True) /= TC_String_2 or
         not Interfaces.C.Is_Nul_Terminated(TC_Char_Array_2)
      then
         Report.Failed("Incorrect result from Function Value with Ref " &
                       "and Terminator parameters, when using the "     &
                       "default Terminator char");
      end if;



      -- Check that the Function Value with Pointer and Length parameters 
      -- will return an Element_Array result of appropriate size and content
      -- (the first Length elements pointed to by the parameter Ref).
      
      -- This call should return only a portion (the first 20 chars) of
      -- the referenced char_array.

      TC_Char_Array_3 := 
        Char_Pointers.Value(Ref    => Char_Ptr,
                            Length => Interfaces.C.ptrdiff_t(TC_Array_Size));

      -- Verify the individual chars of the result.
      for i in 0..TC_Array_Size-1 loop
         if Interfaces.C.To_Ada(TC_Char_Array_3(i)) /= 
            TC_String_3(Integer(i)+1)
         then
            Report.Failed("Incorrect result from Function Value with "  &
                          "Ref and Length parameters, when specifying " &
                          "a length less than the full array size");
            exit;
         end if;
      end loop;

      -- This call should return the entire char_array, including the 
      -- terminating nul char.

      TC_Char_Array_4 := Char_Pointers.Value(Char_Ptr, 27);

      if Interfaces.C.To_Ada(TC_Char_Array_4, True) /= TC_String_4 or
         not Interfaces.C.Is_Nul_Terminated(TC_Char_Array_4)
      then
         Report.Failed("Incorrect result from Function Value with Ref " &
                       "and Length parameters, when specifying the "    &
                       "entire array size");
      end if;



      -- Check that both of the above versions of Function Value will 
      -- propagate Interfaces.C.Strings.Dereference_Error when the value of
      -- the Ref Pointer parameter is null.

      Char_Ptr := null;

      begin
         TC_Char_Array_1 := Char_Pointers.Value(Ref        => Char_Ptr,
                                                Terminator => Char_j);
         Report.Failed("Dereference_Error not raised by Function " &
                       "Value with Terminator parameter, when "    &
                       "provided a null reference");
         -- Call Report.Comment to ensure that the assignment to 
         -- TC_Char_Array_1 is not "dead", and therefore can not be 
         -- optimized away.
         Report.Comment(Interfaces.C.To_Ada(TC_Char_Array_1, False));
      exception
         when Interfaces.C.Strings.Dereference_Error => 
           null;  -- OK, expected exception.
         when others =>
           Report.Failed("Incorrect exception raised by Function " &
                         "Value with Terminator parameter, when "  &
                         "provided a null reference");
      end;


      begin
         TC_Char_Array_3 := 
           Char_Pointers.Value(Char_Ptr,
                               Interfaces.C.ptrdiff_t(TC_Array_Size));
         Report.Failed("Dereference_Error not raised by Function "   &
                       "Value with Length parameter, when provided " &
                       "a null reference");
         -- Call Report.Comment to ensure that the assignment to 
         -- TC_Char_Array_3 is not "dead", and therefore can not be 
         -- optimized away.
         Report.Comment(Interfaces.C.To_Ada(TC_Char_Array_3, False));
      exception
         when Interfaces.C.Strings.Dereference_Error => 
           null;  -- OK, expected exception.
         when others =>
           Report.Failed("Incorrect exception raised by Function " &
                         "Value with Length parameter, when "      &
                         "provided a null reference");
      end;


   exception
      when others => Report.Failed ("Exception raised in Test_Block");
   end Test_Block;

   Report.Result;

end CXB3014;