// Expect >= 8 errors (currently 12, due to double-reporting)

// Correct declaration (used in some test functions)
uniform shader s1;
uniform shader s2;

uniform float2 xy;

// Incorrect shader declarations (they must be uniform)
shader s3;
in shader s4;

// Various places that shaders should not be allowed:
half4  local()             { shader s; return s.eval(xy); }
half4  parameter(shader s) { return s.eval(xy); }
shader returned()          { return s1; }
half4  constructed()       { return shader(s1).eval(xy); }
half4  expression(bool b)  { return (b ? s1 : s2).eval(xy); }
half4  dangling_eval()     { s1.eval; }
