// Test class type decorations
class foo {
public var v = "foo";
}
class bar {
public var v : foo;
}
class bletch(foo) {
public var v = "bletch";
}
var g : foo;
foo oFoo {}
bar oBar {}
bletch oBletch {}
proc ack(o : foo)
{
"", o.v, '\n';
}
proc check(e, num)
{
if (e == oadl::TypeCheck) "TypeCheck #", num, '\n';
}
proc main()
{
var x : foo;
// Test OK assignments
x = oFoo;
g = oFoo;
ack(oFoo);
oBar.v = oFoo;
oadl::typecheck(foo, x);
// Test more OK assignments
x = oBletch;
g = oBletch;
ack(oBletch);
oBar.v = oBletch;
oadl::typecheck(foo, x);
// Test bad assignments
try { x = oBar; } catch(e) { check(e, 1); }
try { g = oBar; } catch(e) { check(e, 2); }
try { ack(oBar); } catch(e) { check(e, 3); }
try { oBar.v = oBar; } catch(e) { check(e, 4); }
try { oadl::typecheck(bar, x); } catch(e) { check(e, 5); }
}