comp.lang.ada
 help / color / mirror / Atom feed
From: "Markus Schöpflin" <no.spam@spam.spam>
Subject: Re: Unexpected discriminant check failure involving access types
Date: Mon, 10 Aug 2015 16:20:36 +0200
Date: 2015-08-10T16:20:36+02:00	[thread overview]
Message-ID: <55C8B334.2010102@spam.spam> (raw)
In-Reply-To: d185227b-7cce-476c-8398-b211429a201f@googlegroups.com

Am 10.08.2015 um 15:14 schrieb Mark Lorenzen:
> On Monday, August 10, 2015 at 2:38:23 PM UTC+2, Markus Schöpflin wrote:
>> Given the following piece of code:
>>
>> ---%<---
>>        1  procedure TEST
>>        2  is
>>        3     type T is (T1, T2);
>>        4
>>        5     type RECORD_T (X : T := T1) is record
>>        6        null;
>>        7     end record;
>>        8
>>        9     type PTR_T is access RECORD_T;
>>       10
>>       11     FOO : RECORD_T;
>>       12     FOO_PTR : constant PTR_T := new RECORD_T;
>>       13
>>       14     FOO1 : constant RECORD_T := (X => T1);
>>       15     FOO2 : constant RECORD_T := (X => T2);
>>       16  begin
>>       17     FOO := FOO1;
>>       18     FOO := FOO2;
>>       19
>>       20     FOO_PTR.all := FOO1;
>>       21     FOO_PTR.all := FOO2;
>>       22  end;
>> --->%---
>>
>> When compiled and executed, I get:
>>
>>   > ./test
>>
>> raised CONSTRAINT_ERROR : test.adb:21 discriminant check failed
>>
>> Can anyone please explain me why I get a discriminant check error when using
>> access types? I would have expected it to work the same as for the non-access
>> case.
>>
>> TIA, Markus
>
> Look at line 12. FOO_PTR is a constant object of an access type. The
> constant object is initialized to point to a discriminated record with
> discriminant T1, since this is the default discriminant of objects of type
> RECORD_T. In line 21 it goes horribly wrong and you try to change the
> object pointed to, to a record with discriminant T2.

I still don't get it: I would have expected the objects FOO and
FOO_PTR.all to be identical in behaviour. Why is "new RECORD_T" creating a
constrained record and just using "RECORD_T" not?

> What problem are you trying to solve? Is the above code just a simple
> reproducer or is it a snippet from real code?

That is a reproducer for a bug found in some real code, which suddenly started 
to give constraint errors, due to a change in the initialization of a variable 
of type PTR_T.

Markus


  reply	other threads:[~2015-08-10 14:20 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-08-10 12:38 Unexpected discriminant check failure involving access types Markus Schöpflin
2015-08-10 13:14 ` Mark Lorenzen
2015-08-10 14:20   ` Markus Schöpflin [this message]
2015-08-10 19:00     ` Randy Brukardt
2015-08-10 14:33 ` Niklas Holsti
2015-08-10 14:56   ` Markus Schöpflin
2015-08-10 19:43     ` Niklas Holsti
replies disabled

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