* Field checks for JS backend * Clean nkCall nodes with no arguments Generating a nkEmpty in place of no arguments makes no sense form the AST point of view and also trips up the VM codegen. * Field checks for VM backend * Test case for #6612 This patchset fixes #6612 * Add test case for LHS double evaluation * Prevent LHS double-eval for JS backend * Prevent double evaluation in VM backend
48 lines
682 B
Nim
48 lines
682 B
Nim
discard """
|
|
output: '''
|
|
foo
|
|
C
|
|
3.14
|
|
foo
|
|
3.14
|
|
3.14
|
|
'''
|
|
"""
|
|
|
|
type
|
|
V = enum
|
|
A, B, C
|
|
X = object
|
|
f0: string
|
|
case f1: V
|
|
of A: f2: string
|
|
of B: discard
|
|
of C: f3: float
|
|
|
|
var obj = X(f0: "foo", f1: C, f3: 3.14)
|
|
|
|
block:
|
|
echo obj.f0
|
|
echo obj.f1
|
|
doAssertRaises(FieldError): echo obj.f2
|
|
echo obj.f3
|
|
|
|
block:
|
|
let a0 = addr(obj.f0)
|
|
echo a0[]
|
|
# let a1 = unsafeAddr(obj.f1)
|
|
# echo a1[]
|
|
doAssertRaises(FieldError):
|
|
let a2 = addr(obj.f2)
|
|
echo a2[]
|
|
let a3 = addr(obj.f3)
|
|
echo a3[]
|
|
|
|
# Prevent double evaluation of LHS
|
|
block:
|
|
var flag = false
|
|
proc wrap(x: X): X =
|
|
doAssert flag == false
|
|
flag = true
|
|
result = x
|
|
echo wrap(obj).f3
|