Module Name: src
Committed By: rillig
Date: Sat Nov 23 00:01:49 UTC 2024
Modified Files:
src/tests/usr.bin/xlint/lint1: msg_128.c msg_153.c msg_182.c queries.c
src/usr.bin/xlint/lint1: err.c tree.c
Log Message:
lint: add details to messages about discarding qualifiers
The related message 153 is left as-is, as it is used in two places, and
the second place is not only about discarded qualifiers.
To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/tests/usr.bin/xlint/lint1/msg_128.c
cvs rdiff -u -r1.7 -r1.8 src/tests/usr.bin/xlint/lint1/msg_153.c \
src/tests/usr.bin/xlint/lint1/msg_182.c
cvs rdiff -u -r1.29 -r1.30 src/tests/usr.bin/xlint/lint1/queries.c
cvs rdiff -u -r1.253 -r1.254 src/usr.bin/xlint/lint1/err.c
cvs rdiff -u -r1.658 -r1.659 src/usr.bin/xlint/lint1/tree.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/tests/usr.bin/xlint/lint1/msg_128.c
diff -u src/tests/usr.bin/xlint/lint1/msg_128.c:1.8 src/tests/usr.bin/xlint/lint1/msg_128.c:1.9
--- src/tests/usr.bin/xlint/lint1/msg_128.c:1.8 Sun Jan 28 08:17:27 2024
+++ src/tests/usr.bin/xlint/lint1/msg_128.c Sat Nov 23 00:01:48 2024
@@ -1,15 +1,31 @@
-/* $NetBSD: msg_128.c,v 1.8 2024/01/28 08:17:27 rillig Exp $ */
+/* $NetBSD: msg_128.c,v 1.9 2024/11/23 00:01:48 rillig Exp $ */
# 3 "msg_128.c"
-// Test for message: operands of '%s' have incompatible pointer types to '%s' and '%s' [128]
+// Test for message: operator '%s' discards '%s' from '%s' [128]
/* lint1-extra-flags: -X 351 */
+char *ptr;
+const char *cptr;
+volatile char *vptr;
+const volatile char *cvptr;
+
+const volatile int *cviptr;
+
void
-conversion_to_unconst(const char *cstr)
+assign(void)
{
- char *str;
- /* expect+2: warning: operands of '=' have incompatible pointer types to 'char' and 'const char' [128] */
- /* expect+1: warning: 'str' set but not used in function 'conversion_to_unconst' [191] */
- str = cstr;
+ /* expect+1: warning: operator '=' discards 'const volatile' from 'pointer to const volatile char' [128] */
+ ptr = cvptr;
+ /* expect+1: warning: operator '=' discards 'volatile' from 'pointer to const volatile char' [128] */
+ cptr = cvptr;
+ /* expect+1: warning: operator '=' discards 'const' from 'pointer to const volatile char' [128] */
+ vptr = cvptr;
+
+ /* expect+1: warning: illegal combination of 'pointer to char' and 'pointer to const volatile int', op '=' [124] */
+ ptr = cviptr;
+ /* expect+1: warning: illegal combination of 'pointer to const char' and 'pointer to const volatile int', op '=' [124] */
+ cptr = cviptr;
+ /* expect+1: warning: illegal combination of 'pointer to volatile char' and 'pointer to const volatile int', op '=' [124] */
+ vptr = cviptr;
}
Index: src/tests/usr.bin/xlint/lint1/msg_153.c
diff -u src/tests/usr.bin/xlint/lint1/msg_153.c:1.7 src/tests/usr.bin/xlint/lint1/msg_153.c:1.8
--- src/tests/usr.bin/xlint/lint1/msg_153.c:1.7 Tue Mar 28 14:44:35 2023
+++ src/tests/usr.bin/xlint/lint1/msg_153.c Sat Nov 23 00:01:48 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_153.c,v 1.7 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_153.c,v 1.8 2024/11/23 00:01:48 rillig Exp $ */
# 3 "msg_153.c"
// Test for message: converting '%s' to incompatible '%s' for argument %d [153]
@@ -10,6 +10,7 @@ typedef double (*unary_operator)(double)
void sink_function_pointer(unary_operator);
void sink_int_pointer(int *);
+void sink_qualifiers(char *, const char *, volatile char *, const volatile char *);
void
to_function_pointer(int *x)
@@ -24,3 +25,14 @@ to_int_pointer(unary_operator op)
/* expect+1: warning: converting 'pointer to function(double) returning double' to incompatible 'pointer to int' for argument 1 [153] */
sink_int_pointer(op);
}
+
+void
+qualifiers(char *ptr, const volatile char *cvptr)
+{
+ sink_qualifiers(ptr, ptr, ptr, ptr);
+
+ /* expect+3: warning: converting 'pointer to const volatile char' to incompatible 'pointer to char' for argument 1 [153] */
+ /* expect+2: warning: converting 'pointer to const volatile char' to incompatible 'pointer to const char' for argument 2 [153] */
+ /* expect+1: warning: converting 'pointer to const volatile char' to incompatible 'pointer to volatile char' for argument 3 [153] */
+ sink_qualifiers(cvptr, cvptr, cvptr, cvptr);
+}
Index: src/tests/usr.bin/xlint/lint1/msg_182.c
diff -u src/tests/usr.bin/xlint/lint1/msg_182.c:1.7 src/tests/usr.bin/xlint/lint1/msg_182.c:1.8
--- src/tests/usr.bin/xlint/lint1/msg_182.c:1.7 Sun Jan 28 08:17:27 2024
+++ src/tests/usr.bin/xlint/lint1/msg_182.c Sat Nov 23 00:01:48 2024
@@ -1,21 +1,21 @@
-/* $NetBSD: msg_182.c,v 1.7 2024/01/28 08:17:27 rillig Exp $ */
+/* $NetBSD: msg_182.c,v 1.8 2024/11/23 00:01:48 rillig Exp $ */
# 3 "msg_182.c"
-// Test for message: incompatible pointer types to '%s' and '%s' [182]
+// Test for message: '%s' discards '%s' from '%s' [182]
/* lint1-extra-flags: -X 351 */
void *
return_discarding_volatile(volatile void *arg)
{
- /* expect+1: warning: incompatible pointer types to 'void' and 'volatile void' [182] */
+ /* expect+1: warning: 'return' discards 'volatile' from 'pointer to volatile void' [182] */
return arg;
}
void
init_discarding_volatile(volatile void *arg)
{
- /* expect+2: warning: incompatible pointer types to 'void' and 'volatile void' [182] */
+ /* expect+2: warning: 'init' discards 'volatile' from 'pointer to volatile void' [182] */
/* expect+1: warning: 'array' set but not used in function 'init_discarding_volatile' [191] */
void *array[] = { arg };
}
Index: src/tests/usr.bin/xlint/lint1/queries.c
diff -u src/tests/usr.bin/xlint/lint1/queries.c:1.29 src/tests/usr.bin/xlint/lint1/queries.c:1.30
--- src/tests/usr.bin/xlint/lint1/queries.c:1.29 Sat Apr 27 12:46:37 2024
+++ src/tests/usr.bin/xlint/lint1/queries.c Sat Nov 23 00:01:48 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: queries.c,v 1.29 2024/04/27 12:46:37 rillig Exp $ */
+/* $NetBSD: queries.c,v 1.30 2024/11/23 00:01:48 rillig Exp $ */
# 3 "queries.c"
/*
@@ -70,6 +70,7 @@ c64_t c64;
char *str;
const char *cstr;
volatile char *vstr;
+const volatile char *cvstr;
void *void_ptr;
const void *const_void_ptr;
@@ -281,10 +282,10 @@ Q7(void)
/* expect+1: redundant cast from 'pointer to char' to 'pointer to char' before assignment [Q7] */
str = (str_t)str;
str = (str_t)cstr;
- /* expect+1: warning: operands of '=' have incompatible pointer types to 'char' and 'const char' [128] */
+ /* expect+1: warning: operator '=' discards 'const' from 'pointer to const char' [128] */
str = (cstr_t)str;
/* expect+2: no-op cast from 'pointer to const char' to 'pointer to const char' [Q6] */
- /* expect+1: warning: operands of '=' have incompatible pointer types to 'char' and 'const char' [128] */
+ /* expect+1: warning: operator '=' discards 'const' from 'pointer to const char' [128] */
str = (cstr_t)cstr;
/* expect+1: no-op cast from 'pointer to char' to 'pointer to char' [Q6] */
cstr = (str_t)str;
@@ -298,10 +299,10 @@ Q7(void)
/* expect+1: redundant cast from 'pointer to char' to 'pointer to char' before assignment [Q7] */
str = (str_t)str;
str = (str_t)vstr;
- /* expect+1: warning: operands of '=' have incompatible pointer types to 'char' and 'volatile char' [128] */
+ /* expect+1: warning: operator '=' discards 'volatile' from 'pointer to volatile char' [128] */
str = (vstr_t)str;
/* expect+2: no-op cast from 'pointer to volatile char' to 'pointer to volatile char' [Q6] */
- /* expect+1: warning: operands of '=' have incompatible pointer types to 'char' and 'volatile char' [128] */
+ /* expect+1: warning: operator '=' discards 'volatile' from 'pointer to volatile char' [128] */
str = (vstr_t)vstr;
/* expect+1: no-op cast from 'pointer to char' to 'pointer to char' [Q6] */
vstr = (str_t)str;
@@ -310,6 +311,13 @@ Q7(void)
/* expect+2: no-op cast from 'pointer to volatile char' to 'pointer to volatile char' [Q6] */
/* expect+1: redundant cast from 'pointer to volatile char' to 'pointer to volatile char' before assignment [Q7] */
vstr = (vstr_t)vstr;
+
+ /* expect+1: warning: operator '=' discards 'const volatile' from 'pointer to const volatile char' [128] */
+ str = cvstr;
+ /* expect+1: warning: operator '=' discards 'volatile' from 'pointer to const volatile char' [128] */
+ cstr = cvstr;
+ /* expect+1: warning: operator '=' discards 'const' from 'pointer to const volatile char' [128] */
+ vstr = cvstr;
}
/*
@@ -361,9 +369,9 @@ Q9(int x)
return (0.0);
case 9:
return
-# 365 "queries.c" 3 4
+# 373 "queries.c" 3 4
((void *)0)
-# 367 "queries.c"
+# 375 "queries.c"
/* expect+1: warning: illegal combination of integer 'int' and pointer 'pointer to void' [183] */
;
case 10:
@@ -516,7 +524,7 @@ convert_from_integer_to_floating(void)
void
Q20_void_pointer_conversion(void)
{
- /* expect+1: warning: operands of '=' have incompatible pointer types to 'void' and 'const void' [128] */
+ /* expect+1: warning: operator '=' discards 'const' from 'pointer to const void' [128] */
void_ptr = const_void_ptr;
const_void_ptr = void_ptr;
/* expect+1: implicit narrowing conversion from void pointer to 'pointer to int' [Q20] */
Index: src/usr.bin/xlint/lint1/err.c
diff -u src/usr.bin/xlint/lint1/err.c:1.253 src/usr.bin/xlint/lint1/err.c:1.254
--- src/usr.bin/xlint/lint1/err.c:1.253 Wed Nov 13 04:32:49 2024
+++ src/usr.bin/xlint/lint1/err.c Sat Nov 23 00:01:48 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: err.c,v 1.253 2024/11/13 04:32:49 rillig Exp $ */
+/* $NetBSD: err.c,v 1.254 2024/11/23 00:01:48 rillig Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID)
-__RCSID("$NetBSD: err.c,v 1.253 2024/11/13 04:32:49 rillig Exp $");
+__RCSID("$NetBSD: err.c,v 1.254 2024/11/23 00:01:48 rillig Exp $");
#endif
#include <limits.h>
@@ -183,7 +183,7 @@ static const char *const msgs[] = {
"pointers to functions can only be compared for equality", // 125
"incompatible types '%s' and '%s' in conditional", // 126
"'&' before array or function: ignored", // 127
- "operands of '%s' have incompatible pointer types to '%s' and '%s'", // 128
+ "operator '%s' discards '%s' from '%s'", // 128
"expression has null effect", // 129
"enum type mismatch: '%s' '%s' '%s'", // 130
"conversion to '%s' may sign-extend incorrectly", // 131
@@ -237,7 +237,7 @@ static const char *const msgs[] = {
"cannot initialize struct/union with no named member", // 179
"bit-field initializer does not fit", // 180
"{}-enclosed or constant initializer of type '%s' required", // 181
- "incompatible pointer types to '%s' and '%s'", // 182
+ "'%s' discards '%s' from '%s'", // 182
"illegal combination of %s '%s' and %s '%s'", // 183
"illegal combination of '%s' and '%s'", // 184
"cannot initialize '%s' from '%s'", // 185
Index: src/usr.bin/xlint/lint1/tree.c
diff -u src/usr.bin/xlint/lint1/tree.c:1.658 src/usr.bin/xlint/lint1/tree.c:1.659
--- src/usr.bin/xlint/lint1/tree.c:1.658 Wed Nov 13 04:32:49 2024
+++ src/usr.bin/xlint/lint1/tree.c Sat Nov 23 00:01:48 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: tree.c,v 1.658 2024/11/13 04:32:49 rillig Exp $ */
+/* $NetBSD: tree.c,v 1.659 2024/11/23 00:01:48 rillig Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID)
-__RCSID("$NetBSD: tree.c,v 1.658 2024/11/13 04:32:49 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.659 2024/11/23 00:01:48 rillig Exp $");
#endif
#include <float.h>
@@ -2857,15 +2857,17 @@ check_assign_void_pointer_compat(op_t op
return false;
/* compatible pointer types (qualifiers ignored) */
- if (allow_c90 &&
- ((!lstp->t_const && rstp->t_const) ||
- (!lstp->t_volatile && rstp->t_volatile))) {
- /* left side has not all qualifiers of right */
+ char qualifiers[32];
+ snprintf(qualifiers, sizeof(qualifiers), "%s%s",
+ !lstp->t_const && rstp->t_const ? " const" : "",
+ !lstp->t_volatile && rstp->t_volatile ? " volatile" : "");
+ if (allow_c90 && qualifiers[0] != '\0') {
switch (op) {
case INIT:
case RETURN:
- /* incompatible pointer types to '%s' and '%s' */
- warning(182, type_name(lstp), type_name(rstp));
+ /* '%s' discards '%s' from '%s' */
+ warning(182, op_name(op),
+ qualifiers + 1, type_name(rtp));
break;
case FARG:
/* converting '%s' to incompatible '%s' ... */
@@ -2873,9 +2875,9 @@ check_assign_void_pointer_compat(op_t op
type_name(rtp), type_name(ltp), arg);
break;
default:
- /* operands of '%s' have incompatible pointer ... */
+ /* operator '%s' discards '%s' from '%s' */
warning(128, op_name(op),
- type_name(lstp), type_name(rstp));
+ qualifiers + 1, type_name(rtp));
break;
}
}