view gcc/testsuite/ada/acats/tests/c4/c432002.a @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children
line wrap: on
line source

-- C432002.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 if an extension aggregate specifies a value for a record 
--      extension and the ancestor expression has discriminants that are
--      inherited by the record extension, then a check is made that each
--      discriminant has the value specified.
--
--      Check that if an extension aggregate specifies a value for a record 
--      extension and the ancestor expression has discriminants that are not
--      inherited by the record extension, then a check is made that each
--      such discriminant has the value specified for the corresponding
--      discriminant.
--
--      Check that the corresponding discriminant value may be specified
--      in the record component association list or in the derived type
--      definition for an ancestor.
--
--      Check the case of ancestors that are several generations removed.
--      Check the case where the value of the discriminant(s) in question
--      is supplied several generations removed.
--
--      Check the case of multiple discriminants.
--
--      Check that Constraint_Error is raised if the check fails.
--
-- TEST DESCRIPTION:
--      A hierarchy of tagged types is declared from a discriminated
--      root type. Each level declares two kinds of types: (1) a type
--      extension which constrains the discriminant of its parent to
--      the value of an expression and (2) a type extension that
--      constrains the discriminant of its parent to equal a new discriminant
--      of the type extension (These are the two categories of noninherited
--      discriminants).
--
--      Values for each type are declared within nested blocks. This is
--      done so that the instances that produce Constraint_Error may
--      be dealt with cleanly without forcing the program to exit.
--
--      Success and failure cases (which should raise Constraint_Error)
--      are set up for each kind of type. Additionally, for the first
--      level of the hierarchy, separate tests are done for ancestor
--      expressions specified by aggregates and those specified by
--      variables. Later tests are performed using variables only.
--
--      Additionally, the cases tested consist of the following kinds of
--      types:
--
--         Extensions of extensions, using both the parent and grandparent
--         types for the ancestor expression,
--
--         Ancestor expressions which are several generations removed
--         from the type of the aggregate,
--
--         Extensions of types with multiple discriminants, where the
--         extension declares a new discriminant which corresponds to
--         more than one discriminant of the ancestor types.
--
--
--
-- CHANGE HISTORY:
--      06 Dec 94   SAIC    ACVC 2.0
--      19 Dec 94   SAIC    Removed RM references from objective text.
--      20 Dec 94   SAIC    Repair confusion WRT overridden discriminants
--
--!

package C432002_0 is

   subtype Length is Natural range 0..256;
   type Discriminant (L : Length) is tagged
      record
         S1 : String (1..L);
      end record;

   procedure Do_Something (Rec : in out Discriminant);
   -- inherited by all type extensions

   -- Aggregates of Discriminant are of the form
   --    (L, S1) where L= S1'Length

   -- Discriminant of parent constrained to value of an expression
   type Constrained_Discriminant_Extension is
      new Discriminant (L => 10)
      with record
         S2 : String (1..20);
      end record;

   -- Aggregates of Constrained_Discriminant_Extension are of the form
   --    (L, S1, S2), where L = S1'Length = 10, S2'Length = 20

   type Once_Removed is new Constrained_Discriminant_Extension
      with record
         S3 : String (1..3);
      end record;

   type Twice_Removed is new Once_Removed
      with record
         S4 : String (1..8);
      end record;

   -- Aggregates of Twice_Removed are of the form
   --    (L, S1, S2, S3, S4), where L = S1'Length = 10,
   --                               S2'Length = 20,
   --                               S3'Length = 3,
   --                               S4'Length = 8

   -- Discriminant of parent constrained to equal new discriminant
   type New_Discriminant_Extension (N : Length) is
      new Discriminant (L => N) with
      record
         S2 : String (1..N);
      end record;

   -- Aggregates of New_Discriminant_Extension are of the form
   --   (N, S1, S2), where N = S1'Length = S2'Length

   -- Discriminant of parent extension constrained to the value of
   -- an expression
   type Constrained_Extension_Extension is
      new New_Discriminant_Extension (N => 20)
      with record
         S3 : String (1..5);
      end record;

   -- Aggregates of Constrained_Extension_Extension are of the form
   --   (N, S1, S2, S3), where N = S1'Length = S2'Length = 20,
   --                             S3'Length = 5

   -- Discriminant of parent extension constrained to equal a new
   -- discriminant
   type New_Extension_Extension (I : Length) is
      new New_Discriminant_Extension (N => I)
      with record
         S3 : String (1..I);
      end record;

   -- Aggregates of New_Extension_Extension are of the form
   --    (I, S1, 2, S3), where
   --       I = S1'Length = S2'Length = S3'Length

   type Multiple_Discriminants (A, B : Length) is tagged
      record
         S1 : String (1..A);
         S2 : String (1..B);
      end record;

   procedure Do_Something (Rec : in out Multiple_Discriminants);
   -- inherited by type extension

   -- Aggregates of Multiple_Discriminants are of the form
   --    (A, B, S1, S2), where A = S1'Length, B = S2'Length

   type Multiple_Discriminant_Extension (C : Length) is
      new Multiple_Discriminants (A => C, B => C)
      with record
         S3 : String (1..C);
      end record;

   -- Aggregates of Multiple_Discriminant_Extension are of the form
   --    (A, B, S1, S2, C, S3), where
   --       A = B = C = S1'Length = S2'Length = S3'Length

end C432002_0;

with Report;
package body C432002_0 is

   S : String (1..20) := "12345678901234567890";

   procedure Do_Something (Rec : in out Discriminant) is
   begin
      Rec.S1 := Report.Ident_Str (S (1..Rec.L));
   end Do_Something;

   procedure Do_Something (Rec : in out Multiple_Discriminants) is
   begin
      Rec.S1 := Report.Ident_Str (S (1..Rec.A));
   end Do_Something;

end C432002_0;


with C432002_0;
with Report;
procedure C432002 is

   -- Various different-sized strings for variety
   String_3  : String (1..3)  := Report.Ident_Str("123");
   String_5  : String (1..5)  := Report.Ident_Str("12345");
   String_8  : String (1..8)  := Report.Ident_Str("12345678");
   String_10 : String (1..10) := Report.Ident_Str("1234567890");
   String_11 : String (1..11) := Report.Ident_Str("12345678901");
   String_20 : String (1..20) := Report.Ident_Str("12345678901234567890");

begin

   Report.Test ("C432002",
                "Extension aggregates for discriminated types");

   --------------------------------------------------------------------
   -- Extension constrains parent's discriminant to value of expression
   --------------------------------------------------------------------

   -- Successful cases - value matches corresponding discriminant value

   CD_Matched_Aggregate:
   begin
      declare
         CD : C432002_0.Constrained_Discriminant_Extension :=
            (C432002_0.Discriminant'(L  => 10,
                                     S1 => String_10)
               with S2 => String_20);
      begin
         C432002_0.Do_Something(CD); -- success
      end;
   exception
      when Constraint_Error =>
         Report.Comment ("Ancestor expression is an aggregate");
         Report.Failed ("Aggregate of extension " &
                        "with discriminant constrained: " &
                        "Constraint_Error was incorrectly raised " &
                        "for value that matches corresponding " &
                        "discriminant");
   end CD_Matched_Aggregate;
   
   CD_Matched_Variable:
   begin
      declare
         D : C432002_0.Discriminant(L => 10) :=
            C432002_0.Discriminant'(L  => 10,
                                    S1 => String_10);

         CD : C432002_0.Constrained_Discriminant_Extension :=
            (D with S2 => String_20);
      begin
         C432002_0.Do_Something(CD); -- success
      end;
   exception
      when Constraint_Error =>
         Report.Comment ("Ancestor expression is a variable");
         Report.Failed ("Aggregate of extension " &
                        "with discriminant constrained: " &
                        "Constraint_Error was incorrectly raised " &
                        "for value that matches corresponding " &
                        "discriminant");
   end CD_Matched_Variable;

   
   -- Unsuccessful cases - value does not match value of corresponding
   --                      discriminant. Constraint_Error should be
   --                      raised.

   CD_Unmatched_Aggregate:
   begin
      declare
         CD : C432002_0.Constrained_Discriminant_Extension :=
            (C432002_0.Discriminant'(L  => 5,
                                     S1 => String_5)
               with S2 => String_20);
      begin
         Report.Comment ("Ancestor expression is an aggregate");
         Report.Failed ("Aggregate of extension " &
                        "with discriminant constrained: " &
                        "Constraint_Error was not raised " &
                        "for discriminant value that does not match " &
                        "corresponding discriminant");
         C432002_0.Do_Something(CD); -- disallow unused var optimization
      end;
   exception
      when Constraint_Error =>
         null; -- raise of Constraint_Error is expected
   end CD_Unmatched_Aggregate;
   
   CD_Unmatched_Variable:
   begin
      declare
         D : C432002_0.Discriminant(L => 5) :=
            C432002_0.Discriminant'(L  => 5,
                                    S1 => String_5);

         CD : C432002_0.Constrained_Discriminant_Extension :=
            (D with S2 => String_20);
      begin
         Report.Comment ("Ancestor expression is an variable");
         Report.Failed ("Aggregate of extension " &
                        "with discriminant constrained: " &
                        "Constraint_Error was not raised " &
                        "for discriminant value that does not match " &
                        "corresponding discriminant");
         C432002_0.Do_Something(CD); -- disallow unused var optimization
      end;
   exception
      when Constraint_Error =>
         null; -- raise of Constraint_Error is expected
   end CD_Unmatched_Variable;

   -----------------------------------------------------------------------
   -- Extension constrains parent's discriminant to equal new discriminant
   -----------------------------------------------------------------------

   -- Successful cases - value matches corresponding discriminant value

   ND_Matched_Aggregate:
   begin
      declare
         ND : C432002_0.New_Discriminant_Extension (N => 8) :=
            (C432002_0.Discriminant'(L  => 8,
                                     S1 => String_8)
               with N  => 8,
                    S2 => String_8);
      begin
         C432002_0.Do_Something(ND); -- success
      end;
   exception
      when Constraint_Error =>
         Report.Comment ("Ancestor expression is an aggregate");
         Report.Failed ("Aggregate of extension " &
                        "with new discriminant: " &
                        "Constraint_Error was incorrectly raised " &
                        "for value that matches corresponding " &
                        "discriminant");
   end ND_Matched_Aggregate;
   
   ND_Matched_Variable:
   begin
      declare
         D : C432002_0.Discriminant(L => 3) :=
            C432002_0.Discriminant'(L  => 3,
                                    S1 => String_3);

         ND : C432002_0.New_Discriminant_Extension (N => 3) :=
            (D with N  => 3,
                    S2 => String_3);
      begin
         C432002_0.Do_Something(ND); -- success
      end;
   exception
      when Constraint_Error =>
         Report.Comment ("Ancestor expression is an variable");
         Report.Failed ("Aggregate of extension " &
                        "with new discriminant: " &
                        "Constraint_Error was incorrectly raised " &
                        "for value that matches corresponding " &
                        "discriminant");
   end ND_Matched_Variable;

   
   -- Unsuccessful cases - value does not match value of corresponding
   --                      discriminant. Constraint_Error should be
   --                      raised.
   
   ND_Unmatched_Aggregate:
   begin
      declare
         ND : C432002_0.New_Discriminant_Extension (N => 20) :=
            (C432002_0.Discriminant'(L  => 11,
                                     S1 => String_11)
               with N  => 20,
                    S2 => String_20);
      begin
         Report.Comment ("Ancestor expression is an aggregate");
         Report.Failed ("Aggregate of extension " &
                        "with new discriminant: " &
                        "Constraint_Error was not raised " &
                        "for discriminant value that does not match " &
                        "corresponding discriminant");
         C432002_0.Do_Something(ND); -- disallow unused var optimization
      end;
   exception
      when Constraint_Error =>
         null; -- raise is expected
   end ND_Unmatched_Aggregate;
   
   ND_Unmatched_Variable:
   begin
      declare
         D : C432002_0.Discriminant(L => 5) :=
            C432002_0.Discriminant'(L  => 5,
                                    S1 => String_5);

         ND : C432002_0.New_Discriminant_Extension (N => 20) :=
            (D with N  => 20,
                    S2 => String_20);
      begin
         Report.Comment ("Ancestor expression is an variable");
         Report.Failed ("Aggregate of extension " &
                        "with new discriminant: " &
                        "Constraint_Error was not raised " &
                        "for discriminant value that does not match " &
                        "corresponding discriminant");
         C432002_0.Do_Something(ND); -- disallow unused var optimization
      end;
   exception
      when Constraint_Error =>
         null; -- raise is expected
   end ND_Unmatched_Variable;

   --------------------------------------------------------------------
   -- Extension constrains parent's discriminant to value of expression
   -- Parent is a discriminant extension
   --------------------------------------------------------------------

   -- Successful cases - value matches corresponding discriminant value

   CE_Matched_Aggregate:
   begin
      declare
         CE : C432002_0.Constrained_Extension_Extension :=
            (C432002_0.Discriminant'(L  => 20,
                                     S1 => String_20)
               with N => 20,
                    S2 => String_20,
                    S3 => String_5);
      begin
         C432002_0.Do_Something(CE); -- success
      end;
   exception
      when Constraint_Error =>
         Report.Comment ("Ancestor expression is an aggregate");
         Report.Failed ("Aggregate of extension (of extension) " &
                        "with discriminant constrained: " &
                        "Constraint_Error was incorrectly raised " &
                        "for value that matches corresponding " &
                        "discriminant");
   end CE_Matched_Aggregate;
   
   CE_Matched_Variable:
   begin
      declare
         ND : C432002_0.New_Discriminant_Extension (N => 20) :=
            C432002_0.New_Discriminant_Extension'
               (N  => 20,
                S1 => String_20,
                S2 => String_20);

         CE : C432002_0.Constrained_Extension_Extension :=
            (ND with S3 => String_5);
      begin
         C432002_0.Do_Something(CE); -- success
      end;
   exception
      when Constraint_Error =>
         Report.Comment ("Ancestor expression is a variable");
         Report.Failed ("Aggregate of extension (of extension) " &
                        "with discriminant constrained: " &
                        "Constraint_Error was incorrectly raised " &
                        "for value that matches corresponding " &
                        "discriminant");
   end CE_Matched_Variable;

   
   -- Unsuccessful cases - value does not match value of corresponding
   --                      discriminant. Constraint_Error should be
   --                      raised.

   CE_Unmatched_Aggregate:
   begin
      declare
         CE : C432002_0.Constrained_Extension_Extension :=
            (C432002_0.New_Discriminant_Extension'
               (N  => 11,
                S1 => String_11,
                S2 => String_11)
            with S3 => String_5);
      begin
         Report.Comment ("Ancestor expression is an aggregate");
         Report.Failed ("Aggregate of extension (of extension) " &
                        "Constraint_Error was not raised " &
                        "with discriminant constrained: " &
                        "for discriminant value that does not match " &
                        "corresponding discriminant");
         C432002_0.Do_Something(CE); -- disallow unused var optimization
      end;
   exception
      when Constraint_Error =>
         null; -- raise of Constraint_Error is expected
   end CE_Unmatched_Aggregate;
   
   CE_Unmatched_Variable:
   begin
      declare
         D : C432002_0.Discriminant(L => 8) :=
            C432002_0.Discriminant'(L  => 8,
                                    S1 => String_8);

         CE : C432002_0.Constrained_Extension_Extension :=
            (D with N  => 8,
                    S2 => String_8,
                    S3 => String_5);
      begin
         Report.Comment ("Ancestor expression is a variable");
         Report.Failed ("Aggregate of extension (of extension) " &
                        "with discriminant constrained: " &
                        "Constraint_Error was not raised " &
                        "for discriminant value that does not match " &
                        "corresponding discriminant");
         C432002_0.Do_Something(CE); -- disallow unused var optimization
      end;
   exception
      when Constraint_Error =>
         null; -- raise of Constraint_Error is expected
   end CE_Unmatched_Variable;

   -----------------------------------------------------------------------
   -- Extension constrains parent's discriminant to equal new discriminant
   -- Parent is a discriminant extension
   -----------------------------------------------------------------------

   -- Successful cases - value matches corresponding discriminant value

   NE_Matched_Aggregate:
   begin
      declare
         NE : C432002_0.New_Extension_Extension (I => 8) :=
            (C432002_0.Discriminant'(L  => 8,
                                     S1 => String_8)
               with I  => 8,
                    S2 => String_8,
                    S3 => String_8);
      begin
         C432002_0.Do_Something(NE); -- success
      end;
   exception
      when Constraint_Error =>
         Report.Comment ("Ancestor expression is an aggregate");
         Report.Failed ("Aggregate of extension (of extension) " &
                        "with new discriminant: " &
                        "Constraint_Error was incorrectly raised " &
                        "for value that matches corresponding " &
                        "discriminant");
   end NE_Matched_Aggregate;
   
   NE_Matched_Variable:
   begin
      declare
         ND : C432002_0.New_Discriminant_Extension (N => 3) :=
            C432002_0.New_Discriminant_Extension'
               (N  => 3,
                S1 => String_3,
                S2 => String_3);

         NE : C432002_0.New_Extension_Extension (I => 3) :=
            (ND with I  => 3,
                     S3 => String_3);
      begin
         C432002_0.Do_Something(NE); -- success
      end;
   exception
      when Constraint_Error =>
         Report.Comment ("Ancestor expression is a variable");
         Report.Failed ("Aggregate of extension (of extension) " &
                        "with new discriminant: " &
                        "Constraint_Error was incorrectly raised " &
                        "for value that matches corresponding " &
                        "discriminant");
   end NE_Matched_Variable;

   
   -- Unsuccessful cases - value does not match value of corresponding
   --                      discriminant. Constraint_Error should be
   --                      raised.

   NE_Unmatched_Aggregate:
   begin
      declare
         NE : C432002_0.New_Extension_Extension (I => 8) :=
            (C432002_0.New_Discriminant_Extension'
               (C432002_0.Discriminant'(L  => 11,
                                        S1 => String_11)
                with N  => 11,
                     S2 => String_11)
            with I  => 8,
                 S3 => String_8);
      begin
         Report.Comment ("Ancestor expression is an extension aggregate");
         Report.Failed ("Aggregate of extension (of extension) " &
                        "with new discriminant: " &
                        "Constraint_Error was not raised " &
                        "for discriminant value that does not match " &
                        "corresponding discriminant");
         C432002_0.Do_Something(NE); -- disallow unused var optimization
      end;
   exception
      when Constraint_Error =>
         null; -- raise is expected
   end NE_Unmatched_Aggregate;
   
   NE_Unmatched_Variable:
   begin
      declare
         D : C432002_0.Discriminant(L => 5) :=
            C432002_0.Discriminant'(L  => 5,
                                    S1 => String_5);

         NE : C432002_0.New_Extension_Extension (I => 20) :=
            (D with I  => 5,
                    S2 => String_5,
                    S3 => String_20);
      begin
         Report.Comment ("Ancestor expression is a variable");
         Report.Failed ("Aggregate of extension (of extension) " &
                        "with new discriminant: " &
                        "Constraint_Error was not raised " &
                        "for discriminant value that does not match " &
                        "corresponding discriminant");
         C432002_0.Do_Something(NE); -- disallow unused var optimization
      end;
   exception
      when Constraint_Error =>
         null; -- raise is expected
   end NE_Unmatched_Variable;

   -----------------------------------------------------------------------
   -- Corresponding discriminant is two levels deeper than aggregate
   -----------------------------------------------------------------------

   -- Successful case - value matches corresponding discriminant value

   TR_Matched_Variable:
   begin
      declare
         D : C432002_0.Discriminant (L => 10) :=
            C432002_0.Discriminant'(L  => 10,
                                    S1 => String_10);

         TR : C432002_0.Twice_Removed :=
            C432002_0.Twice_Removed'(D with S2 => String_20,
                                            S3 => String_3,
                                            S4 => String_8);
         -- N is constrained to a value in the derived_type_definition
         -- of Constrained_Discriminant_Extension. Its omission from
         -- the above record_component_association_list is allowed by
         -- 4.3.2(6).

      begin
         C432002_0.Do_Something(TR); -- success
      end;
   exception
      when Constraint_Error =>
         Report.Failed ("Aggregate of far-removed extension " &
                        "with discriminant constrained: " &
                        "Constraint_Error was incorrectly raised " &
                        "for value that matches corresponding " &
                        "discriminant");
   end TR_Matched_Variable;
   
   
   -- Unsuccessful case - value does not match value of corresponding
   --                      discriminant. Constraint_Error should be
   --                      raised.

   TR_Unmatched_Variable:
   begin
      declare
         D : C432002_0.Discriminant (L => 5) :=
            C432002_0.Discriminant'(L  => 5,
                                    S1 => String_5);

         TR : C432002_0.Twice_Removed :=
            C432002_0.Twice_Removed'(D with S2 => String_20,
                                            S3 => String_3,
                                            S4 => String_8);

      begin
         Report.Failed ("Aggregate of far-removed extension " &
                        "with discriminant constrained: " &
                        "Constraint_Error was not raised " &
                        "for discriminant value that does not match " &
                        "corresponding discriminant");
         C432002_0.Do_Something(TR); -- disallow unused var optimization
      end;
   exception
      when Constraint_Error =>
         null; -- raise is expected
   end TR_Unmatched_Variable;
   
   ------------------------------------------------------------------------
   -- Parent has multiple discriminants.
   -- Discriminant in extension corresponds to both parental discriminants.
   ------------------------------------------------------------------------

   -- Successful case - value matches corresponding discriminant value

   MD_Matched_Variable:
   begin
      declare
         MD : C432002_0.Multiple_Discriminants (A => 10, B => 10) :=
            C432002_0.Multiple_Discriminants'(A  => 10,
                                              B  => 10,
                                              S1 => String_10,
                                              S2 => String_10);
         MDE : C432002_0.Multiple_Discriminant_Extension (C => 10) :=
            (MD with C  => 10,
                     S3 => String_10);

      begin
         C432002_0.Do_Something(MDE); -- success
      end;
   exception
      when Constraint_Error =>
         Report.Failed ("Aggregate of extension " &
                        "of multiply-discriminated parent: " &
                        "Constraint_Error was incorrectly raised " &
                        "for value that matches corresponding " &
                        "discriminant");
   end MD_Matched_Variable;

   
   -- Unsuccessful case - value does not match value of corresponding
   --                      discriminant. Constraint_Error should be
   --                      raised.

   MD_Unmatched_Variable:
   begin
      declare
         MD : C432002_0.Multiple_Discriminants (A => 10, B => 8) :=
            C432002_0.Multiple_Discriminants'(A  => 10,
                                              B  => 8,
                                              S1 => String_10,
                                              S2 => String_8);
         MDE : C432002_0.Multiple_Discriminant_Extension (C => 10) :=
            (MD with C  => 10,
                     S3 => String_10);

      begin
         Report.Failed ("Aggregate of extension " &
                        "of multiply-discriminated parent: " &
                        "Constraint_Error was not raised " &
                        "for discriminant value that does not match " &
                        "corresponding discriminant");
         C432002_0.Do_Something(MDE); -- disallow unused var optimization
      end;
   exception
      when Constraint_Error =>
         null; -- raise is expected
   end MD_Unmatched_Variable;

   Report.Result;

end C432002;