================================================================================
Definite
================================================================================

package P is
   type A is array (1 .. 2) of Boolean;
   V : constant A := (1 => True, 2 => False);
   V2 : constant A := (1 => True, others => False);
end P;

--------------------------------------------------------------------------------

(compilation
  (compilation_unit
    (package_declaration
      (identifier)
      (full_type_declaration
        (identifier)
        (array_type_definition
          (range_g
            (term
              (numeric_literal))
            (term
              (numeric_literal)))
          (component_definition
            (identifier))))
      (object_declaration
        (identifier)
        (identifier)
        (expression
          (term
            (named_array_aggregate
              (array_component_association
                (discrete_choice_list
                  (discrete_choice
                    (expression
                      (term
                        (numeric_literal)))))
                (expression
                  (term
                    (identifier))))
              (array_component_association
                (discrete_choice_list
                  (discrete_choice
                    (expression
                      (term
                        (numeric_literal)))))
                (expression
                  (term
                    (identifier))))))))
      (object_declaration
        (identifier)
        (identifier)
        (expression
          (term
            (named_array_aggregate
              (array_component_association
                (discrete_choice_list
                  (discrete_choice
                    (expression
                      (term
                        (numeric_literal)))))
                (expression
                  (term
                    (identifier))))
              (array_component_association
                (discrete_choice_list
                  (discrete_choice))
                (expression
                  (term
                    (identifier))))))))
      (identifier))))

================================================================================
Definite-2
================================================================================

package P is
   type A is array (1 .. 3) of Boolean;
   V : constant A := (1, 2, 3);
end;

--------------------------------------------------------------------------------

(compilation
  (compilation_unit
    (package_declaration
      (identifier)
      (full_type_declaration
        (identifier)
        (array_type_definition
          (range_g
            (term
              (numeric_literal))
            (term
              (numeric_literal)))
          (component_definition
            (identifier))))
      (object_declaration
        (identifier)
        (identifier)
        (expression
          (term
            (positional_array_aggregate
              (expression
                (term
                  (numeric_literal)))
              (expression
                (term
                  (numeric_literal)))
              (expression
                (term
                  (numeric_literal))))))))))

================================================================================
Indefinite
================================================================================

package P is
   type B is array (Natural range <>) of Boolean;
   V : constant B := (1 .. 2 => False);
end P;

--------------------------------------------------------------------------------

(compilation
  (compilation_unit
    (package_declaration
      (identifier)
      (full_type_declaration
        (identifier)
        (array_type_definition
          (index_subtype_definition
            (identifier))
          (component_definition
            (identifier))))
      (object_declaration
        (identifier)
        (identifier)
        (expression
          (term
            (named_array_aggregate
              (array_component_association
                (discrete_choice_list
                  (discrete_choice
                    (range_g
                      (term
                        (numeric_literal))
                      (term
                        (numeric_literal)))))
                (expression
                  (term
                    (identifier))))))))
      (identifier))))

================================================================================
2D
================================================================================

package P is
   type C is array (Natural range <>, Integer range <>) of Boolean;
   V : constant C := (1 .. 2 => (1 .. 2 => False));
end P;

--------------------------------------------------------------------------------

(compilation
  (compilation_unit
    (package_declaration
      (identifier)
      (full_type_declaration
        (identifier)
        (array_type_definition
          (index_subtype_definition
            (identifier))
          (index_subtype_definition
            (identifier))
          (component_definition
            (identifier))))
      (object_declaration
        (identifier)
        (identifier)
        (expression
          (term
            (named_array_aggregate
              (array_component_association
                (discrete_choice_list
                  (discrete_choice
                    (range_g
                      (term
                        (numeric_literal))
                      (term
                        (numeric_literal)))))
                (expression
                  (term
                    (named_array_aggregate
                      (array_component_association
                        (discrete_choice_list
                          (discrete_choice
                            (range_g
                              (term
                                (numeric_literal))
                              (term
                                (numeric_literal)))))
                        (expression
                          (term
                            (identifier))))))))))))
      (identifier))))

================================================================================
Index in array aggregates
================================================================================

procedure P is
begin
   Arr := (for Index in 1 .. Count => Function_Returning_Limited (Index));
end;

--------------------------------------------------------------------------------

(compilation
  (compilation_unit
    (subprogram_body
      (procedure_specification
        (identifier))
      (handled_sequence_of_statements
        (assignment_statement
          (identifier)
          (expression
            (term
              (named_array_aggregate
                (array_component_association
                  (iterated_element_association
                    (loop_parameter_specification
                      (identifier)
                      (range_g
                        (term
                          (numeric_literal))
                        (term
                          (identifier))))
                    (expression
                      (term
                        (function_call
                          (identifier)
                          (actual_parameter_part
                            (parameter_association
                              (expression
                                (term
                                  (identifier))))))))))))))))))

================================================================================
Slices
================================================================================

Proc (Arr (1 .. 2));

--------------------------------------------------------------------------------

(compilation
  (compilation_unit
    (procedure_call_statement
      (identifier)
      (actual_parameter_part
        (parameter_association
          (expression
            (term
              (slice
                (identifier)
                (range_g
                  (term
                    (numeric_literal))
                  (term
                    (numeric_literal)))))))))))

================================================================================
Slices with subtype declaration
================================================================================

A : Arr (Boolean);

--------------------------------------------------------------------------------

(compilation
  (compilation_unit
    (object_declaration
      (identifier)
      (identifier)
      (index_constraint
        (identifier)))))
