--- /dev/null
+method m(x)
+ x := this-x;
+ return x*2;
+end;
--- /dev/null
+extern long m(long,long);
+RET(m(7,4)==6 && m(18,22)==-8);
--- /dev/null
+method m()
+ var that:=3*this;
+ return this or that;
+end;
--- /dev/null
+extern long m(long);
+RET(m(7)==23 && m(13)==47);
--- /dev/null
+method mymax(that)
+ if this<that then
+ return that;
+ else
+ return this;
+ end;
+end;
--- /dev/null
+extern long mymax(long,long);
+RET(mymax(7,4)==7 && mymax(18,22)==22);
--- /dev/null
+method mymax(that)
+ if not (this<that) then
+ that:=this;
+ end;
+ return that;
+end;
--- /dev/null
+extern long mymax(long,long);
+RET(mymax(7,4)==7 && mymax(18,22)==22);
--- /dev/null
+method fib()
+ var n:=0;
+ var a:=0;
+ var b:=1;
+ while n<this do
+ n:=n--1;
+ var t:=a-(0-b);
+ a:=b;
+ b:=t;
+ end;
+ return a;
+end;
--- /dev/null
+extern long fib(long);
+RET(3==fib(4));
--- /dev/null
+method ggt(b)
+ var a:=this;
+ while b do
+ if b<a then
+ a:=a-b;
+ else
+ b:=b-a;
+ end;
+ end;
+ return a;
+end;
--- /dev/null
+extern long ggt(long, long);
+RET (6==ggt(42,108));
--- /dev/null
+struct next end;
+
+method length()
+ var l:=this;
+ var len:=0;
+ while l do
+ l:=l.next;
+ len:=len--1;
+ end;
+ return len;
+end;
--- /dev/null
+typedef struct list {struct list *next; } list;
+
+extern long length(list *);
+list a={NULL};
+list b={&a};
+list c={&b};
+list d={&c};
+list e={&a};
+RET(2==length(&e) && 4==length(&d));
--- /dev/null
+struct next val end;
+
+
+method insert(val list)
+/* usage: list:=node.insert(5,list) */
+ this.val := val;
+ next := list;
+ return this;
+end;
--- /dev/null
+typedef struct list {struct list *next; long val;} list;
+list *insert(list *, long, list *);
+list a={NULL,7};
+list b={NULL,2};
+RET((&a)==insert(&a, 3, &b) &&
+ a.next==&b && a.val==3 && b.next==NULL && b.val==2);
--- /dev/null
+struct a b c end;
+
+method m(flag)
+ a:=b-1;
+ if flag then
+ b:=c-1;
+ var a:=95;
+ c:=a-1;
+ else
+ a:=a-10;
+ var b:=a*2;
+ b:=23;
+ c:=b*2;
+ end;
+ b:=b-17;
+ return this;
+end;
--- /dev/null
+typedef struct foo {long a; long b; long c;} foo;
+extern foo *m(foo *, long);
+foo s1={29,37,41};
+foo s2={6,28,216};
+
+RET((&s1)==m(&s1,25) && (&s2)==m(&s2,0) &&
+ s1.a==36 && s1.b==23 && s1.c==94 &&
+ s2.a==17 && s2.b==11 && s2.c==46);
+
--- /dev/null
+struct elem end;
+
+method vadd(v n)
+ while 0<n do
+ n:=n-1;
+ (this-(-8*n)).elem := (this-(n*-8)).elem - (0-(v-(n*-8)).elem);
+ end;
+ return this;
+end;
+
--- /dev/null
+extern long *vadd(long *, long *, long);
+long a[]={7,11,13};
+long b[]={23,42,5};
+RET(a==vadd(a,b,2) &&
+ a[0]==30 && a[1]==53 && a[2]==13 &&
+ b[0]==23 && b[1]==42 && b[2]==5);
--- /dev/null
+method m(x)
+ x := this-x;
+ return x*2;
+end;
--- /dev/null
+extern long m(long,long);
+RET(m(7,4)==6 && m(18,22)==-8);
--- /dev/null
+method m()
+ var that:=3*this;
+ return this or that;
+end;
--- /dev/null
+extern long m(long);
+RET(m(7)==23 && m(13)==47);
--- /dev/null
+method mymax(that)
+ if this<that then
+ return that;
+ else
+ return this;
+ end;
+end;
--- /dev/null
+extern long mymax(long,long);
+RET(mymax(7,4)==7 && mymax(18,22)==22);
--- /dev/null
+method mymax(that)
+ if not (this<that) then
+ that:=this;
+ end;
+ return that;
+end;
--- /dev/null
+extern long mymax(long,long);
+RET(mymax(7,4)==7 && mymax(18,22)==22);
--- /dev/null
+method fib()
+ var n:=0;
+ var a:=0;
+ var b:=1;
+ while n<this do
+ n:=n--1;
+ var t:=a-(0-b);
+ a:=b;
+ b:=t;
+ end;
+ return a;
+end;
--- /dev/null
+extern long fib(long);
+RET(3==fib(4));
--- /dev/null
+method ggt(b)
+ var a:=this;
+ while b do
+ if b<a then
+ a:=a-b;
+ else
+ b:=b-a;
+ end;
+ end;
+ return a;
+end;
--- /dev/null
+extern long ggt(long, long);
+RET (6==ggt(42,108));
--- /dev/null
+struct next end;
+
+method length()
+ var l:=this;
+ var len:=0;
+ while l do
+ l:=l.next;
+ len:=len--1;
+ end;
+ return len;
+end;
--- /dev/null
+typedef struct list {struct list *next; } list;
+
+extern long length(list *);
+list a={NULL};
+list b={&a};
+list c={&b};
+list d={&c};
+list e={&a};
+RET(2==length(&e) && 4==length(&d));
--- /dev/null
+struct next val end;
+
+
+method insert(val list)
+/* usage: list:=node.insert(5,list) */
+ this.val := val;
+ next := list;
+ return this;
+end;
--- /dev/null
+typedef struct list {struct list *next; long val;} list;
+list *insert(list *, long, list *);
+list a={NULL,7};
+list b={NULL,2};
+RET((&a)==insert(&a, 3, &b) &&
+ a.next==&b && a.val==3 && b.next==NULL && b.val==2);
--- /dev/null
+struct a b c end;
+
+method m(flag)
+ a:=b-1;
+ if flag then
+ b:=c-1;
+ var a:=95;
+ c:=a-1;
+ else
+ a:=a-10;
+ var b:=a*2;
+ b:=23;
+ c:=b*2;
+ end;
+ b:=b-17;
+ return this;
+end;
--- /dev/null
+typedef struct foo {long a; long b; long c;} foo;
+extern foo *m(foo *, long);
+foo s1={29,37,41};
+foo s2={6,28,216};
+
+RET((&s1)==m(&s1,25) && (&s2)==m(&s2,0) &&
+ s1.a==36 && s1.b==23 && s1.c==94 &&
+ s2.a==17 && s2.b==11 && s2.c==46);
+
--- /dev/null
+struct elem end;
+
+method vadd(v n)
+ while 0<n do
+ n:=n-1;
+ (this-(-8*n)).elem := (this-(n*-8)).elem - (0-(v-(n*-8)).elem);
+ end;
+ return this;
+end;
+
--- /dev/null
+extern long *vadd(long *, long *, long);
+long a[]={7,11,13};
+long b[]={23,42,5};
+RET(a==vadd(a,b,2) &&
+ a[0]==30 && a[1]==53 && a[2]==13 &&
+ b[0]==23 && b[1]==42 && b[2]==5);