Справочник по Ada 95
6.3.1 Правила соответствия
Если профили подпрограмм указаны более чем в одном месте, они должны соответствовать одному из четырёх способов: соответствию по типу, соответствию по режиму, соответствию по подтипу или полному соответствию.
Статическая семантика
Как поясняется в B.1, «Прагмы взаимодействия», для сущности может быть указана конвенция. Если этот международный стандарт не указывает иного, по умолчанию конвенция сущности — Ada. Для вызываемой сущности или типа доступа к подпрограмме конвенция называется конвенцией вызова. Язык определяет следующие конвенции:
- По умолчанию конвенцией вызова для любой подпрограммы, не перечисленной ниже, является Ada. Прагма Convention, Import или Export может быть использована для переопределения конвенции вызова по умолчанию (см. B.1).
- Конвенция вызова Intrinsic представляет подпрограммы, которые «встроены» в компилятор. По умолчанию конвенция вызова Intrinsic применяется для следующего:
- литералы перечислений;
- оператор "/=", неявно объявленный из-за объявления "=" (см. 6.6);
- любая другая неявно объявленная подпрограмма, если это не операция диспетчеризации помеченного типа;
- унаследованная подпрограмма формального помеченного типа с неизвестными дискриминантами;
- атрибут, являющийся подпрограммой;
- подпрограмма, объявленная непосредственно внутри protected_body.
- Атрибут Access не разрешен для подпрограмм Intrinsic.
- Конвенция вызова по умолчанию — protected для защищенной подпрограммы и для типа доступа к подпрограмме со служебным словом protected в её определении.
- Конвенция вызова по умолчанию — entry для входа.
- Если выше не указано как Intrinsic, конвенция вызова для любой унаследованной или переопределяющей операции диспетчеризации помеченного типа — такая же, как у соответствующей подпрограммы родительского типа. По умолчанию конвенция вызова новой операции диспетчеризации помеченного типа — конвенция типа.
Из этих четырёх конвенций только Ada и Intrinsic разрешены в качестве convention_identifier в прагме Convention, Import или Export.
Два профиля соответствуют по типу, если они имеют одинаковое количество параметров, и оба имеют результат, если хотя бы один из них имеет, и соответствующие типы параметров и результата одинаковы, или, для параметров доступа, соответствующие назначенные типы одинаковы.
Два профиля соответствуют по режиму, если они соответствуют по типу, и соответствующие параметры имеют идентичные режимы, и, для параметров доступа, назначенные подтипы статически совпадают.
Два профиля соответствуют по подтипу, если они соответствуют по режиму, соответствующие подтипы профиля статически совпадают, и связанные конвенции вызова одинаковы. Профиль формальной подпрограммы обобщённого типа не соответствует по подтипу никакому другому профилю.
Два профиля полностью соответствуют, если они соответствуют по подтипу, и соответствующие параметры имеют одинаковые имена и имеют default_expressionы, которые полностью соответствуют друг другу.
Два выражения полностью соответствуют, если после замены каждого использования оператора эквивалентным вызовом function_call:
- каждый составной конструкт одного соответствует экземпляру той же синтаксической категории в другом, за исключением того, что расширенное имя может соответствовать direct_name (или character_literal) или другому расширенному имени в другом; и
- каждое direct_name, character_literal и selector_name, которые не являются частью prefix расширенного имени в одном, обозначают ту же декларацию, что и соответствующее direct_name, character_literal или selector_name в другом; и
- каждый attribute_designator в одном должен быть таким же, как соответствующий attribute_designator в другом; и
- каждая primary, которая является литералом в одном, имеет такое же значение, как соответствующий литерал в другом.
Два known_discriminant_partа полностью соответствуют, если они имеют одинаковое количество дискриминант, и дискриминанты в одинаковых позициях имеют одинаковые имена, статически совпадающие подтипы и default_expressionы, которые полностью соответствуют друг другу.
Два discrete_subtype_definitionа полностью соответствуют, если оба являются subtype_indicationами или оба являются rangeами, subtype_markами (если таковые имеются) обозначают тот же подтип, и соответствующие simple_expressionы rangeов (если таковые имеются) полностью соответствуют.
Разрешения для реализации
Реализация может объявить оператор, объявленный в библиотечном модуле, определённом языком, как intrinsic.