comp.lang.ada
 help / color / mirror / Atom feed
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!

  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