Справочник по Ada 2012
6.3.1 Правила соответствия
Когда профили подпрограмм заданы более чем в одном месте, они должны соответствовать одному из четырёх способов: соответствию по типу, соответствию по режиму, соответствию по подтипу или полному соответствию.
Статические семантики
Как объясняется в B.1, «Аспекты интерфейса», для сущности может быть указана конвенция. Если в этом Международном стандарте не указано иное, по умолчанию конвенция сущности — Ada. Для вызываемой сущности или типа доступа к подпрограмме конвенция называется конвенцией вызова. Следующие конвенции определены языком:
- Конвенция вызова по умолчанию для любой подпрограммы, не указанной ниже, — Ada. Аспект Convention может быть указан для переопределения конвенции вызова по умолчанию (см. B.1).
- Конвенция вызова Intrinsic представляет подпрограммы, «встроенные» в компилятор. Конвенция вызова по умолчанию — Intrinsic для следующих случаев:
литерал перечисления;
оператор "/=", объявленный неявно из-за объявления "=" (см. 6.6);
любая другая неявно объявленная подпрограмма, если она не является операцией диспетчеризации помеченного типа;
наследованная подпрограмма формального помеченного типа с неизвестными дискриминантами;
атрибут, являющийся подпрограммой;
подпрограмма, объявленная непосредственно внутри protected_body;
любой префиксный вид подпрограммы (см. 4.1.3) без типа синхронизации (см. 9.5) By_Entry или By_Protected_Procedure.
Атрибут Access не разрешен для подпрограмм Intrinsic.
- Конвенция вызова по умолчанию — protected для защищенной подпрограммы, для префиксного вида подпрограммы с типом синхронизации By_Protected_Procedure и для типа доступа к подпрограмме со служебным словом protected в её определении.
- Конвенция вызова по умолчанию — entry для входа и для префиксного вида подпрограммы с типом синхронизации By_Entry.
- Конвенция вызова для анонимного параметра доступа к подпрограмме или анонимного результата доступа к подпрограмме — protected, если в её определении есть служебное слово protected; в противном случае — конвенция подпрограммы, содержащей параметр.
- Если не указано выше как Intrinsic, конвенция вызова для любой наследуемой или переопределяющей операции диспетчеризации помеченного типа — конвенция соответствующей подпрограммы родительского типа. Конвенция вызова по умолчанию для новой операции диспетчеризации помеченного типа — конвенция типа.
Из этих четырёх конвенций только Ada и Intrinsic разрешены в качестве convention_identifier в спецификации аспекта Convention.
Два профиля типологически согласованы, если они имеют одинаковое количество параметров, и оба имеют результат, если хотя бы один из них имеет, и соответствующие типы параметров и результатов одинаковы, или, для параметров доступа или результатов доступа, соответствующие типы назначения одинаковы, или соответствующие профили назначения типологически согласованы.
Два профиля режимно согласованы, если:
- они типологически согласованы; и
- соответствующие параметры имеют одинаковые режимы и оба или ни один из них не являются явно алиасовыми параметрами; и
- для соответствующих параметров доступа и любого типа результата доступа назначенные подтипы статически совпадают, и либо оба, либо ни один из них не являются типами доступа к константе, или назначенные профили согласованы по подтипу.
Два профиля подтипологически согласованы, если они режимно согласованы, соответствующие подтипы профиля статически совпадают, и связанные конвенции вызова одинаковы. Профиль формальной подпрограммы не подтипологически согласован ни с каким другим профилем.
Два профиля полностью согласованы, если они подтипологически согласованы, если у них есть результаты доступа к подпрограммам, назначенные профили которых полностью согласованы, и для соответствующих параметров:
- они имеют одинаковые имена; и
- оба или ни один из них не имеют null_exclusions; и
- ни один из них не имеет default_expressions, или у них оба есть default_expressions, которые полностью согласованы друг с другом; и
- для параметров доступа к подпрограммам назначенные профили полностью согласованы.
Два выражения полностью согласованы, если после замены каждого использования оператора на эквивалентный function_call:
- каждый составной конструкт одного соответствует экземпляру того же синтаксического класса в другом, за исключением того, что расширенное имя может соответствовать direct_name (или character_literal) или другому расширенному имени в другом; и
- соответствующие defining_identifiers, встречающиеся в двух выражениях, одинаковы; и
- каждое direct_name, character_literal и selector_name, которое не является частью prefix расширенного имени в одном, обозначает ту же декларацию, что и соответствующее direct_name, character_literal или selector_name в другом, или они обозначают соответствующие декларации, встречающиеся в двух выражениях; и
- каждый attribute_designator в одном совпадает с соответствующим attribute_designator в другом; и
- каждый primary, который является литералом в одном, имеет такое же значение, как соответствующий литерал в другом.
Два known_discriminant_parts полностью согласованы, если они имеют одинаковое количество дискриминантов, и дискриминанты в одних и тех же позициях имеют одинаковые имена, статически соответствующие подтипы и default_expressions, которые полностью согласованы друг с другом.
Два discrete_subtype_definitions полностью согласованы, если они оба subtype_indications или оба ranges, subtype_marks (если есть) обозначают один и тот же подтип, а соответствующие simple_expressions в ranges (если есть) полностью согласованы.
Профиль префиксного вида подпрограммы — профиль, полученный путём пропуска первого параметра этой подпрограммы. Для беспараметрической подпрограммы нет профиля префиксного вида. Для определения соответствия по подтипу и режиму конвенция профиля префиксного вида считается совпадающей с конвенцией входа или защищённой операции.
Разрешения реализации
Реализация может объявить оператор, объявленный в единице языка, встроенной библиотекой, как встроенный.