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:
Matt Pharr
2011-12-15 11:09:23 -08:00
parent 17fdab2793
commit b8987faeee
4 changed files with 29 additions and 6 deletions

View File

@@ -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) {

View File

@@ -0,0 +1,8 @@
// Left hand side of assignment statement can't be assigned to
int foo() {return 2;}
int bar()
{
foo() = 2;
}

View File

@@ -0,0 +1,6 @@
// Can't assign to type "const uniform int32" on left-hand side
int bar(){
4 = 0;
}

View File

@@ -0,0 +1,7 @@
// Left hand side of assignment statement can't be assigned to
int bar(){
int x;
4 = x;
}