enable experimental:strictDefs (#24225)

This commit is contained in:
ringabout
2024-11-24 05:01:39 +08:00
committed by GitHub
parent 555191a3f0
commit 2df633180a
86 changed files with 276 additions and 255 deletions

View File

@@ -3,3 +3,5 @@ switch("styleCheck", "error")
switch("define", "nimPreviewSlimSystem")
switch("define", "nimPreviewCstringConversion")
switch("define", "nimPreviewProcConversion")
switch("warningAserror", "ProveInit")
switch("warningAserror", "Uninit")

View File

@@ -124,7 +124,7 @@ proc main() =
var x = @[1, 7, 8, 11, 21, 33, 45, 99]
var y = @[6, 7, 9, 12, 57, 66]
var merged: seq[int]
var merged: seq[int] = @[]
merged.merge(x, y)
doAssert merged.isSorted
doAssert merged == sorted(x & y)
@@ -133,7 +133,7 @@ proc main() =
var x = @[111, 88, 76, 56, 45, 31, 22, 19, 11, 3]
var y = @[99, 85, 83, 82, 69, 64, 48, 42, 33, 31, 26, 13]
var merged: seq[int]
var merged: seq[int] = @[]
merged.merge(x, y, (x, y) => -system.cmp(x, y))
doAssert merged.isSorted((x, y) => -system.cmp(x, y))
doAssert merged == sorted(x & y, SortOrder.Descending)
@@ -142,7 +142,7 @@ proc main() =
var x: seq[int] = @[]
var y = @[1]
var merged: seq[int]
var merged: seq[int] = @[]
merged.merge(x, y)
doAssert merged.isSorted
doAssert merged.isSorted(SortOrder.Descending)
@@ -152,7 +152,7 @@ proc main() =
var x = [1, 3, 5, 5, 7]
var y: seq[int] = @[]
var merged: seq[int]
var merged: seq[int] = @[]
merged.merge(x, y)
doAssert merged.isSorted
doAssert merged == @x
@@ -167,26 +167,26 @@ proc main() =
block:
var x: array[0, int]
var x = default(array[0, int])
var y = [1, 4, 6, 7, 9]
var merged: seq[int]
var merged: seq[int] = @[]
merged.merge(x, y)
doAssert merged.isSorted
doAssert merged == @y
block:
var x: array[0, int]
var y: array[0, int]
var x: array[0, int] = []
var y: array[0, int] = []
var merged: seq[int]
var merged: seq[int] = @[]
merged.merge(x, y)
doAssert merged.isSorted
doAssert merged.len == 0
block:
var x: array[0, int]
var y: array[0, int]
var x: array[0, int] = []
var y: array[0, int] = []
var merged: seq[int] = @[99, 99, 99]
merged.setLen(0)
@@ -195,10 +195,10 @@ proc main() =
doAssert merged.len == 0
block:
var x: seq[int]
var y: seq[int]
var x: seq[int] = @[]
var y: seq[int] = @[]
var merged: seq[int]
var merged: seq[int] = @[]
merged.merge(x, y)
doAssert merged.isSorted
doAssert merged.len == 0
@@ -245,7 +245,7 @@ proc main() =
var x = @[r(-12), r(1), r(3), r(8), r(13), r(88)]
var y = @[r(4), r(7), r(12), r(13), r(77), r(99)]
var merged: seq[Record]
var merged: seq[Record] = @[]
merged.setLen(0)
merged.merge(x, y, ascendingCmp)
doAssert merged.isSorted(ascendingCmp)
@@ -267,7 +267,7 @@ proc main() =
doAssert merged == sorted(x & y, ascendingCmp)
var x: seq[(int, int)]
var x: seq[(int, int)] = @[]
x.merge([(1,1)], [(1,2)], (a,b) => a[0] - b[0])
doAssert x == @[(1, 1), (1, 2)]

View File

@@ -173,7 +173,7 @@ proc main() =
block:
# basic mask operations (mutating)
var v: uint8
var v: uint8 = 0'u8
v.setMask(0b1100_0000)
v.setMask(0b0000_1100)
doAssert v == 0b1100_1100
@@ -254,7 +254,7 @@ proc main() =
doAssert a.clearMasked(3 .. 6) == 0b1000_0100
block:
# single bit operations
var v: uint8
var v: uint8 = 0'u8
v.setBit(0)
doAssert v == 0x0000_0001
v.setBit(1)
@@ -269,7 +269,7 @@ proc main() =
doAssert not v.testBit(6)
block:
# multi bit operations
var v: uint8
var v: uint8 = 0'u8
v.setBits(0, 1, 7)
doAssert v == 0b1000_0011
v.flipBits(2, 3)
@@ -278,11 +278,11 @@ proc main() =
doAssert v == 0b0000_1100
block:
# signed
var v: int8
var v: int8 = 0'i8
v.setBit(7)
doAssert v == -128
block:
var v: uint64
var v: uint64 = 0'u64
v.setBit(63)
doAssert v == 0b1000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000'u64
@@ -335,7 +335,7 @@ proc main() =
block: # not ready for vm because exception is compile error
try:
var v: uint32
var v: uint32 = 0'u32
var i = 32
v.setBit(i)
doAssert false

View File

@@ -190,7 +190,7 @@ proc main() =
doAssert $a == "[10, 20, 30]"
block:
var a, b: Deque[int]
var a, b: Deque[int] = initDeque[int]()
for i in 1 .. 256:
a.addLast(i)
for i in 1 .. 255:

View File

@@ -8,6 +8,7 @@ import std/strutils
import std/assertions
proc testHelper(f: seq[Item]): string =
result = ""
for it in f:
result.add(
$it.deletedA & "." & $it.insertedB & "." & $it.startA & "." & $it.startB & "*"

View File

@@ -25,7 +25,7 @@ proc leakCheck(f: AsyncFD | int | FileHandle | SocketHandle, msg: string,
var args = @[$f.int, msg, $expectLeak]
when defined(windows):
var refFd: Handle
var refFd: Handle = default(Handle)
# NOTE: This function shouldn't be used to duplicate sockets,
# as this function may mess with the socket internal refcounting.
# but due to the lack of type segmentation in the stdlib for
@@ -51,7 +51,7 @@ proc leakCheck(f: AsyncFD | int | FileHandle | SocketHandle, msg: string,
proc isValidHandle(f: int): bool =
## Check if a handle is valid. Requires OS-native handles.
when defined(windows):
var flags: DWORD
var flags: DWORD = default(DWORD)
result = getHandleInformation(f.Handle, addr flags) != 0
else:
result = fcntl(f.cint, F_GETFD) != -1
@@ -88,7 +88,7 @@ proc main() =
defer: close client
client.connect("127.0.0.1", port)
var input: Socket
var input: Socket = default(Socket)
server.accept(input)
leakCheck(input.getFd, "accept()")

View File

@@ -12,12 +12,12 @@ when manualTest:
import strformat
proc frexp_test(lo, hi, step: float64) =
var exp: int
var exp: int = 0
var frac: float64
var eps = 1e-15.float64
var x:float64 = lo
var x: float64 = lo
while x <= hi:
frac = frexp(x.float, exp)
let rslt = pow(2.0, float(exp)) * frac

View File

@@ -54,7 +54,7 @@ proc main =
x.a = val
m1()
var x0: Foo
var x0: Foo = Foo()
x0.a1 = 10
doAssert x0 == Foo(a: 10)

View File

@@ -112,7 +112,7 @@ proc main() =
when sizeof(int) == 8 or defined(js):
block:
var s: seq[Hash]
var s: seq[Hash] = @[]
for a in [0.0, 1.0, -1.0, 1000.0, -1000.0]:
let b = hash(a)
doAssert b notin s
@@ -197,7 +197,7 @@ proc main() =
doAssert hash(Obj5(t: false, x: 1)) != hash(Obj5(t: true, y: 2))
block: # hash(ref|ptr|pointer)
var a: array[10, uint8]
var a: array[10, uint8] = default(array[10, uint8])
# disableVm:
whenVMorJs:
# pending fix proposed in https://github.com/nim-lang/Nim/issues/15952#issuecomment-786312417

View File

@@ -45,7 +45,7 @@ when not defined(windows) and not disableSSLTesting():
proc runServer(port: Port): bool {.thread.} =
## Run a trivial HTTPS server in a {.thread.}
## Exit after serving one request
result = false
var socket = newSocket()
socket.setSockOpt(OptReusePort, true)
socket.bindAddr(port)
@@ -55,7 +55,7 @@ when not defined(windows) and not disableSSLTesting():
## Handle one connection
socket.listen()
var client: Socket
var client: Socket = default(Socket)
var address = ""
log "server: ready"

View File

@@ -125,7 +125,7 @@ proc main(moveZeroesOut: static bool) =
doAssert data.extract.id == 12
block:
var x: seq[Isolated[JsonNode]]
var x: seq[Isolated[JsonNode]] = @[]
x.add isolate(newJString("1234"))
doAssert $x == """@[(value: "1234")]"""

View File

@@ -15,7 +15,7 @@ proc testRoundtrip[T](t: T, expected: string) =
let j = t.toJson
doAssert $j == expected, "\n" & $j & "\n" & expected
doAssert j.jsonTo(T).toJson == j
var t2: T
var t2: T = default(T)
t2.fromJson(j)
doAssert t2.toJson == j

View File

@@ -25,6 +25,7 @@ block: # bug #17454
block: # unpackVarargs
block:
proc bar1(a: varargs[int]): string =
result = ""
for ai in a: result.add " " & $ai
proc bar2(a: varargs[int]) =
let s1 = bar1(a)

View File

@@ -94,10 +94,10 @@ block: # "IpAddress/Sockaddr conversion"
doAssert($ipaddrstr == $ipaddr_1)
var sockaddr: Sockaddr_storage
var socklen: SockLen
var ipaddr_2: IpAddress
var port_2: Port
var sockaddr: Sockaddr_storage = default(Sockaddr_storage)
var socklen: SockLen = default(SockLen)
var ipaddr_2: IpAddress = default(IpAddress)
var port_2: Port = default(Port)
toSockAddr(ipaddr_1, Port(0), sockaddr, socklen)
fromSockAddr(sockaddr, socklen, ipaddr_2, port_2)
@@ -108,11 +108,11 @@ block: # "IpAddress/Sockaddr conversion"
doAssert($ipaddr_1 == $ipaddr_2)
if sockaddr.ss_family.cint == AF_INET.toInt:
var sockaddr4: Sockaddr_in
var sockaddr4: Sockaddr_in = default(Sockaddr_in)
copyMem(addr sockaddr4, addr sockaddr, sizeof(sockaddr4))
fromSockAddr(sockaddr4, socklen, ipaddr_2, port_2)
elif sockaddr.ss_family.cint == AF_INET6.toInt:
var sockaddr6: Sockaddr_in6
var sockaddr6: Sockaddr_in6 = default(Sockaddr_in6)
copyMem(addr sockaddr6, addr sockaddr, sizeof(sockaddr6))
fromSockAddr(sockaddr6, socklen, ipaddr_2, port_2)

View File

@@ -40,7 +40,7 @@ proc testThread() {.thread.} =
proc test() =
let serverFd = initIPv6Server("::1", port)
var t: Thread[void]
var t: Thread[void] = default(Thread[void])
createThread(t, testThread)
var done = false

View File

@@ -47,6 +47,7 @@ proc main() =
block example:
proc find(haystack: string, needle: char): Option[int] =
result = none(int)
for i, c in haystack:
if c == needle:
return some i
@@ -105,7 +106,7 @@ proc main() =
block filter:
doAssert(some(123).filter(proc (v: int): bool = v == 123) == some(123))
doAssert(some(456).filter(proc (v: int): bool = v == 123).isNone)
doAssert(intNone.filter(proc (v: int): bool = doAssert false).isNone)
doAssert(intNone.filter(proc (v: int): bool = raiseAssert "false").isNone)
block flatMap:
proc addOneIfNotZero(v: int): Option[int] =
@@ -136,7 +137,7 @@ proc main() =
doAssert(some(0).flatMap(maybeToString).flatMap(maybeExclaim) == none(string))
block SomePointer:
var intref: ref int
var intref: ref int = nil
doAssert(option(intref).isNone)
intref.new
doAssert(option(intref).isSome)

View File

@@ -44,12 +44,12 @@ proc test() =
doAssert(parseSaturatedNatural("1_000_000", value) == 9)
doAssert value == 1_000_000
var i64Value: int64
var i64Value: int64 = 0'i64
discard parseBiggestInt("9223372036854775807", i64Value)
doAssert i64Value == 9223372036854775807
block:
var f: float
var f: float = 0.0
let res = collect:
for x in ["9.123456789012345+","11.123456789012345+","9.123456789012345-","8.123456789012345+","9.12345678901234-","9.123456789012345"]:
(parseFloat(x, f, 0), $f)

View File

@@ -192,7 +192,7 @@ block:
expr.rule = sequence(capture(ident), *sequence(
nonterminal(ws), term('+'), nonterminal(ws), nonterminal(expr)))
var c: Captures
var c: Captures = default(Captures)
var s = "a+b + c +d+e+f"
doAssert rawMatch(s, expr.rule, 0, c) == len(s)
var a = ""
@@ -208,7 +208,7 @@ block:
doAssert match("_______ana", peg"A <- 'ana' / . A")
doAssert match("abcs%%%", peg"A <- ..A / .A / '%'")
var matches: array[0..MaxSubpatterns-1, string]
var matches: array[0..MaxSubpatterns-1, string] = default(array[0..MaxSubpatterns-1, string])
if "abc" =~ peg"{'a'}'bc' 'xyz' / {\ident}":
doAssert matches[0] == "abc"
else:
@@ -325,7 +325,7 @@ block:
call()
call()
"""
var c: Captures
var c: Captures = default(Captures)
doAssert program.len == program.rawMatch(grammar, 0, c)
doAssert c.ml == 1

View File

@@ -11,7 +11,7 @@ when not defined(js):
randomize(233)
proc main() =
var occur: array[1000, int]
var occur: array[1000, int] = default(array[1000, int])
for i in 0..100_000:
let x = rand(high(occur))

View File

@@ -23,7 +23,7 @@ proc testAll() =
doAssert find("_____abc_______", re"abc") == 5
doAssert findBounds("_____abc_______", re"abc") == (5,7)
var matches: array[6, string]
var matches: array[6, string] = default(array[6, string])
if match("abcdefg", re"c(d)ef(g)", matches, 2):
doAssert matches[0] == "d"
doAssert matches[1] == "g"
@@ -85,7 +85,7 @@ proc testAll() =
doAssert("XYZ".match(re"^\d*") == true)
block:
var matches: array[16, string]
var matches: array[16, string] = default(array[16, string])
if match("abcdefghijklmnop", re"(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)(m)(n)(o)(p)", matches):
for i in 0..matches.high:
doAssert matches[i] == $chr(i + 'a'.ord)

View File

@@ -41,11 +41,13 @@ proc toAst(input: string,
warnings: ref seq[string] = nil): string =
## If `error` is nil then no errors should be generated.
## The same goes for `warnings`.
result = ""
proc testMsgHandler(filename: string, line, col: int, msgkind: MsgKind,
arg: string) =
let mc = msgkind.whichMsgClass
let a = $msgkind % arg
var message: string
var message: string = ""
toLocation(message, filename, line, col + ColRstOffset)
message.add " $1: $2" % [$mc, a]
if mc == mcError:

View File

@@ -22,11 +22,13 @@ proc toHtml(input: string,
warnings: ref seq[string] = nil): string =
## If `error` is nil then no errors should be generated.
## The same goes for `warnings`.
result = ""
proc testMsgHandler(filename: string, line, col: int, msgkind: MsgKind,
arg: string) =
let mc = msgkind.whichMsgClass
let a = $msgkind % arg
var message: string
var message: string = ""
toLocation(message, filename, line, col + ColRstOffset)
message.add " $1: $2" % [$mc, a]
if mc == mcError:

View File

@@ -275,7 +275,10 @@ block: # toSeq test
numeric = @[1, 2, 3, 4, 5, 6, 7, 8, 9]
oddNumbers = toSeq(filter(numeric) do (x: int) -> bool:
if x mod 2 == 1:
result = true)
result = true
else:
result = false
)
doAssert oddNumbers == @[1, 3, 5, 7, 9]
block:

View File

@@ -15,6 +15,7 @@ suite "test sort, sorted, and isSorted procs":
age: int
func newUser(name: string, age: int): User =
result = default(User)
result.name = name
result.age = age

View File

@@ -40,7 +40,7 @@ proc main() =
when defined(posix):
var
ignoreAction = Sigaction(sa_handler: SIG_IGN)
oldSigPipeHandler: Sigaction
oldSigPipeHandler: Sigaction = default(Sigaction)
if sigemptyset(ignoreAction.sa_mask) == -1:
raiseOSError(osLastError(), "Couldn't create an empty signal set")
if sigaction(SIGPIPE, ignoreAction, oldSigPipeHandler) == -1:
@@ -58,10 +58,10 @@ proc main() =
let (_, port) = server.getLocalAddr()
server.listen()
var clientThread: Thread[Port]
var clientThread: Thread[Port] = default(Thread[Port])
createThread(clientThread, abruptShutdown, port)
var peer: Socket
var peer: Socket = default(Socket)
try:
server.accept(peer)
peer.send(DummyData)
@@ -88,10 +88,10 @@ proc main() =
let (_, port) = server.getLocalAddr()
server.listen()
var clientThread: Thread[Port]
var clientThread: Thread[Port] = default(Thread[Port])
createThread(clientThread, abruptShutdown, port)
var peer: Socket
var peer: Socket = default(Socket)
try:
server.accept(peer)
peer.send(DummyData)
@@ -115,10 +115,10 @@ proc main() =
let (_, port) = server.getLocalAddr()
server.listen()
var clientThread: Thread[Port]
var clientThread: Thread[Port] = default(Thread[Port])
createThread(clientThread, notifiedShutdown, port)
var peer: Socket
var peer: Socket = default(Socket)
try:
server.accept(peer)
peer.send(DummyData)

View File

@@ -159,7 +159,7 @@ block tsegfaults:
var crashes = 0
proc main =
try:
var x: ptr int
var x: ptr int = nil
echo x[]
try:
raise newException(ValueError, "not a crash")

View File

@@ -95,6 +95,7 @@ proc main() =
a0.add b0.toOpenArray(1,3)
doAssert a0 == "hioob"
proc fn(c: openArray[char]): string =
result = ""
result.add c
doAssert fn("def") == "def"
doAssert fn(['d','\0', 'f'])[2] == 'f'

View File

@@ -24,7 +24,7 @@ proc main() =
template formatValue(result: var string; value: Obj; specifier: string) =
result.formatValue($value, specifier)
var o: Obj
var o: Obj = default(Obj)
doAssert fmt"{o}" == "foobar"
doAssert fmt"{o:10}" == "foobar "
@@ -292,7 +292,7 @@ proc main() =
let x = 3.14
doAssert fmt"{(if x!=0: 1.0/x else: 0):.5}" == "0.31847"
doAssert fmt"""{(block:
var res: string
var res: string = ""
for i in 1..15:
res.add (if i mod 15 == 0: "FizzBuzz"
elif i mod 5 == 0: "Buzz"
@@ -564,7 +564,7 @@ proc main() =
doAssert fmt"""{(if true: "'" & ')' else: "")}""" == "')"
block: # issue #20381
var ss: seq[string]
var ss: seq[string] = @[]
template myTemplate(s: string) =
ss.add s
ss.add s

View File

@@ -113,6 +113,7 @@ block:
while start+result < input.len and input[start+result] in seps: inc result
proc demangle(s: string; res: var string; start: int): int =
result = 0
while result+start < s.len and s[result+start] in {'_', '@'}: inc result
res = ""
while result+start < s.len and s[result+start] > ' ' and s[result+start] != '_':

View File

@@ -22,6 +22,7 @@ type
PRadixNodeLeaf = ref TRadixNodeLeaf
proc search(r: PRadixNode, s: string): PRadixNode =
result = default(PRadixNode)
var r = r
var i = 0
while r != nil:
@@ -55,7 +56,7 @@ proc contains*(r: PRadixNode, s: string): bool =
return search(r, s) != nil
proc testOrIncl*(r: var PRadixNode, s: string): bool =
nil
result = false
proc incl*(r: var PRadixNode, s: string) = discard testOrIncl(r, s)

View File

@@ -291,7 +291,7 @@ template main() =
block: # bug #20704
proc test() =
var xs, ys: seq[int]
var xs, ys: seq[int] = @[]
for i in 0..5:
xs.add(i)

View File

@@ -513,12 +513,12 @@ block:
proc testReturnValues() =
let t = toTask returnsSomething(2233, 11)
var res: int
var res: int = 0
t.invoke(addr res)
doAssert res == 2233+11
let tb = toTask noArgsButReturnsSomething()
var resB: string
var resB: string = ""
tb.invoke(addr resB)
doAssert resB == "abcdef"

View File

@@ -12,11 +12,13 @@ proc staticTz(hours, minutes, seconds: int = 0): Timezone {.noSideEffect.} =
let offset = hours * 3600 + minutes * 60 + seconds
proc zonedTimeFromAdjTime(adjTime: Time): ZonedTime =
result = default(ZonedTime)
result.isDst = false
result.utcOffset = offset
result.time = adjTime + initDuration(seconds = offset)
proc zonedTimeFromTime(time: Time): ZonedTime =
result = default(ZonedTime)
result.isDst = false
result.utcOffset = offset
result.time = time

View File

@@ -78,7 +78,7 @@ block:
block: # bug #23556
proc test =
var
t: seq[int]
t: seq[int] = @[]
aseq = toAny(t)
invokeNewSeq(aseq, 0)

View File

@@ -6,7 +6,7 @@ import std/assertions
template main =
proc hello(x: varargs[string]): seq[string] =
var s: seq[string]
var s: seq[string] = @[]
s.add x
s

View File

@@ -33,9 +33,9 @@ proc main() =
proc fun(a: Bar): auto = a.b2
var a: Foo
var a: Foo = nil
var x6: ptr Bar
var x6: ptr Bar = nil
when nimvm: discard # pending https://github.com/timotheecour/Nim/issues/568
else:
x6 = create(Bar)
@@ -107,7 +107,7 @@ proc main() =
d2: D
proc identity[T](a: T): T = a
proc identity2[T](a: T, ignore: int): T = a
var a: A
var a: A = default(A)
doAssert ?.a.b.c.d.e.f == 0
doAssert ?.a.b.c.d.e.d2.d3[].d3.e.d2.e.f == 0
doAssert ?.a.b.c.d.d3[].e.f == 0
@@ -174,7 +174,7 @@ proc main() =
doAssert ?.identity(d) == nil
doAssert ?.identity(d[]) == default(typeof(d[]))
doAssert ?.identity(d[]).i4 == 0
var a: A
var a: A = default(A)
doAssert ?.identity(a) == default(A)
doAssert ?.identity(a.a0) == 0
doAssert ?.identity(a.d) == nil
@@ -195,7 +195,7 @@ proc main() =
b1: float
block:
var a: A
var a: A = default(A)
doAssert ?.a.a0.a1[0].a2.addr == nil
a = A(a2: 3)
doAssert ?.a.a0.a1[0].a2.addr == nil

View File

@@ -5,6 +5,7 @@ type MyType* [T] = object
lock: Lock
proc createMyType*[T]: MyType[T] =
result = default(MyType[T])
initLock(result.lock)
proc use* (m: var MyType): int =