(extended_return_object_declaration): accept aspect_specification In accordance with Ada 2022 RM 6.5(2.1/5); this was not allowed in Ada 2012, but was changed in AI12-0398-1/03. add test.
669 lines
18 KiB
Plaintext
669 lines
18 KiB
Plaintext
================================================================================
|
|
Untyped Constant
|
|
================================================================================
|
|
|
|
A : constant := 111;
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(compilation
|
|
(compilation_unit
|
|
(number_declaration
|
|
(identifier)
|
|
(expression
|
|
(term
|
|
(numeric_literal))))))
|
|
|
|
================================================================================
|
|
Factors
|
|
================================================================================
|
|
|
|
A : constant Integer := 2 + 8 * 3;
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(compilation
|
|
(compilation_unit
|
|
(object_declaration
|
|
(identifier)
|
|
(identifier)
|
|
(expression
|
|
(term
|
|
(numeric_literal))
|
|
(binary_adding_operator)
|
|
(term
|
|
(numeric_literal)
|
|
(multiplying_operator)
|
|
(numeric_literal))))))
|
|
|
|
================================================================================
|
|
While
|
|
================================================================================
|
|
|
|
procedure P is
|
|
begin
|
|
while True loop
|
|
exit;
|
|
exit when A > 0;
|
|
end loop;
|
|
end;
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(compilation
|
|
(compilation_unit
|
|
(subprogram_body
|
|
(procedure_specification
|
|
(identifier))
|
|
(handled_sequence_of_statements
|
|
(loop_statement
|
|
(iteration_scheme
|
|
(expression
|
|
(term
|
|
(identifier))))
|
|
(exit_statement)
|
|
(exit_statement
|
|
(expression
|
|
(term
|
|
(identifier))
|
|
(relational_operator)
|
|
(term
|
|
(numeric_literal)))))))))
|
|
|
|
================================================================================
|
|
For loops
|
|
================================================================================
|
|
|
|
procedure P is
|
|
begin
|
|
for E in Pkg.Arr'Range loop
|
|
goto end_loop;
|
|
|
|
<<end_loop>>
|
|
end loop;
|
|
|
|
for E of reverse Arr loop
|
|
delay 1.0;
|
|
end loop;
|
|
end P;
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(compilation
|
|
(compilation_unit
|
|
(subprogram_body
|
|
(procedure_specification
|
|
(identifier))
|
|
(handled_sequence_of_statements
|
|
(loop_statement
|
|
(iteration_scheme
|
|
(loop_parameter_specification
|
|
(identifier)
|
|
(range_g
|
|
(selected_component
|
|
(identifier)
|
|
(identifier))
|
|
(tick)
|
|
(range_attribute_designator))))
|
|
(goto_statement
|
|
(identifier))
|
|
(label
|
|
(identifier)))
|
|
(loop_statement
|
|
(iteration_scheme
|
|
(iterator_specification
|
|
(identifier)
|
|
(identifier)))
|
|
(delay_relative_statement
|
|
(expression
|
|
(term
|
|
(numeric_literal))))))
|
|
(identifier))))
|
|
|
|
================================================================================
|
|
Named loop
|
|
================================================================================
|
|
|
|
procedure P is
|
|
begin
|
|
Main:
|
|
loop
|
|
exit Main;
|
|
end loop Main;
|
|
end;
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(compilation
|
|
(compilation_unit
|
|
(subprogram_body
|
|
(procedure_specification
|
|
(identifier))
|
|
(handled_sequence_of_statements
|
|
(loop_statement
|
|
(loop_label
|
|
(identifier))
|
|
(exit_statement
|
|
(identifier))
|
|
(identifier))))))
|
|
|
|
================================================================================
|
|
Return
|
|
================================================================================
|
|
|
|
function F return Boolean is
|
|
begin
|
|
return True;
|
|
return A : My_Rec := (F => 1) do
|
|
null;
|
|
end return;
|
|
return Y : Integer
|
|
with Address => X'Address
|
|
do
|
|
null;
|
|
end return;
|
|
end F;
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(compilation
|
|
(compilation_unit
|
|
(subprogram_body
|
|
(function_specification
|
|
(identifier)
|
|
(result_profile
|
|
(identifier)))
|
|
(handled_sequence_of_statements
|
|
(simple_return_statement
|
|
(expression
|
|
(term
|
|
(identifier))))
|
|
(extended_return_statement
|
|
(extended_return_object_declaration
|
|
(identifier)
|
|
(identifier)
|
|
(expression
|
|
(term
|
|
(record_aggregate
|
|
(record_component_association_list
|
|
(component_choice_list
|
|
(identifier))
|
|
(expression
|
|
(term
|
|
(numeric_literal))))))))
|
|
(handled_sequence_of_statements
|
|
(null_statement)))
|
|
(extended_return_statement
|
|
(extended_return_object_declaration
|
|
(identifier)
|
|
(identifier)
|
|
(aspect_specification
|
|
(aspect_mark_list
|
|
(aspect_association
|
|
(identifier)
|
|
(expression
|
|
(term
|
|
(identifier)
|
|
(tick)
|
|
(attribute_designator
|
|
(identifier))))))))
|
|
(handled_sequence_of_statements
|
|
(null_statement))))
|
|
(identifier))))
|
|
|
|
================================================================================
|
|
Procedure call
|
|
================================================================================
|
|
|
|
procedure P (A : Integer) is
|
|
begin
|
|
P2 (1, False);
|
|
end P;
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(compilation
|
|
(compilation_unit
|
|
(subprogram_body
|
|
(procedure_specification
|
|
(identifier)
|
|
(formal_part
|
|
(parameter_specification
|
|
(identifier)
|
|
(identifier))))
|
|
(handled_sequence_of_statements
|
|
(procedure_call_statement
|
|
(identifier)
|
|
(actual_parameter_part
|
|
(parameter_association
|
|
(expression
|
|
(term
|
|
(numeric_literal))))
|
|
(parameter_association
|
|
(expression
|
|
(term
|
|
(identifier)))))))
|
|
(identifier))))
|
|
|
|
================================================================================
|
|
Raise exception
|
|
================================================================================
|
|
|
|
procedure P is
|
|
begin
|
|
raise Constraint_Error;
|
|
raise Constraint_Error with "msg";
|
|
end;
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(compilation
|
|
(compilation_unit
|
|
(subprogram_body
|
|
(procedure_specification
|
|
(identifier))
|
|
(handled_sequence_of_statements
|
|
(raise_statement
|
|
(identifier))
|
|
(raise_statement
|
|
(identifier)
|
|
(expression
|
|
(term
|
|
(string_literal))))))))
|
|
|
|
================================================================================
|
|
Function calls
|
|
================================================================================
|
|
|
|
procedure P is
|
|
A : Integer;
|
|
begin
|
|
A := Func (B => 1);
|
|
end;
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(compilation
|
|
(compilation_unit
|
|
(subprogram_body
|
|
(procedure_specification
|
|
(identifier))
|
|
(non_empty_declarative_part
|
|
(object_declaration
|
|
(identifier)
|
|
(identifier)))
|
|
(handled_sequence_of_statements
|
|
(assignment_statement
|
|
(identifier)
|
|
(expression
|
|
(term
|
|
(function_call
|
|
(identifier)
|
|
(actual_parameter_part
|
|
(parameter_association
|
|
(component_choice_list
|
|
(identifier))
|
|
(expression
|
|
(term
|
|
(numeric_literal)))))))))))))
|
|
|
|
================================================================================
|
|
if statement
|
|
================================================================================
|
|
|
|
procedure P is
|
|
begin
|
|
if A = 0 or else B = 1 then
|
|
declare
|
|
begin
|
|
null;
|
|
end;
|
|
elsif A = 1 then
|
|
declare
|
|
C : Integer;
|
|
begin
|
|
null;
|
|
exception
|
|
when Constraint_Error => null;
|
|
end;
|
|
else
|
|
begin
|
|
null;
|
|
end;
|
|
end if;
|
|
end P;
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(compilation
|
|
(compilation_unit
|
|
(subprogram_body
|
|
(procedure_specification
|
|
(identifier))
|
|
(handled_sequence_of_statements
|
|
(if_statement
|
|
(expression
|
|
(term
|
|
(identifier))
|
|
(relational_operator)
|
|
(term
|
|
(numeric_literal))
|
|
(term
|
|
(identifier))
|
|
(relational_operator)
|
|
(term
|
|
(numeric_literal)))
|
|
(block_statement
|
|
(handled_sequence_of_statements
|
|
(null_statement)))
|
|
(elsif_statement_item
|
|
(expression
|
|
(term
|
|
(identifier))
|
|
(relational_operator)
|
|
(term
|
|
(numeric_literal)))
|
|
(block_statement
|
|
(non_empty_declarative_part
|
|
(object_declaration
|
|
(identifier)
|
|
(identifier)))
|
|
(handled_sequence_of_statements
|
|
(null_statement)
|
|
(exception_handler
|
|
(exception_choice_list
|
|
(exception_choice
|
|
(identifier)))
|
|
(null_statement)))))
|
|
(block_statement
|
|
(handled_sequence_of_statements
|
|
(null_statement)))))
|
|
(identifier))))
|
|
|
|
================================================================================
|
|
Case statement
|
|
================================================================================
|
|
|
|
procedure P is
|
|
begin
|
|
case Func(A => 1) is
|
|
when '1' .. '2' =>
|
|
null;
|
|
when '3' | '4' =>
|
|
null;
|
|
end case;
|
|
end;
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(compilation
|
|
(compilation_unit
|
|
(subprogram_body
|
|
(procedure_specification
|
|
(identifier))
|
|
(handled_sequence_of_statements
|
|
(case_statement
|
|
(expression
|
|
(term
|
|
(function_call
|
|
(identifier)
|
|
(actual_parameter_part
|
|
(parameter_association
|
|
(component_choice_list
|
|
(identifier))
|
|
(expression
|
|
(term
|
|
(numeric_literal))))))))
|
|
(case_statement_alternative
|
|
(discrete_choice_list
|
|
(discrete_choice
|
|
(range_g
|
|
(term
|
|
(character_literal))
|
|
(term
|
|
(character_literal)))))
|
|
(null_statement))
|
|
(case_statement_alternative
|
|
(discrete_choice_list
|
|
(discrete_choice
|
|
(expression
|
|
(term
|
|
(character_literal))))
|
|
(discrete_choice
|
|
(expression
|
|
(term
|
|
(character_literal)))))
|
|
(null_statement)))))))
|
|
|
|
================================================================================
|
|
Allocators
|
|
================================================================================
|
|
|
|
procedure P is
|
|
begin
|
|
A := new T;
|
|
A := new (pkg.pool) T'((F => 1));
|
|
end;
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(compilation
|
|
(compilation_unit
|
|
(subprogram_body
|
|
(procedure_specification
|
|
(identifier))
|
|
(handled_sequence_of_statements
|
|
(assignment_statement
|
|
(identifier)
|
|
(expression
|
|
(term
|
|
(allocator
|
|
(identifier)))))
|
|
(assignment_statement
|
|
(identifier)
|
|
(expression
|
|
(term
|
|
(allocator
|
|
(subpool_specification
|
|
(selected_component
|
|
(identifier)
|
|
(identifier)))
|
|
(qualified_expression
|
|
(identifier)
|
|
(tick)
|
|
(expression
|
|
(term
|
|
(record_aggregate
|
|
(record_component_association_list
|
|
(component_choice_list
|
|
(identifier))
|
|
(expression
|
|
(term
|
|
(numeric_literal))))))))))))))))
|
|
|
|
================================================================================
|
|
Filtered for loops
|
|
================================================================================
|
|
|
|
procedure P is
|
|
begin
|
|
for E of Some_Array when E /= 0 loop
|
|
null;
|
|
end loop;
|
|
end;
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(compilation
|
|
(compilation_unit
|
|
(subprogram_body
|
|
(procedure_specification
|
|
(identifier))
|
|
(handled_sequence_of_statements
|
|
(loop_statement
|
|
(iteration_scheme
|
|
(iterator_specification
|
|
(identifier)
|
|
(identifier)
|
|
(iterator_filter
|
|
(expression
|
|
(term
|
|
(identifier))
|
|
(relational_operator)
|
|
(term
|
|
(numeric_literal))))))
|
|
(null_statement))))))
|
|
|
|
================================================================================
|
|
Assignment target name
|
|
================================================================================
|
|
|
|
procedure P is
|
|
begin
|
|
Some_Very_Long.And_Complex (Expression) := @ + 1;
|
|
Another_Very_Long.And_Complex (Expression) := Function_Call (@);
|
|
end;
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(compilation
|
|
(compilation_unit
|
|
(subprogram_body
|
|
(procedure_specification
|
|
(identifier))
|
|
(handled_sequence_of_statements
|
|
(assignment_statement
|
|
(function_call
|
|
(selected_component
|
|
(identifier)
|
|
(identifier))
|
|
(actual_parameter_part
|
|
(parameter_association
|
|
(expression
|
|
(term
|
|
(identifier))))))
|
|
(expression
|
|
(term
|
|
(target_name))
|
|
(binary_adding_operator)
|
|
(term
|
|
(numeric_literal))))
|
|
(assignment_statement
|
|
(function_call
|
|
(selected_component
|
|
(identifier)
|
|
(identifier))
|
|
(actual_parameter_part
|
|
(parameter_association
|
|
(expression
|
|
(term
|
|
(identifier))))))
|
|
(expression
|
|
(term
|
|
(function_call
|
|
(identifier)
|
|
(actual_parameter_part
|
|
(parameter_association
|
|
(expression
|
|
(term
|
|
(target_name)))))))))))))
|
|
|
|
================================================================================
|
|
if-expressions
|
|
================================================================================
|
|
|
|
procedure P is
|
|
begin
|
|
S := new String'((if N /= "" then N else "12"));
|
|
S := new String'(if N /= "" then N else "12");
|
|
end;
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(compilation
|
|
(compilation_unit
|
|
(subprogram_body
|
|
(procedure_specification
|
|
(identifier))
|
|
(handled_sequence_of_statements
|
|
(assignment_statement
|
|
(identifier)
|
|
(expression
|
|
(term
|
|
(allocator
|
|
(qualified_expression
|
|
(identifier)
|
|
(tick)
|
|
(expression
|
|
(term
|
|
(if_expression
|
|
(expression
|
|
(term
|
|
(identifier))
|
|
(relational_operator)
|
|
(term
|
|
(string_literal)))
|
|
(expression
|
|
(term
|
|
(identifier)))
|
|
(expression
|
|
(term
|
|
(string_literal)))))))))))
|
|
(assignment_statement
|
|
(identifier)
|
|
(expression
|
|
(term
|
|
(allocator
|
|
(qualified_expression
|
|
(identifier)
|
|
(tick)
|
|
(if_expression
|
|
(expression
|
|
(term
|
|
(identifier))
|
|
(relational_operator)
|
|
(term
|
|
(string_literal)))
|
|
(expression
|
|
(term
|
|
(identifier)))
|
|
(expression
|
|
(term
|
|
(string_literal)))))))))))))
|
|
|
|
================================================================================
|
|
Re-raise
|
|
================================================================================
|
|
|
|
procedure P is
|
|
begin
|
|
null;
|
|
exception
|
|
when others =>
|
|
Proc;
|
|
pragma Assert (True);
|
|
raise;
|
|
end;
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(compilation
|
|
(compilation_unit
|
|
(subprogram_body
|
|
(procedure_specification
|
|
(identifier))
|
|
(handled_sequence_of_statements
|
|
(null_statement)
|
|
(exception_handler
|
|
(exception_choice_list
|
|
(exception_choice))
|
|
(procedure_call_statement
|
|
(identifier))
|
|
(pragma_g
|
|
(identifier)
|
|
(pragma_argument_association
|
|
(expression
|
|
(term
|
|
(identifier)))))
|
|
(raise_statement))))))
|