Spec-Zone.ru › Ada 2022
Руководство по языку Ada (Ada 2022)

13.14 Правила заморозки

Этот подпункт определяет место в тексте программы, где каждая объявленная сущность становится «замороженной». Использование сущности, например, ссылка на неё по имени или (для типа) выражение типа, вызывает заморозку сущности в некоторых контекстах, как описано ниже. Правила законности запрещают определённые виды использования сущности в области текста, где она заморожена.
Заморозка сущности происходит в одном или нескольких местах (точки заморозки) в тексте программы, где представление сущности должно быть полностью определено. Каждая сущность замораживается от своей первой точки заморозки до конца текста программы (с учётом порядка компиляционных единиц, определённого в 10.1.4).
Этот подпункт также определяет место в тексте программы, где профиль каждой объявленной вызываемой сущности становится замороженным. Использование вызываемой сущности вызывает заморозку её профиля в некоторых контекстах, как описано ниже. В месте, где профиль вызываемой сущности становится замороженным, сама сущность также замораживается.
Конец declarative_part, protected_body или объявление библиотечного пакета или библиотечного обобщённого пакета вызывает заморозку каждой сущности и профиля, объявленного внутри него, а также самой сущности в случае объявления библиотечной единицы. Неинстанцированный proper_body, body_stub или entry_body вызывает заморозку каждой сущности и профиля, объявленных до него в той же declarative_part.
Конструкт, который (явно или неявно) ссылается на сущность, может вызвать заморозку сущности, как определено в последующих параграфах. В месте, где конструкт вызывает заморозку, каждая имя, выражение, явный_ссылка или диапазон в рамках конструкта вызывает заморозку:
  • Возникновение generic_instantiation вызывает заморозку, за исключением имя которая является фактическим параметром обобщения, соответствующий обобщенный формальный параметр является формальным неполным типом (см. 12.5.1). Кроме того, если параметр инстанциации имеет значение по умолчанию, default_expression или default_name этого параметра вызывает заморозку.
  • При возникновении expression_function_declaration в качестве завершения, возвращаемое выражение функции-выражения вызывает заморозку.
  • При возникновении переименования-как-тела, чьё callable_entity_имя обозначает функцию-выражение, возвращаемое выражение функции-выражения вызывает заморозку.
  • Возникновение object_declaration, у которого нет соответствующего завершения, вызывает заморозку.
  • Объявление расширения записи вызывает заморозку родительского подтипа.
  • Объявление расширения записи, интерфейсного типа, задачи или защищенного типа вызывает заморозку любых родительских типов, указанных в объявлении.
  • В момент заморозки сущности, связанной с aspect_specification, все статические выражения внутри aspect_specification вызывают заморозку, как и выражение или имя в aspect_definition для аспектов представления или операционных аспектов, имеющих соответствующее операционное свойство. Аналогично, если aspect_definition для операционного аспекта, отличного от аспекта утверждения, может повлиять на разрешение имён, статическую семантику или правила законности последующего конструкта, то все выражение или имя внутри aspect_definition вызывают заморозку в точке заморозки связанной сущности. Все статические выражения внутри aspect_specification также вызывают заморозку в конце непосредственно окружающего списка объявлений. В целях этого правила, если нет объявленной сущности, связанной с aspect_specification, точка заморозки считается происходящей сразу после aspect_specification.
Статическое выражение (кроме выражения в aspect_specification) вызывает заморозку в момент своего возникновения. Имя объекта или нестатическое выражение вызывают заморозку в момент своего возникновения, если имя или выражение не являются частью default_expression, default_name, возвращаемого выражения функции-выражения, aspect_specification или выражения компонента constraint, в этом случае заморозка происходит позже, как часть другого конструкта или в момент заморозки связанной сущности.
Неявный вызов замораживает те же сущности и профили, что и явный вызов. Это верно, даже если неявный вызов удалён посредством разрешений реализации.
Если выражение неявно преобразуется к типу или подтипу T, то в месте, где выражение вызывает заморозку, T также замораживается.
Следующие правила определяют, какие сущности замораживаются в месте, где конструкт вызывает заморозку:
  • В месте, где выражение вызывает заморозку, тип выражения замораживается, за исключением случаев, когда выражение является литералом перечисления, используемым в качестве discrete_choice array_aggregate enumeration_representation_clause или как aspect_definition спецификации для аспекта Default_Value.
  • В месте вызова функции происходит заморозка профиля функции. Кроме того, если параметр вызова имеет значение по умолчанию, то default_expression этого параметра вызывает заморозку. Если вызов функции выполняется для функции-выражения, то возвращаемое выражение функции-выражения вызывает заморозку.
  • В месте generic_instantiation, вызывающего заморозку вызываемой сущности, профиль этой сущности замораживается, за исключением случаев, когда формальная подпрограмма, соответствующая вызываемой сущности, имеет параметр или результат формального немаркированного неполного типа; если вызываемая сущность является функцией-выражением, то возвращаемое выражение функции-выражения вызывает заморозку.
  • В месте использования атрибута Access или Unchecked_Access, чьё prefix обозначает функцию-выражение, вызывается заморозка возвращаемого выражения функции-выражения.
  • В месте, где имя вызывает заморозку, сущность, обозначаемая имя, замораживается, если имя не является prefix расширенного имени; в месте, где имя объекта вызывает заморозку, номинальный подтип, связанный с имя, замораживается.
  • В месте, где явный_ссылка вызывает заморозку, номинальный подтип, связанный с явный_ссылка, замораживается.
  • В месте, где диапазон вызывает заморозку, тип диапазон замораживается.
  • В месте, где allocator вызывает заморозку, обозначенный подтип его типа замораживается. Если тип allocator является производным типом, то все родительские типы также замораживаются.
  • В месте заморозки профиля замораживаются все подтипы профиля. Если соответствующая вызываемая сущность является членом семейства входов, то подтип индекса семейства замораживается.
END_OF_DOCUMENT_MARKER
  • В месте, где подтип замораживается, замораживается и его тип. В месте, где замораживается тип, любые выражения или имена в полном определении типа вызывают замораживание, за исключением тех, которые встречаются в определении_типа_доступа или определении_доступа; также замораживаются первый подтип и любые подтипы компонентов, индексные подтипы и родительский подтип типа. Для конкретного помеченного типа также замораживается соответствующий тип класса. Для типа класса также замораживается соответствующий конкретный тип.
  • В месте, где замораживается конкретный помеченный тип, замораживаются примитивные подпрограммы типа. В месте, где замораживается тип, замораживаются любые подпрограммы, указанные в определении_клаузы_атрибута для типа.
  • В месте, где конструкция вызывает замораживание, если конструкция включает проверку, связанную с некоторым аспектом утверждения (независимо от того, включена ли проверка), или зависит от определения некоторого операционного аспекта как части своей динамической семантики, любые имена или выражения в определении_аспекта для аспекта вызывают замораживание.
Несмотря на остальную часть этого подраздела, замораживание неполного представления не оказывает никакого влияния.

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

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

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

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


Spec-Zone.ru

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