Справочник по Ada 95
13.14 Правила замораживания
Этот пункт определяет место в тексте программы, где каждый объявленный элемент становится «замороженным». Использование элемента, например, ссылка на него по имени или (для типа) выражение типа, вызывает замораживание элемента в некоторых контекстах, как описано ниже. Правила законности запрещают определенные виды использования элемента в области текста, где он заморожен.
Замораживание элемента происходит в одном или нескольких местах (точках замораживания) в тексте программы, где представление элемента должно быть полностью определено. Каждый элемент замораживается от своей первой точки замораживания до конца текста программы (с учетом порядка компиляции единиц, определенного в 10.1.4).
Конец declarative_part, protected_body или объявления библиотечного пакета или библиотечного обобщенного пакета вызывает замораживание каждого объявленного в нем элемента, за исключением неполных типов. Тело неинстанцируемого объекта, отличного от тела переименований, вызывает замораживание каждого элемента, объявленного перед ним в том же declarative_part.
Конструкт, который (явно или неявно) ссылается на элемент, может вызвать замораживание элемента, как определено в последующих абзацах. В месте, где конструкт вызывает замораживание, каждый имя, выражение, неявное_разъяснение или диапазон внутри конструкции вызывает замораживание:
- Происхождение generic_instantiation вызывает замораживание; также, если параметр инстанциации имеет значение по умолчанию, default_expression или default_name для этого параметра вызывает замораживание.
- Происхождение object_declaration, которое не имеет соответствующего завершения, вызывает замораживание.
- Объявление расширения записи вызывает замораживание родительского подтипа.
Статическое выражение вызывает замораживание в месте его возникновения. Имя объекта или нестатическое выражение вызывают замораживание в месте их возникновения, если имя или выражение не являются частью default_expression, default_name или выражения для каждого объекта ограничения компонента constraint, в этом случае замораживание происходит позже как часть другого конструкта.
Неявный вызов замораживает те же элементы, что и явный вызов. Это верно, даже если неявный вызов удален с помощью разрешений реализации.
Если выражение неявно преобразуется в тип или подтип T, то в месте, где выражение вызывает замораживание, T замораживается.
Следующие правила определяют, какие элементы замораживаются в месте, где конструкт вызывает замораживание:
- В месте, где выражение вызывает замораживание, тип выражения замораживается, за исключением случая, когда выражение представляет собой литерал перечисления, используемый в качестве discrete_choice array_aggregate enumeration_representation_clause.
- В месте, где имя вызывает замораживание, элемент, обозначаемый имя, замораживается, за исключением случая, когда имя является prefix расширенного имени; в месте, где имя объекта вызывает замораживание, номинальный подтип, связанный с имя, замораживается.
- В месте, где implicit_dereference вызывает замораживание, номинальный подтип, связанный с implicit_dereference, замораживается.
- В месте, где диапазон вызывает замораживание, тип диапазона замораживается.
- В месте, где allocator вызывает замораживание, назначенный подтип его типа замораживается. Если тип allocator является производным типом, то все типы предков также замораживаются.
- В месте замораживания вызываемого элемента, каждый подтип его профиля замораживается. Если вызываемый элемент является членом семейства записей, то подтип индекса семейства замораживается. В месте, где вызов функции вызывает замораживание, если параметр вызова имеет значение по умолчанию, default_expression для этого параметра вызывает замораживание.
- В месте, где подтип замораживается, его тип замораживается. В месте, где тип замораживается, любые выражения или имена внутри полного определения типа вызывают замораживание; первый подтип и любые подтипы компонентов, подтипы индексов и родительский подтип типа также замораживаются. Для конкретного помеченного типа соответствующий тип всего класса также замораживается. Для типа всего класса соответствующий конкретный тип также замораживается.
Правила законности
Явное объявление примитивного подпрограммы помеченного типа должно произойти до замораживания типа (см. 3.9.2).
Завершение объявления отложенной константы должно произойти до замораживания константы (см. 7.4).
Операционный или представленный элемент, который непосредственно указывает аспект элемента, должен появиться до замораживания элемента (см. 13.1).