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

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.
  • В месте, где имя вызывает заморозку, сущность, обозначаемая именем, замораживается, если имя не является префиксом расширенного имени; в месте, где имя объекта вызывает заморозку, номинальный подтип, связанный с именем, замораживается.
  • В месте, где implicit_dereference вызывает заморозку, номинальный подтип, связанный с implicit_dereference, замораживается.
  • В месте, где диапазон вызывает заморозку, тип диапазона замораживается.
  • В месте, где allocator вызывает заморозку, указанный подтип его типа замораживается. Если тип allocator является производным типом, то все предковые типы также замораживаются.
  • В месте заморозки вызываемой сущности каждый подтип её профиля замораживается. Если вызываемая сущность является членом семейства записей, то подтип индекса семейства замораживается. В месте заморозки вызова функции, если параметр вызова имеет значение по умолчанию, default_expression для этого параметра вызывает заморозку.
  • В месте заморозки подтипа его тип замораживается. В месте заморозки типа, любые выражения или имена внутри полного определения типа вызывают заморозку; первый подтип и любые компоненты подтипы, подтипы индексов и родительский подтип типа также замораживаются. Для конкретного помеченного типа соответствующий тип класса также замораживается. Для типа класса соответствующий конкретный тип замораживается.
  • В месте заморозки конкретного помеченного типа замораживаются примитивные подпрограммы типа.

Правила законности

Явное объявление примитивной подпрограммы помеченного типа должно выполняться до заморозки типа (см. 3.9.2).
Тип должен быть полностью определён перед заморозкой (см. 3.11.1 и 7.3).
Завершение объявления отложенной константы должно выполняться перед заморозкой константы (см. 7.4).
Операционный или представленный элемент, непосредственно задающий аспект сущности, должен появиться до заморозки сущности (см. 13.1).

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

Тег (см. 3.9) помеченного типа T создаётся в момент заморозки T.


Spec-Zone.ru

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