[require]
shader model >= 4.0
shader model < 6.0

[effect]
// Annotations on techniques
technique10 t1 < int a = 1; > {}
technique10 t2 < int a = 2; int t1 = 3; int t2 = 4; > {}

[effect]
// Annotations on passes
technique10 t1 < int a = 1; >
{
    pass < int t1 = 2; > {}
}

[effect]
// Using names from the global scope
float a;

technique10 t1 < int a = 1; >
{
    pass < int a = 2; > {}
}

[effect]
// Evaluated literal constant expression for initial values
technique10 < int a = 1+2; > {}

[effect]
// Using constant variables in the initializer
static const int b = 123;
technique10 < int a = b; > {}

[effect]
// Implicitly sized array
technique10 < float a[] = {1, 2}; > {}

[effect]
// Nested braces
technique10 < float4 a = {1, {{{2, {3}}, 4}}}; > {}

[effect]
// Flattening
technique10 < float4 a = {1, float2(2, 3), 4}; > {}

[effect]
// Comma separated initializers
technique10 < int a = 1, b = 2; > {}

[effect]
// Majority modifier
technique10 < row_major float3x2 m = {1, 2, 3, 4, 5, 6}; > {}

[effect]
float4 var : SEMANTIC < int a = 123; > = 123;
technique10 {}

[effect]
float4 main() : sv_target
{
    float var < > = 0;
    return 0;
}

technique10 {}

[effect]
technique10 < string a = "test"; > {}

[effect fail]
// Without closing semicolon
technique10 t1 < int a = 1 > {}

[effect fail]
// Redefinition
technique10 < int a = 0; float a = 1.0; > {}

[effect fail]
technique10
{
    pass < int a = 0; float a = 1.0; > {}
}

[effect fail]
// Without initializer
technique10 < int a; > {}

[effect fail]
// Only numeric types and strings are allowed
technique10 < DepthStencilState ds = { 0 }; > {}

[effect fail todo]
// Type declarations are not allowed
technique10 < struct s { int a; } var = { 2 }; > {}

[effect fail todo]
// Static modifier is not allowed
technique10 < static int a = 5; > {}

[effect fail]
// Initializer should not depend on other annotations
technique10 < int a = 1, b = a; > {}

[effect fail]
technique10 < int a = 1; int b = a; > {}

[effect fail]
float4 main() : sv_target
{
    float var < int a = 1; > = 0;
    return 0;
}

technique10 {}
