Spec-Zone.ru › Ada 2005
Руководство по Ada 2005

B.3.3 Директива Unchecked_Union

Директива Unchecked_Union определяет соответствие интерфейса между заданным дискриминированным типом и некоторым объединением C. Директива указывает, что связанный тип должен иметь представление, не оставляющее места для его дискриминанта(ов).

Синтаксис

Форма директивы Unchecked_Union следующая:
pragma Unchecked_Union (first_subtype_local_name);

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

Unchecked_Union — директива представления, задающая аспект объединения без проверки для представления.
first_subtype_local_name директивы pragma Unchecked_Union должна обозначать не ограниченный дискриминированный тип записи, имеющий variant_part.
Тип, к которому применяется директива Unchecked_Union, называется типом объединения без проверок. Подтип типа объединения без проверок определяется как подтип объединения без проверок. Объект типа объединения без проверок определяется как объект объединения без проверок.
Все подтипы компонентов типа объединения без проверок должны быть совместимы с C.
Если подтип компонента типа объединения без проверок подчиняется ограничению на объект, то подтип компонента должен быть подтипом объединения без проверок.
Любое имя, обозначающее дискриминант объекта типа объединения без проверок, должно встречаться в области объявления типа.
Компонент, объявленный в 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 типа объединения без проверок, если тип не имеет значений по умолчанию для дискриминантов.

Разрешения для реализации

Реализация может потребовать, чтобы pragma Controlled было указано для типа доступа подкомпонента типа объединения без проверок.
ПРИМЕЧАНИЯ
13 Использование объединения без проверок для получения эффекта неявного преобразования приводит к ошибочному выполнению (см. 11.5). Выполнение следующего примера ошибочно, даже если Float'Size = Integer'Size:
type T (Flag : Boolean := False) is
record
case Flag is
when False =>
F1 : Float := 0.0;
when True =>
F2 : Integer := 0;
end case;
end record;
pragma Unchecked_Union (T);
X : T;
Y : Integer := X.F2; -- ошибка





Spec-Zone.ru

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