fixed more type checks, just assignable issues left

This commit is contained in:
Partho
2025-04-27 21:51:46 -04:00
parent 94815e237a
commit 31e8517601

View File

@ -258,6 +258,10 @@ definition:
TableNode *expected = getReturn(getTypeEntry(look_up(cur, $1))); TableNode *expected = getReturn(getTypeEntry(look_up(cur, $1)));
if ($8 == undefined) { if ($8 == undefined) {
throw_error(ERROR_TYPE, "Expected %s as return type but got undefined (possibly NULL). Differing return types in function.", getName(expected)); throw_error(ERROR_TYPE, "Expected %s as return type but got undefined (possibly NULL). Differing return types in function.", getName(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) { }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)); throw_error(ERROR_TYPE, "Expected %s as return type but got %s. Differing return types in function.", getName(expected), getName($8));
} else { } else {
@ -507,8 +511,16 @@ compound_statement statement_list {
$$ = $1; $$ = $1;
} else if ($1 == $2) { } else if ($1 == $2) {
$$ = $1; $$ = $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 { } 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; $$ = undefined;
} }
} }
@ -522,8 +534,16 @@ compound_statement statement_list {
$$ = $1; $$ = $1;
} else if ($1 == $3) { } else if ($1 == $3) {
$$ = $1; $$ = $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 { } 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; $$ = undefined;
} }
} }
@ -546,8 +566,18 @@ WHILE L_PAREN expression R_PAREN sblock {
$$ = $6; $$ = $6;
} else if ($6 == $8) { } else if ($6 == $8) {
$$ = $6; $$ = $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 { } 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; $$ = undefined;
} }
} }
@ -916,7 +946,7 @@ assignable:
} else {break;} } else {break;}
} }
} else { } 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))); throw_error(ERROR_TYPE, "expected %s expression in function call but got %s", getName(param), getName(getFirstEntry(cur)));
} }