fixed more type checks, just assignable issues left
This commit is contained in:
@ -258,7 +258,11 @@ definition:
|
||||
TableNode *expected = getReturn(getTypeEntry(look_up(cur, $1)));
|
||||
if ($8 == undefined) {
|
||||
throw_error(ERROR_TYPE, "Expected %s as return type but got undefined (possibly NULL). Differing return types in function.", getName(expected));
|
||||
} else if ($8 != expected) {
|
||||
} else if (getAdInfoType(expected)==TYPE_ARRAY_TYPE && $8 == addr){
|
||||
printdebug("CORRECT RETURN TYPE!!!");
|
||||
} else if (getAdInfoType(expected)==TYPE_RECORD_TYPE && $8 == addr){
|
||||
printdebug("CORRECT RETURN TYPE!!!");
|
||||
}else if ($8 != expected) {
|
||||
throw_error(ERROR_TYPE, "Expected %s as return type but got %s. Differing return types in function.", getName(expected), getName($8));
|
||||
} else {
|
||||
printdebug("CORRECT RETURN TYPE!!!");
|
||||
@ -507,8 +511,16 @@ compound_statement statement_list {
|
||||
$$ = $1;
|
||||
} else if ($1 == $2) {
|
||||
$$ = $1;
|
||||
}else if((getAdInfoType((TableNode*)$1) == TYPE_ARRAY_TYPE) && ((TableNode*)$2)==addr){
|
||||
$$ = $1;
|
||||
}else if((getAdInfoType((TableNode*)$1) == TYPE_RECORD_TYPE) && ((TableNode*)$2)==addr){
|
||||
$$ = $1;
|
||||
}else if(((TableNode*)$1)==addr && (getAdInfoType((TableNode*)$2) == TYPE_ARRAY_TYPE)){
|
||||
$$ = $2;
|
||||
}else if(((TableNode*)$1)==addr && (getAdInfoType((TableNode*)$2) == TYPE_RECORD_TYPE)){
|
||||
$$ = $2;
|
||||
} else {
|
||||
printdebug("differing return types within same function at line %d, column %d", @1.first_line, @1.first_column);
|
||||
printdebug("1 differing return types within same function at line %d, column %d", @1.first_line, @1.first_column);
|
||||
$$ = undefined;
|
||||
}
|
||||
}
|
||||
@ -522,8 +534,16 @@ compound_statement statement_list {
|
||||
$$ = $1;
|
||||
} else if ($1 == $3) {
|
||||
$$ = $1;
|
||||
}else if((getAdInfoType((TableNode*)$1) == TYPE_ARRAY_TYPE) && ((TableNode*)$3)==addr){
|
||||
$$ = $1;
|
||||
}else if((getAdInfoType((TableNode*)$1) == TYPE_RECORD_TYPE) && ((TableNode*)$3)==addr){
|
||||
$$ = $1;
|
||||
}else if(((TableNode*)$1)==addr && (getAdInfoType((TableNode*)$3) == TYPE_ARRAY_TYPE)){
|
||||
$$ = $3;
|
||||
}else if(((TableNode*)$1)==addr && (getAdInfoType((TableNode*)$3) == TYPE_RECORD_TYPE)){
|
||||
$$ = $3;
|
||||
} else {
|
||||
printdebug("differing return types within same function at line %d, column %d", @1.first_line, @1.first_column);
|
||||
printdebug("2 differing return types within same function at line %d, column %d", @1.first_line, @1.first_column);
|
||||
$$ = undefined;
|
||||
}
|
||||
}
|
||||
@ -546,8 +566,18 @@ WHILE L_PAREN expression R_PAREN sblock {
|
||||
$$ = $6;
|
||||
} else if ($6 == $8) {
|
||||
$$ = $6;
|
||||
}else if((getAdInfoType((TableNode*)$6) == TYPE_ARRAY_TYPE) && ((TableNode*)$8)==addr){
|
||||
$$ = $6;
|
||||
}else if((getAdInfoType((TableNode*)$6) == TYPE_RECORD_TYPE) && ((TableNode*)$8)==addr){
|
||||
$$ = $6;
|
||||
}else if(((TableNode*)$6)==addr && (getAdInfoType((TableNode*)$8) == TYPE_ARRAY_TYPE)){
|
||||
$$ = $8;
|
||||
}else if(((TableNode*)$6)==addr && (getAdInfoType((TableNode*)$8) == TYPE_RECORD_TYPE)){
|
||||
$$ = $8;
|
||||
} else {
|
||||
printdebug("differing return types within same function at line %d, column %d", @1.first_line, @1.first_column);
|
||||
printdebug("3 differing return types within same function at line %d, column %d", @1.first_line, @1.first_column);
|
||||
printf("%s\n", getName((TableNode*)$6));
|
||||
printf("%s\n", getName((TableNode*)$8));
|
||||
$$ = undefined;
|
||||
}
|
||||
}
|
||||
@ -916,7 +946,7 @@ assignable:
|
||||
} else {break;}
|
||||
}
|
||||
} else {
|
||||
if (strcmp(getName(param), getName(getFirstEntry(cur))) != 0) {
|
||||
if (strcmp(getName(param), getType(getFirstEntry(cur))) != 0) {
|
||||
throw_error(ERROR_TYPE, "expected %s expression in function call but got %s", getName(param), getName(getFirstEntry(cur)));
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user