Здравствуйте!
Возник вопрос, связанный с pragma Remote_Types
Есть две спецификации:
--------------
-- unit.ads --
--------------
generic
package Unit is
pragma Remote_Types;
type Item is tagged limited private;
type Item_Class is access all Item'Class;
private
type Item is tagged limited null record;
end Unit;
--------------------
-- unit-child.ads --
--------------------
generic
package Unit.Child is
pragma Remote_Types;
type New_Item is new Item with private;
type New_Item_Access is access all New_Item'Class;
private
type New_Item is new Item with null record;
end Unit.Child;
Первый компилируется без вопросов, а вот второй ругается:
gcc -c unit-child.ads
unit-child.ads:5:09: non-remote access type without user-defined Read and Write
attributes
Данная "фича" проявляется только с настраиваемыми пакетами. Я использовал GNAT-3.15p, честно скачанный с cs.nyu.edu.
Копание в RM результатов не дало. Что не так в этих спецификациях? Заранее благодарен за помощь.
--
С уважением,
Юрий Королев
Sergey I. Rybin wrote:
"Sergey I. Rybin" wrote:
Данная "фича" проявляется только с настраиваемыми пакетами. Я использовал
GNAT-3.15p, честно скачанный с cs.nyu.edu.
Копание в RM результатов не дало. Что не так в этих спецификациях?
Заранее благодарен за помощь.
Да, вот еще - в распоследнем компиляторе (со вчерашних исходников) - все то же
самое. Я в этом (remote types) ни фига не понимаю, но если есть переходящее в
уверенность подозрение, что компилятор не прав - надо слать баг репорт!
Стойте! Стойте! Компилятор может быть прав!
Пришли ещё и как ты этот generic настраиваешь. Чем подпробнее, тем лучше. (Можешь лично мне, если там тайны имеются :).
PS. Сейчас убегаю, по вечером (после 22 MSK) обещаю разобраться.
Данная "фича" проявляется только с настраиваемыми пакетами. Я использовал GNAT-3.15p, честно скачанный с cs.nyu.edu.
Копание в RM результатов не дало. Что не так в этих спецификациях? Заранее благодарен за помощь.
Я разве что могу ткнуть в то место в RM, которое проверяется
(вычислено по компиляторским исходникам):
E.2.2(8):
if the full view of a type declared in the visible part of the library unit has a part that is of a non-remote access type, then that access type, or the type of some part that includes the access type
subcomponent, shall have user-specified Read and Write attributes.
"Sergey I. Rybin" wrote:
Данная "фича" проявляется только с настраиваемыми пакетами. Я использовал GNAT-3.15p, честно скачанный с cs.nyu.edu.
Копание в RM результатов не дало. Что не так в этих спецификациях? Заранее благодарен за помощь.
Да, вот еще - в распоследнем компиляторе (со вчерашних исходников) - все то же самое. Я в этом (remote types) ни фига не понимаю, но если есть переходящее в уверенность подозрение, что компилятор не прав - надо слать баг репорт!
Стойте! Стойте! Компилятор может быть прав!
Да запросто!
Пришли ещё и как ты этот generic настраиваешь. Чем подпробнее, тем лучше. (Можешь лично мне, если там тайны имеются :).
Диагностика выдается без всякой настройки! То есть - при компиляции самого generic-а.
Самих сырцов у меня с собой нет, но если понадобится - завтра принесу. А пока наковырял что-то на подобие куска, на котором я споткнулся.
--------------
-- unit.ads --
--------------
generic
type Something is private;
Default : Something;
package Unit is
pragma Remote_Types;
type Item is tagged limited private;
type Item_Class is access all Item'Class;
private
type Item is tagged limited null record;
end Unit;
--------------------
-- unit-child.ads --
--------------------
generic
package Unit.Child is
pragma Remote_Types;
type New_Item is new Item with private;
function Get (Self : access New_Item) return Something;
type New_Item_Class is access all New_Item'Class;
private
type New_Item is new Item with
record
Field : Something := Default;
end record;
end Unit.Child;
--------------------
-- unit-child.adb --
--------------------
package body Unit.Child is
function Get (Self : access New_Item) return Something is
begin
return Self.Field;
end Get;
end Unit.Child;
------------------
-- instance.adb --
------------------
with Unit, Unit.Child;
with Ada.Text_IO;
use Ada.Text_IO;
procedure Instance is
package Int_Unit is new Unit (Integer, 256);
package Int_Child is new Int_Unit.Child;
type New_Item_Access is access all Int_Child.New_Item;
var : New_Item_Access := new Int_Child.New_Item;
x : Integer;
begin
x := Int_Child.Get (var);
Put_Line (x'Img);
end Instance;
Симптомы те же. Да, и еще интересный момент: если в unit-child.ads type New_Item is new Item with private;
заменить на
type New_Item is tagged limited private;
все становится нормально, то же самое происходит при удалении pragma Remote_Types.
--
С уважением,
Юрий Королев
----- Original Message -----
From: "Vadim Godunko" <vgodunko@...>
To: <ada_ru@yahoogroups.com>
Sent: Monday, March 31, 2003 1:26 PM
Subject: Re: [ada_ru] опять Remote_Types
Sergey I. Rybin wrote:
"Sergey I. Rybin" wrote:
>Данная "фича" проявляется только с настраиваемыми пакетами. Я
использовал
>GNAT-3.15p, честно скачанный с cs.nyu.edu.
>Копание в RM результатов не дало. Что не так в этих спецификациях? >Заранее благодарен за помощь.
Да, вот еще - в распоследнем компиляторе (со вчерашних исходников) - все
то же
самое. Я в этом (remote types) ни фига не понимаю, но если есть
переходящее в
Yury Korolyov wrote:
Симптомы те же. Да, и еще интересный момент: если в unit-child.ads
type New_Item is new Item with private;
заменить на
type New_Item is tagged limited private;
все становится нормально, то же самое происходит при удалении pragma
Remote_Types.
Последнее не удивительно - удалив Remote_Types, пакет становится uncategorized - т.е. допускает использование любых конструкций языка.
Теперь далее. Прошу господина Рыбина меня подправить, если что (поскольку я, напротив, только в remote что-то и смыслю :(.
Рассматриваем исходный вариант.
Item_Class есть general access class-wide limited private type. Всё соответствует E 2.2 (8).
New_Item_Class есть general access class-wide private type extension (можно добавить limited). А это не general access class-wide limited private type. :(
Компилятор прав!
Но он не прав! В RM95/TC1 и этот случай считается разрашенным. Так-что bug-report писать можно, но с соответствующей ссылкой RM 95/TC1 E2.2 (9.2/2):
- a general access type that designates a class-wide limited private type or a class-wide private type extension all of whose ancestors are
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ether private type extensions or limited private types.
^^^^^^^^^^^^^^^^^^^^
Хотя, по моему, здесь навертели так, что сАвсем непонятно стало.
-- Vadim Godunko
Здравствуйте,
Спасибо за ваши ответы.
Возникло еще три доп. вопроса:
1. Можно ли эту ситуацию красиво обойти (на примере который я высылал)? 2. Как правильно составить багрепорт в ACT, где про это почитать, есть ли что-то типа формы?
3. И вопрос к господину Рыбину: я так понимаю, что мне, как неподписанному на поддержку пользователю, патчи не получить никак?
--
С уважением,
Юрий Королев
----- Original Message -----
From: "Vadim Godunko" <vgodunko@...>
To: <ada_ru@yahoogroups.com>
Sent: Monday, March 31, 2003 9:21 PM
Subject: Re: [ada_ru] опять Remote_Types
2. Как правильно составить багрепорт в ACT, где про это почитать, есть ли что-то типа формы?
Да нет никакой формы - присто письмо на report@....
Хотя нет, чтобы оно на автопилоте не было отфутболено, надо что-то в Subject line указать...
Вадим, как правильно для public version это оформить? Это точно должно быть в документации, причем на уровне README!
3. И вопрос к господину Рыбину: я так понимаю, что мне, как неподписанному на поддержку пользователю, патчи не получить никак?
При существующей процедуре - никак до появления следующей public version
Sergey I. Rybin wrote:
2. Как правильно составить багрепорт в ACT, где про это почитать, есть ли
что-то типа формы?
Да нет никакой формы - присто письмо на report@....
Хотя нет, чтобы оно на автопилоте не было отфутболено, надо что-то в Subject
line указать...
Вадим, как правильно для public version это оформить? Это точно должно
быть в документации, причем на уровне README!
Ага, только этот README как исчез в 3.13p, так больше и не появлялся :(
Значится так. В поле Subject надобно написать "GNAT" и дополнить кратким описанием проблемы.
Текст сообщения произвольный, но ясно, что здесь стоит описать суть проблемы. Если проблема связана с RTL (или есть на то подозрения) - указать на какой паре CPU/OS возникли сложности. Если дистрибутив компилятора не "фирменный" - непременно это указать.
Если необходимо передать исходники, то они собираются в один файл (я обычно называю его sources.ada), но так, что-бы потом можно было gnatchop-ом расчопить. Для Linux-а всё элементарно:
cat <имена файлов> > sources.ada
Сжимать исходники нельзя. Но если их действительно много (у меня как-то было около 3.5М), то можно, но лучше чем нибудь распространенным, например gzip. При этом имеет смысл извиниться за вызванные неудобства.
Если есть bug-box - цеплять отдельным файлом.
Вот собственно и всё.
Пишешь, цепляешь, отправляешь. Сразу проверяешь почту - ответ от робота приходит моментально. Если всё нормально - получишь заявление, что отчет проверят, и страницу лекции "о вреде коммерческой поддержки" :) Если не примут - так и будет сказано, причины будут указаны.
Yury Korolyov wrote:
Возникло еще три доп. вопроса:
1. Можно ли эту ситуацию красиво обойти (на примере который я высылал)?
Похоже нельзя. Наследование в RT позволяется, но вот создание ссылочных типов на всё, кроме "корневых" в иерархии типов, запрещается. Как это ни странно.
Придётся пихать ACT или самостоятельно править компилятор.
-- Vadim Godunko
Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти