From 375e9f050de6b09c00eecafd63bd9b967fbeb335 Mon Sep 17 00:00:00 2001 From: lemon Date: Wed, 26 Nov 2025 18:46:44 +0100 Subject: c/type: make implicit const T* -> T* conversion warning, not error --- c/c.c | 9 ++++++++- io.c | 3 ++- type.c | 3 +-- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/c/c.c b/c/c.c index 5dd4368..c50ffa7 100644 --- a/c/c.c +++ b/c/c.c @@ -342,7 +342,14 @@ argpromote(union type t) bool assigncheck(union type t, const struct expr *src) { - if (assigncompat(t, typedecay(src->ty))) return 1; + union type srcty = typedecay(src->ty);; + if (assigncompat(t, srcty)) { + if (t.t == TYPTR && srcty.t == TYPTR + && (t.flag & TFCHLDQUAL & srcty.flag & TFCHLDQUAL) != (srcty.flag & TFCHLDQUAL)) { + warn(&src->span, "usage of '%ty' discards pointer qualifiers", src->ty); + } + return 1; + } if (t.t == TYPTR && iszero(*src)) return 1; return 0; } diff --git a/io.c b/io.c index b3119fc..58ebf17 100644 --- a/io.c +++ b/io.c @@ -1011,10 +1011,11 @@ vdiag(const struct span *span, enum diagkind kind, const char *fmt, va_list ap) do { ioputc(&bstderr, mark); mark = '~'; - } while (--nmark && ++j < end); + } while (--nmark > 0 && ++j < end); col = 1; ++line; efmt("%g.\n"); + --nmark; } ioputc(&bstderr, '\n'); } diff --git a/type.c b/type.c index 78a6278..5025395 100644 --- a/type.c +++ b/type.c @@ -257,8 +257,7 @@ assigncompat(union type dst, union type src) if (dst.t == TYPTR && src.t == TYPTR) { ds = typechild(dst); ss = typechild(src); - if (ds.bits == ss.bits || ss.t == TYVOID || ds.t == TYVOID) - return ((dst.flag & TFCHLDQUAL) & (src.flag & TFCHLDQUAL)) == (src.flag & TFCHLDQUAL); + return ds.bits == ss.bits || ss.t == TYVOID || ds.t == TYVOID; } if (dst.t == TYBOOL && src.t == TYPTR) return 1; -- cgit v1.2.3