#version 450 core

buffer bn {
    int a[];
    float b[];
} buf;

uniform un {
    int a[];
    float b[];
} ubuf;

buffer bna {
    int a[];
    float b[];
} bufa[4];

uniform una {
    int a[];
    float b[];
} ubufa[4];

buffer abn {
    int aba[];
    float abb[];
};

uniform aun {
    int aua[];
    float aub[];
};

layout(binding=1)                             uniform samplerBuffer       uniformTexelBufferDyn[];
layout(binding=2, r32f)                       uniform imageBuffer         storageTexelBufferDyn[];
layout(binding=3)                             uniform uname { float a; }  uniformBuffer[];
layout(binding=4)                             buffer  bname { float b; }  storageBuffer[];
layout(binding=5)                             uniform sampler2D           sampledImage[];
layout(binding=6, r32f)                       uniform image2D             storageImage[];
layout(binding=8)                             uniform samplerBuffer       uniformTexelBuffer[];
layout(binding=9, r32f)                       uniform imageBuffer         storageTexelBuffer[];

int i;

void main()
{
    ubuf.a[3];
    ubuf.b[3];
    buf.a[3];
    buf.b[3];

    ubufa[3].a[3];
    ubufa[3].b[3];
    bufa[3].a[3];
    bufa[3].b[3];

    aua[3];
    aub[3];
    aba[3];
    abb[3];

    ubuf.a[i];             // ERROR
    ubuf.b[i];             // ERROR
    buf.a[i];              // ERROR
    buf.b[i];

    ubuf.a.length();       // ERROR
    ubuf.b.length();       // ERROR
    buf.a.length();        // ERROR
    buf.b.length();

    ubufa[1].a[i];         // ERROR
    ubufa[1].b[i];         // ERROR
    bufa[1].a[i];          // ERROR
    bufa[1].b[i];

    ubufa[1].a.length();   // ERROR
    ubufa[1].b.length();   // ERROR
    bufa[1].a.length();    // ERROR
    bufa[1].b.length();

    aua[i];                // ERROR
    aub[i];                // ERROR
    aba[i];                // ERROR
    abb[i];

    aua.length();          // ERROR
    aub.length();          // ERROR
    aba.length();          // ERROR
    abb.length();

    uniformTexelBufferDyn[1];
    storageTexelBufferDyn[1];
    uniformBuffer[1];
    storageBuffer[1];
    sampledImage[1];
    storageImage[1];
    uniformTexelBuffer[1];
    storageTexelBuffer[1];

    uniformTexelBufferDyn[i];  // ERROR, need extension
    storageTexelBufferDyn[i];  // ERROR, need extension
    uniformBuffer[i];          // ERROR, need extension
    storageBuffer[i];          // ERROR, need extension
    sampledImage[i];           // ERROR, need extension
    storageImage[i];           // ERROR, need extension
    uniformTexelBuffer[i];     // ERROR, need extension
    storageTexelBuffer[i];     // ERROR, need extension

    float local[] = ubuf.b;    // ERROR, can initialize with runtime-sized array
}