Implemented #27, easy coercion from int to float

This commit is contained in:
2022-09-14 16:30:54 +01:00
parent 0f6be5ead7
commit 29b1c41064
3 changed files with 27 additions and 0 deletions

View File

@@ -0,0 +1,13 @@
//test int -> float coercion
{
var f: float = 0;
assert typeof f == float, "coercion on decl failed";
f = 42;
assert typeof f == float, "coercion on assign failed";
}
print "All good";

View File

@@ -544,6 +544,11 @@ static bool execVarDecl(Interpreter* interpreter, bool lng) {
parseCompoundToPureValues(interpreter, &val);
}
//BUGFIX: allow easy coercion on decl
if (AS_TYPE(type).typeOf == LITERAL_FLOAT && IS_INTEGER(val)) {
val = TO_FLOAT_LITERAL(AS_INTEGER(val));
}
if (!IS_NULL(val) && !setScopeVariable(interpreter->scope, identifier, val, false)) {
interpreter->errorOutput("Incorrect type assigned to variable \"");
printLiteralCustom(identifier, interpreter->errorOutput);
@@ -635,6 +640,12 @@ static bool execVarAssign(Interpreter* interpreter) {
return false;
}
//BUGFIX: allow easy coercion on assign
Literal type = getScopeType(interpreter->scope, lhs);
if (AS_TYPE(type).typeOf == LITERAL_FLOAT && IS_INTEGER(rhs)) {
rhs = TO_FLOAT_LITERAL(AS_INTEGER(rhs));
}
if (!setScopeVariable(interpreter->scope, lhs, rhs, true)) {
interpreter->errorOutput("Incorrect type assigned to variable \"");
printLiteralCustom(lhs, interpreter->errorOutput);
@@ -642,11 +653,13 @@ static bool execVarAssign(Interpreter* interpreter) {
freeLiteral(lhs);
freeLiteral(rhs);
freeLiteral(type);
return false;
}
freeLiteral(lhs);
freeLiteral(rhs);
freeLiteral(type);
return true;
}

View File

@@ -165,6 +165,7 @@ int main() {
char* filenames[] = {
"arithmetic.toy",
"casting.toy",
"coercions.toy",
"comparisons.toy",
"dot-and-matrix.toy",
"functions.toy",