comp.lang.ada
 help / color / mirror / Atom feed
From: Adam Beneschan <adam@irvine.com>
Subject: Re: Inheritance of representation aspects
Date: Mon, 4 Feb 2013 09:32:49 -0800 (PST)
Date: 2013-02-04T09:32:49-08:00	[thread overview]
Message-ID: <ec1e1efe-f8f8-4fd5-9316-3172797f67a3@googlegroups.com> (raw)
In-Reply-To: <lyip69s6qf.fsf@pushface.org>

On Sunday, February 3, 2013 8:27:20 AM UTC-8, Simon Wright wrote:
> A question on Stack Overflow[1] asks about deriving from an unchecked
> union. The questioner thinks that a derived type should also be
> an unchecked union, but GNAT doesn't.
> A demo is
> 
>    package Union is
>       type Access_Kind is (Named, Indexed);
>       type Array_Type is array (0 .. 1) of Integer;
> 
>       type Base (Kind : Access_Kind := Access_Kind'First) is record
>          case Kind is
>             when Named =>
>                X, Y : Integer;
>             when Indexed =>
>                S : Array_Type;
>          end case;
>       end record with
>         Unchecked_Union => True,
>         Convention => C_Pass_By_Copy;
> 
>       --  A primitive operation, freezes Base.
>       procedure P (R : Base) is null;
> 
>       --  Derived types should inherit both representation aspects, so
>       --  both these aspects should be confirming 
>       type Derived_1 is new Base with Unchecked_Union => True;
>       type Derived_2 is new Base with Convention => C_Pass_By_Copy;
> 
>       --  This should fail (ARM 13.1(10)).
>       type Derived_3 is new Base with Unchecked_Union => False;
> 
>    end Union;
> 
> Both Unchecked_Union and C_Pass_By_Copy are representation aspects, and
> should therefore be inherited (I've given links at my SO answer[2]). So
> the aspects specified for Derived_1 and Derived_2 should both be
> confirming and therefore OK (?), while the aspect for Derived_3 should
> be illegal by ARM 13.1(10).
> 
> With GNAT GPL 2012 and GCC 4.8.0 (r195682), Derived_1 and Derived_2 fail
> (representation item appears too late) and Derived_3 doesn't raise an
> error.
> 
> With GNAT GPL 2012, if I comment out Derived_1 and Derived_2, the
> compilation is successful (with 4.8.0 I get a bug box, which is a
> separate issue).
> 
> Am I correct that these aspects should be inherited?

You're right that they should be inherited (13.1(15)), and that the declaration of Derived_3 would be illegal.

I'm not clear that Derived_1 and Derived_2 are legal, however.  The aspect clauses are confirming, but there's no blanket rule that confirming aspect clauses are always legal.  The rule in 13.1(10) says

"For an untagged derived type, it is illegal to specify a type-related representation aspect if the parent type is a by-reference type, or has any user-defined primitive subprograms."

So it's illegal, period.  There is no exception here for confirming aspect clauses.

                            -- Adam



  reply	other threads:[~2013-02-04 17:32 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-02-03 16:27 Inheritance of representation aspects Simon Wright
2013-02-04 17:32 ` Adam Beneschan [this message]
2013-02-04 18:23   ` Simon Wright
2013-02-05  2:45     ` Randy Brukardt
replies disabled

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