From: anon@anon.org (anon)
Subject: Re: Extending discriminant types
Date: Wed, 19 Nov 2008 09:49:08 GMT
Date: 2008-11-19T09:49:08+00:00 [thread overview]
Message-ID: <oiRUk.141685$Mh5.126924@bgtnsc04-news.ops.worldnet.att.net> (raw)
In-Reply-To: 20081115101632.5f98c596@cube.tz.axivion.com
-- Your talking about "Variant Parts and Discrete Choices" (RM 3.8.1)
-- which is validated during runtine, if the variable is reference.
--
-- Now with a smart compiler it could detect the error, but the
-- compiler in GNAT is not that smart.
procedure t is
-- Change "Base" to "KBase" to prevent confusion with predefine
-- Attribute 'Base, which als works.
type Kind is (A, B);
type KBase (K : Kind) is abstract tagged record
case K is
when A => null;
when B => Dummy : Natural;
end case;
end record;
type Base_Access is access all KBase'Class;
-- type "Child" is bound to KBase ( K => B ) so any reference
-- of "Child" to ( K => A ) should cause an error condition
-- but this only happens during runtime.
type Child is new KBase (B) with null record;
-- Var2 is in error and should cause a Constaint_Error
-- once referenced.
Var : Base_Access := new Child ;
Var0 : Base_Access := new Child'(K => B, Dummy => 5);
Var1 : Base_Access := new Child'Base(K => B); -- Just for Adam, this works
Var2 : Base_Access := new Child'Base(K => A);
begin -- t
Var.Dummy := 2 ;
Var0.Dummy := 4 ;
Var1.Dummy := 8 ; -- Just for Adam, this works
-- Uncommenting the following line will result in a Constraint_Error
-- during runtine. But until Var2 is reference the validation of
-- type is not performed.
-- Var2.Dummy := 16 ;
end t ;
In <20081115101632.5f98c596@cube.tz.axivion.com>, Stefan Bellon <bellon@software-erosion.org> writes:
>Hi,
>
>I stumbled across some behaviour when extending an unconstrained
>discriminant type while providing the constraint when extending. Assume
>the following code:
>
> type Kind is (A, B);
>
> type Base (K : Kind) is abstract tagged record
> case K is
> when A => null;
> when B => Dummy : Natural;
> end case;
> end record;
>
> type Base_Access is access all Base'Class;
>
> type Child is new Base (B) with null record;
>
>In this case I would have thought that type Child is now constrained to
>Kind B and no object of type Child with Kind A can be created.
>
>However, the following compiles (with GNAT) and does not throw an
>exception at runtime:
>
> Var : Base_Access := new Child'(K => A);
>
>Am I misunderstanding the Ada semantics? If so, is there a way to
>achieve what I'm trying, i.e. that I can determine the Kind while
>extending and not change it when creating objects?
>
>Greetings,
>Stefan
>
next prev parent reply other threads:[~2008-11-19 9:49 UTC|newest]
Thread overview: 68+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-11-15 9:16 Extending discriminant types Stefan Bellon
2008-11-15 18:50 ` Jeffrey R. Carter
2008-11-17 16:30 ` Adam Beneschan
2008-11-18 11:02 ` christoph.grein
2008-11-18 23:24 ` Adam Beneschan
2008-11-19 9:49 ` anon [this message]
2008-11-19 10:15 ` christoph.grein
2008-11-19 19:19 ` Georg Bauhaus
2008-11-19 11:38 ` Martin
2008-11-20 7:21 ` anon
2008-11-20 8:30 ` christoph.grein
2008-11-20 8:36 ` Ludovic Brenta
2008-11-20 11:45 ` Georg Bauhaus
2008-11-20 11:46 ` Georg Bauhaus
2008-11-20 23:01 ` anon
2008-11-21 11:54 ` Ludovic Brenta
2008-11-20 14:03 ` Dmitry A. Kazakov
2008-11-20 15:03 ` Robert A Duff
2008-11-20 15:57 ` Stefan Bellon
2008-11-21 0:32 ` Adam Beneschan
2008-11-20 16:11 ` Adam Beneschan
2008-11-20 22:59 ` anon
2008-11-21 0:29 ` Adam Beneschan
2008-11-21 7:25 ` anon
2008-11-21 9:19 ` Jean-Pierre Rosen
2008-11-21 10:11 ` christoph.grein
2008-11-21 12:00 ` Ludovic Brenta
2008-11-21 22:31 ` anon
2008-11-22 0:18 ` Stefan Bellon
2008-11-23 4:06 ` anon
2008-11-23 5:39 ` Georg Bauhaus
2008-11-23 8:00 ` anon
2008-11-24 10:08 ` Georg Bauhaus
2008-11-24 22:16 ` anon
2008-11-25 10:37 ` Martin
2008-11-25 11:24 ` Georg Bauhaus
2008-11-25 20:49 ` Jeffrey R. Carter
2008-11-25 21:01 ` Adam Beneschan
2008-11-25 22:09 ` Georg Bauhaus
2008-11-25 22:33 ` Jeffrey R. Carter
2008-11-26 0:58 ` Adam Beneschan
2008-11-26 1:45 ` Jeffrey R. Carter
2008-11-26 9:31 ` Martin
2008-11-26 9:38 ` Stefan Bellon
2008-11-26 9:48 ` Martin
2008-11-26 10:16 ` Stefan Bellon
2008-11-26 11:05 ` Ludovic Brenta
2008-11-26 11:33 ` Stefan Bellon
2008-11-26 15:49 ` Adam Beneschan
2008-11-26 16:15 ` Ludovic Brenta
2008-11-26 11:10 ` Niklas Holsti
2008-11-23 8:48 ` Compiler quality (was: Extending discriminant types) Ludovic Brenta
2008-11-24 23:33 ` anon
2008-11-25 6:54 ` christoph.grein
2008-11-25 10:01 ` Ludovic Brenta
2008-11-26 23:34 ` anon
2008-11-27 10:24 ` Compiler quality Georg Bauhaus
2008-11-27 14:46 ` Ludovic Brenta
2008-11-28 9:13 ` Martin
2008-11-28 10:28 ` Georg Bauhaus
2008-12-02 3:51 ` Randy Brukardt
2008-11-22 13:10 ` Extending discriminant types Gautier
2008-11-24 8:24 ` christoph.grein
2008-11-21 6:11 ` christoph.grein
2008-11-21 21:12 ` Jeffrey R. Carter
2008-11-22 16:41 ` sjw
2008-11-21 11:44 ` Martin
2008-11-20 9:55 ` Martin
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox