aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2025-11-26 18:46:44 +0100
committerlemon <lsof@mailbox.org>2025-11-26 19:31:10 +0100
commit375e9f050de6b09c00eecafd63bd9b967fbeb335 (patch)
tree940db01d53dbe8d39279b6c95902b4cfadb31f92
parent0bb43ea3af31d4c141285ab968b476228416f0c8 (diff)
c/type: make implicit const T* -> T* conversion warning, not error
-rw-r--r--c/c.c9
-rw-r--r--io.c3
-rw-r--r--type.c3
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;