Spec-Zone.ru › Ada 2022
Справочник по Ada (Ada 2022)

6.5 Операторы return

Оператор simple_return_statement или extended_return_statement (совместно называемые оператором return) используется для завершения выполнения ближайшего содержащего оператора subprogram_body, entry_body или accept_statement.

Синтаксис

simple_return_statement ::= return [expression];
extended_return_object_declaration ::=
defining_identifier : [aliased] [constant] return_subtype_indication [:= expression]
[aspect_specification]
extended_return_statement ::=
return extended_return_object_declaration [do
handled_sequence_of_statements
end return];
return_subtype_indication ::= subtype_indication | access_definition

Правила разрешения имен

Подтип результата функции — подтип, обозначенный subtype_mark или определённый access_definition после ключевого слова return в профиле функции. Ожидаемый тип для expression, если таковой имеется, в операторе simple_return_statement — тип результата соответствующей функции. Ожидаемый тип для expression в операторе extended_return_object_declaration — тип return_subtype_indication.

Правила легитимности

Оператор return должен находиться внутри вызываемого конструкта, и он применяется к самому внутреннему вызываемому конструкту или оператору extended_return_statement, который его содержит. Оператор return не должен находиться внутри тела, находящегося внутри конструкта, к которому применяется оператор return.
Тело функции должно содержать по крайней мере один оператор return, который применяется к телу функции, если функция не содержит операторы code_statement. Оператор simple_return_statement должен включать expression, если и только если он применяется к телу функции. Оператор extended_return_statement должен применяться к телу функции. Оператор extended_return_object_declaration с ключевым словом constant должен включать expression.
Выражение expression оператора extended_return_statement — это выражение (если таковое имеется) extended_return_object_declaration оператора extended_return_statement.
Для оператора extended_return_statement, который применяется к телу функции:
  • Если подтип результата функции определяется subtype_mark, return_subtype_indication должен быть subtype_indication. Тип subtype_indication должен соответствовать типу результата функции. Подтип, определённый subtype_indication, должен быть статически совместим с подтипом результата функции; если тип результата функции является элементарным, оба подтипа должны статически совпадать. Если подтип результата функции неопределён, то подтип, определённый subtype_indication, должен быть определённым подтипом, или должен быть expression.
  • Если подтип результата функции определён access_definition, return_subtype_indication должен быть access_definition. Подтип, определённый access_definition, должен статически совпадать с подтипом результата функции. Уровень доступности этого анонимного подтипа доступа — уровень доступности подтипа результата.
  • Если подтип результата функции является универсальным, уровень доступности типа подтипа, определённого return_subtype_indication, не должен быть статически глубже, чем у главного объекта, который обработал тело функции.
Для любого оператора return, который применяется к телу функции:
  • Если подтип результата функции ограничен, то expression оператора return (если таковое имеется) должно соответствовать ограничениям, описанным в 7.5.
  • Если подтип результата функции является универсальным, уровень доступности типа expression (если таковое имеется) оператора return не должен быть статически глубже, чем у главного объекта, который обработал тело функции.
  • Если подтип, определяемый expression оператора simple_return_statement или return_subtype_indication, имеет один или несколько дискриминантов доступа, уровень доступности анонимного типа доступа каждого дискриминанта доступа не должен быть статически глубже, чем у главного объекта, который обработал тело функции.
Если ключевое слово aliased присутствует в extended_return_object_declaration, тип объекта расширенного возврата должен быть неизменяемо ограниченным.

Статическая семантика

В операторе extended_return_statement объект возврата объявляется с заданным defining_identifier, с номинальным подтипом, определённым return_subtype_indication. Оператор extended_return_statement с ключевым словом constant — полное объявление константы, которое объявляет объект возврата как константный объект.

Динамическая семантика

При выполнении оператора extended_return_statement, subtype_indication или access_definition обрабатываются. Это создаёт номинальный подтип объекта возврата. Если есть выражение expression, оно вычисляется и преобразуется к номинальному подтипу (что может вызвать исключение Constraint_Error — см. 4.6); объект возврата создаётся, и преобразованное значение присваивается объекту возврата. В противном случае объект возврата создаётся и инициализируется по умолчанию, как для автономного объекта его номинального подтипа (см. 3.3.1). Если номинальный подтип неопределён, объект возврата ограничен его начальным значением. Проверяется, что значение объекта возврата принадлежит подтипу результата функции. Constraint_Error генерируется, если эта проверка завершается неудачей.
При выполнении оператора simple_return_statement, выражение expression (если таковое имеется) сначала вычисляется, преобразуется в подтип результата и затем присваивается анонимному объекту возврата.
Если объект возврата имеет части, которые являются задачами, активация этих задач не происходит до возврата из функции (см. 9.2).
Если тип результата функции — это конкретный помеченный тип, метка возвращаемого объекта — это метка типа результата. Если тип результата является общим для класса, метка возвращаемого объекта — это метка значения выражения оператора возврата, если возвращаемый объект не определён с помощью extended_return_object_declaration с subtype_indication, которая является специфичной, в таком случае это метка типа subtype_indication. Проверяется, что мастер типа, идентифицированный меткой результата, включает в себя разработку мастера, который разработал тело функции. Если эта проверка не пройдена, возникает Program_Error.
Для выполнения extended_return_statement выполняется handled_sequence_of_statements. Внутри этого handled_sequence_of_statements выполнение simple_return_statement, применимого к extended_return_statement, вызывает передачу управления, завершающую extended_return_statement. После завершения оператора возврата, применимого к вызываемому конструкту, нормальным завершением simple_return_statement или достижением end return extended_return_statement, выполняется передача управления, завершающая выполнение вызываемого конструкта и возвращающая управление вызывающей стороне.
Если тип результата функции определён access_definition, обозначающим конкретный помеченный тип T, проверяется, что значение результата равно null или что метка объекта, обозначенного значением результата, идентифицирует T. Constraint_Error возникает, если эта проверка не пройдена.
Параграфы с 9 по 20 были удалены.
Если какая-либо часть конкретного типа возвращаемого объекта функции (или её корасширения) имеет один или несколько дискриминантов доступа, значение которых не ограничено типом результата функции, выполняется проверка, что уровень доступности анонимного типа доступа каждого дискриминанта доступа, как определено выражением или return_subtype_indication оператора возврата, не глубже уровня мастера вызова (см. 3.10.2). Если эта проверка не пройдена, возникает Program_Error.
Выполняется проверка того, что возвращаемое значение удовлетворяет предикатам типа возврата. Если эта проверка не пройдена, эффект определяется в 3.2.4.
В случае функции function_call обозначает постоянный вид возвращаемого объекта.

Разрешения на реализацию

Для вызова функции, используемой для инициализации составного объекта с ограниченным номинальным типом или для инициализации возвращаемого объекта, который встроен в такой объект:
  • Если тип результата функции ограничен и преобразование объекта этого типа в тип объекта, который инициализируется, вызовет Constraint_Error, то Constraint_Error может быть вызван до вызова функции.
  • Если тип результата функции неограничен и оператор возврата выполняется таким образом, что возвращаемый объект известен как ограниченный, а преобразование возвращаемого объекта в тип объекта, который инициализируется, вызовет Constraint_Error, то Constraint_Error может быть вызван в момент вызова (после отмены выполнения тела функции).

Примеры

Примеры операторов возврата:
return; -- в теле процедуры, entry_body,
-- accept_statement или extended_return_statement
return Key_Value(Last_Index); -- в теле функции
return Node : Cell do -- в теле функции, см. 3.10.1 для Cell
Node.Value := Result;
Node.Succ := Next_Node;
end return;


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API