// Test array type decorations
class foo {
    public var v : Array[2,3];
}

var g : Array[2,3];

foo oFoo {}

proc ack(o : Array[2,3])
{
    "", o, '\n';
}

proc check(e, num)
{
    if (e == oadl::TypeCheck) "TypeCheck #", num, '\n';
}

proc main()
{
    var x : Array[2,3];
    var y : Array[*];
    var arr = {"A0", "A1", "A2", "B0", "B1", "B2"}.reshape(2,3);
    var bad = arr.reshape(1,3);

    // Test OK assignments
    x = arr;
    g = arr;
    ack(arr);
    oFoo.v = arr;
    y = arr;
    y = bad;
    oadl::typecheck(Array[2,3], x);
    oadl::typecheck(Array[*], x);
    oadl::typecheck(Array[*], y);

    // Test bad assignments
    try { x = bad; }                        catch(e) { check(e, 1); }
    try { g = bad; }                        catch(e) { check(e, 2); }
    try { ack(bad); }                       catch(e) { check(e, 3); }
    try { oFoo.v = bad; }                   catch(e) { check(e, 4); }
    try { oadl::typecheck(Array[1,3], x); } catch(e) { check(e, 5); }
    try { y = 3; }                          catch(e) { check(e, 6); }
}