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
This commit is contained in:
ringabout 2022-12-06 17:19:12 +08:00 • committed by GitHub
commit b2c7019006
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 144 additions and 30 deletions

34
tests/init/tlet.nim Normal file
View file

@ -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()

View file

@ -0,0 +1,5 @@
discard """
errormsg: "'let' symbol requires an initialization"
"""
let x: int

View file

@ -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()

View file

@ -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)