mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-29 23:36:05 +00:00

The `-Wpointer-sign` warning text is inappropriate for describing the incompatible pointer conversion between plain `char` and explicitly `signed`/`unsigned` `char` (whichever plain `char` has the same range as) and vice versa. Specifically, in part, it reads "converts between pointers to integer types with different sign". This patch changes that portion to read instead as "converts between pointers to integer types where one is of the unique plain 'char' type and the other is not" when one of the types is plain `char`. C17 subclause 6.5.16.1 indicates that the conversions resulting in `-Wpointer-sign` warnings in assignment-like contexts are constraint violations. This means that strict conformance requires a diagnostic for the case where the message text is wrong before this patch. The lack of an even more specialized warning group is consistent with GCC. Reviewed By: aaron.ballman Differential Revision: https://reviews.llvm.org/D93999
24 lines
2.1 KiB
C
24 lines
2.1 KiB
C
// RUN: %clang_cc1 %s -verify -fsyntax-only
|
|
// RUN: %clang_cc1 %s -verify -fsyntax-only -fno-signed-char
|
|
|
|
int a(int* x); // expected-note{{passing argument to parameter 'x' here}}
|
|
int b(unsigned* y) { return a(y); } // expected-warning {{passing 'unsigned int *' to parameter of type 'int *' converts between pointers to integer types with different sign}}
|
|
|
|
signed char *plainCharToSignedChar(signed char *arg) { // expected-note{{passing argument to parameter}}
|
|
extern char c;
|
|
signed char *p = &c; // expected-warning {{converts between pointers to integer types where one is of the unique plain 'char' type and the other is not}}
|
|
struct { signed char *p; } s = { &c }; // expected-warning {{converts between pointers to integer types where one is of the unique plain 'char' type and the other is not}}
|
|
p = &c; // expected-warning {{converts between pointers to integer types where one is of the unique plain 'char' type and the other is not}}
|
|
plainCharToSignedChar(&c); // expected-warning {{converts between pointers to integer types where one is of the unique plain 'char' type and the other is not}}
|
|
return &c; // expected-warning {{converts between pointers to integer types where one is of the unique plain 'char' type and the other is not}}
|
|
}
|
|
|
|
char *unsignedCharToPlainChar(char *arg) { // expected-note{{passing argument to parameter}}
|
|
extern unsigned char uc[];
|
|
char *p = uc; // expected-warning {{converts between pointers to integer types where one is of the unique plain 'char' type and the other is not}}
|
|
(void) (char *[]){ [42] = uc }; // expected-warning {{converts between pointers to integer types where one is of the unique plain 'char' type and the other is not}}
|
|
p = uc; // expected-warning {{converts between pointers to integer types where one is of the unique plain 'char' type and the other is not}}
|
|
unsignedCharToPlainChar(uc); // expected-warning {{converts between pointers to integer types where one is of the unique plain 'char' type and the other is not}}
|
|
return uc; // expected-warning {{converts between pointers to integer types where one is of the unique plain 'char' type and the other is not}}
|
|
}
|