From e1ed34627f0f99e580e3e20d5782f582a08c887e Mon Sep 17 00:00:00 2001 From: Yuriy Glukhov Date: Sun, 19 Nov 2017 03:32:39 +0200 Subject: [PATCH] Fixes #5979 (#5980) --- compiler/ccgexprs.nim | 10 ++++++++-- tests/cpp/tcasts.nim | 10 ++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 tests/cpp/tcasts.nim diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index 45b2be558..9db136ed1 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -1645,8 +1645,14 @@ proc genSomeCast(p: BProc, e: PNode, d: var TLoc) = putIntoDest(p, d, e, "(($1) ($2))" % [getClosureType(p.module, etyp, clHalfWithEnv), rdCharLoc(a)], a.storage) else: - putIntoDest(p, d, e, "(($1) ($2))" % - [getTypeDesc(p.module, e.typ), rdCharLoc(a)], a.storage) + let srcTyp = skipTypes(e.sons[1].typ, abstractRange) + # C++ does not like direct casts from pointer to shorter integral types + if srcTyp.kind in {tyPtr, tyPointer} and etyp.kind in IntegralTypes: + putIntoDest(p, d, e, "(($1) (ptrdiff_t) ($2))" % + [getTypeDesc(p.module, e.typ), rdCharLoc(a)], a.storage) + else: + putIntoDest(p, d, e, "(($1) ($2))" % + [getTypeDesc(p.module, e.typ), rdCharLoc(a)], a.storage) proc genCast(p: BProc, e: PNode, d: var TLoc) = const ValueTypes = {tyFloat..tyFloat128, tyTuple, tyObject, tyArray} diff --git a/tests/cpp/tcasts.nim b/tests/cpp/tcasts.nim new file mode 100644 index 000000000..35f06234d --- /dev/null +++ b/tests/cpp/tcasts.nim @@ -0,0 +1,10 @@ +discard """ + cmd: "nim cpp $file" + output: "" +""" + +block: #5979 + var a = 'a' + var p: pointer = cast[pointer](a) + var c = cast[char](p) + doAssert(c == 'a')