aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/algol68/execute/lisp-1.a68
blob: 8cec7f6e94e7152745b0ca68aedf172bc0aef06e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# { dg-options "-fstropping=upper" }  #
BEGIN INT num ints := 0, num chars := 0;
      PROC collect stats = (REF CONS tree) VOID:
      BEGIN REF CONS e := tree;
            WHILE REF CONS (e) ISNT NIL
            DO CASE car OF e
               IN (CHAR c): num chars +:= 1,
                  (INT): num ints +:= 1,
                  (REF CONS s): collect stats (s)
               ESAC;
               e := cdr OF e
            OD
      END;
      MODE ATOM = UNION (CHAR, INT);
      MODE CONS = STRUCT (UNION (ATOM, REF CONS) car, REF CONS cdr);
      PROC list = ([]UNION (ATOM, REF CONS) item) REF CONS:
      BEGIN REF CONS a := NIL;
            FOR i FROM UPB item BY -1 TO 1
            DO a := HEAP CONS := (item[i], a) OD;
            a
      END;
      REF CONS expression := list (("X", "+", list (("Y", "x", 2))));
      collect stats (expression);
      ASSERT (num ints = 1 AND num chars = 4)
END