8.7. КОНТЕКСТ РАЗРЕШЕНИЯ СОВМЕЩЕНИЯ

Совмещение определено для программ, литералов перечисления, символов операций и одиночных входов, а также для тех операций, которые присущи обычным базовым операциям, например присваивание, проверка принадлежности, генератор, литерал null, агрегаты и строковые литералы.

Для совмещенных понятий разрешение совмещения определяет фактический смысл, который имеет вхождение идентификатора, когда в соответствии с правилами видимости выясняется, что в месте этого вхождения приемлема более чем одна трактовка идентификатора;аналогичным образом разрешение совмещения определяет фактическую трактовку вхождения операции или некоторой базовой операции.

В таком месте рассматриваются все видимые описания. Вхождение правильно только тогда, когда есть точно одна интерпретация самого вложенного полного контекста. Полный контекст — это описание, оператор, спецификатор представления.

При рассмотрении возможных интерпретаций полного контекста учитываются только те правила, которые касаются синтаксиса, области действия и видимости, а также те, которые даны ниже. Учитываются:

а) любое правило, которое требует, чтобы имя или выражение имели определенный тип или такой же тип, как другое имя или выражение;

б) любое правило, которое требует, чтобы тип имени или выражения был типом определенного класса; аналогично любое правило, которое требует, чтобы определенный тип был дискретным, целым, вещественным, универсальным, символьным, логическим или нелимитируемым типом;

в) любое правило, которое требует, чтобы префикс соответствовал определенному типу;

г) любое правило, которое задает определенный тип в качестве типа результата базовой операции, и любое правило, которое устанавливает, что это тип определенного класса;

д) правила, которые требуют, чтобы тип агрегата или строкового литерала был определен исключительно охватывающим полным контекстом (см. 4.3 и 4.2). Аналогично правила, которые требуют, чтобы тип префикса атрибута, тип выражения оператора выбора или тип операнда преобразования типа были определены независимо от контекста (см. 4.1.4, 4.6, 5.4 и 6.4.1);

е) правила, данные в разд. 6.6 по разрешению вызовов совмещенных подпрограмм, в разд. 4.6 по неявным преобразованиям универсальных выражений, в разд. 3.6.1 по интерпретации дискретных диапазонов с границами, имеющими универсальный тип, в разд. 4.1.3 по интерпретации расширенного имени, чей префикс обозначает подпрограмму или оператор принятия.

Имена подпрограмм, используемые в качестве аргументов прагмы, следуют другому правилу: прагма может применяться для нескольких совмещенных подпрограмм, как пояснено в разд. 6.3.2 для прагмы INLINE, в разд. 11.7 для прагмы SUPPRESS и в разд. 13.9 для прагмы INTERFACE.

Подобно данные в спецификаторах контекста (см. 10.1.1) и спецификаторах адреса простые имена следуют другим правилам.

Примечание. Если существует только одна возможная интерпретация, то идентификатор обозначает соответствующее понятие. Однако данное утверждение не означает, что это вхождение обязательно правильно, так как существуют другие требования, которые не учитываются при разрешении совмещения: например, являетсятти выражение статическим, каковы виды параметров, является ли объект константой, выполняются ли правила согласования, является ли вхождение в спецификатор представления предписывающим, каков порядок предвыполне-ния и т. п.

Аналогично при разрешении совмещения не учитываются подтипы. (Нарушение ограничения не делает программу неправильной, но возбуждает исключение во время выполнения программы.)

Спецификация параметра цикла есть описание и, следовательно, полный контекст.

Правила, которые требуют, чтобы определенные конструкции имели один и тот же профиль параметров и типа результата, подпадают под категорию а); то же справедливо для правил, которые требуют согласования двух конструкций, так как это согласование требует в свою очередь, чтобы соответствующие имена имели одинаковый смысл, определенный правилами видимости и совмещения.

Ссылки: агрегат 4.3, базовая операция 3.3, вход 9.5, выражение 4.4, генератор 4.8, идентификатор 2.3, имя 4.1, исключение 11, класс типа 3.3, литерал 4.2, литерал перечисления 3.5.1, литерал null 3.8, оператор 5, оператор выбора 5.4, операция 4.5, операция типа 3.3.3, описание 3.1, подпрограмма 6, подтип 3.3, правильный 1.6, прагма 2.8, преобразование типа 4.6, присваивание 5.2, проверка принадлежности 4.5.2, раздел формальных параметров G.1, совмещение6.6, спецификатор представления 13.1, спецификация параметра цикла 5.5, статическое выражение 4.9, статический подтип 4.9.

Правила формы (а): выбор 3.7.3, 4.3.2, 5.4, выражение по умолчанию 3.7, 3.7.1, 6.1, 12.1.1, выражение результата 5.8, дискретный диапазон 3.6.1, 5.5, 9.5, индексное выражение 4.1.1, 4.1.2, 9.5, квалифицированное выражение 4.7, начальное значение 3.2.1, ограничение диапазона 3.5, ограничение дискриминанта 3.7.2, ограничение индекса 3.6.1, оператор задержки 9.6, переименование объекта 8.5, правила согласования 9.5, присваивание 5.2, проверка принадлежности 4.5.2, профиль параметров и типа результата 8.5, 12.3.6, сопоставление компонент 4.3.1, 4.3.2, сопоставление параметров настройки 12.3, сопоставление параметров 6.4.1, спецификатор адреса 13.5, спецификатор представления перечислимых 13.3.

Правила формы (б): атрибут VAL 3.5.5, выражение выбора 6.4, дискретный диапазон 3.6.1, 5.5, 9.5, именуемая компонента 4.1.3, оператор прекращения 9.10, описание плавающего типа 3.5.7, описание фиксированного типа 3.5.9, описание целого типа 3.5.4, описание числа 3.2.2, присваивание 5.2, проверка принадлежности 4.4, спецификатор длины 13.2, спецификатор представления записи 13.4, условие 5.3, 5.5, 5.7, 9.7.1, форма управления промежуточной проверкой 4.4.

Правила формы (в): именуемая компонента 4.1.3, индексируемая компонента 4.1.1, отрезок 4.1.2.

Правила формы (г): агрегат 4.3, генератор 4.8, литерал null 4.2, проверка принадлежности 4.4, строковый литерал 4.2, форма управления с промежуточной проверкой 4.4, числовой литерал 2.4.