paul@cernvax.UUCP (paul) (02/08/88)
<<< DISK$SYSTEM:[NOTES$LIBRARY]ADA.NOTE;1 >>> -< Ada >- ================================================================================ Note 12.6 A bug in Vax Ada compiler... 6 of 6 20514::LOUBOUTIN "Sylvain R.Y. (021/47 27 37)" 68 lines 19-JAN-1988 10:00 -< I don't think so >- -------------------------------------------------------------------------------- Spencer Peterson says: > The "exemple" procedure/program is ERRONEOUS. I quote, with meaningful > substitutions, from the Ada Reference Manual( Chapter 13.10.1, Para. 6). > > "If A and B designate the same object, then accessing that object through > B is erroneous if this access is performed (or attempted) after the call > DISPOSE(A); the effect of each such access is not defined by the language." > > The program behaves as correctly as it can, given that it is 'legal' for > a compiler to optimize use of storage by NOT allocating a fresh copy of > the string contents, although it would be prefered that a second copy be > made and thus, no problem would occur when the original is DISPOSEd. The > effect of making a copy of the contents of an access type, in this case, > is the same as if B were a constant of type ACCESS_STRING, i.e. > B : constant ACCESS_STRING := A; I don't agree with Spencer Peterson because in my example, B is not an access to a string, but actually a string. So it doesn't designate the same object than A. My procedure would have been erroneous if I had written it like that: ... type ACCESS_STRING is access STRING; procedure DISPOSE is new UNCHECKED_DEALLOCATION (STRING, ACCESS_STRING); A: ACCESS_STRING := new STRING'("Ceci est un exemple..."); B: constant ACCESS_STRING := A; ---------------------- ... but the problem is different when the procedure is written like this: ... type ACCESS_STRING is access STRING; procedure DISPOSE is new UNCHECKED_DEALLOCATION (STRING, ACCESS_STRING); A: ACCESS_STRING := new STRING'("Ceci est un exemple..."); B: constant STRING := A.all; --------------- ... So I still pretend that there is a bug in the Vax Ada compiler. Another point, the program behaviour is correct if I use a variable instead of a constant: ... type ACCESS_STRING is access STRING; procedure DISPOSE is new UNCHECKED_DEALLOCATION (STRING, ACCESS_STRING); A: ACCESS_STRING := new STRING'("Ceci est un exemple..."); B: STRING(A.all'RANGE) := A.all; --------------- ... Sylvain Louboutin D.I. Swiss Federal Institute of Technology 1015 Lausanne, -------------- SWITZERLAND Phone: (+41 21) 47 27 37 Email: LOUBOUTIN@CLSEPF51 (from BITNET/EARN) LOUBOUTIN%CLSEPF51.BITNET@WISCVM.WISC.EDU (from ARPA Internet)