We were (unintentionally) only using structural equivalence to compare struct types.
Now we require that the struct name match for two struct types to be the same. Added a test to check this. (Also removed a stale test, movmsk-opt.ispc)
This commit is contained in:
@@ -1,35 +0,0 @@
|
||||
static float float4(uniform float a, uniform float b, uniform float c,
|
||||
uniform float d) {
|
||||
float ret = 0;
|
||||
for (uniform int i = 0; i < programCount; i += 4) {
|
||||
ret = insert(ret, i + 0, a);
|
||||
ret = insert(ret, i + 1, b);
|
||||
ret = insert(ret, i + 2, c);
|
||||
ret = insert(ret, i + 3, d);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
|
||||
|
||||
export void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) {
|
||||
float a = aFOO[programIndex];
|
||||
uniform int ret = 0;
|
||||
|
||||
float v = float4(1,1,0,0);
|
||||
bool b = (v == 1.);
|
||||
ret = __movmsk((sign_extend(b)));
|
||||
RET[programIndex] = ret;
|
||||
}
|
||||
|
||||
|
||||
// fixme for 16-wide...
|
||||
export void result(uniform float RET[]) {
|
||||
uniform int x = -1234;
|
||||
if (programCount == 4) x = 3;
|
||||
else if (programCount == 8) x = 0x33;
|
||||
else if (programCount == 16) x = 0x3333;
|
||||
RET[programIndex] = x;
|
||||
}
|
||||
14
tests_errors/struct_type_equality.ispc
Normal file
14
tests_errors/struct_type_equality.ispc
Normal file
@@ -0,0 +1,14 @@
|
||||
// Can't convert between different struct types "uniform struct Foo" and "uniform struct Bar"
|
||||
|
||||
struct Foo {
|
||||
int a;
|
||||
};
|
||||
|
||||
struct Bar {
|
||||
int x;
|
||||
};
|
||||
|
||||
void f(Foo a) {
|
||||
Bar b;
|
||||
b =a;
|
||||
}
|
||||
2
type.cpp
2
type.cpp
@@ -2448,6 +2448,8 @@ lCheckTypeEquality(const Type *a, const Type *b, bool ignoreConst) {
|
||||
if (sta != NULL && stb != NULL) {
|
||||
if (sta->GetElementCount() != stb->GetElementCount())
|
||||
return false;
|
||||
if (sta->GetStructName() != stb->GetStructName())
|
||||
return false;
|
||||
for (int i = 0; i < sta->GetElementCount(); ++i)
|
||||
if (!lCheckTypeEquality(sta->GetElementType(i), stb->GetElementType(i),
|
||||
ignoreConst))
|
||||
|
||||
Reference in New Issue
Block a user