www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - Invariant/initialization bug?

reply David Medlock <amedlock nospam.org> writes:
Consider the following code:

class Test
{
   int[]   array;
   uint    count = 0;

   uint    capacity() { return array.length; }

   invariant { assert( count <= capacity ); }

   this() {}
}

void main( char[][] arg )
{
   Test test = new Test();
}

This produces a stack overflow....

If I change the 'capacity' in the invariant to array.length it does not 
crash.

I am guessing the problem is that the invariant call capacity() also 
calls the invariant upon entry.

Is this improper behavior re: contracts in D or simply unspecified?

In DBC as I understand it, no contracts can fire while another contract 
is being checked.  Apparently this rule is not enforced in D?

-David
Feb 18 2005
parent =?ISO-8859-1?Q?Thomas_K=FChne?= <thomas-dloop kuehne.THISISSPAM.cn> writes:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

David Medlock wrote:

| Consider the following code:
|
| class Test
| {
|   int[]   array;
|   uint    count = 0;
|
|   uint    capacity() { return array.length; }
|
|   invariant { assert( count <= capacity ); }
|
|   this() {}
| }
|
| void main( char[][] arg )
| {
|   Test test = new Test();
| }
|
| This produces a stack overflow....
|
| If I change the 'capacity' in the invariant to array.length it does
| not crash.
|
| I am guessing the problem is that the invariant call capacity() also
| calls the invariant upon entry.
|
| Is this improper behavior re: contracts in D or simply unspecified?

http://digitalmars.com/d/class.html#invariants



| In DBC as I understand it, no contracts can fire while another contract
| is being checked.  Apparently this rule is not enforced in D?

Known compiler bug:
http://dstress.kuehne.cn/nocompile/invariant_17.d

Thomas

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.0 (MingW32)

iD8DBQFCFx2/3w+/yD4P9tIRAjh+AJ9IT9IW3VKUq2lUA/K3VWMW5qniKwCggxih
eiPO1945ylXL5DYLV4FuzuU=
=tnie
-----END PGP SIGNATURE-----
Feb 19 2005