Merge pull request #652 from jbrodman/ptrarithlvalues
Fix a case for a missing lvalue for pointer arithmetic
This commit is contained in:
16
expr.cpp
16
expr.cpp
@@ -2798,6 +2798,17 @@ BinaryExpr::TypeCheck() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const Type *
|
||||||
|
BinaryExpr::GetLValueType() const {
|
||||||
|
const Type *t = GetType();
|
||||||
|
if (CastType<PointerType>(t) != NULL) {
|
||||||
|
// Are we doing something like (basePtr + offset)[...] = ...
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
BinaryExpr::EstimateCost() const {
|
BinaryExpr::EstimateCost() const {
|
||||||
@@ -4266,8 +4277,9 @@ IndexExpr::GetValue(FunctionEmitContext *ctx) const {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Symbol *baseSym = GetBaseSymbol();
|
Symbol *baseSym = GetBaseSymbol();
|
||||||
if (dynamic_cast<FunctionCallExpr *>(baseExpr) == NULL) {
|
if (dynamic_cast<FunctionCallExpr *>(baseExpr) == NULL &&
|
||||||
// Only check for non-function calls
|
dynamic_cast<BinaryExpr *>(baseExpr) == NULL) {
|
||||||
|
// Don't check if we're doing a function call or pointer arith
|
||||||
AssertPos(pos, baseSym != NULL);
|
AssertPos(pos, baseSym != NULL);
|
||||||
}
|
}
|
||||||
mask = lMaskForSymbol(baseSym, ctx);
|
mask = lMaskForSymbol(baseSym, ctx);
|
||||||
|
|||||||
1
expr.h
1
expr.h
@@ -155,6 +155,7 @@ public:
|
|||||||
|
|
||||||
llvm::Value *GetValue(FunctionEmitContext *ctx) const;
|
llvm::Value *GetValue(FunctionEmitContext *ctx) const;
|
||||||
const Type *GetType() const;
|
const Type *GetType() const;
|
||||||
|
const Type *GetLValueType() const;
|
||||||
void Print() const;
|
void Print() const;
|
||||||
|
|
||||||
Expr *Optimize();
|
Expr *Optimize();
|
||||||
|
|||||||
16
tests/ptr-arith-indexing.ispc
Normal file
16
tests/ptr-arith-indexing.ispc
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
|
||||||
|
export uniform int width() { return programCount; }
|
||||||
|
|
||||||
|
int foo(uniform float * uniform base, uniform int uOfs, varying int vOfs) {
|
||||||
|
return (base+uOfs)[vOfs];
|
||||||
|
}
|
||||||
|
|
||||||
|
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||||
|
uniform float * uniform ptr = &aFOO[0];
|
||||||
|
int val = foo(ptr, programCount, programIndex);
|
||||||
|
RET[programIndex] = val;
|
||||||
|
}
|
||||||
|
|
||||||
|
export void result(uniform float RET[]) {
|
||||||
|
RET[programIndex] = 1+programCount+programIndex;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user