uniform half4 colorGreen;

struct S {
    float f;
    float af[5];
    half4 h4;
    half4 ah4[5];
};

half4 globalVar;
S globalStruct;

half4 main() {
    /* assign to scalar */               int i; i = 0;
    /* assign to vector */               int4 i4; i4 = int4(1,2,3,4);
    /* assign to matrix */               float3x3 f3x3; f3x3 = float3x3(1,2,3,4,5,6,7,8,9);
    /* assign to swizzle */              half4 x; x.w = 0; x.yx = half2(0);
    /* assign to array of scalar */      int ai[1]; ai[0] = 0;
    /* assign to array of vector */      int4 ai4[1]; ai4[0] = int4(1,2,3,4);
    /* assign to array of matrix */      half3x3 ah2x4[1]; ah2x4[0] = half3x3(1,2,3,4,5,6,7,8,9);
    /* assign to array swizzle */        float4 af4[1]; af4[0].x = 0; af4[0].ywxz = float4(1);

    /* assign to struct variable */      S s; s.f = 0;
    /* assign to struct array */         s.af[1] = 0;
    /* assign to struct swizzle */       s.h4.zxy = half3(9);
    /* assign to struct array swizzle */ s.ah4[2].yw = half2(5);

    /* assign to global var */           globalVar = half4(0);
    /* assign to global struct */        globalStruct.f = 0;

// Not allowed in ES2
//  /* assign to array idx by lookup */  ai[0] = 0; ai[ai[0]] = 0;

// Not allowed natively in GLSL, but SkSL will turn these into valid GLSL expressions.
    /* assign to folded ternary */       half l, r; (true ? l : r) = 0;
    /* assign to unary plus */           +ai[0] += +ai4[0][0];
    /* assign to struct unary plus */    +s.f = 1; +s.af[0] = 2;
                                         +s.h4 = half4(1); +s.ah4[0] = half4(2);

    // Keep these variables alive
    af4[0] *= float(ah2x4[0][0][0]);
    i4.y *= i;
    x.y *= l;
    s.f *= l;

    return colorGreen;
}
