nVidia GLSL linking errors when uniforms mixed with array access

Have observed some problems when linking successfully compiled shaders using the GeForce 8800 GTX/PCI/SSE2 render, using ForceWare version 169.25.

`uniform int uniSingle;
uniform ivec2 uniPair;
void main() {
float myArray[25];

// using a uniform to access an array causes “error C1011: cannot index a non-array value”
myArray[uniSingle];

// accessing a uniform itself as an array also causes the same link error
uniPair[1];

// this links though
uniPair.y;
}`

I have employed permanent workarounds, but though I would document this when I could not it done so before.

What happens if you try…?

uniform ivec2 uniPair(0);

the Nvidia compiler does a lot of optimizations (some of them accrue in the linking process). eg: never used uniforms are optimized away…
maybe this is your problem?

your sample compiles and links on a X1600 but I bet it wont on my GF 7…

Chris;
Trying to do what you ask results in compile errors:
(1) : error C0000: syntax error, unexpected integer constant at token "<int-const>" (1) : error C0501: type name expected at token "<int-const>" (1) : warning C7011: implicit cast from "int" to "float" (1) : error C1010: expression left of ."x" is not a struct or array (1) : error C1010: expression left of ."y" is not a struct or array

Those after the first two, are just repercussions of the initial error, later in the source.

Michael (I believe);
I was only documenting this for others. I think I am good.

It looks like just expressing the uniPair as a structure(.x or .y) fixes that issue in a shader am still test running. Pretty sure you would get this error regardless of whether it is in dead code or not.

I changed my design in another shader to avoid the issue I had using a uniform to index an array. Kind of cheated, and am not even using a uniform. That shader completely tested!

It fails on GF 8, so it is very likely to fail on GF 7.

Thanks guys.