diff --git a/expr.cpp b/expr.cpp index 69056426..006e179d 100644 --- a/expr.cpp +++ b/expr.cpp @@ -7741,6 +7741,19 @@ AddressOfExpr::GetType() const { } +const Type * +AddressOfExpr::GetLValueType() const { + if (!expr) + return NULL; + + const Type *type = expr->GetType(); + if (!type) + return NULL; + + return PointerType::GetUniform(type); +} + + Symbol * AddressOfExpr::GetBaseSymbol() const { return expr ? expr->GetBaseSymbol() : NULL; diff --git a/expr.h b/expr.h index 7d209bba..c1570412 100644 --- a/expr.h +++ b/expr.h @@ -543,6 +543,7 @@ public: llvm::Value *GetValue(FunctionEmitContext *ctx) const; const Type *GetType() const; + const Type *GetLValueType() const; Symbol *GetBaseSymbol() const; void Print() const; Expr *TypeCheck(); diff --git a/tests/ref-10.ispc b/tests/ref-10.ispc new file mode 100644 index 00000000..82be2cd2 --- /dev/null +++ b/tests/ref-10.ispc @@ -0,0 +1,24 @@ + +export uniform int width() { return programCount; } + + +struct Foo { + float a, b, c; +}; + +void foo(Foo &f, uniform int dim) { + (&f.a)[dim] += (&f.a)[dim]; +} + +export void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) { + Foo f = { b, aFOO[programIndex], 1 }; + if (programIndex < 2) + foo(f, 0); + RET[programIndex] = f.a + f.b + f.c; +} + +export void result(uniform float RET[]) { + RET[programIndex] = 7+programIndex; + RET[0] = 12; + RET[1] = 13; +}