fixes #1593
This commit is contained in:
parent
aae180e26b
commit
2d43fcafe0
2 changed files with 46 additions and 2 deletions
|
|
@ -11,6 +11,14 @@
|
||||||
|
|
||||||
# -------------------------- constant expressions ------------------------
|
# -------------------------- constant expressions ------------------------
|
||||||
|
|
||||||
|
proc int64Literal(i: BiggestInt): PRope =
|
||||||
|
if i > low(int64):
|
||||||
|
result = rfmt(nil, "IL64($1)", toRope(i))
|
||||||
|
else:
|
||||||
|
result = ~"(IL64(-9223372036854775807) - IL64(1))"
|
||||||
|
|
||||||
|
proc uint64Literal(i: uint64): PRope = toRope($i & "ULL")
|
||||||
|
|
||||||
proc intLiteral(i: BiggestInt): PRope =
|
proc intLiteral(i: BiggestInt): PRope =
|
||||||
if (i > low(int32)) and (i <= high(int32)):
|
if (i > low(int32)) and (i <= high(int32)):
|
||||||
result = toRope(i)
|
result = toRope(i)
|
||||||
|
|
@ -46,16 +54,18 @@ proc genLiteral(p: BProc, n: PNode, ty: PType): PRope =
|
||||||
case n.kind
|
case n.kind
|
||||||
of nkCharLit..nkUInt64Lit:
|
of nkCharLit..nkUInt64Lit:
|
||||||
case skipTypes(ty, abstractVarRange).kind
|
case skipTypes(ty, abstractVarRange).kind
|
||||||
of tyChar, tyInt64, tyNil:
|
of tyChar, tyNil:
|
||||||
result = intLiteral(n.intVal)
|
result = intLiteral(n.intVal)
|
||||||
of tyInt:
|
of tyInt:
|
||||||
if (n.intVal >= low(int32)) and (n.intVal <= high(int32)):
|
if n.intVal >= low(int32) and n.intVal <= high(int32):
|
||||||
result = int32Literal(int32(n.intVal))
|
result = int32Literal(int32(n.intVal))
|
||||||
else:
|
else:
|
||||||
result = intLiteral(n.intVal)
|
result = intLiteral(n.intVal)
|
||||||
of tyBool:
|
of tyBool:
|
||||||
if n.intVal != 0: result = ~"NIM_TRUE"
|
if n.intVal != 0: result = ~"NIM_TRUE"
|
||||||
else: result = ~"NIM_FALSE"
|
else: result = ~"NIM_FALSE"
|
||||||
|
of tyInt64: result = int64Literal(n.intVal)
|
||||||
|
of tyUInt64: result = uint64Literal(uint64(n.intVal))
|
||||||
else:
|
else:
|
||||||
result = ropef("(($1) $2)", [getTypeDesc(p.module,
|
result = ropef("(($1) $2)", [getTypeDesc(p.module,
|
||||||
skipTypes(ty, abstractVarRange)), intLiteral(n.intVal)])
|
skipTypes(ty, abstractVarRange)), intLiteral(n.intVal)])
|
||||||
|
|
|
||||||
34
tests/ccgbugs/tcvarargs.nim
Normal file
34
tests/ccgbugs/tcvarargs.nim
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
discard """
|
||||||
|
output: '''17
|
||||||
|
17
|
||||||
|
17
|
||||||
|
17
|
||||||
|
17
|
||||||
|
17
|
||||||
|
'''
|
||||||
|
"""
|
||||||
|
|
||||||
|
# bug #1593
|
||||||
|
|
||||||
|
{.emit: """
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
void foo(int n, ...) {
|
||||||
|
NI64 k;
|
||||||
|
int i;
|
||||||
|
va_list argp;
|
||||||
|
va_start(argp, n);
|
||||||
|
for (i = 1; i <= n; i++) {
|
||||||
|
k = va_arg(argp, NI64);
|
||||||
|
printf("%lld\n", (long long)k);
|
||||||
|
}
|
||||||
|
va_end(argp);
|
||||||
|
}
|
||||||
|
""".}
|
||||||
|
|
||||||
|
proc foo(x: cint) {.importc, varargs, nodecl.}
|
||||||
|
|
||||||
|
proc main() =
|
||||||
|
const k = 17'i64
|
||||||
|
foo(6, k, k, k, k, k, k)
|
||||||
|
main()
|
||||||
Loading…
Add table
Add a link
Reference in a new issue