Справочник по Ada (Ada 2022)
8.5.1 Объявления переименования объектов
Объявление object_renaming_declaration используется для переименования объекта или значения.
Синтаксис
object_renaming_declaration ::=
defining_identifier [: [null_exclusion] subtype_mark] renames object_name
[aspect_specification];
| defining_identifier : access_definition renames object_name
[aspect_specification];
defining_identifier [: [null_exclusion] subtype_mark] renames object_name
[aspect_specification];
| defining_identifier : access_definition renames object_name
[aspect_specification];
Правила разрешения имен
Тип object_name должен соответствовать типу, определённому subtype_mark, если он присутствует. Если subtype_mark или access_definition отсутствуют, ожидаемый тип object_name — любой тип.
В случае, когда тип определён access_definition, тип object_name должен соответствовать анонимному типу доступа. Если анонимный тип доступа — тип доступа к объекту, тип object_name должен иметь тот же целевой тип, что и access_definition. Если анонимный тип доступа — тип доступа к подпрограмме, тип object_name должен иметь целевой профиль, который является типом-конформантом профиля access_definition.
Правила легитимности
Переименовываемый элемент должен быть объектом или значением.
В случае, когда тип определяется access_definition, тип переименовываемого сущности и тип, определенный access_definition:
- должны быть типами доступа к объектам с статически соответствующими целевыми подтипами и при этом быть или не быть типами доступа к константам; или
- должны быть типами доступа к подпрограммам с подтип-конформантными целевыми профилями.
Для object_renaming_declaration с null_exclusion или access_definition, имеющим null_exclusion, подтип object_name должен исключать нуль. Кроме того, если object_renaming_declaration находится в теле генерического блока G или в теле генерического блока, объявленного в области объявления генерического блока G, то:
- если object_name статически обозначает генерический формальный объект с режимом in out для G, то объявление этого объекта должно иметь null_exclusion;
- если object_name статически обозначает вызов генерической формальной функции G, то объявление результата этой функции должно иметь null_exclusion.
В случае, когда object_name является qualified_expression с номинальным подтипом S и чьё expression является name, обозначающим объект Q:
- если S — элементарный подтип, то:
Q должен быть константой, отличной от дериференции типа доступа; или
номинальный подтип Q должен быть статически совместим с S; или
S должен статически соответствовать базовому подтипу своего типа, если скалярный, или первому подтипу своего типа, если тип доступа.
- если S — составной подтип, то Q должен быть известен как ограниченный или S должен статически соответствовать первому подтипу своего типа.
Переименовываемый элемент не должен быть подкомпонентом, зависящим от дискриминантов объекта, номинальный подтип которого является неограниченным, если объект не известен как ограниченный. Срез массива не должен быть переименован, если это ограничение не позволяет переименовать массив.
Помимо мест, где обычно применяются правила легитимности (см. 12.3), эти правила также применяются в частях с приватными данными экземпляра генерического блока.
Статическая семантика
Объявление object_renaming_declaration объявляет новый вид переименовываемого сущности, свойства которого идентичны свойствам переименовываемого вида. Таким образом, свойства переименовываемого элемента не затрагиваются объявлением renaming_declaration. В частности, его номинальный подтип, является ли он значением или объектом, его значение, если это объект, и является ли он константой, не затрагиваются; аналогично, ограничения и другие свойства его номинального подтипа не затрагиваются переименованием (любое ограничение, подразумеваемое subtype_mark или access_definition object_renaming_declaration, игнорируется).
Примеры
Пример переименования объекта:
Пример переименования значения:
Uno renames One; -- см. 3.3.2