diff options
author | ringabout <43030857+ringabout@users.noreply.github.com> | 2024-03-06 01:06:58 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-05 18:06:58 +0100 |
commit | 7cd3d606838848261b7be6aa4675a761c7946129 (patch) | |
tree | d93952c441faf30447722db6b45fafa3bbc67f82 | |
parent | d373d304ff6b17dc8ae39760bb8a45e5537d807e (diff) | |
download | Nim-7cd3d606838848261b7be6aa4675a761c7946129.tar.gz |
fixes #12703; nim cpp rejects valid code would lose const qualifier for cstring to string via cstrToNimstr (#23371)
fixes #12703 ref #19588
-rw-r--r-- | compiler/ccgexprs.nim | 19 | ||||
-rw-r--r-- | tests/cpp/torc.nim | 14 |
2 files changed, 29 insertions, 4 deletions
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index 704ca82e2..c81153744 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -2250,9 +2250,15 @@ proc convStrToCStr(p: BProc, n: PNode, d: var TLoc) = proc convCStrToStr(p: BProc, n: PNode, d: var TLoc) = var a: TLoc = initLocExpr(p, n[0]) - putIntoDest(p, d, n, - ropecg(p.module, "#cstrToNimstr($1)", [rdLoc(a)]), - a.storage) + if p.module.compileToCpp: + # fixes for const qualifier; bug #12703; bug #19588 + putIntoDest(p, d, n, + ropecg(p.module, "#cstrToNimstr((NCSTRING) $1)", [rdLoc(a)]), + a.storage) + else: + putIntoDest(p, d, n, + ropecg(p.module, "#cstrToNimstr($1)", [rdLoc(a)]), + a.storage) gcUsage(p.config, n) proc genStrEquals(p: BProc, e: PNode, d: var TLoc) = @@ -2470,7 +2476,12 @@ proc genMagicExpr(p: BProc, e: PNode, d: var TLoc, op: TMagic) = genDollar(p, e, d, "#nimFloat32ToStr($1)") else: genDollar(p, e, d, "#nimFloatToStr($1)") - of mCStrToStr: genDollar(p, e, d, "#cstrToNimstr($1)") + of mCStrToStr: + if p.module.compileToCpp: + # fixes for const qualifier; bug #12703; bug #19588 + genDollar(p, e, d, "#cstrToNimstr((NCSTRING) $1)") + else: + genDollar(p, e, d, "#cstrToNimstr($1)") of mStrToStr, mUnown: expr(p, e[1], d) of generatedMagics: genCall(p, e, d) of mEnumToStr: diff --git a/tests/cpp/torc.nim b/tests/cpp/torc.nim index 67eb52dea..9f1a41a21 100644 --- a/tests/cpp/torc.nim +++ b/tests/cpp/torc.nim @@ -59,3 +59,17 @@ block: # bug #10219 var v1 = initVector[int](10) doAssert v1[0] == 0 + +block: # bug #12703 bug #19588 + type + cstringConstImpl {.importc:"const char*".} = cstring + constChar = distinct cstringConstImpl + + {.emit: """ + const char* foo() { + return "hello"; + } + """.} + proc foo(): constChar {.importcpp.} # change to importcpp for C++ backend + doAssert $(foo().cstring) == "hello" + |