================================================================================
Discrete Choice expression
================================================================================

declare
   type Color_Type is (Red, 'W');
   Color : Color_Type := 'W';
begin
   case Color is
      when Red => null;
      when 'W' => null;
   end case;
end;

--------------------------------------------------------------------------------
(compilation
  (compilation_unit
    (block_statement
      (non_empty_declarative_part
        (full_type_declaration
          (identifier)
          (enumeration_type_definition
            (identifier)
            (character_literal)))
        (object_declaration
          (identifier)
          (identifier)
          (expression
            (term
              (character_literal)))))
      (handled_sequence_of_statements
        (case_statement
          (expression
            (term
              (identifier)))
          (case_statement_alternative
            (discrete_choice_list
              (discrete_choice
                (expression
                  (term
                    (identifier)))))
            (null_statement))
          (case_statement_alternative
            (discrete_choice_list
              (discrete_choice
                (expression
                  (term
                    (character_literal)))))
            (null_statement)))))))

================================================================================
Discrete Choice subtype indication
================================================================================

declare
   Value : Integer := 5;
begin
   case Value is
      when Integer range 1 .. Integer'Last => null;
      when Integer range 0 .. 0            => null;
      when others                          => null;
   end case;
end;

--------------------------------------------------------------------------------
(compilation
  (compilation_unit
    (block_statement
      (non_empty_declarative_part
        (object_declaration
          name: (identifier)
          subtype_mark: (identifier)
          (expression
            (term
              (numeric_literal)))))
      (handled_sequence_of_statements
        (case_statement
          (expression
            (term
              name: (identifier)))
          (case_statement_alternative
            (discrete_choice_list
              (discrete_choice
                subtype_mark: (identifier)
                (range_constraint
                  (range_g
                    (term
                      (numeric_literal))
                    (term
                      name: (identifier)
                      name: (tick)
                      name: (attribute_designator
                        (identifier)))))))
            (null_statement))
          (case_statement_alternative
            (discrete_choice_list
              (discrete_choice
                subtype_mark: (identifier)
                (range_constraint
                  (range_g
                    (term
                      (numeric_literal))
                    (term
                      (numeric_literal))))))
            (null_statement))
          (case_statement_alternative
            (discrete_choice_list
              (discrete_choice))
            (null_statement)))))))

================================================================================
Discrete Choice range
================================================================================

declare
   Value : Character := 'A';
begin
   case Value is
      when 'a' .. 'z' => null;
      when 'A' .. 'Z' => null;
      when others     => null;
   end case;
end;

--------------------------------------------------------------------------------
(compilation
  (compilation_unit
    (block_statement
      (non_empty_declarative_part
        (object_declaration
          name: (identifier)
          subtype_mark: (identifier)
          (expression
            (term
              name: (character_literal)))))
      (handled_sequence_of_statements
        (case_statement
          (expression
            (term
              name: (identifier)))
          (case_statement_alternative
            (discrete_choice_list
              (discrete_choice
                (range_g
                  (term
                    name: (character_literal))
                  (term
                    name: (character_literal)))))
            (null_statement))
          (case_statement_alternative
            (discrete_choice_list
              (discrete_choice
                (range_g
                  (term
                    name: (character_literal))
                  (term
                    name: (character_literal)))))
            (null_statement))
            (case_statement_alternative
              (discrete_choice_list
                (discrete_choice))
            (null_statement)))))))
