Ada_Ru форум

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

опять Remote_Types

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

Сообщения

Yury Korolyov
опять Remote_Types
2003-03-31 10:47:49

Здравствуйте!

 

Возник вопрос, связанный с 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

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

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