#version 300 es

uniform mat4x3 m43;
uniform mat3x3 m33;
uniform mat4x4 m44;

in vec3 v3;
varying vec2 v2;               // ERROR, varying reserved
in vec4 bad[10];               // ERROR, no arrayed inputs
highp in vec4 badorder;        // ERROR, incorrect qualifier order
out invariant vec4 badorder2;  // ERROR, incorrect qualifier order
in centroid vec4 badorder4;    // ERROR, incorrect qualifier order
out flat vec4 badorder3;       // ERROR, incorrect qualifier order
void bar(in const float a);    // ERROR, incorrect qualifier order
void bar2(highp in float b);   // ERROR, incorrect qualifier order
smooth flat out vec4 rep;      // ERROR, replicating interpolation qualification
centroid sample out vec4 rep2; // ERROR, replicating auxiliary qualification
in uniform vec4 rep3;          // ERROR, replicating storage qualification

struct S {
    vec3 c;
    float f;
};

out S s;

void main()
{
    int id = gl_VertexID + gl_InstanceID;

    int c0 = gl_MaxVertexAttribs;
    int c1 = gl_MaxVertexUniformVectors;
    int c2 = gl_MaxVertexOutputVectors;
    int c3 = gl_MaxFragmentInputVectors;
    int c4 = gl_MaxVertexTextureImageUnits;
    int c5 = gl_MaxCombinedTextureImageUnits;
    int c6 = gl_MaxTextureImageUnits;
    int c7 = gl_MaxFragmentUniformVectors;
    int c8 = gl_MaxDrawBuffers;
    int c9 = gl_MinProgramTexelOffset;
    int c10 = gl_MaxProgramTexelOffset;

    mat3x4 tm = transpose(m43);
    highp float dm = determinant(m44);
    mat3x3 im = inverse(m33);

    mat3x2 op = outerProduct(v2, v3);

    gl_Position = m44[2];
    gl_PointSize = v2.y;

     s.c = v3;
     s.f = dm;

#ifdef GL_ES
#error GL_ES is set
#else
#error GL_ES is not set
#endif
}

float badsize[];    // ERROR
float[] badsize2;   // ERROR
uniform ub {
    int a[];        // ERROR
} ubInst[];         // ERROR
void foo(int a[]);  // ERROR
float okayA[] = float[](3.0f, 4.0F);  // Okay

out vec3 newV;
void newVFun()
{
    newV = v3;
}

invariant newV;  // ERROR, variable already used
in vec4 invIn;
invariant invIn; // ERROR, in v300
out S s2;
invariant s2;
invariant out S s3;
flat out int;

uniform ub2 {
    float f;
} a;

uniform ub2 {  // ERROR redeclaration of block name (same instance name)
    float g;
} a;

uniform ub2 {  // ERROR redeclaration of block name (different instance name)
    float f;
} c;

uniform ub2 {  // ERROR redeclaration of block name (no instance name)
    float f123;
};

uniform ub3 {
    bool b23;
};

uniform ub3 {  // ERROR redeclaration of block name (no instance name in first or declared)
    bool b234;
};

precision lowp sampler3D;
precision lowp sampler2DShadow;
precision lowp sampler2DArrayShadow;

uniform sampler2D s2D;
uniform sampler3D s3D;
uniform sampler2DShadow s2DS;
uniform sampler2DArrayShadow s2DAS;
in vec2 c2D;

void foo23()
{
    ivec2 x1 = textureSize(s2D, 2);
    textureSize(s2D);        // ERROR, no lod
    ivec3 x3 = textureSize(s2DAS, -1);
    textureSize(s2DAS);      // ERROR, no lod
    vec4 x4 = texture(s2D, c2D);
    texture(s2D, c2D, 0.2);  // ERROR, bias
    vec4 x5 = textureProjOffset(s3D, vec4(0.2), ivec3(1));
    textureProjOffset(s3D, vec4(0.2), ivec3(1), .03);  // ERROR, bias
    float x6 = textureProjGradOffset(s2DS, invIn, vec2(4.2), vec2(5.3), ivec2(1));
}

int fgfg(float f, mediump int i);
int fgfg(float f, highp int i);   // ERROR, precision qualifier difference

int fgfgh(float f, const in mediump int i);
int fgfgh(float f, in mediump int i);   // ERROR, precision qualifier difference

void foo2349()
{
    float[] x = float[] (1.0, 2.0, 3.0);
	float[] y = x;
    float[3] z = x;
    float[3] w;
    w = y;
}

int[] foo213234();        // ERROR
int foo234234(float[]);   // ERROR
int foo234235(vec2[] v);  // ERROR
precision highp float[2]; // ERROR

int fffg(float f);
int fffg(float f);

int gggf(float f);
int gggf(float f) { return 2; }
int gggf(float f);

int agggf(float f) { return 2; }
int agggf(float f);

out struct Ssss { float f; } ssss;

uniform Bblock {
   int a;
} Binst;
int Bfoo;

layout(std140) Binst;    // ERROR
layout(std140) Bblock;   // ERROR
layout(std140) Bfoo;     // ERROR

layout(std430) uniform B430 { int a; } B430i;     // ERROR

struct SNA {
    int a[];             // ERROR
};

void fooDeeparray()
{
    float[] x = float[] (1.0, 2.0, 3.0),
            y = float[] (1.0, 2.0, 3.0, 4.0);
    float xp[3], yp[4];
    xp = x;
    yp = y;
    xp = y; // ERROR, wrong size
    yp = x; // ERROR, wrong size
}
