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

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.
Если подтип компонента типа объединения без проверки подчиняется ограничению на объект, то подтип компонента должен быть подтипом объединения без проверки.
Любое имя, обозначающее дискриминант объекта типа объединения без проверки, должно встречаться в области объявления типа и не должно встречаться в record_representation_clause.
Тип компонента, объявленного в variant_part типа объединения без проверки, не должен требовать финализации. Помимо мест, где обычно применяются правила легальности (см. 12.3), это правило также применяется в приватной части экземпляра генерического блока. Для типа объединения без проверки, объявленного в теле генерического блока или в теле любого его дочернего библиотечного блока, ни одна часть типа компонента, объявленного в variant_part типа объединения без проверки, не должна быть формального приватного типа или формального расширения приватного типа, объявленного в формальной части генерического блока.
Завершение неполного или приватного объявления типа, имеющего known_discriminant_part, не должно быть типом объединения без проверки.
Подтип объединения без проверки должен передаваться только как фактический параметр генерика, если соответствующий формальный тип не имеет известных дискриминантов или является типом объединения без проверки.

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

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

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

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


Spec-Zone.ru

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