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;
 		}
 	}

Reply via email to