Do assignment lvalue error checking in type checking
Added some tests related to this. Also improved source file position reporting in error reporting.
This commit is contained in:
14
expr.cpp
14
expr.cpp
@@ -2037,12 +2037,8 @@ AssignExpr::GetValue(FunctionEmitContext *ctx) const {
|
||||
ctx->SetDebugPos(pos);
|
||||
|
||||
Symbol *baseSym = lvalue->GetBaseSymbol();
|
||||
if (!baseSym) {
|
||||
// FIXME: I think that this check also is unnecessary and that this
|
||||
// case should be covered during type checking.
|
||||
Error(pos, "Left hand side of assignment statement can't be assigned to.");
|
||||
return NULL;
|
||||
}
|
||||
// Should be caught during type-checking...
|
||||
assert(baseSym != NULL);
|
||||
|
||||
switch (op) {
|
||||
case Assign: {
|
||||
@@ -2180,6 +2176,12 @@ AssignExpr::TypeCheck() {
|
||||
}
|
||||
}
|
||||
|
||||
if (lvalue->GetBaseSymbol() == NULL) {
|
||||
Error(lvalue->pos, "Left hand side of assignment statement can't be "
|
||||
"assigned to.");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const Type *lhsType = lvalue->GetType();
|
||||
if (dynamic_cast<const PointerType *>(lhsType) != NULL) {
|
||||
if (op == AddAssign || op == SubAssign) {
|
||||
|
||||
8
tests_errors/lvalue-1.ispc
Normal file
8
tests_errors/lvalue-1.ispc
Normal file
@@ -0,0 +1,8 @@
|
||||
// Left hand side of assignment statement can't be assigned to
|
||||
|
||||
int foo() {return 2;}
|
||||
|
||||
int bar()
|
||||
{
|
||||
foo() = 2;
|
||||
}
|
||||
6
tests_errors/lvalue-2.ispc
Normal file
6
tests_errors/lvalue-2.ispc
Normal file
@@ -0,0 +1,6 @@
|
||||
// Can't assign to type "const uniform int32" on left-hand side
|
||||
|
||||
int bar(){
|
||||
4 = 0;
|
||||
}
|
||||
|
||||
7
tests_errors/lvalue-3.ispc
Normal file
7
tests_errors/lvalue-3.ispc
Normal file
@@ -0,0 +1,7 @@
|
||||
// Left hand side of assignment statement can't be assigned to
|
||||
|
||||
int bar(){
|
||||
int x;
|
||||
4 = x;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user