summary refs log tree commit diff stats
path: root/tests/objvariant/tadrdisc.nim
blob: 1afe7d04f73167fc369ac305c04b20cdb852427f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
discard """
  file: "tadrdisc.nim"
  line: 20
  errormsg: "type mismatch: got (TKind)"
"""
# Test that the address of a dicriminants cannot be taken

type
  TKind = enum ka, kb, kc
  TA = object
    case k: TKind
    of ka: x, y: int
    of kb: a, b: string
    of kc: c, d: float

proc setKind(k: var TKind) =
  k = kc

var a: TA
setKind(a.k)
span class="w"> {.passL: "-lm".} # for exp proc c_exp(a: float64): float64 {.importc: "exp", header: "<math.h>".} proc c_printf(frmt: cstring): cint {.importc: "printf", header: "<stdio.h>", varargs, discardable.} const snprintfName = when defined(windows): "_snprintf" else: "snprintf" proc c_snprintf*(buffer: pointer, buf_size: uint, format: cstring): cint {.importc: snprintfName, header: "<stdio.h>", varargs .} proc c_malloc(size:uint):pointer {.importc:"malloc", header: "<stdlib.h>".} proc c_free(p: pointer) {.importc:"free", header: "<stdlib.h>".} proc fun() = block: # c_exp var x = 0.3 let b = c_exp(x) let b2 = int(b*1_000_000) # avoids floating point equality doAssert b2 == 1349858 doAssert c_exp(0.3) == c_exp(x) const x2 = 0.3 doAssert c_exp(x2) == c_exp(x) block: # c_printf c_printf("foo\n") c_printf("foo:%d\n", 100) c_printf("foo:%d\n", 101.cint) c_printf("foo:%d:%d\n", 102.cint, 103.cint) let temp = 104.cint c_printf("foo:%d:%d:%d\n", 102.cint, 103.cint, temp) var temp2 = 105.cint c_printf("foo:%g:%s:%d:%d\n", 0.03, "asdf", 103.cint, temp2) block: # c_snprintf, c_malloc, c_free let n: uint = 50 var buffer2: pointer = c_malloc(n) var s: cstring = "foobar" var age: cint = 25 let j = c_snprintf(buffer2, n, "s1:%s s2:%s age:%d pi:%g", s, s, age, 3.14) c_printf("ret={%s}\n", buffer2) c_free(buffer2) # not sure it has an effect block: # c_printf bug var a = 123 var a2 = a.addr #[ bug: different behavior between CT RT in this case: at CT, shows foo2:a=123 at RT, shows foo2:a=<address as int> ]# if false: c_printf("foo2:a=%d\n", a2) static: fun() fun()