class C { function F(c: C, d: D): bool { true } method M(x: int) returns (y: int, c: C) requires F(#D.A, this); // 2 errors requires F(4, 5); // 2 errors requires F(this, #D.A); // good { } method Caller() { call m,n := M(true); // error on in-parameter call n,m := M(m); // 2 errors on out-parameters } } datatype D { A; } datatype Nothing { // error: no grounding constructor } datatype NeverendingList { // error: no grounding constructor Cons(int, NeverendingList); } datatype MutuallyRecursiveDataType { FromANumber(int); // this is the base case Else(TheCounterpart, C); } datatype TheCounterpart { TreeLike(TheCounterpart, TheCounterpart); More(MutuallyRecursiveDataType); } // these 'ReverseOrder_' order tests may be called white-box unit tests datatype ReverseOrder_MutuallyRecursiveDataType { FromANumber(int); // this is the base case Else(ReverseOrder_TheCounterpart, C); } datatype ReverseOrder_TheCounterpart { TreeLike(ReverseOrder_TheCounterpart, ReverseOrder_TheCounterpart); More(ReverseOrder_MutuallyRecursiveDataType); } // --------------------- class ArrayTests { ghost method G(a: array) requires a != null && 10 <= a.Length; modifies a; { a[7] := 13; // error: array elements are not ghost locations } } // --------------------- method DuplicateVarName(x: int) returns (y: int) { var z: int; var z: int; // error: redeclaration of local var x := x; // redeclaration of in-parameter is fine var x := x; // error: but a redeclaration of that local is not fine { var x := x; // an inner local variable of the same name is fine var x := x; // error: but a redeclaration thereof is not okay var y := y; // duplicating an out-parameter here is fine } var y := y; // error: redeclaration of an out-parameter is not allowed (it is // treated like an outermost-scoped local in this regard) } // --------------------- method InitCalls() { var c := new C.F(null, null); // error: F is not a method var d := new C.M(8); // error: M has out parameters var e := new C.Caller(); }