comp.lang.ada
 help / color / mirror / Atom feed
From: Simon Wright <simon@pushface.org>
Subject: Re: Inheritance of representation aspects
Date: Mon, 04 Feb 2013 18:23:33 +0000
Date: 2013-02-04T18:23:33+00:00	[thread overview]
Message-ID: <lyehgwrl96.fsf@pushface.org> (raw)
In-Reply-To: ec1e1efe-f8f8-4fd5-9316-3172797f67a3@googlegroups.com

Adam Beneschan <adam@irvine.com> writes:

> 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.

Still, it's be nice for it to be legal (perhaps 13.1(18.2) could be
amended to say that a confirming aspect clause isn't "really" a
specification?! Simpler if (10) just said that

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



  reply	other threads:[~2013-02-04 18:23 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
2013-02-04 18:23   ` Simon Wright [this message]
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