process foo {
    var("hello") x;
    alias("x") y;
    val_equal(y, "hello") a;
    assert(a);

    var("hello") x;
    alias("x") y;
    y->set("world");
    val_equal(y, "world") a;
    assert(a);

    var("hello") x;
    alias("x") y;
    alias("y") z;
    z->set("world");
    val_equal(x, "world") a;
    assert(a);

    call("test", {"hello"}) c;
    alias("c.x") x;
    val_equal(x, "hello") a;
    assert(a);

    call("test", {"hello"}) c;
    alias("c") x;
    alias("x") y;
    alias("y.x") z;
    c.x->set("world");
    val_equal(z, "world") a;
    assert(a);

    var("hello") x;
    call("test2", {"_caller.x"}) c;
    c.x->set("world");
    val_equal(x, "world") a;
    assert(a);

    exit("0");
}

template test {
    var(_arg0) x;
}

template test2 {
    alias(_arg0) x;
}
