Open PhilippMDoerner opened 1 year ago
!nim c
const x = @["a", "b"]
proc myProc(x: seq[string]) = echo x
x.myProc()
proc myProc2(x: seq[string] = @[]) = echo x
x.myProc2()
proc myProc3(x: static seq[string]) = echo x
x.myProc3()
proc myProc4(x: static seq[string] = @[]) = echo x
x.myProc4()
0 bytes (0 bytes)
```cpp
```
2023-10-05T10:59:02
2023-10-05T10:59:03
0 bytes (0 bytes)
```cpp
```
2023-10-05T10:59:03
2023-10-05T10:59:04
0 bytes (0 bytes)
```cpp
```
2023-10-05T10:59:04
2023-10-05T10:59:04
0 bytes (0 bytes)
```cpp
```
2023-10-05T10:59:07
2023-10-05T10:59:07
0 bytes (0 bytes)
```cpp
```
2023-10-05T10:59:10
2023-10-05T10:59:10
0 bytes (0 bytes)
```cpp
```
2023-10-05T10:59:13
2023-10-05T10:59:13
0 bytes (0 bytes)
```cpp
```
2023-10-05T10:59:15
2023-10-05T10:59:15
11.4.0
14.0.0
18.0
2023-10-05T10:58:31Z
1
nim c --run -d:nimDebug -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints:off --warnings:off --lineTrace:off --nimcache:/home/runner/work/Nim/Nim --out:/home/runner/work/Nim/Nim/temp /home/runner/work/Nim/Nim/temp.nim
:robot: Bug found in 16 minutes
bisecting 7
commits at 0
commits per second
0 bytes (0 bytes)
```cpp
```
2023-10-05T11:00:56
2023-10-05T11:00:57
1 minutes
0 bytes (0 bytes)
```cpp
```
2023-10-05T11:01:22
2023-10-05T11:01:22
0 bytes (0 bytes)
```cpp
```
2023-10-05T11:01:23
2023-10-05T11:01:24
0 bytes (0 bytes)
```cpp
```
2023-10-05T11:01:47
2023-10-05T11:01:48
0 bytes (0 bytes)
```cpp
```
2023-10-05T11:02:08
2023-10-05T11:02:08
0 bytes (0 bytes)
```cpp
```
2023-10-05T11:02:30
2023-10-05T11:02:31
0 bytes (0 bytes)
```cpp
```
2023-10-05T11:02:49
2023-10-05T11:02:49
12.2.0
16.0.6
18.0
2023-10-05T10:58:31Z
1
nim c --run -d:nimDebug -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints:off --warnings:off --lineTrace:off --nimcache:D:\a\Nim\Nim --out:D:\a\Nim\Nim/temp D:\a\Nim\Nim/temp.nim
:robot: Bug found in 19 minutes
bisecting 7
commits at 0
commits per second
0 bytes (0 bytes)
```cpp
```
2023-10-05T11:10:31
2023-10-05T11:10:32
0 bytes (0 bytes)
```cpp
```
2023-10-05T11:10:33
2023-10-05T11:10:33
0 bytes (0 bytes)
```cpp
```
2023-10-05T11:10:33
2023-10-05T11:10:34
0 bytes (0 bytes)
```cpp
```
2023-10-05T11:16:18
2023-10-05T11:16:19
0 bytes (0 bytes)
```cpp
```
2023-10-05T11:20:20
2023-10-05T11:20:20
0 bytes (0 bytes)
```cpp
```
2023-10-05T11:24:02
2023-10-05T11:24:02
0 bytes (0 bytes)
```cpp
```
2023-10-05T11:27:45
2023-10-05T11:27:45
14.0.0
14.0.0
18.0
2023-10-05T10:58:31Z
1
nim c --run -d:nimDebug -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints:off --warnings:off --lineTrace:off --nimcache:/Users/runner/work/Nim/Nim --out:/Users/runner/work/Nim/Nim/temp /Users/runner/work/Nim/Nim/temp.nim
:robot: Bug found in 21 minutes
bisecting 7
commits at 0
commits per second
Not related to empty sequence type inference? Also where is the compiler crash?
const x = @["a", "b"]
proc myProc4(x: static seq[string] = @["a"]) =
echo x
x.myProc4()
(3, 39) Error: type mismatch: got 'seq[string]' for '["a"]' but expected 'static[seq[string]]'
Not related to empty sequence type inference? Also where is the compiler crash?
const x = @["a", "b"] proc myProc4(x: static seq[string] = @["a"]) = echo x x.myProc4()
(3, 39) Error: type mismatch: got 'seq[string]' for '["a"]' but expected 'static[seq[string]]'
I'm happy to rename based on suggestions. With the compiler telling me "It's not X, it is Y" as an end-user of the compiler I can only assume that it is the type-inference of the compiler that is borked here, as it is incorrectly identifying the type of the default value.
Sorry for misleading, there seems to be 2 issues here:
Same issue as #13944 and #12559, @[]
matches static seq[string]
but has type seq[empty]
which doesn't get updated:
proc myProc3(x: static seq[string]) =
echo x
myProc3(@[]) # type mismatch with echo
The default parameter value @["a"]
doesn't get converted to static seq[string]
the same way a normal parameter does
Description
With procs you have the feature that you can assign default values to their parameters.
proc someProc(x: int = 5)
is a valid proc, which uses5
as a parameter value if the parameterx
is not set by the caller ofsomeProc
.For sequences you can pass even pass empty sequences as default values! This does not break, because the compiler will infer the type of the empty seq based on the type of the parameter itself. This inference breaks when the parameter type is a static seq.
See below an example:
Nim Version
Nim Compiler Version 2.0.0 [Linux: amd64] Compiled at 2023-08-01 Copyright (c) 2006-2023 by Andreas Rumpf
git hash: a488067a4130f029000be4550a0fb1b39e0e9e7c active boot switches: -d:release
Current Output
Expected Output
Possible Solution
No response
Additional Information
static seq[T]
is the only other type I could create this kind of problem for. For other more generic types likeOption
it works fine.