Files
Nim/tests/sets/twrongenumrange.nim
metagn 7dfadb8b4e stricter set type match, implicit conversion for literals (#24176)
fixes #18396, fixes #20142

Set types with base types matching less than a generic match (so
subrange matches, conversion matches, int conversion matches) are now
considered mismatching, as their representation is different on the
backends (except VM and JS), causing codegen issues. An exception is
granted for set literal types, which now implicitly convert each element
to the matched base type, so things like `s == {'a', 'b'}` are still
possible where `s` is `set[range['a'..'z']]`. Also every conversion
match in this case is unified under the normal "conversion" match, so a
literal doesn't match one set type better than the other, unless it's
equal.

However `{'a', 'b'} == s` or `{'a', 'b'} - s` etc is now not possible.
when it used to work in the VM. So this is somewhat breaking, and needs
a changelog entry.
2024-10-03 20:39:55 +02:00

51 lines
1.7 KiB
Nim

discard """
cmd: "nim check --hints:off $file"
"""
# issue #17848
block:
# generate with:
# var a = ""
# for i in 0..<80: a.add "k" & $i & ", "
# echo a
type
TMsgKind = enum
k0, k1, k2, k3, k4, k5, k6, k7, k8, k9, k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k50, k51, k52, k53, k54, k55, k56, k57, k58, k59, k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k70, k71, k72, k73, k74, k75, k76, k77, k78, k79
type
TNoteKind = range[k10..k79]
Conf = ref object
notes: set[TNoteKind]
proc bad(conf: Conf, noteSet: set[TMsgKind]) =
conf.notes = noteSet #[tt.Error
^ type mismatch: got <set[TMsgKind]> but expected 'set[TNoteKind]']#
var conf = Conf()
bad(conf, {k10..k60})
block:
type
TMsgKind = enum k0, k1, k2, k3
TNoteKind = range[k1..k2]
TNoteKinds = set[TNoteKind]
type Conf = ref object
notes: TNoteKinds
proc fn(conf: Conf, b: set[TMsgKind]) =
conf.notes = b #[tt.Error
^ type mismatch: got <set[TMsgKind]> but expected 'TNoteKinds = set[TNoteKind]']#
var conf = Conf()
conf.fn({k0..k3}) # BUG: this should give error
echo conf.notes # {k1, k2}
block:
#[
compiler/bitsets.nim(43, 9) `elem >= 0` [AssertionDefect]
]#
type
TMsgKind = enum k0, k1, k2, k3
TNoteKind = range[k1..k2]
var notes: set[TNoteKind]
notes = {k0} #[tt.Error
^ type mismatch: got <set[TMsgKind]> but expected 'set[TNoteKind]']#
notes = {k0..k3} #[tt.Error
^ type mismatch: got <set[TMsgKind]> but expected 'set[TNoteKind]']#