comp.lang.ada
 help / color / mirror / Atom feed
From: Adam Beneschan <adam@irvine.com>
Subject: Re: Discriminant ans tagged type ?!
Date: Fri, 21 Mar 2008 08:25:38 -0700 (PDT)
Date: 2008-03-21T08:25:38-07:00	[thread overview]
Message-ID: <641eca48-f0c9-4ccd-a998-2de9a727bacb@u10g2000prn.googlegroups.com> (raw)
In-Reply-To: 25164625-2bf7-4cea-b4fa-dc1422588446@u72g2000hsf.googlegroups.com

On Mar 21, 1:18 am, Tony <truand.t...@gmail.com> wrote:
> On 18 mar, 20:54, Adam Beneschan <a...@irvine.com> wrote:
>
>
>
> > On Mar 18, 8:54 am, Adam Beneschan <a...@irvine.com> wrote:
>
> > > However, I tried changing the declaration of T as follows:
>
> > >    T : String (1 .. B.L);  -- NO, THIS IS WRONG, I SCREWED UP
>
> > > and GNAT accepted it.  (I haven't done enough testing to make sure
> > > GNAT handles it correctly in other ways, though.)  Here, B refers to
> > > the "current instance" of the type (8.6(17)), and 3.7(18) means that
> > > all instances of the type will have a component L that is inherited
> > > from A, so this should be legal unless there are some other rules that
> > > I've missed (and that GNAT also missed).
>
> > Never mind.  After reading Bob's post, I got pointed to 3.8(10-12),
> > which disallows references to inherited discriminants in a type
> > extension.  So I guess GNAT (or at least the version I'm using, which
> > is probably not the latest) is wrong to accept this.  Sorry.
>
> >                                   -- Adam
>
> --
> I tried Bob's answer with the Aonix compiler:
> ERROR : LRM:3.8(12), A discriminant used in a constraint may only
> appear alone as a direct_name.
> I'm lost...;-)

3.8(12) is one of the rules I overlooked (thanks, Tuck).  Perhaps you
tried  Bob's answer together with my incorrect suggestion to use
string(1..B.L), which violates that rule; when you use a discriminant
in a constraint, the discriminant can't be an "expanded name" or part
of a larger expression, and I think B.L is an expanded name here.  My
apologies for misleading you.

This should work:

    type B (L : Natural) is new A(L) with record
         T : String (1 .. L);
    end record;

Everything I said earlier about visibility wouldn't apply here,
because redeclaring the discriminant L makes it visible inside the
record declaration of B.  This would work too:

    type B (Ell : Natural) is new A(L) with record
         T : String (1 .. Ell);
    end record;

It's the new discriminant that can be used in the declaration, not the
one inherited from A.


> Is my first code correct? I guess yes...

Still no.  The compiler may accept it, but that just means the
compiler has a bug.

I hope I've got everything straight now.

                                   -- Adam




  reply	other threads:[~2008-03-21 15:25 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-03-18 15:22 Discriminant ans tagged type ?! Tony
2008-03-18 15:54 ` Adam Beneschan
2008-03-18 19:54   ` Adam Beneschan
2008-03-21  8:18     ` Tony
2008-03-21 15:25       ` Adam Beneschan [this message]
2008-03-21 16:46         ` Simon Wright
2008-03-22  9:05         ` Tony
2008-04-04 15:40           ` Tom Grosman
2008-03-18 18:40 ` Robert A Duff
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox