Справочник Ada 2012
13.14 Правила заморозки
Этот подпункт определяет место в тексте программы, где каждое объявленное сущности становится «замороженным». Использование сущности, например, ссылка на неё по имени или (для типа) выражение типа, вызывает заморозку сущности в некоторых контекстах, как описано ниже. Правила законности запрещают определенные виды использования сущности в области текста, где она заморожена.
Заморозка сущности происходит в одном или нескольких местах (точки заморозки) в тексте программы, где представление сущности должно быть полностью определено. Каждая сущность замораживается от своей первой точки заморозки до конца текста программы (с учётом порядка единиц компиляции, определённых в 10.1.4).
Этот подпункт также определяет место в тексте программы, где профиль каждой объявленной вызываемой сущности становится замороженным. Использование вызываемой сущности вызывает заморозку её профиля в некоторых контекстах, как описано ниже. В месте, где профиль вызываемой сущности замораживается, сама сущность также замораживается.
Конец declarative_part, protected_body или объявление библиотечного пакета или обобщённого библиотечного пакета вызывает заморозку каждой сущности и профиля, объявленных внутри него, за исключением неполных типов. proper_body, body_stub или entry_body вызывают заморозку каждой сущности и профиля, объявленных перед ним в той же declarative_part, которая не является неполным типом; она вызывает заморозку неполного типа только если тело находится в непосредственной области действия неполного типа.
Конструкция, которая (явным или неявным образом) ссылается на сущность, может вызвать заморозку сущности, как определено в последующих абзацах. В месте, где конструкция вызывает заморозку, каждый имя, выражение, неявная_развязка или диапазон внутри конструкции вызывает заморозку:
- Появление обобщенной_инстанциации вызывает заморозку, за исключением того, что имя, являющееся фактическим параметром обобщения, соответствующим обобщенному формальному параметру, являющемуся формальным неполным типом (см. 12.5.1) не вызывает заморозку. Кроме того, если параметр инстанциации имеет значение по умолчанию, выражение_по_умолчанию или имя_по_умолчанию для этого параметра вызывает заморозку.
- При появлении объявления функции-выражения expression_function_declaration в качестве завершения, выражение возврата функции-выражения вызывает заморозку.
- При появлении переименования в качестве тела, чье имя вызываемой сущности имя обозначает функцию-выражение, выражение возврата функции-выражения вызывает заморозку.
- Появление object_declaration, у которого нет соответствующего завершения, вызывает заморозку.
- Объявление расширения записи вызывает заморозку родительского подтипа.
- Объявление расширения записи, интерфейсного типа, задачи или защищённого типа вызывает заморозку любых родительских типов, указанных в объявлении.
- В точке заморозки сущности, связанной с aspect_specification, любые выражения или имена внутри aspect_specification вызывают заморозку. Любые статические выражения внутри aspect_specification также вызывают заморозку в конце непосредственно окружающего списка объявлений.
Статическое выражение (кроме как внутри aspect_specification) вызывает заморозку там, где оно встречается. Имя объекта или нестатическое выражение вызывают заморозку там, где они встречаются, если имя или выражение не являются частью выражения_по_умолчанию, имени_по_умолчанию, выражения возврата функции-выражения, aspect_specification или выражения для объекта компонента ограничение, в этом случае заморозка происходит позже как часть другой конструкции или в точке заморозки связанной сущности.
Неявный вызов замораживает те же сущности и профили, что и явный вызов. Это верно даже если неявный вызов удалён с помощью разрешений реализации.
Если выражение неявно преобразуется к типу или подтипу T, то в месте, где выражение вызывает заморозку, T замораживается.
Следующие правила определяют, какие сущности замораживаются в месте, где конструкция вызывает заморозку:
- В месте, где выражение вызывает заморозку, тип выражения замораживается, за исключением случая, когда выражение является литералом перечисления, используемым в качестве discrete_choice агрегата массива array_aggregate enumeration_representation_clause.
- В месте, где вызов функции вызывает заморозку, профиль функции замораживается. Кроме того, если параметр вызова имеет значение по умолчанию, выражение_по_умолчанию для этого параметра вызывает заморозку. Если вызов функции относится к функции-выражению, выражение возврата функции-выражения вызывает заморозку.
- В месте, где обобщенная_инстанциация вызывает заморозку вызываемой сущности, профиль этой сущности замораживается, за исключением случаев, когда формальная подпрограмма, соответствующая вызываемой сущности, имеет параметр или результат формального немаркированного неполного типа; если вызываемая сущность является функцией-выражением, выражение возврата функции-выражения вызывает заморозку.
- В месте, где используется атрибут Access или Unchecked_Access, чьё префикс обозначает функцию-выражение, вызывающая заморозку, выражение возврата функции-выражения вызывает заморозку.
- В месте, где имя вызывает заморозку, сущность, обозначаемая именем, замораживается, если имя не является префиксом расширенного имени; в месте, где имя объекта имя вызывает заморозку, номинальный подтип, связанный с именем, замораживается.
- В месте, где implicit_dereference вызывает заморозку, номинальный подтип, связанный с implicit_dereference, замораживается.
- В месте, где allocator вызывает заморозку, назначенный подтип его типа замораживается. Если тип allocator является производным типом, то все родительские типы также замораживаются.
- В месте заморозки профиля замораживаются все подтипы профиля. Если соответствующая вызываемая сущность является членом семейства входов, индексный подтип семейства замораживается.
- В месте заморозки подтипа замораживается его тип. В месте заморозки типа любые выражения или имена в полном определении типа вызывают заморозку; первый подтип, а также любые подтипы компонентов, индексные подтипы и родительский подтип типа замораживаются также. Для конкретного помеченного типа замораживается соответствующий тип-класс. Для типа-класса также замораживается соответствующий конкретный тип.
- В месте заморозки конкретного помеченного типа замораживаются примитивные подпрограммы типа. В месте заморозки типа любая подпрограмма, указанная в attribute_definition_clause для типа, замораживается.
Правила законности
Явное объявление примитивной подпрограммы помеченного типа должно произойти до заморозки типа (см. 3.9.2).
Завершение объявления отложенной константы должно произойти до заморозки константы (см. 7.4).
END_OF_DOCUMENT_MARKER Операционный или представительный элемент, который непосредственно определяет аспект сущности, должен появиться до того, как сущность будет заморожена (см. 13.1).
Динамическая семантика
Тег (см. 3.9) помеченного типа T создается в тот момент, когда T замораживается.