diff options
Diffstat (limited to 'tests/objvariant')
-rw-r--r-- | tests/objvariant/t14581.nim | 25 | ||||
-rw-r--r-- | tests/objvariant/tadrdisc.nim | 2 | ||||
-rw-r--r-- | tests/objvariant/tcheckedfield1.nim | 3 | ||||
-rw-r--r-- | tests/objvariant/tconstobjvariant.nim | 18 | ||||
-rw-r--r-- | tests/objvariant/tconstructionorder.nim | 20 | ||||
-rw-r--r-- | tests/objvariant/tfloatrangeobj.nim | 1 | ||||
-rw-r--r-- | tests/objvariant/tnon_zero_discrim_err.nim | 14 | ||||
-rw-r--r-- | tests/objvariant/treassign.nim | 31 | ||||
-rw-r--r-- | tests/objvariant/trt_discrim.nim | 88 | ||||
-rw-r--r-- | tests/objvariant/trt_discrim_err2.nim | 4 |
10 files changed, 177 insertions, 29 deletions
diff --git a/tests/objvariant/t14581.nim b/tests/objvariant/t14581.nim new file mode 100644 index 000000000..72ba32f18 --- /dev/null +++ b/tests/objvariant/t14581.nim @@ -0,0 +1,25 @@ +discard """ + matrix: "--gc:refc; --gc:arc" + output: "abc: @[(kind: A, x: 0)]" +""" + +import std/tables + +type E = enum + A, B + +type O = object + case kind: E + of A: + x: int + of B: + y: int + +proc someTable(): Table[string, seq[O]] = + result = initTable[string, seq[O]]() + result["abc"] = @[O(kind: A)] + +const t = someTable() + +for k, v in t: + echo k, ": ", v diff --git a/tests/objvariant/tadrdisc.nim b/tests/objvariant/tadrdisc.nim index a68dddf66..5e4e39a44 100644 --- a/tests/objvariant/tadrdisc.nim +++ b/tests/objvariant/tadrdisc.nim @@ -3,7 +3,7 @@ discard """ file: "tadrdisc.nim" line: 20 """ -# Test that the address of a dicriminants cannot be taken +# Test that the address of a discriminants cannot be taken type TKind = enum ka, kb, kc diff --git a/tests/objvariant/tcheckedfield1.nim b/tests/objvariant/tcheckedfield1.nim index 69b099f24..4a6c49f66 100644 --- a/tests/objvariant/tcheckedfield1.nim +++ b/tests/objvariant/tcheckedfield1.nim @@ -1,6 +1,5 @@ discard """ - nimout: "Warning: cannot prove that field 'x.s' is accessible [ProveField]" - line:51 + nimout: "tcheckedfield1.nim(39, 6) Warning: cannot prove that field 'x.s' is accessible [ProveField]" action: run output: "abc abc" """ diff --git a/tests/objvariant/tconstobjvariant.nim b/tests/objvariant/tconstobjvariant.nim new file mode 100644 index 000000000..45a647707 --- /dev/null +++ b/tests/objvariant/tconstobjvariant.nim @@ -0,0 +1,18 @@ +# This is a sample code, the first echo statement prints out the error +type + A = object + case w: uint8 + of 1: + n: int + else: + other: string + +const + a = A(w: 1, n: 5) + +proc foo = + + let c = [a] + doAssert c[0].n == 5 + +foo() \ No newline at end of file diff --git a/tests/objvariant/tconstructionorder.nim b/tests/objvariant/tconstructionorder.nim index 19ddea7a1..5ca484884 100644 --- a/tests/objvariant/tconstructionorder.nim +++ b/tests/objvariant/tconstructionorder.nim @@ -23,22 +23,22 @@ type # This will test that all the values are what we expect. proc assertTree(root: Node) = # check root of tree - assert root.kind == Operator - assert root.operator == '*' + doAssert root.kind == Operator + doAssert root.operator == '*' # check left subtree - assert root.left.value == 5 - assert root.left.kind == Literal + doAssert root.left.value == 5 + doAssert root.left.kind == Literal # check right subtree - assert root.right.kind == Operator - assert root.right.operator == '+' + doAssert root.right.kind == Operator + doAssert root.right.operator == '+' - assert root.right.left.value == 5 - assert root.right.left.kind == Literal + doAssert root.right.left.value == 5 + doAssert root.right.left.kind == Literal - assert root.right.right.value == 10 - assert root.right.right.kind == Literal + doAssert root.right.right.value == 10 + doAssert root.right.right.kind == Literal proc newLiteralNode(value: int): Node = result = Node( diff --git a/tests/objvariant/tfloatrangeobj.nim b/tests/objvariant/tfloatrangeobj.nim index cad2b2aa0..67e886302 100644 --- a/tests/objvariant/tfloatrangeobj.nim +++ b/tests/objvariant/tfloatrangeobj.nim @@ -2,6 +2,7 @@ discard """ output: '''(kind: 2.0, twoStr: "TWO STR") (kind: 1.0) ''' +disabled: "true" """ type FloatRange = range[1.0..3.0] diff --git a/tests/objvariant/tnon_zero_discrim_err.nim b/tests/objvariant/tnon_zero_discrim_err.nim new file mode 100644 index 000000000..c595bba1b --- /dev/null +++ b/tests/objvariant/tnon_zero_discrim_err.nim @@ -0,0 +1,14 @@ +discard """ + errormsg: "low(kind) must be 0 for discriminant" + line: 7 +""" +type + HoledObj = object + case kind: int + of 0: a: int + else: discard + +let someInt = low(int) +case someInt +of 938: echo HoledObj(kind: someInt, a: 1) +else: discard diff --git a/tests/objvariant/treassign.nim b/tests/objvariant/treassign.nim index 2938b30a3..527204616 100644 --- a/tests/objvariant/treassign.nim +++ b/tests/objvariant/treassign.nim @@ -25,3 +25,34 @@ t.curr = TokenObject(kind: Token.bar, bar: BasicNumber(value: 12.34)) t.curr = TokenObject(kind: Token.foo, foo: "foo") echo "SUCCESS" + +proc passToVar(x: var Token) = discard + +{.cast(uncheckedAssign).}: + passToVar(t.curr.kind) + + t.curr = TokenObject(kind: t.curr.kind, foo: "abc") + + t.curr.kind = Token.foo + + +block: + type + TokenKind = enum + strLit, intLit + Token = object + case kind*: TokenKind + of strLit: + s*: string + of intLit: + i*: int64 + + var t = Token(kind: strLit, s: "abc") + + {.cast(uncheckedAssign).}: + + # inside the 'cast' section it is allowed to assign to the 't.kind' field directly: + t.kind = intLit + + {.cast(uncheckedAssign).}: + t.kind = strLit \ No newline at end of file diff --git a/tests/objvariant/trt_discrim.nim b/tests/objvariant/trt_discrim.nim index 612647fbe..95b2a9f76 100644 --- a/tests/objvariant/trt_discrim.nim +++ b/tests/objvariant/trt_discrim.nim @@ -5,7 +5,7 @@ template reject(x) = static: assert(not compiles(x)) type - Kind = enum k1 = 2, k2 = 33, k3 = 84, k4 = 278, k5 = 1000 # Holed enum work! + Kind = enum k1 = 0, k2 = 33, k3 = 84, k4 = 278, k5 = 1000 # Holed enum work! #No they don't.. KindObj = object case kind: Kind of k1, k2..k3: i32: int32 @@ -13,10 +13,10 @@ type else: str: string IntObj = object - case kind: int16 - of low(int16) .. -1: bad: string - of 0: neutral: string - of 1 .. high(int16): good: string + case kind: uint8 + of low(uint8) .. 127: bad: string + of 128'u8: neutral: string + of 129 .. high(uint8): good: string OtherKind = enum ok1, ok2, ok3, ok4, ok5 NestedKindObj = object @@ -76,24 +76,25 @@ reject: # elif branches are ignored elif kind == k4: discard else: discard KindObj(kind: kind, str: "3") -let intKind = 29'i16 +let intKind = 29'u8 accept: case intKind - of low(int16) .. -1: discard IntObj(kind: intKind, bad: "bad") - of 0: discard IntObj(kind: intKind, neutral: "neutral") - of 1 .. high(int16): discard IntObj(kind: intKind, good: "good") + of low(uint8) .. 127: discard IntObj(kind: intKind, bad: "bad") + of 128'u8: discard IntObj(kind: intKind, neutral: "neutral") + of 129 .. high(uint8): discard IntObj(kind: intKind, good: "good") reject: # 0 leaks to else case intKind - of low(int16) .. -1: discard IntObj(kind: intKind, bad: "bad") - of 1 .. high(int16): discard IntObj(kind: intKind, good: "good") + of low(uint8) .. 127: discard IntObj(kind: intKind, bad: "bad") + of 129 .. high(uint8): discard IntObj(kind: intKind, good: "good") accept: case intKind - of low(int16) .. -1: discard IntObj(kind: intKind, bad: "bad") - of 0: discard IntObj(kind: intKind, neutral: "neutral") - of 10, 11 .. high(int16), 1 .. 9: discard IntObj(kind: intKind, good: "good") + of low(uint8) .. 127: discard IntObj(kind: intKind, bad: "bad") + of 128'u8: discard IntObj(kind: intKind, neutral: "neutral") + of 139'u8, 140 .. high(uint8), 129'u8 .. 138'u8: discard IntObj(kind: intKind, good: "good") + accept: case kind @@ -136,3 +137,62 @@ reject: # not immutable. of k1, k2, k3: discard KindObj(varkind: kind, i32: 1) of k4: discard KindObj(varkind: kind, f32: 2.0) else: discard KindObj(varkind: kind, str: "3") + +accept: + proc kindProc(kind: Kind): KindObj = + case kind: + of k1: result = KindObj(kind: kind, i32: 1) + else: discard + +reject: + proc varKindProc(kind: var Kind): KindObj = + case kind: + of k1: result = KindObj(kind: kind, i32: 1) + else: discard + +type + Kind3 = enum + A, B, C, E + + OkRange = range[B..C] + NotOkRange = range[B..E] + + CaseObject = object + case kind: Kind3 + of B, C: + field: int + else: discard + +accept: + let rtDiscriminator: OkRange = B + discard CaseObject(kind: rtDiscriminator, field: 1) + +accept: + let rtDiscriminator = B + discard CaseObject(kind: OkRange(rtDiscriminator), field: 1) + +accept: + const rtDiscriminator: NotOkRange = B + discard CaseObject(kind: rtDiscriminator, field: 1) + +accept: + discard CaseObject(kind: NotOkRange(B), field: 1) + +reject: + let rtDiscriminator: NotOkRange = B + discard CaseObject(kind: rtDiscriminator, field: 1) + +reject: + let rtDiscriminator = B + discard CaseObject(kind: NotOkRange(rtDiscriminator), field: 1) + +reject: + type Obj = object + case x: int + of 0 .. 1000: + field: int + else: + discard + + let x: range[0..15] = 1 + let o = Obj(x: x, field: 1) diff --git a/tests/objvariant/trt_discrim_err2.nim b/tests/objvariant/trt_discrim_err2.nim index c5352014e..4f2790bc6 100644 --- a/tests/objvariant/trt_discrim_err2.nim +++ b/tests/objvariant/trt_discrim_err2.nim @@ -1,10 +1,10 @@ discard """ - errormsg: "branch initialization with a runtime discriminator only supports ordinal types with 2^16 elements or less." + errormsg: " branch initialization with a runtime discriminator only supports ordinal types with 2^16 elements or less." line: 13 """ type HoledObj = object - case kind: int + case kind: range[0 .. 20000] of 0: a: int else: discard |