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

B.3.3 Типы объединений без проверок

Указание аспекта Unchecked_Union со значением True определяет соответствие интерфейса между заданным дискриминированным типом и некоторым объединением C. Аспект требует, чтобы связанному типу было задано представление, не выделяющее место для его дискриминантов.
Абзацы с 2 по 3 были перемещены в Приложение J, «Устаревшие особенности».

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

Для дискриминированного типа записи, имеющего variant_part, может быть указан следующий определяемый языком аспект представления:
Unchecked_Union

Тип аспекта Unchecked_Union — Boolean. Если он задан напрямую, то aspect_definition должен быть статическим выражением. Если он не задан (включая наследование), то аспект имеет значение False.

Правила допустимости

Абзацы 4 и 5 были удалены.
Тип, для которого аспект Unchecked_Union имеет значение True, называется типом объединения без проверок. Подтип типа объединения без проверок определяется как подтип объединения без проверок. Объект типа объединения без проверок определяется как объект объединения без проверок.
Все компоненты подтипа типа объединения без проверок должны быть совместимы с C.
Если подтип компонента типа объединения без проверок подчиняется ограничению на объект, то этот подтип компонента должен быть подтипом объединения без проверок.
Любое имя, обозначающее дискриминант объекта типа объединения без проверок, должно встречаться в области объявления типа или в качестве selector_name aggregate, и не должно встречаться в record_representation_clause.
Тип компонента, объявленного в variant_part типа объединения без проверок, не нуждается в финализации. Кроме мест, где обычно применяются правила допустимости (см. 12.3), это правило также применяется в частях private экземпляра генерируемого модуля. Для типа объединения без проверок, объявленного в теле генерируемого модуля или в теле любого из его дочерних библиотечных модулей, ни одна часть типа компонента, объявленного в variant_part типа объединения без проверок, не должна быть формального типа private или формального расширения private, объявленного в формальной части генерируемого модуля.
Завершение неполного или частного объявления типа, имеющего known_discriminant_part, не должно быть типом объединения без проверок.
Подтип объединения без проверок может быть передан только как фактический параметр генерируемого модуля, если соответствующий формальный тип не имеет известных дискриминантов или является типом объединения без проверок.

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

Тип объединения без проверок может использовать соглашение C.
Все объекты типа объединения без проверок имеют одинаковый размер.
Дискриминанты объектов типа объединения без проверок имеют размер ноль.
Любая проверка, требующая считывания дискриминанта объекта типа объединения без проверок, подавляется (см. 11.5). К таким проверкам относятся:
  • Проверка, выполняемая при адресации компонента варианта (то есть компонента, объявленного в части варианта) объекта типа объединения без проверок, что у объекта есть этот компонент (см. 4.1.3).
  • Любые проверки, связанные с преобразованием типа или подтипа значения типа объединения без проверок (см. 4.6). Это включает, например, проверку, связанную с неявным преобразованием подтипа оператора присваивания.
  • Проверка членства в подтипе, связанная с вычислением квалифицированного выражения (см. 4.7) или неинициализированного аллокатора (см. 4.8).

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

Вид объекта типа объединения без проверок (включая преобразование типа или вызов функции) имеет выводимые дискриминанты, если он имеет ограниченный номинальный подтип, за исключением случаев, когда объект является компонентом вложенного объекта типа объединения без проверок, который подчиняется ограничению на объект и вложенный объект не имеет выводимых дискриминантов.
Выражение типа объединения без проверок имеет выводимые дискриминанты, если это либо имя объекта с выводимыми дискриминантами, либо квалифицированное выражение, чьей subtype_mark обозначает ограниченный подтип.
Program_Error поднимается в следующих случаях:
  • Вычисление предопределённого оператора равенства для типа объединения без проверок, если ни один из операндов не имеет выводимых дискриминантов.
  • Вычисление предопределённого оператора равенства для типа, имеющего подкомпонент типа объединения без проверок, номинальный подтип которого не ограничен.
  • Вычисление индивидуальной проверки членства, если subtype_mark (если есть) обозначает ограниченный подтип объединения без проверок, и tested_simple_expression не имеет выводимых дискриминантов.
  • Преобразование из производного типа объединения без проверок в неограниченный не-тип-объединения-без-проверок, если операнд преобразования не имеет выводимых дискриминантов.
  • Выполнение реализации по умолчанию атрибута Write или Read типа объединения без проверок.
  • Выполнение реализации по умолчанию атрибута Output или Input типа объединения без проверок, если тип не имеет значений дискриминанта по умолчанию.
Абзац 29 был удалён.
ПРИМЕЧАНИЕ Использование типа объединения без проверок для получения эффекта неявного преобразования приводит к ошибочному выполнению (см. 11.5). Выполнение следующего примера является ошибочным, даже если Float'Size = Integer'Size:
тип T (Флаг : Булево := Ложь) есть
запись
выбор Флаг есть
когда Ложь =>
F1 : Вещественное := 0.0;
когда Истина =>
F2 : Целое := 0;
конец выбора;
конец записи
с Unchecked_Union;
X : T;
Y : Целое := X.F2; -- ошибка


Spec-Zone.ru

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