Ada_Ru форум

Обсуждение языка Ада

[ada_ru] Вопрос generics + use type

Оставить новое сообщение

Сообщения

Васил Дядов
[ada_ru] Вопрос generics + use type
2020-01-12 15:36:23

Столкнулся с такой ситуацией (GNAT 2019): не работает use type внутри определения функции.

 

стандарт Ada2012

 

Пример:

 

 

test.ads:

package Test is

generic

type T is private;

C : T;

with function "+" (L : T; R: T) return T;

package S is end;

generic

with package S_Inst is new S (<>);

package P is

function F (V : S_Inst.T) return S_Inst.T;

end P;

end Test;

 

test.adb:

package body Test is

package body P is

use type S_Inst.T; -- <- вот так работает

 

function F (V: S_Inst.T) return S_Inst.T is

-- use type S_Inst.T; -- <- a тут не работает, компилятор пишет: there is no applicable operator "+" for private type "T"

begin

return V + S_Inst.C;

end F;

end P;

 

end Test;

 

Может кто-нибудь подсказать, это я в чём-то не прав, или это компилятор глючит? Вроде бы всё по-стандарту, должно и так и так работать.

Предложение

generic

with package S_Inst is new S (<>);

-- означает, что S_Inst наследует всю дескриминантную часть пакета S. И это означает, что предложение

use type S_Inst.T; -- <- вот так работает

в теле пакета P определяет, все ещё, формальный параметр generic-пакета P; Это же предложение в теле функции понимается как некое определение фактического типа, и для него должна быть определена перегруженная функция "+"!

Так что компилятор работает правильно.

Советую избегать таких сложных вложенных generic-пакетов.

С уважением и наилучшими пожеланиями,

Сергей Дюков,

Волжский.

Это же предложение в теле функции понимается как некое определение фактического типа, и для него должна быть определена перегруженная функция "+"!

 

Был бы очень признателен за ссылку на пункты стандарта. Видимо, я недопонимаю некоторые тонкости.

Предложение

use type S_Inst.T;

определяет тип " S_Inst.T " и должно появляться до использования это типа в программе, а функция " F " использует этот тип. Вот в чём была ошибка -- нарушение последовательности определения типов. Если нет определения типа " S_Inst.T " до определения тела функции "F" -- будет выдаваться ошибка, независимо от того есть ли в теле функции предложение "use" или нет.

С уважением и наилучшими пожеланиями,

Сергей Дюков,

Волжский.

Проблема в том, что если использовать просто 'use S_inst', то для компилятора нет разницы в том, на уровне пакета это или на уровне определения функции. То есть и там и там видимость получается одинаковая и всё работает одинаково. А вот в use type разница есть, хотя вроде бы не должно её быть.

 

ARM2012 8.4 внимательно смотрел, никаких сносок ничего не нашёл по этому поводу.

On 1/12/20 6:36 PM, Васил Дядов ada_ru@forge.ada-ru.org [ada_ru] wrote:

Столкнулся с такой ситуацией (GNAT 2019): не работает use type внутри определения функции.

 

Может кто-нибудь подсказать, это я в чём-то не прав, или это компилятор глючит? Вроде бы всё по-стандарту, должно и так и так работать.

 

Больше похоже на ошибку в компиляторе, имеет смысл пожаловаться в AdaCore.

Нас всех смутил тот факт, что спецификация generc-пакета допускает недоопределеные типы, а реализация (body package) нет. А так получилась обычная ошибка видимости типов. В присланных на ТЕГРАММ файлах test1.ads и test1.adb формальная функция "+" определена в спецификации пакета P, но здесь она не имеет никакого отношения к формальной функции определённой в пакете S, но здесь и нет необходимости в предложении "use", так как тип S_Inst.T оказался полностью определен. В любом случае использование предложения "use type" в теле функции F не имеет смысла. Попробуйте удалить предложение "use" и в теле пакета P и в теле функции F (файл test.adb). И увидите туже ошибку, то есть компилятор ругается не на инструкцию "use", а на заголовок функции F.

С уважением и наилучшими пожеланиями,

Сергей Дюков,

Волжский.

Новое сообщение:
Страницы: 1

Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти