diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -7780,7 +7780,8 @@ "|%diff{sending $ to parameter of type $|" "sending to parameter of different type}0,1" "|%diff{casting $ to type $|casting between types}0,1}2" - " converts between pointers to integer types with different sign">, + " converts between pointers to integer types that differ by" + " signed/unsigned/plain variation">, InGroup>; def err_typecheck_convert_incompatible_pointer_sign : Error< "%select{%diff{assigning to $ from $|assigning to different types}0,1" @@ -7794,7 +7795,8 @@ "|%diff{sending $ to parameter of type $|" "sending to parameter of different type}0,1" "|%diff{casting $ to type $|casting between types}0,1}2" - " converts between pointers to integer types with different sign">; + " converts between pointers to integer types that differ by" + " signed/unsigned/plain variation">; def ext_typecheck_convert_incompatible_pointer : ExtWarn< "incompatible pointer types " "%select{%diff{assigning to $ from $|assigning to different types}0,1" diff --git a/clang/test/Sema/incompatible-sign.c b/clang/test/Sema/incompatible-sign.c --- a/clang/test/Sema/incompatible-sign.c +++ b/clang/test/Sema/incompatible-sign.c @@ -1,5 +1,23 @@ // 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}} +int b(unsigned* y) { return a(y); } // expected-warning {{passing 'unsigned int *' to parameter of type 'int *' converts between pointers to integer types that differ by signed/unsigned/plain variation}} +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 that differ by signed/unsigned/plain variation}} + struct { signed char *p; } s = { &c }; // expected-warning {{converts between pointers to integer types that differ by signed/unsigned/plain variation}} + p = &c; // expected-warning {{converts between pointers to integer types that differ by signed/unsigned/plain variation}} + plainCharToSignedChar(&c); // expected-warning {{converts between pointers to integer types that differ by signed/unsigned/plain variation}} + return &c; // expected-warning {{converts between pointers to integer types that differ by signed/unsigned/plain variation}} +} + +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 that differ by signed/unsigned/plain variation}} + (void) (char *[]){ [42] = &uc }; // expected-warning {{converts between pointers to integer types that differ by signed/unsigned/plain variation}} + p = &uc; // expected-warning {{converts between pointers to integer types that differ by signed/unsigned/plain variation}} + unsignedCharToPlainChar(&uc); // expected-warning {{converts between pointers to integer types that differ by signed/unsigned/plain variation}} + return &uc; // expected-warning {{converts between pointers to integer types that differ by signed/unsigned/plain variation}} +} diff --git a/clang/test/Sema/incompatible-sign.cpp b/clang/test/Sema/incompatible-sign.cpp new file mode 100644 --- /dev/null +++ b/clang/test/Sema/incompatible-sign.cpp @@ -0,0 +1,14 @@ +// RUN: %clang_cc1 %s -verify -fsyntax-only +// RUN: %clang_cc1 %s -verify -fsyntax-only -fno-signed-char + +void plainToSigned() { + extern char c; + signed char *p; + p = &c; // expected-error {{converts between pointers to integer types that differ by signed/unsigned/plain variation}} +} + +void unsignedToPlain() { + extern unsigned char uc; + char *p; + p = &uc; // expected-error {{converts between pointers to integer types that differ by signed/unsigned/plain variation}} +} diff --git a/clang/test/Sema/vector-ops.c b/clang/test/Sema/vector-ops.c --- a/clang/test/Sema/vector-ops.c +++ b/clang/test/Sema/vector-ops.c @@ -24,7 +24,7 @@ v2u *v2u_ptr = 0; v2s *v2s_ptr; - v2s_ptr = v2u_ptr; // expected-warning{{converts between pointers to integer types with different sign}} + v2s_ptr = v2u_ptr; // expected-warning{{converts between pointers to integer types that differ by signed/unsigned/plain variation}} } void testLogicalVecVec(v2u v2ua, v2s v2sa, v2f v2fa) { diff --git a/clang/test/SemaObjC/objc-cf-audited-warning.m b/clang/test/SemaObjC/objc-cf-audited-warning.m --- a/clang/test/SemaObjC/objc-cf-audited-warning.m +++ b/clang/test/SemaObjC/objc-cf-audited-warning.m @@ -20,5 +20,5 @@ void saveImageToJPG(const char *filename) { - CFURLRef url = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, filename, 10, 0); // expected-warning {{passing 'const char *' to parameter of type 'const UInt8 *' (aka 'const unsigned char *') converts between pointers to integer types with different sign}} + CFURLRef url = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, filename, 10, 0); // expected-warning {{passing 'const char *' to parameter of type 'const UInt8 *' (aka 'const unsigned char *') converts between pointers to integer types that differ by signed/unsigned/plain variation}} } diff --git a/clang/test/SemaOpenCL/builtins-amdgcn-error.cl b/clang/test/SemaOpenCL/builtins-amdgcn-error.cl --- a/clang/test/SemaOpenCL/builtins-amdgcn-error.cl +++ b/clang/test/SemaOpenCL/builtins-amdgcn-error.cl @@ -156,7 +156,7 @@ const char ptr[] = "workgroup"; val = __builtin_amdgcn_atomic_inc32(&val, val, __ATOMIC_ACQUIRE, ptr); // expected-error {{expression is not a string literal}} int signedVal = 15; - signedVal = __builtin_amdgcn_atomic_inc32(&signedVal, signedVal, __ATOMIC_ACQUIRE, ""); // expected-warning {{passing '__private int *' to parameter of type 'volatile __private unsigned int *' converts between pointers to integer types with different sign}} + signedVal = __builtin_amdgcn_atomic_inc32(&signedVal, signedVal, __ATOMIC_ACQUIRE, ""); // expected-warning {{passing '__private int *' to parameter of type 'volatile __private unsigned int *' converts between pointers to integer types that differ by signed/unsigned/plain variation}} } void test_atomic_inc64() { @@ -170,7 +170,7 @@ const char ptr[] = "workgroup"; val = __builtin_amdgcn_atomic_inc64(&val, val, __ATOMIC_ACQUIRE, ptr); // expected-error {{expression is not a string literal}} __INT64_TYPE__ signedVal = 15; - signedVal = __builtin_amdgcn_atomic_inc64(&signedVal, signedVal, __ATOMIC_ACQUIRE, ""); // expected-warning {{passing '__private long *' to parameter of type 'volatile __private unsigned long *' converts between pointers to integer types with different sign}} + signedVal = __builtin_amdgcn_atomic_inc64(&signedVal, signedVal, __ATOMIC_ACQUIRE, ""); // expected-warning {{passing '__private long *' to parameter of type 'volatile __private unsigned long *' converts between pointers to integer types that differ by signed/unsigned/plain variation}} } void test_atomic_dec32() { @@ -184,7 +184,7 @@ const char ptr[] = "workgroup"; val = __builtin_amdgcn_atomic_dec32(&val, val, __ATOMIC_ACQUIRE, ptr); // expected-error {{expression is not a string literal}} int signedVal = 15; - signedVal = __builtin_amdgcn_atomic_dec32(&signedVal, signedVal, __ATOMIC_ACQUIRE, ""); // expected-warning {{passing '__private int *' to parameter of type 'volatile __private unsigned int *' converts between pointers to integer types with different sign}} + signedVal = __builtin_amdgcn_atomic_dec32(&signedVal, signedVal, __ATOMIC_ACQUIRE, ""); // expected-warning {{passing '__private int *' to parameter of type 'volatile __private unsigned int *' converts between pointers to integer types that differ by signed/unsigned/plain variation}} } void test_atomic_dec64() { @@ -198,5 +198,5 @@ const char ptr[] = "workgroup"; val = __builtin_amdgcn_atomic_dec64(&val, val, __ATOMIC_ACQUIRE, ptr); // expected-error {{expression is not a string literal}} __INT64_TYPE__ signedVal = 15; - signedVal = __builtin_amdgcn_atomic_dec64(&signedVal, signedVal, __ATOMIC_ACQUIRE, ""); // expected-warning {{passing '__private long *' to parameter of type 'volatile __private unsigned long *' converts between pointers to integer types with different sign}} + signedVal = __builtin_amdgcn_atomic_dec64(&signedVal, signedVal, __ATOMIC_ACQUIRE, ""); // expected-warning {{passing '__private long *' to parameter of type 'volatile __private unsigned long *' converts between pointers to integer types that differ by signed/unsigned/plain variation}} }