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