summaryrefslogtreecommitdiff
path: root/parser
diff options
context:
space:
mode:
authorMarc Vertes <mvertes@free.fr>2024-03-12 09:50:32 +0100
committerMarc Vertes <mvertes@free.fr>2024-03-12 09:50:32 +0100
commita3116a6613363f303b84f5f704f5e87495d4f3b9 (patch)
tree3cf04ff2687e6e3f15bd96f752fc758aeac005c3 /parser
parent89e1575f1d7e542b843a53ba7434ac0f034a63fb (diff)
fix: force adding a return at end of function
This will avoid infinite loops, and is necessary for functions with no returned values. This doesn't remove the need to better check the consistency of return statements in general.
Diffstat (limited to 'parser')
-rw-r--r--parser/interpreter_test.go1
-rw-r--r--parser/parse.go9
2 files changed, 10 insertions, 0 deletions
diff --git a/parser/interpreter_test.go b/parser/interpreter_test.go
index c3f2909..8f166df 100644
--- a/parser/interpreter_test.go
+++ b/parser/interpreter_test.go
@@ -97,6 +97,7 @@ func TestFunc(t *testing.T) {
{src: "func f(a int) int {return a+2}; f(5) - f(3)", res: "2"},
{src: "func f(a int) int {return a+2}; f(3) - 2", res: "3"},
{src: "func f(a, b, c int) int {return a+b-c} ; f(7, 1, 3)", res: "5"},
+ {src: "var a int; func f() {a = a+2}; f(); a", res: "2"},
})
}
diff --git a/parser/parse.go b/parser/parse.go
index ffa8102..c13c33d 100644
--- a/parser/parse.go
+++ b/parser/parse.go
@@ -246,6 +246,15 @@ func (p *Parser) ParseFunc(in Tokens) (out Tokens, err error) {
out = append(out, scanner.Token{Id: lang.Grow, Beg: l})
}
out = append(out, toks...)
+ if out[len(out)-1].Id != lang.Return {
+ // Ensure that a return statment is always added at end of function.
+ // TODO: detect missing or wrong returns
+ x, err := p.ParseReturn([]scanner.Token{{Id: lang.Return}})
+ if err != nil {
+ return out, err
+ }
+ out = append(out, x...)
+ }
out = append(out, scanner.Token{Id: lang.Label, Str: fname + "_end"})
return out, err
}