diff options
author | ringabout <43030857+ringabout@users.noreply.github.com> | 2022-12-06 17:19:12 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-12-06 10:19:12 +0100 |
commit | b2c70190061233f2aaaaacdfb36f8f5181c1f514 (patch) | |
tree | b77672304b9dc444b98954bff404a0cd9b9ccc08 /tests | |
parent | 6d8cf25bd7d9d0836c7c894cffae2cdb4f6a2503 (diff) | |
download | Nim-b2c70190061233f2aaaaacdfb36f8f5181c1f514.tar.gz |
definite assignment analysis for let (#21024)
* draft for let daa * patch * fixes bugs * errors for global let variable reassignments * checkpoint * out param accepts let * add more tests * add documentation * merge tests
Diffstat (limited to 'tests')
-rw-r--r-- | tests/init/tlet.nim | 34 | ||||
-rw-r--r-- | tests/init/tlet_uninit2.nim | 5 | ||||
-rw-r--r-- | tests/init/tlet_uninit3.nim | 24 | ||||
-rw-r--r-- | tests/init/tlet_uninit4.nim | 12 |
4 files changed, 75 insertions, 0 deletions
diff --git a/tests/init/tlet.nim b/tests/init/tlet.nim new file mode 100644 index 000000000..de0da23a6 --- /dev/null +++ b/tests/init/tlet.nim @@ -0,0 +1,34 @@ +{.experimental: "strictDefs".} + +proc bar(x: out string) = + x = "abc" + +proc foo() = + block: + let x: string + if true: + x = "abc" + else: + x = "def" + doAssert x == "abc" + block: + let y: string + bar(y) + doAssert y == "abc" + block: + let x: string + if true: + x = "abc" + discard "abc" + else: + x = "def" + discard "def" + doAssert x == "abc" + block: # + let x: int + block: # + let x: float + x = 1.234 + doAssert x == 1.234 +static: foo() +foo() diff --git a/tests/init/tlet_uninit2.nim b/tests/init/tlet_uninit2.nim new file mode 100644 index 000000000..174aa28f7 --- /dev/null +++ b/tests/init/tlet_uninit2.nim @@ -0,0 +1,5 @@ +discard """ + errormsg: "'let' symbol requires an initialization" +""" + +let x: int \ No newline at end of file diff --git a/tests/init/tlet_uninit3.nim b/tests/init/tlet_uninit3.nim new file mode 100644 index 000000000..cb786f8c8 --- /dev/null +++ b/tests/init/tlet_uninit3.nim @@ -0,0 +1,24 @@ +discard """ + cmd: "nim check $file" + action: "reject" + nimout: ''' +tlet_uninit3.nim(13, 5) Error: 'let' symbol requires an initialization +tlet_uninit3.nim(19, 5) Error: 'x' cannot be assigned to +tlet_uninit3.nim(23, 11) Error: 'let' symbol requires an initialization +''' +""" + +{.experimental: "strictDefs".} + +let global {.used.}: int + +proc foo() = + block: + let x: int + x = 13 + x = 14 + + block: + let x: int + doAssert x == 0 +foo() diff --git a/tests/init/tlet_uninit4.nim b/tests/init/tlet_uninit4.nim new file mode 100644 index 000000000..c57d15ff8 --- /dev/null +++ b/tests/init/tlet_uninit4.nim @@ -0,0 +1,12 @@ +discard """ + errormsg: "type mismatch: got <string>" +""" + +{.experimental: "strictDefs".} + +proc foo(x: var string) = + echo x + +proc bar() = + let x: string + foo(x) |