From c333cb542c1df7da6f9f74f13417e903eb8fa9fe Mon Sep 17 00:00:00 2001 From: James Shubin Date: Sun, 17 Dec 2023 21:16:03 -0500 Subject: [PATCH] lang: ast: Expr Param and Poly should not have values Sometimes a recursive call through ExprVar's Value method would hit one of these and return (nil, nil) which would throw off things. --- lang/ast/structs.go | 4 ++-- .../TestAstFunc2/scope-lambda-printf.txtar | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 lang/interpret_test/TestAstFunc2/scope-lambda-printf.txtar diff --git a/lang/ast/structs.go b/lang/ast/structs.go index c0775eb3..171e1507 100644 --- a/lang/ast/structs.go +++ b/lang/ast/structs.go @@ -8682,7 +8682,7 @@ func (obj *ExprParam) SetValue(value types.Value) error { // usually only be valid once the engine has run and values have been produced. // This might get called speculatively (early) during unification to learn more. func (obj *ExprParam) Value() (types.Value, error) { - return nil, nil + return nil, fmt.Errorf("no value for ExprParam") } // ExprPoly is a polymorphic expression that is a definition that can be used in @@ -8799,7 +8799,7 @@ func (obj *ExprPoly) SetValue(value types.Value) error { // usually only be valid once the engine has run and values have been produced. // This might get called speculatively (early) during unification to learn more. func (obj *ExprPoly) Value() (types.Value, error) { - return nil, nil + return nil, fmt.Errorf("no value for ExprPoly") } // ExprIf represents an if expression which *must* have both branches, and which diff --git a/lang/interpret_test/TestAstFunc2/scope-lambda-printf.txtar b/lang/interpret_test/TestAstFunc2/scope-lambda-printf.txtar new file mode 100644 index 00000000..434d79dd --- /dev/null +++ b/lang/interpret_test/TestAstFunc2/scope-lambda-printf.txtar @@ -0,0 +1,12 @@ +-- main.mcl -- +import "fmt" +$format = "%d" # should get ignored +$fn = func($format) { + fmt.printf($format, 42) +} +test $fn("%s") {} +# should error at unification if possible, otherwise at runtime +# TODO: I would expect that if the "%s" and "%d" swapped, that speculatively we +# would be able to run this at compile time and know the result statically. +-- OUTPUT -- +# err: errStream: func `printf@??????????` stopped before it was loaded: base kind does not match (Str != Int)