diff options
author | metagn <metagngn@gmail.com> | 2024-08-22 08:19:43 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-08-22 07:19:43 +0200 |
commit | 2311049b27d6a46b6df53ecf4bbe73a598bedd65 (patch) | |
tree | 9f9ae687bbea305e685abddc61c900dc3ef1ee1d | |
parent | 832ba815d1cf7ec0846cdade49f697228bb04d22 (diff) | |
download | Nim-2311049b27d6a46b6df53ecf4bbe73a598bedd65.tar.gz |
don't require symbol with enum type to be constant in fitNode (#23999)
fixes #23998 In `fitNode` the first symbol of a symchoice that expects an enum type with the same enum type is given as the result of the `fitNode`. But `getConstExpr` is also called on it, which will return a `nil` node for nodes that aren't constant but have the enum type, like variables or proc parameters. Instead we just return the node directly since it's already typed. Normally, this `if` branch in `fitNode` shouldn't exist since `paramTypesMatch` handles it, but the way pure enum symbols work makes it really impractical to check their ambiguity, which `paramTypesMatch` won't like. If it causes problems for regular enums we can restrict this branch to just pure enums until they are hopefully eventually removed.
-rw-r--r-- | compiler/sem.nim | 2 | ||||
-rw-r--r-- | tests/enum/toverloadedname.nim | 7 |
2 files changed, 8 insertions, 1 deletions
diff --git a/compiler/sem.nim b/compiler/sem.nim index 44a4c1c1e..58183261f 100644 --- a/compiler/sem.nim +++ b/compiler/sem.nim @@ -103,7 +103,7 @@ proc fitNode(c: PContext, formal: PType, arg: PNode; info: TLineInfo): PNode = result = nil for ch in arg: if sameType(ch.typ, formal): - return getConstExpr(c.module, ch, c.idgen, c.graph) + return ch typeMismatch(c.config, info, formal, arg.typ, arg) else: result = indexTypesMatch(c, formal, arg.typ, arg) diff --git a/tests/enum/toverloadedname.nim b/tests/enum/toverloadedname.nim new file mode 100644 index 000000000..d11b0fb83 --- /dev/null +++ b/tests/enum/toverloadedname.nim @@ -0,0 +1,7 @@ +block: # issue #23998 + type + Enum {.pure.} = enum + a + Obj = object + a: Enum + proc test(a: Enum) = discard Obj(a: a) |