diff --git a/scripts/test/coercions.toy b/scripts/test/coercions.toy new file mode 100644 index 0000000..19acf6e --- /dev/null +++ b/scripts/test/coercions.toy @@ -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"; diff --git a/source/interpreter.c b/source/interpreter.c index db8f10c..06bea60 100644 --- a/source/interpreter.c +++ b/source/interpreter.c @@ -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; } diff --git a/test/test_interpreter.c b/test/test_interpreter.c index 9d434f6..dfa4a24 100644 --- a/test/test_interpreter.c +++ b/test/test_interpreter.c @@ -165,6 +165,7 @@ int main() { char* filenames[] = { "arithmetic.toy", "casting.toy", + "coercions.toy", "comparisons.toy", "dot-and-matrix.toy", "functions.toy",