uniform half4 colorGreen;
uniform half unknownInput;

struct S {
    half4 ah4[1];
    half ah[1];
    half4 h4;
    half h;
};

// Each helper function needs to reference the variable multiple times, because if it's only read
// from once, it is inlined directly whether or not it is trivial.
half4 funcb(bool b) {
    return half4(b, b, b, !b);
}

half4 func1(half h) {
    return h.xxxx * h.xxxx;
}

half4 func2(half2 h2) {
    return h2.xyxy * h2.yxyx;
}

half4 func3(half3 h3) {
    return h3.xyzx * h3.xyzx;
}

half4 func4(half4 h4) {
    return h4 * h4;
}

half4 main(float2 coords) {
    S s;
    s.ah4[0] = half4(unknownInput);
    s.ah[0] = unknownInput;
    s.h4 = half4(unknownInput);
    s.h = unknownInput;

    S as[1];
    as[0].ah4[0] = half4(unknownInput);

    bool b = bool(unknownInput);
    int i = int(unknownInput);

    // These expressions are considered "trivial" and will be cloned directly into the inlined
    // function without a temporary variable.
    half4 var;
    var = func1(+s.h);
    var = funcb(b);
    var = func2(s.ah4[0].yw);
    var = func2(as[0].ah4[0].xy);
    var = func3(s.h4.zzz);
    var = func3(colorGreen.xyz);
    var = func3(s.h.xxx);
    var = func4(half4(s.h));
    var = func4(s.ah4[0].xxxy);
    var = func4(colorGreen);

    // These expressions are considered "non-trivial" and will be placed in a temporary variable
    // when inlining occurs.
    var = func1(-s.h);
    var = funcb(!b);
//  var = func2(as[i].h4.yw);  // indexing by non-constant expressions disallowed in ES2
    var = func3(s.h4.yyy + s.h4.zzz);
    var = func4(s.h4.y001);

    return colorGreen;
}
