#version 420 core

// testing input arrays without a gl_in[] block redeclaration, see 400.geom for with

int i;

void foo()
{
    gl_in.length();  // ERROR
    gl_in[1].gl_Position;
    gl_in[i].gl_Position;  // ERROR
}

layout(triangles) in;

in vec4 color3[3];

void foo3()
{
    gl_in.length();
    gl_in[i].gl_Position;
    color3.length();
}

uniform sampler2D s2D;
in vec2 coord[];
uniform vec4 v4;

void foo4()
{
    const ivec2 offsets[5] =
    {
        ivec2(0,1),
        ivec2(1,-2),
        ivec2(0,3),
        ivec2(-3,0),
        ivec2(2,1)
    };

    vec4 v = textureGatherOffset(s2D, coord[0], offsets[i].xy);

    offsets[i].xy = ivec2(3);  // ERROR
    v4.x = 3.2;                // ERROR
    v4.xy;   // should have non-uniform type
}

out gl_PerVertex {
    float gl_PointSize[1];  // ERROR, adding array
    float gl_ClipDistance;  // ERROR, removing array
};

float foo5()
{
    return i;  // implicit conversion of return type
}
