From 2631e9923874856d62ba310905ec2dc96502ab53 Mon Sep 17 00:00:00 2001 From: ringabout <43030857+ringabout@users.noreply.github.com> Date: Sat, 12 Nov 2022 02:32:33 +0800 Subject: [PATCH] issue a warning for ptr to cstring conversion[backport] (#20814) * issue a warning for ptr to cstring conversion[backport] * add a changelog (cherry picked from commit 8e1181bde593ba3ab4409f1454a7b7280b659cd0) --- changelog.md | 4 ++++ compiler/lineinfos.nim | 2 ++ compiler/sempass2.nim | 5 +++++ 3 files changed, 11 insertions(+) diff --git a/changelog.md b/changelog.md index 83ea765b89..e670fe678c 100644 --- a/changelog.md +++ b/changelog.md @@ -20,6 +20,10 @@ ## Standard library additions and changes +- Pointer to `cstring` conversion now triggers a `[PtrToCstringConv]` warning. + This warning will become an error in future versions! Use a `cast` operation + like `cast[cstring](x)` instead. + ## Standard library additions and changes - `macros.parseExpr` and `macros.parseStmt` now accept an optional diff --git a/compiler/lineinfos.nim b/compiler/lineinfos.nim index e62f552af4..0f4059cc53 100644 --- a/compiler/lineinfos.nim +++ b/compiler/lineinfos.nim @@ -76,6 +76,7 @@ type warnAnyEnumConv = "AnyEnumConv", warnHoleEnumConv = "HoleEnumConv", warnCstringConv = "CStringConv", + warnPtrToCstringConv = "PtrToCstringConv", warnEffect = "Effect", warnUser = "User", # hints @@ -166,6 +167,7 @@ const warnAnyEnumConv: "$1", warnHoleEnumConv: "$1", warnCstringConv: "$1", + warnPtrToCstringConv: "unsafe conversion to 'cstring' from '$1'; this will become a compile time error in the future", warnEffect: "$1", warnUser: "$1", hintSuccess: "operation successful: $#", diff --git a/compiler/sempass2.nim b/compiler/sempass2.nim index 41c90ef564..5e39edece1 100644 --- a/compiler/sempass2.nim +++ b/compiler/sempass2.nim @@ -1216,6 +1216,11 @@ proc track(tracked: PEffects, n: PNode) = 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.typ.skipTypes(abstractInst).kind == tyCstring and + isCharArrayPtr(n[1].typ, true): + message(tracked.config, n.info, warnPtrToCstringConv, + $n[1].typ) + let t = n.typ.skipTypes(abstractInst) if t.kind == tyEnum: