% Test HLSL attribute syntax. The compiler ignores unrecognized attributes, so % we need to get the parsing syntax right. Most of the following tests which % succeed print warnings. [pixel shader] [numthreads] float4 main() : sv_target { return 0; } [pixel shader] [ numthreads ] float4 main() : sv_target { return 0; } [pixel shader] [numthreads(1)] float4 main() : sv_target { return 0; } [pixel shader todo] [numthreads("")] float4 main() : sv_target { return 0; } [pixel shader todo] [numthreads("one")] float4 main() : sv_target { return 0; } [pixel shader todo] uniform float4 f; [numthreads(1, "one", 3 + 9, -9.8e4, -float2(1, 2), f)] float4 main() : sv_target { return 0; } [pixel shader fail] [numthreads()] float4 main() : sv_target { return 0; } [pixel shader fail] [numthreads(1,)] float4 main() : sv_target { return 0; } [pixel shader fail] [numthreads(f)] float4 main() : sv_target { return 0; } [pixel shader fail] /* Test an invalid constructor. */ [numthreads(float2(1))] float4 main() : sv_target { return 0; } [pixel shader] [not_a_real_attribute_name] float4 main() : sv_target { return 0; } [pixel shader] uniform float4 f; [f] float4 main() : sv_target { return 0; } [pixel shader fail] % This is valid IDL syntax, but not HLSL. [one, two] float4 main() : sv_target { return 0; } [pixel shader] [one][two] float4 main() : sv_target { return 0; } [pixel shader fail todo] [one][one] float4 main() : sv_target { return 0; } [pixel shader fail todo] [one][one(1)] float4 main() : sv_target { return 0; } [pixel shader] [one][One] float4 main() : sv_target { return 0; } [pixel shader] [numthreads] float4 main(); [numthreads] float4 main() : sv_target { return 0; } [pixel shader] /* Expressions with side effects are forbidden in attributes—see * hlsl-numthreads.shader_test for an example—but not if the attribute is * ignored. */ static int i = 1; [one(i++)] [two(++i)] [three(i = 4)] float4 main() : sv_target { return 0; } [pixel shader fail] [one] float4 f; float4 main() : sv_target { return 0; }