class ObjStack3 {
/*@ non_null */ Object [] a;
//@ invariant a.length == 10;
//@ invariant \elemtype(\typeof(a)) == \type(Object);
int n; //@ invariant 0 <= n & n <= 10;
//@ invariant (\forall int i; n <= i & i < 10 ==> a[i] == null);
//@ invariant a.owner == this;
ObjStack3() {
n = 0;
a = new Object[10];
//@ set a.owner = this;
}
//@ requires n < 10;
void Push(Object o) {
a[n++] = o;
}
//@ requires n > 0;
Object Pop() {
Object o = a[--n];
a[n] = null;
return o;
}
}
class Foo {
/*@ non_null */ Object [] b;
//@ invariant b.owner == this;
void m() {
//@ assert (\forall ObjStack3 x, y; x != y ==> x.a != y.a);
//@ assert (\forall Foo x, y; x != y ==> x.b != y.b);
/*@ assert (\forall ObjStack3 x; (\forall Foo y;
(Object)x != y ==> x.a != y.b));
*/
}
Foo() {
b = new Object[10];
//@ set b.owner = this;
}
}