Type convert arrays in select expressions to pointers to the first element.

Fixes issue #345.
This commit is contained in:
Matt Pharr
2012-08-03 11:53:59 -07:00
parent 49dde7c6f2
commit 8f5189f606
2 changed files with 30 additions and 8 deletions

View File

@@ -3274,15 +3274,19 @@ SelectExpr::TypeCheck() {
if (!type1 || !type2)
return NULL;
if (CastType<ArrayType>(type1)) {
Error(pos, "Array type \"%s\" can't be used in select expression",
type1->GetString().c_str());
return NULL;
if (const ArrayType *at1 = CastType<ArrayType>(type1)) {
expr1 = TypeConvertExpr(expr1, PointerType::GetUniform(at1->GetBaseType()),
"select");
if (expr1 == NULL)
return NULL;
type1 = expr1->GetType();
}
if (CastType<ArrayType>(type2)) {
Error(pos, "Array type \"%s\" can't be used in select expression",
type2->GetString().c_str());
return NULL;
if (const ArrayType *at2 = CastType<ArrayType>(type2)) {
expr2 = TypeConvertExpr(expr2, PointerType::GetUniform(at2->GetBaseType()),
"select");
if (expr2 == NULL)
return NULL;
type2 = expr2->GetType();
}
const Type *testType = test->GetType();

View File

@@ -0,0 +1,18 @@
uniform float a[1234];
float * uniform func(uniform bool x) {
return x ? a : NULL;
}
export uniform int width() { return programCount; }
export void f_f(uniform float RET[], uniform float aFOO[]) {
a[programIndex] = aFOO[programIndex];
float * uniform ptr = func(aFOO[0] == 1);
RET[programIndex] = ptr[programIndex];
}
export void result(uniform float RET[]) {
RET[programIndex] = 1 + programIndex;
}