test.vpr

    import "foo.tdf"
    import "foo.txt"
    import "foo.txt"

    domain Foo[T] {
        axiom named { forall x: Int:: {lookup(x)} len(lookup(x)) == foobar(x) }
        axiom { forall x: Int :: {lookup(x)} {len(lookup(x))} len(lookup(x)) == foobar(x) } // anonymous
    }

    // this is a comment

    /* This is also
     * another multi-line comment
     * With a string "string" and
     * an import "foo.bar" inside */

    // Any copyright is dedicated to the Public Domain.
    // http://creativecommons.org/publicdomain/zero/1.0/

    import "empty.sil"

    method test1(xs: Seq[Ref]) {
      inhale forall i: Int :: 0 <= i && i < |xs| ==> xs[i].f != 0
    }

    function $(n: Ref, m: Ref): Node

    domain Foo[T] {
        function enc(arg: T): Foo[T]
        function dec(arg: Foo[T]): T

        axiom ax_Dec {
            forall arg: T ::
                dec( enc(arg) ) == arg
        }

        axiom ax_Enc {
            forall arg: Foo[T] ::
            { enc( dec(arg) ), foo(bar, i) }
                {  dec(arg) }
                    enc( dec(arg) ) == arg
        }
    }

    function myFunc(arg: Int): Int
        requires true || false
        ensures arg <= 0 ==> result == -1
        ensures arg > 0  ==> result == arg
    {
        arg > 0 ? arg : myFunc(arg - 1)
    }

    field value: Int
    field next: Ref

    predicate list(xs: Ref) {
        acc(xs.value) && acc(xs.next)
        && ( list(xs.next) )
    }

    define myPureMacro(abc) abc

    define myStmtMacro(abc) {
        inhale abc
        exhale abc
    }

    method smokeTest() {

        inhale false; exhale false
        assume false; assert false

        //magic wands
        var s: Set[Int]
        assert s setminus s != s

    }

    //:: special comment
    /*
            gfdgfd
    */

    method testHighlights() returns ( res: Set[Seq[Multiset[Foo[Int]]]] )
        requires true
        ensures false
    {
        var a: Int; var b: Bool; var c: Ref; var d: Rational; var e: Perm
        var x: Seq[Int]; var y: Set[Int]; var z: Multiset[Int]
        var t1: Set[Int] := Set(a, 1, 2)
        var t2: Seq[Int] := Seq(a, a, a)
        var t3: Multiset[Int] := Multiset(a, a, 0, 0, 0)

        assert myFunc(331) > -2

        myStmtMacro( myFunc(331) == -331 )

        while ( true )
            invariant true
        {
            var aa: Ref
            aa := null
            var bb: Int
            bb := 33
        }

        if ( true ) {
            assert true
        } elseif ( false ) {
            assert false
        } else {
            assert true
        }

        //forperm r: Ref :: true
        //exists
        //forall
        assert ! false
        assert 0  +321 - 0 -321 == 0
    }

    field f:Int

    method test02(x: Ref)
      requires acc(x.f, write)
      ensures acc(x.f, write)
    {
      define A true
      define B acc(x.f, write)

      package A --* B
      wand w := A --* B

      //apply w

        label my_lbl

        goto my_lbl

        fresh x

        var p: Perm

        var r: Ref; r := new (*)

        constraining ( p ) {
            exhale acc(x.f, p)
        }

        assert 0 == ( let a == (11 + 22) in a+a )
    }