@@ -24,34 +24,32 @@ proc fun() =
2424 doAssert c_exp (x2) == c_exp (x)
2525
2626 block : # c_printf
27- c_printf (" foo\n " )
28- c_printf (" foo:%d\n " , 100 )
29- c_printf (" foo:%d\n " , 101 .cint )
30- c_printf (" foo:%d:%d\n " , 102 .cint , 103 .cint )
27+ c_printf (" foo0\n " )
28+ c_printf (" foo1:%d\n " , 101 .cint )
29+ c_printf (" foo2:%d:%d\n " , 102 .cint , 103 .cint )
3130 let temp = 104 .cint
32- c_printf (" foo :%d:%d:%d\n " , 102 .cint , 103 .cint , temp)
31+ c_printf (" foo3 :%d:%d:%d\n " , 102 .cint , 103 .cint , temp)
3332 var temp2 = 105 .cint
34- c_printf (" foo :%g:%s:%d:%d\n " , 0.03 , " asdf" , 103 .cint , temp2)
33+ c_printf (" foo4 :%g:%s:%d:%d\n " , 0.03 , " asdf" , 103 .cint , temp2)
3534
3635 block : # c_snprintf, c_malloc, c_free
3736 let n: uint = 50
3837 var buffer2: pointer = c_malloc (n)
3938 var s: cstring = " foobar"
4039 var age: cint = 25
4140 discard c_snprintf (buffer2, n, " s1:%s s2:%s age:%d pi:%g" , s, s, age, 3.14 )
42- c_printf (" ret= {%s}\n " , buffer2)
41+ c_printf (" foo5: {%s}\n " , buffer2)
4342 c_free (buffer2) # not sure it has an effect
4443
45- block : # c_printf bug
46- var a = 123
44+ block : # c_printf bug with `var` {.varargs.} params
45+ var a = 123 . cint
4746 var a2 = a.addr
48- #[
49- bug: different behavior between CT RT in this case:
50- at CT, shows foo2:a=123
51- at RT, shows foo2:a=<address as int>
52- ]#
53- if false :
54- c_printf (" foo2:a=%d\n " , a2)
47+ when false :
48+ # BUG: CT FFI currently does not handle this edge case correctly,
49+ # passing `a2` as `cint` instead of as `ptr cint` for a {.varargs.} param:
50+ # at CT, shows foo6:a2=0x7b
51+ # at RT, shows foo2:a2=<address>
52+ c_printf (" foo6:a2=%p\n " , a2)
5553
5654
5755static :
0 commit comments