From: AdaMagica <christ-usch.grein@t-online.de>
Subject: Re: Ada Annoyances
Date: Tue, 27 Jun 2017 08:19:40 -0700 (PDT)
Date: 2017-06-27T08:19:40-07:00 [thread overview]
Message-ID: <0f43638d-8954-4db2-94a3-b6615754da34@googlegroups.com> (raw)
In-Reply-To: <71c4fdcd-4213-4b84-b852-c8674cfaf717@googlegroups.com>
Am Montag, 26. Juni 2017 22:35:34 UTC+2 schrieb Maciej Sobczak:
> The complete example (analogous to the C++ example I have written in the other post) is:
>
> with Ada.Text_IO;
> with Ada.Finalization;
>
> procedure Test is
>
> package P is
> type Base is new Ada.Finalization.Limited_Controlled with null record;
>
> procedure Initialize (Obj : in out Base);
> procedure VFoo (Obj : in Base);
>
> type Derived is new Base with null record;
>
> procedure Initialize (Obj : in out Derived);
> procedure VFoo (Obj : in Derived);
>
> procedure Use_Object (Obj : in Base'Class);
> end P;
> ...
>
> When executed, we get:
>
> test with Base
> call from Base's Initialize
> Hello from Base
> test with Derived
> call from Base's Initialize
> Hello from Derived <<<<<<< here are dragons!
> call from Derived's Initialize
> Hello from Derived
Yes, this *is* a problem. The reason are the initialize *procedures* and the view conversion.
The following uses *functions* instead (which behave more like C++'s constructors). This program works correctly just like the C++ version.
(It seems that there is a bug in Gnat here. See comments in the code.)
package Maciej is
type Base is tagged record
I: Integer; -- Gnat bug? Need this lest call of Base'(Create) will be optimized away
end record;
function Create return Base;
procedure Foo (X: Base);
type Derived is new Base with null record;
function Create return Derived;
procedure Foo (X: Derived);
procedure Use_Object (X: Base'Class);
end Maciej;
-----------
with Ada.Text_IO;
package body Maciej is
-- Ada hasn't constructors comparable with those of C++.
function Create return Base is
B: Base := (I => 19); -- Here, the C++ constructor would be called.
begin
Ada.Text_IO.Put_Line (" Calling Use_Object from Base constructor:");
Use_Object (B);
return B;
end Create;
procedure Foo (X: Base) is
begin
Ada.Text_IO.Put_Line (" Hello from Base object!");
end Foo;
function Create return Derived is
D: Derived := (Base'(Create) with null record);
begin
Ada.Text_IO.Put_Line (" Calling Use_Object from Derived constructor:");
Use_Object (D);
return D;
end Create;
procedure Foo (X: Derived) is
begin
Ada.Text_IO.Put_Line (" Hello from Derived object!");
end Foo;
procedure Use_Object (X: Base'Class) is
begin
X.Foo;
end Use_Object;
end Maciej;
-----------
with Ada.Text_IO;
with Maciej;
procedure Maciej_Main is
begin
Ada.Text_IO.Put_Line ("Test with Base object:");
declare
B: Maciej.Base := Maciej.Create;
begin
null;
end;
Ada.Text_IO.New_Line;
Ada.Text_IO.Put_Line ("Test with Derived object:");
declare
D: Maciej.Derived := Maciej.Create;
begin
null;
end;
Ada.Text_IO.New_Line;
Ada.Text_IO.Put_Line ("Same again with procedures:");
declare
B: Maciej.Base;
begin
B.Create;
end;
declare
D: Maciej.Derived;
begin
D.Create;
end;
end Maciej_Main;
Test with Base object:
Calling Use_Object from Base constructor:
Hello from Base object!
Test with Derived object:
Calling Use_Object from Base constructor:
Hello from Base object!
Calling Use_Object from Derived constructor:
Hello from Derived object!
next prev parent reply other threads:[~2017-06-27 15:19 UTC|newest]
Thread overview: 116+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-21 1:12 Ada Annoyances pythoner6
2017-06-21 10:13 ` Lucretia
2017-06-23 15:27 ` raph.amiard
2017-06-23 17:49 ` Randy Brukardt
2017-06-23 19:21 ` Niklas Holsti
2017-06-24 4:02 ` Shark8
2017-06-24 19:55 ` Simon Wright
2017-06-24 20:56 ` Niklas Holsti
2017-06-25 23:43 ` Randy Brukardt
2017-06-26 20:20 ` Niklas Holsti
2017-06-26 21:47 ` Randy Brukardt
2017-06-26 22:23 ` Dmitry A. Kazakov
2017-06-29 19:00 ` Niklas Holsti
2017-06-29 21:29 ` Robert A Duff
2017-06-30 0:50 ` Randy Brukardt
2017-07-03 20:39 ` Robert A Duff
2017-07-04 19:52 ` Niklas Holsti
2017-07-04 19:32 ` Niklas Holsti
2017-06-30 0:47 ` Randy Brukardt
2017-06-30 18:45 ` Niklas Holsti
2017-06-30 20:06 ` Robert A Duff
2017-06-29 21:12 ` Robert A Duff
2017-07-04 19:30 ` Niklas Holsti
2017-07-05 20:03 ` Robert A Duff
2017-06-23 19:22 ` Niklas Holsti
2017-06-30 15:02 ` Norman Worth
2017-06-30 23:49 ` pythoner6
2017-07-03 0:04 ` Randy Brukardt
2017-07-03 17:47 ` Jere
2017-07-03 19:43 ` Dmitry A. Kazakov
2017-07-04 2:18 ` Randy Brukardt
2017-12-17 13:47 ` Prefixed notation for non tagged types Jere
2017-12-17 15:06 ` Simon Wright
2017-12-17 15:33 ` Dmitry A. Kazakov
2017-12-18 22:31 ` Randy Brukardt
2017-12-19 0:40 ` Jere
2017-12-19 23:04 ` Randy Brukardt
2017-12-20 12:33 ` Robert Eachus
2017-06-21 11:58 ` Ada Annoyances joakimds
2017-06-21 12:29 ` Pascal Obry
2017-06-21 14:52 ` pythoner6
2017-06-21 16:11 ` J-P. Rosen
2017-06-21 16:12 ` Dmitry A. Kazakov
2017-06-21 22:45 ` pythoner6
2017-06-22 7:29 ` Dmitry A. Kazakov
2017-06-22 10:29 ` pythoner6
2017-06-22 11:04 ` Egil H H
2017-06-22 13:30 ` Dmitry A. Kazakov
2017-06-22 19:22 ` Niklas Holsti
2017-06-22 21:52 ` Dmitry A. Kazakov
2017-06-23 9:33 ` AdaMagica
2017-06-23 10:25 ` Simon Wright
2017-06-23 1:00 ` pythoner6
2017-06-23 15:23 ` raph.amiard
2017-06-23 16:10 ` Dmitry A. Kazakov
2017-06-23 17:41 ` Randy Brukardt
2017-06-23 18:56 ` Maciej Sobczak
2017-06-23 22:18 ` pythoner6
2017-06-24 8:05 ` Dmitry A. Kazakov
2017-06-24 8:35 ` Maciej Sobczak
2017-06-24 9:07 ` Dmitry A. Kazakov
2017-06-24 20:50 ` Maciej Sobczak
2017-06-24 21:06 ` Dmitry A. Kazakov
2017-06-25 11:33 ` Maciej Sobczak
2017-06-25 14:32 ` Dmitry A. Kazakov
2017-06-25 20:50 ` Maciej Sobczak
2017-06-26 7:58 ` Dmitry A. Kazakov
2017-06-26 13:24 ` Maciej Sobczak
2017-06-26 16:38 ` Dmitry A. Kazakov
2017-06-26 20:42 ` Maciej Sobczak
2017-06-24 8:34 ` Maciej Sobczak
2017-06-24 13:06 ` pythoner6
2017-06-24 15:40 ` Dmitry A. Kazakov
2017-06-26 0:06 ` Randy Brukardt
2017-06-26 20:35 ` Maciej Sobczak
2017-06-26 21:40 ` Randy Brukardt
2017-06-27 7:23 ` Maciej Sobczak
2017-06-27 20:38 ` Randy Brukardt
2017-06-28 8:21 ` Dmitry A. Kazakov
2017-06-28 20:50 ` Randy Brukardt
2017-06-28 23:18 ` Nasser M. Abbasi
2017-06-29 7:27 ` Dmitry A. Kazakov
2017-06-29 16:24 ` Jeffrey R. Carter
2017-06-29 16:51 ` Nasser M. Abbasi
2017-07-04 23:40 ` Luke A. Guest
2017-07-05 5:29 ` J-P. Rosen
2017-07-05 13:49 ` Dennis Lee Bieber
2017-07-05 17:49 ` Jeffrey R. Carter
2017-06-29 21:46 ` darkestkhan
2017-06-29 7:15 ` Dmitry A. Kazakov
2017-06-30 0:42 ` Randy Brukardt
2017-06-30 7:36 ` Dmitry A. Kazakov
2017-06-28 13:07 ` Maciej Sobczak
2017-06-27 7:26 ` Dmitry A. Kazakov
2017-06-27 20:41 ` Randy Brukardt
2017-06-28 7:57 ` Dmitry A. Kazakov
2017-06-27 15:19 ` AdaMagica [this message]
2017-06-27 16:32 ` Dmitry A. Kazakov
2017-06-28 13:15 ` Maciej Sobczak
2017-06-28 14:05 ` AdaMagica
2017-06-29 21:17 ` Robert A Duff
2017-06-30 7:44 ` Dmitry A. Kazakov
2017-06-30 7:49 ` J-P. Rosen
2017-06-30 8:28 ` Dmitry A. Kazakov
2017-06-30 10:14 ` J-P. Rosen
2017-06-30 10:30 ` Dmitry A. Kazakov
2017-06-28 20:53 ` Randy Brukardt
2017-12-17 16:24 ` Mehdi Saada
2017-12-17 17:27 ` Dmitry A. Kazakov
2017-12-18 23:09 ` Randy Brukardt
2017-12-19 9:25 ` Dmitry A. Kazakov
2017-06-21 20:40 ` G.B.
2017-06-21 22:25 ` pythoner6
2017-06-26 11:01 ` Vincent
2017-06-26 11:15 ` Alejandro R. Mosteo
2017-06-26 16:35 ` Pascal Obry
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox