From da8319699664e02166a2536d234ed6b61d2f74c1 Mon Sep 17 00:00:00 2001 From: Dmitry Babokin Date: Tue, 30 Dec 2014 18:11:39 +0300 Subject: [PATCH] Adding missing AddressOfExpr::GetLValueType() --- expr.cpp | 13 +++++++++++++ expr.h | 1 + tests/ref-10.ispc | 24 ++++++++++++++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 tests/ref-10.ispc 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; +}