From: wallace@bonmot (Richard Wallace)
Subject: Variant Record Defaults
Organization: Digital Equipment Corporation
X-Newsreader: Tin 1.1 PL3
Date: Thu, 24 Sep 1992 23:04:21 GMT

mmangieri@vitro.com (M. J. Mangieri) writes:
: In article <1992Sep22.215834.11990@nntpd2.cxo.dec.com> wallace@bonmot (Richard
: Wallace) writes:
: > wallace@bonmot (Richard Wallace) writes:
: > : BERRYMAN@orca.drep.dnd.ca (DON BERRYMAN) writes:
: > : : 
: > : : Please concider the following code fragment:
: > : : 
: > : :      package dstring is
: > : :          type text (maxlen: positive := 64) is private;
: > : :          ---STUFF DELETED--
: > : :      private
: > : :          type text (maxlen: positive := 64) is
: > : :      	record
: > : :      	    last: natural := 0;
: > : :      	    data: string (1..maxlen);
: > : :      	end record;
: > : :      end dstring;
: > : : 
: > : :      with dstring;
: > : :      procedure useit is
: > : :         type buffer is record
: > : :              data: dstring.text;
: > : :         end record;
: > : :         aaa: buffer;
: > : :         bbb: dstring.text;
: > : :      begin
: > : :         null;
: > : :      end useit;
: > : : 
: > : : 
: > : : When compiled on VAX/VMS Ada I get the following:
: > : : 
: > : :      S2$ ada useit
: > : :          3      type buffer is record
: > : :      ...........1
: > : :      %ADAC-I-CONS_OR_NUM_ERR, (1) CONSTRAINT_ERROR or NUMERIC_ERROR will
: be raised
: > : :              here [LRM 11.1(5-6), F.9.5]
: > : :              during evaluation related to record type buffer at line 3
: > : :      %ADAC-I-ENDDIAGS, Ada compilation completed with 1 diagnostic
: > : :      S2$
: > : : 
: > : : What appears to be the problem is that BUFFER.DATA is not using the
: default
: > : : for MAXLEN. When I specify it in the record definition the message goes
: > : : away. Since I can create the variable, BBB, of type DSTRING.TEXT it does
: not
: > : : seem to be a problem with my definitions. So why does ADA not use the 
: > : : default for BUFFER.DATA???  
: > : : 
: > : : I'm sure the reason is given in an obscure section of the LRM,
: > : : 
: > : : 
: > : : Don Berryman
: > : : Defence Research Establishment Pacific
: > : : Canadian Forces Base Esquimalt
: > : : Victoria, BC, CANADA, V0S-1B0
: > : : 604-363-2731    604-363-2856fax
: > : : berryman@orca.drep.dnd.ca
: > : : 
: > : : 

.. my answer deleted ...

: In simple terms -- the problem is that when defining a record type whose
: discriminant type is POSITIVE, an implementation is allowed to reserve
: sufficient space for POSITIVE'LAST characters (which on the VAX is a lot of
: characters!) You may get STORAGE_ERROR, or, in the case of the VAX,
: NUMERIC_ERROR, since POSITIVE'LAST + POSITIVE'SIZE (for the discriminant
: itself) is a value greater than INTEGER'LAST. 
: 
: A solution would be to create a subtype of POSITIVE and use that as the
: discriminant's type.
: 
:          __________________________________________________________________
:         / Michael J. Mangieri                 Internet: mmangieri@vitro.com
: __     /  Vitro Corporation                      Voice:      (301) 231-3016
:   \   /   MX-SP 4-2311                             FAX:      (301) 231-1233
:    \ /    14000 Georgia Ave.              
:     *     Silver Spring, MD 20906-2972    
: 
:          "Everything should be made as simple as possible, but not simpler."
:                                                        - A. Einstein
: 
: 

I concur Michael's findings.

With the subtype of POSITIVE the the discrimanent on dstring.text does not
generate a compile warning or runtime error.  The runtime error is 
CONSTRAINT_ERROR with VAX Ada on VAX/VMS if the original program above is run.

Richard Wallace
Digital Equipment Corporation
301 Rockrimmon Blvd. South
CXO2-1/7A
Colorado Springs, CO 80919-2398
(719)548-2792
<wallace@cookie.enet.dec.com>

	"The opinions expressed are my own, Uncle Ken or Uncle Bob
	 may, or may not, agree with me."