-
-
Notifications
You must be signed in to change notification settings - Fork 1.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
allow
untyped
arguments to fail to compile in overload mismatch err…
…or (#23984) fixes #8697, fixes #9620, fixes #23265 When matching a `template` with an `untyped` argument fails because of a mismatching typed argument, `presentFailedCandidates` tries to sem every single argument to show their types, but trying to type the `untyped` argument can fail if it's supposed to use an injected symbol, so we get an unrelated error message like "undeclared identifier". Instead we use `tryExpr` as the comment suggests, setting the type to `untyped` if it fails to compile. We could also maybe check if an `untyped` argument is expected in its place and not try to compile the expression if it is but this would require a bit of reorganizing the code here and IMO it's better to have the information of what type it would be if it can be typed.
- Loading branch information
Showing
2 changed files
with
54 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
discard """ | ||
cmd: "nim check $file" | ||
""" | ||
|
||
block: | ||
template foo(x: var int, y: untyped) = discard | ||
var a: float | ||
foo(a, undeclared) #[tt.Error | ||
^ type mismatch: got <float, untyped>]# # `untyped` is arbitary | ||
# previous error: undeclared identifier: 'undeclared' | ||
|
||
block: # issue #8697 | ||
type | ||
Fruit = enum | ||
apple | ||
banana | ||
orange | ||
macro hello(x, y: untyped) = discard | ||
hello(apple, banana, orange) #[tt.Error | ||
^ type mismatch: got <Fruit, Fruit, Fruit>]# | ||
|
||
block: # issue #23265 | ||
template declareFoo(fooName: untyped, value: uint16) = | ||
const `fooName Value` {.inject.} = value | ||
|
||
declareFoo(FOO, 0xFFFF) | ||
declareFoo(BAR, 0xFFFFF) #[tt.Error | ||
^ type mismatch: got <untyped, int literal(1048575)>]# | ||
|
||
block: # issue #9620 | ||
template forLoop(index: untyped, length: int{lvalue}, body: untyped) = | ||
for `index`{.inject.} in 0 ..< length: | ||
body | ||
var x = newSeq[int](10) | ||
forLoop(i, x.len): #[tt.Error | ||
^ type mismatch: got <untyped, int, void>]# | ||
x[i] = i |