Справочное руководство по Ada 2005
6.5 Операторы return
Оператор simple_return_statement или extended_return_statement (совместно называемые оператором return) используется для завершения выполнения ближайшего содержащего subprogram_body, entry_body или accept_statement.
Синтаксис
extended_return_statement ::=
return defining_identifier : [aliased] return_subtype_indication [:= expression] [do
handled_sequence_of_statements
end return];
return defining_identifier : [aliased] return_subtype_indication [:= expression] [do
handled_sequence_of_statements
end return];
Правила разрешения имен
Подтип результата функции — это подтип, обозначенный subtype_mark или определённый access_definition после ключевого слова return в профиле функции. Ожидаемый тип для выражения, если таковое имеется, в операторе simple_return_statement — это тип результата соответствующей функции. Ожидаемый тип для выражения в операторе extended_return_statement — это тип return_subtype_indication.
Правила легальности
Оператор return должен находиться внутри вызываемого конструкта, и он применяется к ближайшему вызываемому конструкту или extended_return_statement, который его содержит. Оператор return не должен находиться внутри тела, которое находится внутри конструкта, к которому применяется оператор return.
Тело функции должно содержать по крайней мере один оператор return, который применяется к телу функции, если функция не содержит операторов code_statement. Оператор simple_return_statement должен включать выражение, если и только если он применяется к телу функции. Оператор extended_return_statement должен применяться к телу функции.
Для оператора extended_return_statement, который применяется к телу функции:
- Если подтип результата функции определён subtype_mark, то return_subtype_indication должен быть subtype_indication. Тип subtype_indication должен быть типом результата функции. Если подтип результата функции ограничен, то подтип, определённый subtype_indication, также должен быть ограничен и должен статически соответствовать этому подтипу результата. Если подтип результата функции неограничен, то подтип, определённый subtype_indication, должен быть определённым подтипом, или должно быть выражение.
- Если подтип результата функции определён access_definition, то return_subtype_indication должен быть access_definition. Подтип, определённый access_definition, должен статически соответствовать подтипу результата функции. Уровень доступности этого анонимного подтипа доступа — уровень подтипа результата.
Для любого оператора return, который применяется к телу функции:
- Если подтип результата функции ограничен, то выражение оператора return (если оно есть) должно быть агрегатом, вызовом функции (или эквивалентным использованием оператора), или qualified_expression или скобочным выражением, операндом которого является одно из этих.
- Если подтип результата функции — класс-тип, уровень доступности типа выражения оператора return должен не быть статически глубже, чем уровень мастера, который обработал тело функции. Если подтип результата имеет один или несколько неограниченных дискриминаторов доступа, уровень доступности анонимного типа доступа каждого дискриминатора доступа, как определено выражением оператора simple_return_statement или return_subtype_indication, должен не быть статически глубже, чем уровень мастера, который обработал тело функции.
Статическая семантика
В операторе extended_return_statement объект return объявляется с данным defining_identifier с номинальным подтипом, определённым return_subtype_indication.
Динамическая семантика
Для выполнения extended_return_statement, subtype_indication или access_definition обрабатывается. Это создаёт номинальный подтип объекта return. Если есть выражение, оно вычисляется и преобразуется в номинальный подтип (что может вызвать Constraint_Error — см. 4.6); объект return создаётся, и преобразованное значение присваивается объекту return. В противном случае объект return создаётся и инициализируется по умолчанию, как для самостоятельного объекта его номинального подтипа (см. 3.3.1). Если номинальный подтип неопределён, объект return ограничивается своим начальным значением.
Для выполнения simple_return_statement, выражение (если есть) сначала вычисляется, преобразуется в подтип результата, а затем присваивается анонимному объекту return.
Если у объекта return есть какие-либо части, которые являются задачами, активация этих задач не происходит до возврата из функции (см. 9.2).
Если тип результата функции — конкретный помеченный тип, метка объекта return — это метка типа результата. Если тип результата — класс-тип, метка объекта return — метка значения выражения. Проверяется, что уровень доступности типа, идентифицированного меткой результата, не глубже уровня мастера, который обработал тело функции. Если эта проверка не пройдена, возникает Program_Error.
Абзацы с 9 по 20 были удалены.
Если подтип результата функции имеет один или более неограниченных дискриминаторов доступа, проверяется, что уровень доступности анонимного типа доступа каждого дискриминатора доступа, как определено выражением или return_subtype_indication функции, не глубже уровня мастера, который обработал тело функции. Если эта проверка не пройдена, возникает Program_Error.
При выполнении оператора extended_return_statement выполняется handled_sequence_of_statements. Внутри этой handled_sequence_of_statements выполнение оператора simple_return_statement, который применяется к extended_return_statement, вызывает передачу управления, завершающую extended_return_statement. После завершения оператора return, который применяется к вызываемому конструкту, выполняется передача управления, завершающая выполнение вызываемого конструкта и возвращающая управление вызывающей стороне.
В случае функции, function_call обозначает постоянный вид возвращаемого объекта.
Разрешения реализации
Если подтип результата функции не ограничен, и вызов функции используется для задания начального значения объекта с ограниченным номинальным подтипом, Constraint_Error может быть поднят в точке вызова (после отказа от выполнения тела функции), если при разработке return_subtype_indication или вычислении expression оператора return, относящегося к телу функции, определяется, что значение результата нарушит ограничение подтипа этого объекта.
Примеры
Примеры операторов return:
return Key_Value(Last_Index); -- в теле функции
return Node : Cell do -- в теле функции, см. 3.10.1 для Cell
Node.Value := Result;
Node.Succ := Next_Node;
end return;
Node.Value := Result;
Node.Succ := Next_Node;
end return;