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

6.5 Операторы return

Оператор simple_return_statement или extended_return_statement (совместно называемые оператором return) используется для завершения выполнения внутреннего окружающего тела подпрограммы, тела входа или оператора accept.

Синтаксис

simple_return_statement ::= return [выражение];
extended_return_object_declaration ::=
идентификатор_определения : [aliased][constant] return_subtype_indication [:= выражение]
extended_return_statement ::=
return extended_return_object_declaration [do
последовательность_обработанных_операторов
end return];
return_subtype_indication ::= subtype_indication | определение_доступа

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

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

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

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

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

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

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

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