diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2021-07-21 16:55:50 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-21 16:55:50 +0200 |
commit | 01fc9e58ca8b694eac6c07b05c26c9d98cbd141c (patch) | |
tree | 8c666d469fe32fb47130cd4a11c5e7efda8545c3 /compiler/sempass2.nim | |
parent | 58080525a1dcad23de6ad0cf9ca6988f103de350 (diff) | |
download | Nim-01fc9e58ca8b694eac6c07b05c26c9d98cbd141c.tar.gz |
fixes #18550 (#18553)
* fixes #18550 * update the manual to reflect reality
Diffstat (limited to 'compiler/sempass2.nim')
-rw-r--r-- | compiler/sempass2.nim | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/compiler/sempass2.nim b/compiler/sempass2.nim index 1e1672cad..ce21c3ed2 100644 --- a/compiler/sempass2.nim +++ b/compiler/sempass2.nim @@ -951,6 +951,15 @@ proc trackInnerProc(tracked: PEffects, n: PNode) = else: for ch in n: trackInnerProc(tracked, ch) +proc allowCStringConv(n: PNode): bool = + case n.kind + of nkStrLit..nkTripleStrLit: result = true + of nkSym: result = n.sym.kind in {skConst, skParam} + of nkAddr: result = isCharArrayPtr(n.typ, true) + of nkCallKinds: + result = isCharArrayPtr(n.typ, n[0].kind == nkSym and n[0].sym.magic == mAddr) + else: result = isCharArrayPtr(n.typ, false) + proc track(tracked: PEffects, n: PNode) = case n.kind of nkSym: @@ -1157,6 +1166,13 @@ proc track(tracked: PEffects, n: PNode) = if tracked.owner.kind != skMacro: createTypeBoundOps(tracked, n.typ, n.info) of nkHiddenStdConv, nkHiddenSubConv, nkConv: + if n.kind in {nkHiddenStdConv, nkHiddenSubConv} and + n.typ.skipTypes(abstractInst).kind == tyCstring and + not allowCStringConv(n[1]): + message(tracked.config, n.info, warnCstringConv, + "implicit conversion to 'cstring' from a non-const location: $1; this will become a compile time error in the future" % + [$n[1]]) + if n.len == 2: track(tracked, n[1]) if tracked.owner.kind != skMacro: |