Add support for forward declarations of structures.
Now a declaration like 'struct Foo;' can be used to establish the name of a struct type, without providing a definition. One can pass pointers to such types around the system, but can't do much else with them (as in C/C++). Issue #125.
This commit is contained in:
36
tests/struct-forward-decl-2.ispc
Normal file
36
tests/struct-forward-decl-2.ispc
Normal file
@@ -0,0 +1,36 @@
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
struct Foo;
|
||||
|
||||
void bing(Foo * uniform);
|
||||
|
||||
struct Foo {
|
||||
int i;
|
||||
varying float f;
|
||||
Foo * uniform next;
|
||||
};
|
||||
|
||||
void bar(Foo * uniform f) {
|
||||
bing(f);
|
||||
}
|
||||
|
||||
|
||||
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
uniform Foo fa, fb;
|
||||
fa.next = &fb;
|
||||
fb.f = aFOO[programIndex];
|
||||
fb.i = 100;
|
||||
bar(&fa);
|
||||
RET[programIndex] = fb.f;
|
||||
}
|
||||
|
||||
|
||||
void bing(Foo * uniform f) {
|
||||
f = f->next;
|
||||
f->f *= 2;
|
||||
}
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
RET[programIndex] = 2 + 2*programIndex;
|
||||
}
|
||||
33
tests/struct-forward-decl.ispc
Normal file
33
tests/struct-forward-decl.ispc
Normal file
@@ -0,0 +1,33 @@
|
||||
|
||||
export uniform int width() { return programCount; }
|
||||
|
||||
struct Foo;
|
||||
|
||||
void bing(varying Foo * uniform);
|
||||
|
||||
struct Foo {
|
||||
float f;
|
||||
int i;
|
||||
};
|
||||
|
||||
void bar(varying Foo * uniform f) {
|
||||
bing(f);
|
||||
}
|
||||
|
||||
|
||||
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||
Foo f;
|
||||
f.f = aFOO[programIndex];
|
||||
f.i = programIndex;
|
||||
bar(&f);
|
||||
RET[programIndex] = f.f;
|
||||
}
|
||||
|
||||
|
||||
void bing(varying Foo * uniform f) {
|
||||
f->f *= 2;
|
||||
}
|
||||
|
||||
export void result(uniform float RET[]) {
|
||||
RET[programIndex] = 2 + 2*programIndex;
|
||||
}
|
||||
Reference in New Issue
Block a user