#version 120

in vec4 i;                // ERROR
out vec4 o;               // ERROR

attribute vec2 attv2;
attribute vec4 attv4;
uniform sampler2D s2D;
invariant varying vec2 centTexCoord;
invariant gl_Position;
centroid gl_Position;     // ERROR
centroid centroid foo;    // ERROR
invariant gl_Position, gl_PointSize;

void main()
{
    centTexCoord = attv2; 
    gl_Position = attv4;

    gl_ClipVertex = attv4;
    gl_ClipDistance[1] = 0.2;  // ERROR

    vec3[12] a;
    vec4[a.length()] b;
    gl_Position = b[b.length()-1];

    float f[];
    int a1 = f.length();  // ERROR
    float f[7];
    int aa = f.length();
    int a2 = f.length;    // ERROR
    int a3 = f.length(a); // ERROR
    int a4 = f.flizbit;   // ERROR
    int a4 = f.flizbit(); // ERROR
    float md[2][4];       // ERROR
    float[2] md2[4];      // ERROR
    float[2][4] md3;      // ERROR
    float md5, md6[2][3]; // ERROR
    float[2] md4, md7[4]; // ERROR
    float md9[2][3] = float[2][3](1, 2, 3, 4, 5, 6);  // ERROR
    float md10, md11[2][3] = float[2][3](1, 2, 3, 4, 5, 6);  // ERROR

    gl_PointSize = 3.8;
}

uniform float initted = 3.4;   // okay

const float concall = sin(0.3);

int[2][3] foo(                 // ERROR
              float[2][3] a,   // ERROR
              float[2] b[3],   // ERROR
              float c[2][3]);  // ERROR

int overloadA(in float f);
int overloadA(out float f);        // ERROR, different qualifiers
float overloadA(float);            // ERROR, different return value for same signature
float overloadA(out float f, int);
float overloadA(int i);

void overloadB(float, const in float) { }

vec2 overloadC(int, int);
vec2 overloadC(const in int, float);
vec2 overloadC(float, int);
vec2 overloadC(vec2, vec2);

vec3 overloadD(int, float);
vec3 overloadD(float, in int);

vec3 overloadE(float[2]);
vec3 overloadE(mat2 m);
vec3 overloadE(vec2 v);

vec3 overloadF(int);
vec3 overloadF(float);

void foo()
{
    float f;
    int i;

    overloadB(f, f);
    overloadB(f, 2);
    overloadB(1, i);

    overloadC(1);    // ERROR
    overloadC(1, i);
    overloadC(vec2(1), vec2(2));
    overloadC(f, 3.0);           // ERROR, no way
    overloadC(ivec2(1), vec2(2));

    overloadD(i, f);
    overloadD(f, i);
    overloadD(i, i);   // ERROR, ambiguous

    int overloadB;     // hiding
    overloadB(1, i);   // ERROR

    sin(1);
    texture2D(s2D, ivec2(0));
    clamp(attv4, 0, 1);
    clamp(ivec4(attv4), 0, 1);

    int a[2];
    overloadC(a, 3); // ERROR
    overloadE(a);    // ERROR
    overloadE(3.3);  // ERROR
    overloadE(vec2(3.3));
    overloadE(mat2(0.5));
    overloadE(ivec4(1)); // ERROR
    overloadE(ivec2(1));

    float b[2];
    overloadE(b);
    
    overloadF(1, 1); // ERROR
    overloadF(1);
}

varying vec4 gl_TexCoord[35]; // ERROR, size too big

// tests for output conversions
void outFun(in float, out ivec2, in int, out float);
int outFunRet(in float, out int, const in int, out ivec4);
ivec2 outFunRet(in float, out ivec4, in int, out ivec4);

void foo2()
{
    vec2 v2;
    vec4 v4;
    float f;
    int i;

    outFun(i, v2, i, f);
    outFunRet(i, f, i, v4);
    float ret = outFunRet(i, f, i, v4);
    vec2 ret2 = outFunRet(i, v4, i, v4);
    bool b = any(lessThan(v4, attv4));  // tests aggregate arg to unary built-in 
}

// version 130 features

uniform int c;

attribute ivec2 x;
attribute vec2 v2a;
attribute float c1D;
attribute vec2  c2D;
attribute vec3  c3D;

uniform vec4 v4;

void foo213()
{
    float f = 3;
    switch (c) {         // ERRORs...
    case 1:              
        f = sin(f);
        break;
    case 2:
        f = f * f;
    default:
        f = 3.0;
    }

    int i;          
    i << 3 | 0x8A >> 1 & 0xFF;      // ERRORs...

    vec3 modfOut, modfIn;
    vec3 v11 = modf(modfIn, modfOut); // ERRORS...
    float t = trunc(f);
    vec2 v12 = round(v2a);
    vec2 v13 = roundEven(v2a);
    bvec2 b10 = isnan(v2a);
    bvec4 b11 = isinf(v4);

    sinh(c1D) +                      // ERRORS...
    cosh(c1D) * tanh(c2D);
    asinh(c4D) + acosh(c4D);
    atanh(c3D);

    int id = gl_VertexID;            // ERROR
    gl_ClipDistance[1] = 0.3;        // ERROR
}

// token pasting (ERRORS...)

#define mac abc##def
int mac;

#define macr(A,B) A ## B
int macr(qrs,tuv);
