aaron.ballman created this revision. aaron.ballman added reviewers: efriedma, jyknight, erichkeane, clang-language-wg. Herald added subscribers: steakhal, Enna1, kosarev, arphaman, jvesely. Herald added a project: All. aaron.ballman requested review of this revision. Herald added projects: clang, Sanitizers, clang-tools-extra. Herald added a subscriber: Sanitizers.
Clang has traditionally allowed C programs to implicitly convert integers to pointers and pointers to integers, despite it not being valid to do so except under special circumstances (like converting the integer 0, which is the null pointer constant, to a pointer). In C89, this would result in undefined behavior per 3.3.4, and in C99 this rule was strengthened to be a constraint violation instead. Constraint violations are most often handled as an error. This patch changes the warning to default to an error in all C modes (it is already an error in C++). This gives us better security posture by calling out potential programmer mistakes in code but still allows users who need this behavior to use `-Wno-error=int-conversion` to retain the warning behavior, or `-Wno-int-conversion` to silence the diagnostic entirely. When modifying the diagnostics, I observed that `ext_typecheck_convert_int_pointer` was already marked `SFINAEFailure` but `ext_typecheck_convert_pointer_int` was not. This appeared to be an oversight which I corrected. That resulted in needing a change to not perform SFINAE traps in C mode. If desired, I can split those changes into a separate review, but they felt related enough to this change to be reasonable to roll in here by virtue of changing the behavior of the diagnostic. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D129881 Files: clang-tools-extra/test/clang-tidy/checkers/bugprone/no-escape.m clang-tools-extra/test/clang-tidy/checkers/performance/no-int-to-ptr.c clang/bindings/python/tests/cindex/test_diagnostics.py clang/include/clang/Basic/DiagnosticSemaKinds.td clang/lib/Sema/SemaExprCXX.cpp clang/test/Analysis/ObjCProperties.m clang/test/Analysis/bsd-string.c clang/test/Analysis/novoidtypecrash.c clang/test/Analysis/null-deref-ps.c clang/test/Analysis/number-object-conversion.c clang/test/Analysis/number-object-conversion.m clang/test/Analysis/pr22954.c clang/test/C/drs/dr0xx.c clang/test/C/drs/dr2xx.c clang/test/CodeGen/2008-03-05-syncPtr.c clang/test/CodeGen/2008-07-31-promotion-of-compound-pointer-arithmetic.c clang/test/CodeGen/aarch64-mops.c clang/test/CodeGen/address-space-cast.c clang/test/CodeGen/const-init.c clang/test/CodeGen/pointer-arithmetic.c clang/test/CodeGen/pointer-to-int.c clang/test/CodeGen/statements.c clang/test/CodeGen/struct-init.c clang/test/CodeGen/vla.c clang/test/CodeGenObjC/block-ptr-type-crash.m clang/test/CodeGenOpenCL/builtins-generic-amdgcn.cl clang/test/FixIt/dereference-addressof.c clang/test/FixIt/selector-fixit.m clang/test/Misc/serialized-diags.c clang/test/Misc/tabstop.c clang/test/Modules/config_macros.m clang/test/PCH/objc_exprs.m clang/test/Parser/implicit-casts.c clang/test/Sema/array-init.c clang/test/Sema/atomic-ops.c clang/test/Sema/block-return.c clang/test/Sema/builtin-alloca-with-align.c clang/test/Sema/builtin-assume-aligned.c clang/test/Sema/builtin-dump-struct.c clang/test/Sema/builtins-bpf.c clang/test/Sema/builtins.c clang/test/Sema/compound-literal.c clang/test/Sema/conditional-expr.c clang/test/Sema/enum.c clang/test/Sema/extern-redecl.c clang/test/Sema/format-strings.c clang/test/Sema/function-redecl.c clang/test/Sema/function.c clang/test/Sema/i-c-e.c clang/test/Sema/indirect-goto.c clang/test/Sema/matrix-type-builtins.c clang/test/Sema/nullability.c clang/test/SemaObjC/argument-checking.m clang/test/SemaObjC/comptypes-7.m clang/test/SemaObjC/ivar-lookup-resolution-builtin.m clang/test/SemaObjC/message.m clang/test/SemaObjC/method-lookup-5.m clang/test/SemaObjC/nullability.m clang/test/SemaObjC/objc-container-subscripting-3.m clang/test/SemaObjC/objc-literal-fixit.m clang/test/SemaObjC/signed-char-bool-conversion.m clang/test/SemaOpenCL/atomic-ops.cl clang/test/SemaOpenCL/builtins-amdgcn-error.cl clang/test/VFS/Inputs/external-names.h clang/test/VFS/external-names.c compiler-rt/test/dfsan/gep.c compiler-rt/test/dfsan/sigaction.c
Index: compiler-rt/test/dfsan/sigaction.c =================================================================== --- compiler-rt/test/dfsan/sigaction.c +++ compiler-rt/test/dfsan/sigaction.c @@ -1,5 +1,5 @@ -// RUN: %clang_dfsan -DUSE_SIGNAL_ACTION %s -o %t && %run %t -// RUN: %clang_dfsan %s -o %t && %run %t +// RUN: %clang_dfsan -DUSE_SIGNAL_ACTION -Wno-error=int-conversion %s -o %t && %run %t +// RUN: %clang_dfsan -Wno-error=int-conversion %s -o %t && %run %t // // REQUIRES: x86_64-target-arch Index: compiler-rt/test/dfsan/gep.c =================================================================== --- compiler-rt/test/dfsan/gep.c +++ compiler-rt/test/dfsan/gep.c @@ -1,5 +1,5 @@ -// RUN: %clang_dfsan %s -mllvm -dfsan-combine-offset-labels-on-gep=false -o %t && %run %t -// RUN: %clang_dfsan %s -DPROP_OFFSET_LABELS -o %t && %run %t +// RUN: %clang_dfsan %s -mllvm -dfsan-combine-offset-labels-on-gep=false -Wno-error=int-conversion -o %t && %run %t +// RUN: %clang_dfsan %s -DPROP_OFFSET_LABELS -Wno-error=int-conversion -o %t && %run %t // // REQUIRES: x86_64-target-arch Index: clang/test/VFS/external-names.c =================================================================== --- clang/test/VFS/external-names.c +++ clang/test/VFS/external-names.c @@ -21,7 +21,7 @@ // Diagnostics: // RUN: %clang_cc1 -I %t -ivfsoverlay %t.external.yaml -fsyntax-only %s 2>&1 | FileCheck -check-prefix=CHECK-DIAG-EXTERNAL %s -// CHECK-DIAG-EXTERNAL: {{.*}}Inputs{{..?}}external-names.h:{{[0-9]*:[0-9]*}}: warning: incompatible pointer +// CHECK-DIAG-EXTERNAL: {{.*}}Inputs{{..?}}external-names.h:{{[0-9]*:[0-9]*}}: warning: initializing 'const char **' // RUN: %clang_cc1 -I %t -ivfsoverlay %t.yaml -fsyntax-only %s 2>&1 | FileCheck -check-prefix=CHECK-DIAG %s // CHECK-DIAG-NOT: Inputs Index: clang/test/VFS/Inputs/external-names.h =================================================================== --- clang/test/VFS/Inputs/external-names.h +++ clang/test/VFS/Inputs/external-names.h @@ -1,4 +1,4 @@ void foo(char **c) { *c = __FILE__; - int x = c; // produce a diagnostic + const char **x = c; // produce a diagnostic } Index: clang/test/SemaOpenCL/builtins-amdgcn-error.cl =================================================================== --- clang/test/SemaOpenCL/builtins-amdgcn-error.cl +++ clang/test/SemaOpenCL/builtins-amdgcn-error.cl @@ -146,7 +146,7 @@ __builtin_amdgcn_fence(4); // expected-error {{too few arguments to function call, expected 2}} __builtin_amdgcn_fence(4, 4, 4); // expected-error {{too many arguments to function call, expected 2}} __builtin_amdgcn_fence(3.14, ""); // expected-warning {{implicit conversion from 'double' to 'unsigned int' changes value from 3.14 to 3}} - __builtin_amdgcn_fence(__ATOMIC_ACQUIRE, 5); // expected-warning {{incompatible integer to pointer conversion passing 'int' to parameter of type 'const char *'}} + __builtin_amdgcn_fence(__ATOMIC_ACQUIRE, 5); // expected-error {{incompatible integer to pointer conversion passing 'int' to parameter of type 'const char *'}} const char ptr[] = "workgroup"; __builtin_amdgcn_fence(__ATOMIC_ACQUIRE, ptr); // expected-error {{expression is not a string literal}} } @@ -164,7 +164,7 @@ val = __builtin_amdgcn_atomic_inc32(4); // expected-error {{too few arguments to function call, expected 4}} val = __builtin_amdgcn_atomic_inc32(&val, val, 4, 4, 4, 4); // expected-error {{too many arguments to function call, expected 4}} val = __builtin_amdgcn_atomic_inc32(&val, val, 3.14, ""); // expected-warning {{implicit conversion from 'double' to 'unsigned int' changes value from 3.14 to 3}} - val = __builtin_amdgcn_atomic_inc32(&val, val, __ATOMIC_ACQUIRE, 5); // expected-warning {{incompatible integer to pointer conversion passing 'int' to parameter of type 'const char *'}} + val = __builtin_amdgcn_atomic_inc32(&val, val, __ATOMIC_ACQUIRE, 5); // expected-error {{incompatible integer to pointer conversion passing 'int' to parameter of type 'const char *'}} 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; @@ -179,7 +179,7 @@ val = __builtin_amdgcn_atomic_inc64(4); // expected-error {{too few arguments to function call, expected 4}} val = __builtin_amdgcn_atomic_inc64(&val, val, 4, 4, 4, 4); // expected-error {{too many arguments to function call, expected 4}} val = __builtin_amdgcn_atomic_inc64(&val, val, 3.14, ""); // expected-warning {{implicit conversion from 'double' to 'unsigned int' changes value from 3.14 to 3}} - val = __builtin_amdgcn_atomic_inc64(&val, val, __ATOMIC_ACQUIRE, 5); // expected-warning {{incompatible integer to pointer conversion passing 'int' to parameter of type 'const char *'}} + val = __builtin_amdgcn_atomic_inc64(&val, val, __ATOMIC_ACQUIRE, 5); // expected-error {{incompatible integer to pointer conversion passing 'int' to parameter of type 'const char *'}} 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; @@ -194,7 +194,7 @@ val = __builtin_amdgcn_atomic_dec32(4); // expected-error {{too few arguments to function call, expected 4}} val = __builtin_amdgcn_atomic_dec32(&val, val, 4, 4, 4, 4); // expected-error {{too many arguments to function call, expected 4}} val = __builtin_amdgcn_atomic_dec32(&val, val, 3.14, ""); // expected-warning {{implicit conversion from 'double' to 'unsigned int' changes value from 3.14 to 3}} - val = __builtin_amdgcn_atomic_dec32(&val, val, __ATOMIC_ACQUIRE, 5); // expected-warning {{incompatible integer to pointer conversion passing 'int' to parameter of type 'const char *'}} + val = __builtin_amdgcn_atomic_dec32(&val, val, __ATOMIC_ACQUIRE, 5); // expected-error {{incompatible integer to pointer conversion passing 'int' to parameter of type 'const char *'}} 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; @@ -209,7 +209,7 @@ val = __builtin_amdgcn_atomic_dec64(4); // expected-error {{too few arguments to function call, expected 4}} val = __builtin_amdgcn_atomic_dec64(&val, val, 4, 4, 4, 4); // expected-error {{too many arguments to function call, expected 4}} val = __builtin_amdgcn_atomic_dec64(&val, val, 3.14, ""); // expected-warning {{implicit conversion from 'double' to 'unsigned int' changes value from 3.14 to 3}} - val = __builtin_amdgcn_atomic_dec64(&val, val, __ATOMIC_ACQUIRE, 5); // expected-warning {{incompatible integer to pointer conversion passing 'int' to parameter of type 'const char *'}} + val = __builtin_amdgcn_atomic_dec64(&val, val, __ATOMIC_ACQUIRE, 5); // expected-error {{incompatible integer to pointer conversion passing 'int' to parameter of type 'const char *'}} 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; Index: clang/test/SemaOpenCL/atomic-ops.cl =================================================================== --- clang/test/SemaOpenCL/atomic-ops.cl +++ clang/test/SemaOpenCL/atomic-ops.cl @@ -82,7 +82,7 @@ __opencl_atomic_load(ci, memory_order_acquire, memory_scope_work_group); __opencl_atomic_init(&gn, 456); - __opencl_atomic_init(&gn, (void*)0); // expected-warning{{incompatible pointer to integer conversion passing '__generic void *' to parameter of type 'int'}} + __opencl_atomic_init(&gn, (void*)0); // expected-error{{incompatible pointer to integer conversion passing '__generic void *' to parameter of type 'int'}} } void memory_checks(atomic_int *Ap, int *p, int val) { Index: clang/test/SemaObjC/signed-char-bool-conversion.m =================================================================== --- clang/test/SemaObjC/signed-char-bool-conversion.m +++ clang/test/SemaObjC/signed-char-bool-conversion.m @@ -24,9 +24,7 @@ b = 2.1; // expected-warning {{implicit conversion from constant value 2.1 to 'BOOL'; the only well defined values for 'BOOL' are YES and NO}} b = YES; -#ifndef __cplusplus - b = ptr; // expected-warning {{incompatible pointer to integer conversion assigning to 'BOOL' (aka 'signed char') from 'int *'}} -#endif + b = ptr; // expected-error {{incompatible pointer to integer conversion assigning to 'BOOL' (aka 'signed char') from 'int *'}} } @interface BoolProp @@ -41,9 +39,7 @@ bp.p = i; // expected-warning {{implicit conversion from integral type 'int' to 'BOOL'}} bp.p = b; bp.p = bp.p; -#ifndef __cplusplus - bp.p = ptr; // expected-warning {{incompatible pointer to integer conversion assigning to 'BOOL' (aka 'signed char') from 'int *'}} -#endif + bp.p = ptr; // expected-error {{incompatible pointer to integer conversion assigning to 'BOOL' (aka 'signed char') from 'int *'}} bp.p = 1; bp.p = 2; // expected-warning {{implicit conversion from constant value 2 to 'BOOL'; the only well defined values for 'BOOL' are YES and NO}} } Index: clang/test/SemaObjC/objc-literal-fixit.m =================================================================== --- clang/test/SemaObjC/objc-literal-fixit.m +++ clang/test/SemaObjC/objc-literal-fixit.m @@ -29,11 +29,11 @@ NSNumber *n6 = '1'; // expected-error{{numeric literal must be prefixed by '@'}} int i; - NSNumber *n7 = i; // c-warning{{incompatible integer to pointer conversion}} + NSNumber *n7 = i; // c-error{{incompatible integer to pointer conversion}} // arc-error@-1{{implicit conversion of 'int' to 'NSNumber *' is disallowed with ARC}} // cxx-error@-2{{cannot initialize a variable of type 'NSNumber *' with an lvalue of type 'int'}} - id n8 = 1; // c-warning{{incompatible integer to pointer conversion}} + id n8 = 1; // c-error{{incompatible integer to pointer conversion}} // arc-error@-1{{implicit conversion of 'int' to 'id' is disallowed with ARC}} // cxx-error@-2{{cannot initialize a variable of type 'id' with an rvalue of type 'int'}} } Index: clang/test/SemaObjC/objc-container-subscripting-3.m =================================================================== --- clang/test/SemaObjC/objc-container-subscripting-3.m +++ clang/test/SemaObjC/objc-container-subscripting-3.m @@ -19,7 +19,7 @@ NSMutableDictionary *dict; id key, val; val = dict[key]; // expected-error {{method for accessing dictionary element must have Objective-C object return type instead of 'int'}} \ - // expected-warning {{incompatible integer to pointer conversion assigning to 'id' from 'int'}} + // expected-error {{incompatible integer to pointer conversion assigning to 'id' from 'int'}} dict[key] = val; // expected-error {{method object parameter type 'int' is not object type}} } Index: clang/test/SemaObjC/nullability.m =================================================================== --- clang/test/SemaObjC/nullability.m +++ clang/test/SemaObjC/nullability.m @@ -301,5 +301,5 @@ @end void testMessageSendResultType(C0 * _Nullable c0) { - int *p = [c0 count]; // expected-warning {{incompatible integer to pointer conversion initializing 'int *' with an expression of type 'int'}} + int *p = [c0 count]; // expected-error {{incompatible integer to pointer conversion initializing 'int *' with an expression of type 'int'}} } Index: clang/test/SemaObjC/method-lookup-5.m =================================================================== --- clang/test/SemaObjC/method-lookup-5.m +++ clang/test/SemaObjC/method-lookup-5.m @@ -7,4 +7,4 @@ @end void f0(A *a) { int x = [[a foo] baz]; } // expected-warning {{method '+baz' not found (return type defaults to 'id')}} \ - // expected-warning {{ncompatible pointer to integer conversion initializing 'int' with an expression of type 'id'}} + // expected-error {{incompatible pointer to integer conversion initializing 'int' with an expression of type 'id'}} Index: clang/test/SemaObjC/message.m =================================================================== --- clang/test/SemaObjC/message.m +++ clang/test/SemaObjC/message.m @@ -87,7 +87,7 @@ int test5(int X) { int a = [X somemsg]; // expected-warning {{receiver type 'int' is not 'id'}} \ expected-warning {{method '-somemsg' not found}} \ - expected-warning {{incompatible pointer to integer conversion initializing 'int' with an expression of type 'id'}} + expected-error {{incompatible pointer to integer conversion initializing 'int' with an expression of type 'id'}} int b = [S somemsg]; // expected-error {{bad receiver type 'struct S'}} } Index: clang/test/SemaObjC/ivar-lookup-resolution-builtin.m =================================================================== --- clang/test/SemaObjC/ivar-lookup-resolution-builtin.m +++ clang/test/SemaObjC/ivar-lookup-resolution-builtin.m @@ -30,11 +30,11 @@ { return index; // expected-error {{call to undeclared library function 'index'}} \ // expected-note {{include the header <strings.h> or explicitly provide a declaration for 'index'}} \ - // expected-warning {{incompatible pointer to integer conversion returning}} + // expected-error {{incompatible pointer to integer conversion returning}} } + (int) ClassMethod { - return index; // expected-warning {{incompatible pointer to integer conversion returning}} + return index; // expected-error {{incompatible pointer to integer conversion returning}} } @end Index: clang/test/SemaObjC/comptypes-7.m =================================================================== --- clang/test/SemaObjC/comptypes-7.m +++ clang/test/SemaObjC/comptypes-7.m @@ -21,24 +21,25 @@ int i = 0; int *j = nil; - /* These should all generate warnings. */ + /* The incompatible pointer types should all generate warnings, while the + incompatible integer to/from pointer conversions default to an error. */ - obj = i; // expected-warning {{incompatible integer to pointer conversion assigning to 'id' from 'int'}} + obj = i; // expected-error {{incompatible integer to pointer conversion assigning to 'id' from 'int'}} obj = j; // expected-warning {{incompatible pointer types assigning to 'id' from 'int *'}} - obj_p = i; // expected-warning {{incompatible integer to pointer conversion assigning to 'id<MyProtocol>' from 'int'}} + obj_p = i; // expected-error {{incompatible integer to pointer conversion assigning to 'id<MyProtocol>' from 'int'}} obj_p = j; // expected-warning {{incompatible pointer types assigning to 'id<MyProtocol>' from 'int *'}} - obj_c = i; // expected-warning {{incompatible integer to pointer conversion assigning to 'MyClass *' from 'int'}} + obj_c = i; // expected-error {{incompatible integer to pointer conversion assigning to 'MyClass *' from 'int'}} obj_c = j; // expected-warning {{incompatible pointer types assigning to 'MyClass *' from 'int *'}} - obj_C = i; // expected-warning {{incompatible integer to pointer conversion assigning to 'Class' from 'int'}} + obj_C = i; // expected-error {{incompatible integer to pointer conversion assigning to 'Class' from 'int'}} obj_C = j; // expected-warning {{incompatible pointer types assigning to 'Class' from 'int *'}} - i = obj; // expected-warning {{incompatible pointer to integer conversion assigning to 'int' from 'id'}} - i = obj_p; // expected-warning {{incompatible pointer to integer conversion assigning to 'int' from 'id<MyProtocol>'}} - i = obj_c; // expected-warning {{incompatible pointer to integer conversion assigning to 'int' from 'MyClass *'}} - i = obj_C; // expected-warning {{incompatible pointer to integer conversion assigning to 'int' from 'Class'}} + i = obj; // expected-error {{incompatible pointer to integer conversion assigning to 'int' from 'id'}} + i = obj_p; // expected-error {{incompatible pointer to integer conversion assigning to 'int' from 'id<MyProtocol>'}} + i = obj_c; // expected-error {{incompatible pointer to integer conversion assigning to 'int' from 'MyClass *'}} + i = obj_C; // expected-error {{incompatible pointer to integer conversion assigning to 'int' from 'Class'}} j = obj; // expected-warning {{incompatible pointer types assigning to 'int *' from 'id'}} j = obj_p; // expected-warning {{incompatible pointer types assigning to 'int *' from 'id<MyProtocol>'}} Index: clang/test/SemaObjC/argument-checking.m =================================================================== --- clang/test/SemaObjC/argument-checking.m +++ clang/test/SemaObjC/argument-checking.m @@ -17,10 +17,10 @@ id obj = [Test alloc]; struct S sInst; - charStarFunc(1); // expected-warning {{incompatible integer to pointer conversion passing 'int' to parameter of type 'char *'}} - charFunc("abc"); // expected-warning {{incompatible pointer to integer conversion passing 'char[4]' to parameter of type 'char'}} + charStarFunc(1); // expected-error {{incompatible integer to pointer conversion passing 'int' to parameter of type 'char *'}} + charFunc("abc"); // expected-error {{incompatible pointer to integer conversion passing 'char[4]' to parameter of type 'char'}} - [obj charStarMeth:1]; // expected-warning {{incompatible integer to pointer conversion sending 'int'}} + [obj charStarMeth:1]; // expected-error {{incompatible integer to pointer conversion sending 'int'}} [obj structMeth:1]; // expected-error {{sending 'int'}} [obj structMeth:sInst :1]; // expected-error {{sending 'int'}} } Index: clang/test/Sema/nullability.c =================================================================== --- clang/test/Sema/nullability.c +++ clang/test/Sema/nullability.c @@ -211,7 +211,7 @@ int vla[_Nonnull GLOBAL_LENGTH], void ** _Nullable reference); void testDecayedType(void) { - int produceAnErrorMessage = arrays; // expected-warning {{incompatible pointer to integer conversion initializing 'int' with an expression of type 'void (int * _Nonnull, void ** _Nullable, void *** _Nullable, void * _Null_unspecified * _Nonnull * _Nullable, int * _Nonnull, int * _Nonnull, int * _Nonnull, int * _Nonnull, int * _Nonnull, void ** _Nullable)'}} + int produceAnErrorMessage = arrays; // expected-error {{incompatible pointer to integer conversion initializing 'int' with an expression of type 'void (int * _Nonnull, void ** _Nullable, void *** _Nullable, void * _Null_unspecified * _Nonnull * _Nullable, int * _Nonnull, int * _Nonnull, int * _Nonnull, int * _Nonnull, int * _Nonnull, void ** _Nullable)'}} } int notInFunction[_Nullable 3]; // expected-error {{nullability specifier '_Nullable' cannot be applied to non-pointer type 'int[3]'}} Index: clang/test/Sema/matrix-type-builtins.c =================================================================== --- clang/test/Sema/matrix-type-builtins.c +++ clang/test/Sema/matrix-type-builtins.c @@ -73,13 +73,13 @@ 10, // expected-error {{1st argument must be a pointer to a valid matrix element type}} 1ull << 21, // expected-error {{row dimension is outside the allowed range [1, 1048575]}} 1ull << 21, // expected-error {{column dimension is outside the allowed range [1, 1048575]}} - ""); // expected-warning {{incompatible pointer to integer conversion casting 'char[1]' to type 'unsigned long'}} + ""); // expected-error {{incompatible pointer to integer conversion casting 'char[1]' to type 'unsigned long'}} sx5x10_t a13 = __builtin_matrix_column_major_load( 10, // expected-error {{1st argument must be a pointer to a valid matrix element type}} *p4, // expected-error {{casting 'struct Foo' to incompatible type 'unsigned long'}} "", // expected-error {{column argument must be a constant unsigned integer expression}} - // expected-warning@-1 {{incompatible pointer to integer conversion casting 'char[1]' to type 'unsigned long'}} + // expected-error@-1 {{incompatible pointer to integer conversion casting 'char[1]' to type 'unsigned long'}} 10); } Index: clang/test/Sema/indirect-goto.c =================================================================== --- clang/test/Sema/indirect-goto.c +++ clang/test/Sema/indirect-goto.c @@ -6,6 +6,6 @@ goto *l1_ptr; l1: goto *x; // expected-error{{incompatible type}} - goto *y; // expected-warning{{incompatible integer to pointer conversion}} + goto *y; // expected-error{{incompatible integer to pointer conversion}} } Index: clang/test/Sema/i-c-e.c =================================================================== --- clang/test/Sema/i-c-e.c +++ clang/test/Sema/i-c-e.c @@ -92,7 +92,7 @@ int realop[(__real__ 4) == 4 ? 1 : -1]; int imagop[(__imag__ 4) == 0 ? 1 : -1]; -int *PR14729 = 0 ?: 1/0; // expected-error {{not a compile-time constant}} expected-warning 3{{}} +int *PR14729 = 0 ?: 1/0; // expected-error {{not a compile-time constant}} expected-warning 2{{}} expected-error {{incompatible integer to pointer conversion initializing 'int *' with an expression of type 'int'}} int bcp_call_v; int bcp_call_a[] = {__builtin_constant_p(bcp_call_v && 0) ? bcp_call_v && 0 : -1}; Index: clang/test/Sema/function.c =================================================================== --- clang/test/Sema/function.c +++ clang/test/Sema/function.c @@ -1,7 +1,7 @@ // RUN: %clang_cc1 %s -fsyntax-only -verify -verify=c2x -pedantic -Wno-strict-prototypes // PR1892, PR11354 -void f(double a[restrict][5]) { __typeof(a) x = 10; } // expected-warning {{(aka 'double (*restrict)[5]')}} +void f(double a[restrict][5]) { __typeof(a) x = 10; } // expected-error {{(aka 'double (*restrict)[5]')}} int foo (__const char *__path); int foo(__const char *__restrict __file); Index: clang/test/Sema/function-redecl.c =================================================================== --- clang/test/Sema/function-redecl.c +++ clang/test/Sema/function-redecl.c @@ -96,7 +96,7 @@ // GNU extension: prototypes and K&R function definitions int isroot(short x, // expected-note{{previous declaration is here}} - enum e); + enum e); int isroot(x, y) short x; // expected-warning{{promoted type 'int' of K&R function parameter is not compatible with the parameter type 'short' declared in a previous prototype}} @@ -121,11 +121,11 @@ a2 x2; // expected-note{{passing argument to parameter here}} void test_x(void) { x(5); - x2(5); // expected-warning{{incompatible integer to pointer conversion passing 'int' to parameter of type 'int *'}} + x2(5); // expected-error{{incompatible integer to pointer conversion passing 'int' to parameter of type 'int *'}} } -enum e0 {one}; -void f3(); +enum e0 {one}; +void f3(); void f3(enum e0 x) {} enum incomplete_enum; Index: clang/test/Sema/format-strings.c =================================================================== --- clang/test/Sema/format-strings.c +++ clang/test/Sema/format-strings.c @@ -64,11 +64,11 @@ printf("abc\ def" "%*d", 1, 1); // no-warning - + // <rdar://problem/6079850>, allow 'unsigned' (instead of 'int') to be used for both // the field width and precision. This deviates from C99, but is reasonably safe // and is also accepted by GCC. - printf("%*d", (unsigned) 1, 1); // no-warning + printf("%*d", (unsigned) 1, 1); // no-warning } // When calling a non-variadic format function (vprintf, vscanf, NSLogv, ...), @@ -218,7 +218,7 @@ va_start(ap,buf); vprintf("",ap); // expected-warning {{format string is empty}} sprintf(buf, "", 1); // expected-warning {{format string is empty}} - + // Don't warn about empty format strings when there are no data arguments. // This can arise from macro expansions and non-standard format string // functions. @@ -254,7 +254,7 @@ const char *s3 = "hello"; char * const s4 = "hello"; extern const char s5[]; - + printf(s1); // no-warning printf(s2); // no-warning printf(s3); // expected-warning{{not a string literal}} @@ -279,7 +279,7 @@ void torture(va_list v8) { vprintf ("%*.*d", v8); // no-warning - + } void test10(int x, float f, int i, long long lli) { @@ -344,7 +344,7 @@ unsigned char buf[4]; printf ("%.4s\n", buf); // no-warning printf ("%.4s\n", &buf); // expected-warning{{format specifies type 'char *' but the argument has type 'unsigned char (*)[4]'}} - + // Verify that we are checking asprintf asprintf(&b, "%d", "asprintf"); // expected-warning{{format specifies type 'int' but the argument has type 'char *'}} } @@ -490,7 +490,7 @@ extern void rdar8332221_vprintf_scanf(const char *, va_list, const char *, ...) __attribute__((__format__(__printf__, 1, 0))) __attribute__((__format__(__scanf__, 3, 4))); - + void rdar8332221(va_list ap, int *x, long *y) { rdar8332221_vprintf_scanf("%", ap, "%d", x); // expected-warning{{incomplete format specifier}} } @@ -790,7 +790,7 @@ void PR30481(void) { // This caused crashes due to invalid casts. - printf(1 > 0); // expected-warning{{format string is not a string literal}} expected-warning{{incompatible integer to pointer conversion}} expected-note@format-strings.c:*{{passing argument to parameter here}} expected-note{{to avoid this}} + printf(1 > 0); // expected-warning{{format string is not a string literal}} expected-error{{incompatible integer to pointer conversion}} expected-note@format-strings.c:*{{passing argument to parameter here}} expected-note{{to avoid this}} } void test_printf_opaque_ptr(void *op) { Index: clang/test/Sema/extern-redecl.c =================================================================== --- clang/test/Sema/extern-redecl.c +++ clang/test/Sema/extern-redecl.c @@ -14,10 +14,10 @@ int *PR10013_x = 0; { extern int PR10013_x; - extern int PR10013_x; + extern int PR10013_x; } - - return PR10013_x; // expected-warning{{incompatible pointer to integer conversion}} + + return PR10013_x; // expected-error{{incompatible pointer to integer conversion}} } static int test1_a[]; // expected-warning {{tentative array definition assumed to have one element}} Index: clang/test/Sema/enum.c =================================================================== --- clang/test/Sema/enum.c +++ clang/test/Sema/enum.c @@ -1,5 +1,5 @@ // RUN: %clang_cc1 -triple %itanium_abi_triple %s -fsyntax-only -verify -pedantic -enum e {A, +enum e {A, B = 42LL << 32, // expected-warning {{ISO C restricts enumerator values to range of 'int'}} C = -4, D = 12456 }; @@ -11,7 +11,7 @@ enum h { e = -2147483648, // too pos f = 2147483648, // expected-warning {{ISO C restricts enumerator values to range of 'int'}} i = 0xFFFF0000 // expected-warning {{too large}} -}; +}; // minll maxull enum x // expected-warning {{enumeration values exceed range of largest integer}} @@ -91,7 +91,7 @@ typedef enum { an_enumerator = 20 } an_enum; -char * s = (an_enum) an_enumerator; // expected-warning {{incompatible integer to pointer conversion initializing 'char *' with an expression of type 'an_enum'}} +char * s = (an_enum) an_enumerator; // expected-error {{incompatible integer to pointer conversion initializing 'char *' with an expression of type 'an_enum'}} // PR4515 enum PR4515 {PR4515a=1u,PR4515b=(PR4515a-2)/2}; Index: clang/test/Sema/conditional-expr.c =================================================================== --- clang/test/Sema/conditional-expr.c +++ clang/test/Sema/conditional-expr.c @@ -90,7 +90,7 @@ int f0(int a) { // GCC considers this a warning. - return a ? f1() : nil; // expected-warning {{pointer/integer type mismatch in conditional expression ('int' and 'void *')}} expected-warning {{incompatible pointer to integer conversion returning 'void *' from a function with result type 'int'}} + return a ? f1() : nil; // expected-warning {{pointer/integer type mismatch in conditional expression ('int' and 'void *')}} expected-error {{incompatible pointer to integer conversion returning 'void *' from a function with result type 'int'}} } int f2(int x) { Index: clang/test/Sema/compound-literal.c =================================================================== --- clang/test/Sema/compound-literal.c +++ clang/test/Sema/compound-literal.c @@ -11,7 +11,7 @@ static int x = (int){1}; static int *p2 = (int []){2,x}; // expected-error {{initializer element is not a compile-time constant}} -static long *p3 = (long []){2,"x"}; // expected-warning {{incompatible pointer to integer conversion initializing 'long' with an expression of type 'char[2]'}} +static long *p3 = (long []){2,"x"}; // expected-error {{incompatible pointer to integer conversion initializing 'long' with an expression of type 'char[2]'}} typedef struct { } cache_t; // expected-warning{{empty struct is a GNU extension}} static cache_t clo_I1_cache = ((cache_t) { } ); // expected-warning{{use of GNU empty initializer extension}} Index: clang/test/Sema/builtins.c =================================================================== --- clang/test/Sema/builtins.c +++ clang/test/Sema/builtins.c @@ -28,7 +28,7 @@ const void *X; X = CFSTR("\242"); // expected-warning {{input conversion stopped}} X = CFSTR("\0"); // no-warning - X = CFSTR(242); // expected-error {{CFString literal is not a string constant}} expected-warning {{incompatible integer to pointer conversion}} + X = CFSTR(242); // expected-error {{CFString literal is not a string constant}} expected-error {{incompatible integer to pointer conversion}} X = CFSTR("foo", "bar"); // expected-error {{too many arguments to function call}} } @@ -201,8 +201,8 @@ result = __builtin___strlcat_chk(dst, src, sizeof(dst), sizeof(dst)); ptr = __builtin___memccpy_chk(dst, src, '\037', sizeof(src)); // expected-error {{too few arguments to function call}} - ptr = __builtin___strlcpy_chk(dst, src, sizeof(dst), sizeof(dst)); // expected-warning {{incompatible integer to pointer conversion}} - ptr = __builtin___strlcat_chk(dst, src, sizeof(dst), sizeof(dst)); // expected-warning {{incompatible integer to pointer conversion}} + ptr = __builtin___strlcpy_chk(dst, src, sizeof(dst), sizeof(dst)); // expected-error {{incompatible integer to pointer conversion}} + ptr = __builtin___strlcat_chk(dst, src, sizeof(dst), sizeof(dst)); // expected-error {{incompatible integer to pointer conversion}} } void no_ms_builtins(void) { Index: clang/test/Sema/builtins-bpf.c =================================================================== --- clang/test/Sema/builtins-bpf.c +++ clang/test/Sema/builtins-bpf.c @@ -33,7 +33,7 @@ } void *invalid3(struct s *arg) { - return __builtin_preserve_field_info(arg->a, 1); // expected-warning {{incompatible integer to pointer conversion returning 'unsigned int' from a function with result type 'void *'}} + return __builtin_preserve_field_info(arg->a, 1); // expected-error {{incompatible integer to pointer conversion returning 'unsigned int' from a function with result type 'void *'}} } unsigned valid4(struct s *arg) { Index: clang/test/Sema/builtin-dump-struct.c =================================================================== --- clang/test/Sema/builtin-dump-struct.c +++ clang/test/Sema/builtin-dump-struct.c @@ -16,7 +16,7 @@ __builtin_dump_struct(&a, 2); // expected-error {{expected a callable expression as 2nd argument to '__builtin_dump_struct', found 'int'}} __builtin_dump_struct(b, goodfunc); // expected-error {{expected pointer to struct as 1st argument to '__builtin_dump_struct', found 'void *'}} __builtin_dump_struct(&a, badfunc1); // expected-error {{too many arguments to function call, expected 1, have 2}} expected-note {{in call to printing function with arguments '("%s", "struct A")'}} - __builtin_dump_struct(&a, badfunc2); // expected-warning-re 1+{{incompatible pointer to integer conversion passing 'char[{{.*}}]' to parameter of type 'int'}} + __builtin_dump_struct(&a, badfunc2); // expected-error-re 1+{{incompatible pointer to integer conversion passing 'char[{{.*}}]' to parameter of type 'int'}} // expected-note@-1 1+{{in call to printing function with arguments '("}} __builtin_dump_struct(&a, badfunc3); // expected-error {{too many arguments to function call, expected 0, have 2}} expected-note {{in call to printing function with arguments '("%s", "struct A")'}} __builtin_dump_struct(a, goodfunc); // expected-error {{expected pointer to struct as 1st argument to '__builtin_dump_struct', found 'struct A'}} Index: clang/test/Sema/builtin-assume-aligned.c =================================================================== --- clang/test/Sema/builtin-assume-aligned.c +++ clang/test/Sema/builtin-assume-aligned.c @@ -25,7 +25,7 @@ } int test5(int *a, unsigned *b) { - a = __builtin_assume_aligned(a, 32, b); // expected-warning {{incompatible pointer to integer conversion passing 'unsigned int *' to parameter of type}} + a = __builtin_assume_aligned(a, 32, b); // expected-error {{incompatible pointer to integer conversion passing 'unsigned int *' to parameter of type}} return a[0]; } Index: clang/test/Sema/builtin-alloca-with-align.c =================================================================== --- clang/test/Sema/builtin-alloca-with-align.c +++ clang/test/Sema/builtin-alloca-with-align.c @@ -9,7 +9,7 @@ } void test3(unsigned *b) { - __builtin_alloca_with_align(b, 32); // expected-warning {{incompatible pointer to integer conversion passing 'unsigned int *' to parameter of type}} + __builtin_alloca_with_align(b, 32); // expected-error {{incompatible pointer to integer conversion passing 'unsigned int *' to parameter of type}} } void test4(int a) { Index: clang/test/Sema/block-return.c =================================================================== --- clang/test/Sema/block-return.c +++ clang/test/Sema/block-return.c @@ -98,7 +98,7 @@ } int (*funcptr3[5])(long); -int sz8 = sizeof(^int (*[5])(long) {return funcptr3;}); // expected-error {{block cannot return array type}} expected-warning {{incompatible pointer to integer conversion}} +int sz8 = sizeof(^int (*[5])(long) {return funcptr3;}); // expected-error {{block cannot return array type}} expected-error {{incompatible pointer to integer conversion}} int sz9 = sizeof(^int(*())()[3]{ }); // expected-error {{function cannot return array type}} // expected-warning@-1 {{a function declaration without a prototype is deprecated in all versions of C}} Index: clang/test/Sema/atomic-ops.c =================================================================== --- clang/test/Sema/atomic-ops.c +++ clang/test/Sema/atomic-ops.c @@ -164,16 +164,16 @@ __atomic_load(CI, CI, memory_order_relaxed); // expected-warning {{passing 'const int *' to parameter of type 'int *' discards qualifiers}} __c11_atomic_store(i, 1, memory_order_seq_cst); - __c11_atomic_store(p, 1, memory_order_seq_cst); // expected-warning {{incompatible integer to pointer conversion}} + __c11_atomic_store(p, 1, memory_order_seq_cst); // expected-error {{incompatible integer to pointer conversion}} (int)__c11_atomic_store(f, 1, memory_order_seq_cst); // expected-error {{operand of type 'void'}} __atomic_store_n(I, 4, memory_order_release); __atomic_store_n(I, 4.0, memory_order_release); __atomic_store_n(CI, 4, memory_order_release); // expected-error {{address argument to atomic operation must be a pointer to non-const type ('const int *' invalid)}} - __atomic_store_n(I, P, memory_order_release); // expected-warning {{parameter of type 'int'}} + __atomic_store_n(I, P, memory_order_release); // expected-error {{parameter of type 'int'}} __atomic_store_n(i, 1, memory_order_release); // expected-error {{must be a pointer to integer or pointer}} __atomic_store_n(s1, *s2, memory_order_release); // expected-error {{must be a pointer to integer or pointer}} - __atomic_store_n(I, I, memory_order_release); // expected-warning {{incompatible pointer to integer conversion passing 'int *' to parameter of type 'int'; dereference with *}} + __atomic_store_n(I, I, memory_order_release); // expected-error {{incompatible pointer to integer conversion passing 'int *' to parameter of type 'int'; dereference with *}} __atomic_store(I, *P, memory_order_release); __atomic_store(CI, I, memory_order_release); // expected-error {{address argument to atomic operation must be a pointer to non-const type ('const int *' invalid)}} @@ -229,11 +229,11 @@ _Bool cmpexch_4 = __atomic_compare_exchange_n(I, I, 5, 1, memory_order_seq_cst, memory_order_seq_cst); _Bool cmpexch_5 = __atomic_compare_exchange_n(I, P, 5, 0, memory_order_seq_cst, memory_order_seq_cst); // expected-warning {{; dereference with *}} - _Bool cmpexch_6 = __atomic_compare_exchange_n(I, I, P, 0, memory_order_seq_cst, memory_order_seq_cst); // expected-warning {{passing 'int **' to parameter of type 'int'}} + _Bool cmpexch_6 = __atomic_compare_exchange_n(I, I, P, 0, memory_order_seq_cst, memory_order_seq_cst); // expected-error {{passing 'int **' to parameter of type 'int'}} (void)__atomic_compare_exchange_n(CI, I, 5, 1, memory_order_seq_cst, memory_order_seq_cst); // expected-error {{address argument to atomic operation must be a pointer to non-const type ('const int *' invalid)}} (void)__atomic_compare_exchange_n(I, CI, 5, 1, memory_order_seq_cst, memory_order_seq_cst); // expected-warning {{passing 'const int *' to parameter of type 'int *' discards qualifiers}} - _Bool cmpexch_7 = __atomic_compare_exchange(I, I, 5, 1, memory_order_seq_cst, memory_order_seq_cst); // expected-warning {{passing 'int' to parameter of type 'int *'}} + _Bool cmpexch_7 = __atomic_compare_exchange(I, I, 5, 1, memory_order_seq_cst, memory_order_seq_cst); // expected-error {{passing 'int' to parameter of type 'int *'}} _Bool cmpexch_8 = __atomic_compare_exchange(I, P, I, 0, memory_order_seq_cst, memory_order_seq_cst); // expected-warning {{; dereference with *}} _Bool cmpexch_9 = __atomic_compare_exchange(I, I, I, 0, memory_order_seq_cst, memory_order_seq_cst); (void)__atomic_compare_exchange(CI, I, I, 0, memory_order_seq_cst, memory_order_seq_cst); // expected-error {{address argument to atomic operation must be a pointer to non-const type ('const int *' invalid)}} @@ -257,7 +257,7 @@ // Ensure the <stdatomic.h> macros behave appropriately. atomic_int n = ATOMIC_VAR_INIT(123); atomic_init(&n, 456); - atomic_init(&n, (void*)0); // expected-warning {{passing 'void *' to parameter of type 'int'}} + atomic_init(&n, (void*)0); // expected-error {{passing 'void *' to parameter of type 'int'}} const atomic_wchar_t cawt; atomic_init(&cawt, L'x'); // expected-error {{non-const}} @@ -279,7 +279,7 @@ k = atomic_exchange(&n, 72); k = atomic_exchange_explicit(&n, k, memory_order_release); - atomic_compare_exchange_strong(&n, k, k); // expected-warning {{take the address with &}} + atomic_compare_exchange_strong(&n, k, k); // expected-error {{take the address with &}} atomic_compare_exchange_weak(&n, &k, k); atomic_compare_exchange_strong_explicit(&n, &k, k, memory_order_seq_cst); // expected-error {{too few arguments}} atomic_compare_exchange_weak_explicit(&n, &k, k, memory_order_seq_cst, memory_order_acquire); Index: clang/test/Sema/array-init.c =================================================================== --- clang/test/Sema/array-init.c +++ clang/test/Sema/array-init.c @@ -11,7 +11,7 @@ extern int fileScopeExtern[3] = { 1, 3, 5 }; // expected-warning{{'extern' variable has an initializer}} -static long ary3[] = { 1, "abc", 3, 4 }; // expected-warning{{incompatible pointer to integer conversion initializing 'long' with an expression of type 'char[4]'}} +static long ary3[] = { 1, "abc", 3, 4 }; // expected-error{{incompatible pointer to integer conversion initializing 'long' with an expression of type 'char[4]'}} void func(void) { int x = 1; @@ -24,7 +24,7 @@ int x4 = { 1, 2 }; // expected-warning{{excess elements in scalar initializer}} - int y[4][3] = { + int y[4][3] = { { 1, 3, 5 }, { 2, 4, 6 }, { 3, 5, 7 }, @@ -34,7 +34,7 @@ 1, 3, 5, 2, 4, 6, 3, 5, 7 }; - int y3[4][3] = { + int y3[4][3] = { { 1, 3, 5 }, { 2, 4, 6 }, { 3, 5, 7 }, @@ -46,27 +46,27 @@ int a,b,c; } z = { 1 }; - struct threeElements *p = 7; // expected-warning{{incompatible integer to pointer conversion initializing 'struct threeElements *' with an expression of type 'int'}} - + struct threeElements *p = 7; // expected-error{{incompatible integer to pointer conversion initializing 'struct threeElements *' with an expression of type 'int'}} + extern int blockScopeExtern[3] = { 1, 3, 5 }; // expected-error{{'extern' variable cannot have an initializer}} - + static long x2[3] = { 1.0, - "abc", // expected-warning{{incompatible pointer to integer conversion initializing 'long' with an expression of type 'char[4]'}} + "abc", // expected-error{{incompatible pointer to integer conversion initializing 'long' with an expression of type 'char[4]'}} 5.8 }; // expected-warning {{implicit conversion from 'double' to 'long' changes value from 5.8 to 5}} } void test(void) { - int y1[3] = { + int y1[3] = { { 1, 2, 3 } // expected-warning{{excess elements in scalar initializer}} }; - int y3[4][3] = { + int y3[4][3] = { { 1, 3, 5 }, { 2, 4, 6 }, { 3, 5, 7 }, { 4, 6, 8 }, { }, // expected-warning{{use of GNU empty initializer extension}} expected-warning{{excess elements in array initializer}} }; - int y4[4][3] = { + int y4[4][3] = { { 1, 3, 5, 2 }, // expected-warning{{excess elements in array initializer}} { 4, 6 }, { 3, 5, 7 }, @@ -86,13 +86,13 @@ { 4, 5, 6 } }; short q3[4][3][2] = { - { + { { 1 }, }, - { + { { 2, 3 }, }, - { + { { 4, 5 }, { 6 }, }, @@ -109,8 +109,8 @@ } unsigned char asso_values[] = { 34 }; -int legal2(void) { - return asso_values[0]; +int legal2(void) { + return asso_values[0]; } void illegal(void) { @@ -120,13 +120,13 @@ { 4, 5, 6 } }; short q3[4][3][] = { // expected-error{{array has incomplete element type 'short[]'}} - { + { { 1 }, }, - { + { { 2, 3 }, }, - { + { { 4, 5 }, { 6 }, }, @@ -167,11 +167,11 @@ char c[] = { "Hello" }; int l[sizeof(c) == 6 ? 1 : -1]; - - int i[] = { "Hello "}; // expected-warning{{incompatible pointer to integer conversion initializing 'int' with an expression of type 'char[7]'}} + + int i[] = { "Hello "}; // expected-error{{incompatible pointer to integer conversion initializing 'int' with an expression of type 'char[7]'}} char c2[] = { "Hello", "Good bye" }; //expected-warning{{excess elements in char array initializer}} - int i2[1] = { "Hello" }; //expected-warning{{incompatible pointer to integer conversion initializing 'int' with an expression of type 'char[6]'}} + int i2[1] = { "Hello" }; //expected-error{{incompatible pointer to integer conversion initializing 'int' with an expression of type 'char[6]'}} char c3[5] = { "Hello" }; char c4[4] = { "Hello" }; //expected-warning{{initializer-string for char array is too long}} @@ -204,14 +204,14 @@ struct s1 {char a; char b;} t1; struct s2 {struct s1 c;} t2 = { t1 }; // The following is a less than great diagnostic (though it's on par with EDG). -struct s1 t3[] = {t1, t1, "abc", 0}; //expected-warning{{incompatible pointer to integer conversion initializing 'char' with an expression of type 'char[4]'}} +struct s1 t3[] = {t1, t1, "abc", 0}; //expected-error{{incompatible pointer to integer conversion initializing 'char' with an expression of type 'char[4]'}} int t4[sizeof t3 == 6 ? 1 : -1]; } struct foo { int z; } w; -int bar (void) { +int bar (void) { struct foo z = { w }; //expected-error{{initializing 'int' with an expression of incompatible type 'struct foo'}} - return z.z; -} + return z.z; +} struct s3 {void (*a)(void);} t5 = {autoStructTest}; struct {int a; int b[];} t6 = {1, {1, 2, 3}}; // expected-warning{{flexible array initialization is a GNU extension}} \ // expected-note{{initialized flexible array member 'b' is here}} @@ -273,7 +273,7 @@ 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, - 13.0f, 14.0f, 15.0f, 16.0f + 13.0f, 14.0f, 15.0f, 16.0f }; } Index: clang/test/Parser/implicit-casts.c =================================================================== --- clang/test/Parser/implicit-casts.c +++ clang/test/Parser/implicit-casts.c @@ -14,7 +14,7 @@ } int test3(void) { int a[2]; - a[0] = test3; // expected-warning{{incompatible pointer to integer conversion assigning to 'int' from 'int (void)'}} + a[0] = test3; // expected-error{{incompatible pointer to integer conversion assigning to 'int' from 'int (void)'}} return 0; } short x; void test4(char c) { x += c; } Index: clang/test/PCH/objc_exprs.m =================================================================== --- clang/test/PCH/objc_exprs.m +++ clang/test/PCH/objc_exprs.m @@ -9,7 +9,7 @@ int *A1 = (objc_string)0; // expected-warning {{aka 'NSString *'}} char A2 = (objc_encode){}; // expected-error {{not a compile-time constant}} \ - expected-warning {{char[2]}} + expected-error {{char[2]}} int *A3 = (objc_protocol)0; // expected-warning {{aka 'Protocol *'}} Index: clang/test/Modules/config_macros.m =================================================================== --- clang/test/Modules/config_macros.m +++ clang/test/Modules/config_macros.m @@ -6,7 +6,7 @@ char *test_bar(void) { return bar(); // expected-error{{call to undeclared function 'bar'; ISO C99 and later do not support implicit function declarations}} \ - // expected-warning{{incompatible integer to pointer conversion}} + // expected-error{{incompatible integer to pointer conversion}} } #undef WANT_FOO // expected-note{{macro was #undef'd here}} Index: clang/test/Misc/tabstop.c =================================================================== --- clang/test/Misc/tabstop.c +++ clang/test/Misc/tabstop.c @@ -1,6 +1,6 @@ -// RUN: %clang_cc1 -ftabstop 3 -fsyntax-only %s 2>&1 | FileCheck -check-prefix=CHECK-3 -strict-whitespace %s -// RUN: %clang_cc1 -ftabstop 4 -fsyntax-only %s 2>&1 | FileCheck -check-prefix=CHECK-4 -strict-whitespace %s -// RUN: %clang_cc1 -ftabstop 5 -fsyntax-only %s 2>&1 | FileCheck -check-prefix=CHECK-5 -strict-whitespace %s +// RUN: %clang_cc1 -ftabstop 3 -fsyntax-only -Wno-error=int-conversion %s 2>&1 | FileCheck -check-prefix=CHECK-3 -strict-whitespace %s +// RUN: %clang_cc1 -ftabstop 4 -fsyntax-only -Wno-error=int-conversion %s 2>&1 | FileCheck -check-prefix=CHECK-4 -strict-whitespace %s +// RUN: %clang_cc1 -ftabstop 5 -fsyntax-only -Wno-error=int-conversion %s 2>&1 | FileCheck -check-prefix=CHECK-5 -strict-whitespace %s // tab void* a = 1; Index: clang/test/Misc/serialized-diags.c =================================================================== --- clang/test/Misc/serialized-diags.c +++ clang/test/Misc/serialized-diags.c @@ -57,7 +57,7 @@ // CHECK: +-{{.*[/\\]}}serialized-diags.c:20:15: note: expanded from macro 'false' [] // CHECK: +-Range: {{.*[/\\]}}serialized-diags.c:20:15 {{.*[/\\]}}serialized-diags.c:20:16 // CHECK: +-{{.*[/\\]}}serialized-diags.c:19:6: note: 'taz' declared here [] -// CHECK: {{.*[/\\]}}serialized-diags.h:5:7: warning: incompatible integer to pointer conversion initializing 'char *' with an expression of type 'int' [-Wint-conversion] +// CHECK: {{.*[/\\]}}serialized-diags.h:5:7: error: incompatible integer to pointer conversion initializing 'char *' with an expression of type 'int' [-Wint-conversion] // CHECK: Range: {{.*[/\\]}}serialized-diags.h:5:16 {{.*[/\\]}}serialized-diags.h:5:17 // CHECK: +-{{.*[/\\]}}serialized-diags.c:26:10: note: in file included from {{.*[/\\]}}serialized-diags.c:26: [] // CHECK: Number FIXITs = 0 Index: clang/test/FixIt/selector-fixit.m =================================================================== --- clang/test/FixIt/selector-fixit.m +++ clang/test/FixIt/selector-fixit.m @@ -1,6 +1,6 @@ // RUN: cp %s %t -// RUN: %clang_cc1 -x objective-c -Wundeclared-selector -fixit %t -// RUN: %clang_cc1 -x objective-c -Wundeclared-selector -Werror %t +// RUN: %clang_cc1 -x objective-c -Wundeclared-selector -Wno-int-conversion -fixit %t +// RUN: %clang_cc1 -x objective-c -Wundeclared-selector -Wno-int-conversion -Werror %t // rdar://14039037 @interface NSObject @end Index: clang/test/FixIt/dereference-addressof.c =================================================================== --- clang/test/FixIt/dereference-addressof.c +++ clang/test/FixIt/dereference-addressof.c @@ -11,12 +11,12 @@ void f2(int *aPtr, int a, float *bPtr, char c) { float fl = 0; - ip(a); // expected-warning{{incompatible integer to pointer conversion passing 'int' to parameter of type 'int *'; take the address with &}} - i(aPtr); // expected-warning{{incompatible pointer to integer conversion passing 'int *' to parameter of type 'int'; dereference with *}} - ii(&a); // expected-warning{{incompatible pointer to integer conversion passing 'int *' to parameter of type 'int'; remove &}} + ip(a); // expected-error{{incompatible integer to pointer conversion passing 'int' to parameter of type 'int *'; take the address with &}} + i(aPtr); // expected-error{{incompatible pointer to integer conversion passing 'int *' to parameter of type 'int'; dereference with *}} + ii(&a); // expected-error{{incompatible pointer to integer conversion passing 'int *' to parameter of type 'int'; remove &}} fp(*bPtr); // expected-error{{passing 'float' to parameter of incompatible type 'float *'; remove *}} f(bPtr); // expected-error{{passing 'float *' to parameter of incompatible type 'float'; dereference with *}} - a = aPtr; // expected-warning{{incompatible pointer to integer conversion assigning to 'int' from 'int *'; dereference with *}} + a = aPtr; // expected-error{{incompatible pointer to integer conversion assigning to 'int' from 'int *'; dereference with *}} fl = bPtr + a; // expected-error{{assigning to 'float' from incompatible type 'float *'; dereference with *}} bPtr = bPtr[a]; // expected-error{{assigning to 'float *' from incompatible type 'float'; take the address with &}} } Index: clang/test/CodeGenOpenCL/builtins-generic-amdgcn.cl =================================================================== --- clang/test/CodeGenOpenCL/builtins-generic-amdgcn.cl +++ clang/test/CodeGenOpenCL/builtins-generic-amdgcn.cl @@ -1,5 +1,5 @@ // REQUIRES: amdgpu-registered-target -// RUN: %clang_cc1 -no-opaque-pointers -triple amdgcn-unknown-unknown -S -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -no-opaque-pointers -Wno-error=int-conversion -triple amdgcn-unknown-unknown -S -emit-llvm -o - %s | FileCheck %s // CHECK-LABEL: @test_builtin_clz( // CHECK: tail call i32 @llvm.ctlz.i32(i32 %a, i1 true) Index: clang/test/CodeGenObjC/block-ptr-type-crash.m =================================================================== --- clang/test/CodeGenObjC/block-ptr-type-crash.m +++ clang/test/CodeGenObjC/block-ptr-type-crash.m @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -Wno-objc-root-class -fblocks -o /dev/null -triple x86_64-- -emit-llvm %s +// RUN: %clang_cc1 -Wno-objc-root-class -Wno-int-conversion -fblocks -o /dev/null -triple x86_64-- -emit-llvm %s // REQUIRES: asserts // Verify there is no assertion. Index: clang/test/CodeGen/vla.c =================================================================== --- clang/test/CodeGen/vla.c +++ clang/test/CodeGen/vla.c @@ -1,5 +1,5 @@ -// RUN: %clang_cc1 -no-opaque-pointers -triple i386-unknown-unknown %s -emit-llvm -o - | FileCheck %s -check-prefixes=CHECK,NULL-INVALID -// RUN: %clang_cc1 -no-opaque-pointers -triple i386-unknown-unknown %s -emit-llvm -fno-delete-null-pointer-checks -o - | FileCheck %s -check-prefixes=CHECK,NULL-VALID +// RUN: %clang_cc1 -no-opaque-pointers -Wno-int-conversion -triple i386-unknown-unknown %s -emit-llvm -o - | FileCheck %s -check-prefixes=CHECK,NULL-INVALID +// RUN: %clang_cc1 -no-opaque-pointers -Wno-int-conversion -triple i386-unknown-unknown %s -emit-llvm -fno-delete-null-pointer-checks -o - | FileCheck %s -check-prefixes=CHECK,NULL-VALID int b(char* x); @@ -70,7 +70,7 @@ int bork[4][13][15]; // CHECK: call void @function1(i16 noundef signext 1, i32* noundef {{.*}}) function1(1, bork); - // CHECK: call void @function(i16 noundef signext 1, i32* noundef {{.*}}) + // CHECK: call void @function(i16 noundef signext 1, i32* noundef {{.*}}) function(1, bork[2]); } Index: clang/test/CodeGen/struct-init.c =================================================================== --- clang/test/CodeGen/struct-init.c +++ clang/test/CodeGen/struct-init.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -no-opaque-pointers -triple armv7-apple-darwin -target-feature +neon %s -emit-llvm -o - | FileCheck %s +// RUN: %clang_cc1 -no-opaque-pointers -Wno-int-conversion -triple armv7-apple-darwin -target-feature +neon %s -emit-llvm -o - | FileCheck %s typedef struct _zend_ini_entry zend_ini_entry; struct _zend_ini_entry { Index: clang/test/CodeGen/statements.c =================================================================== --- clang/test/CodeGen/statements.c +++ clang/test/CodeGen/statements.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -Wno-error=return-type %s -emit-llvm-only +// RUN: %clang_cc1 -Wno-error=return-type -Wno-error=int-conversion %s -emit-llvm-only // REQUIRES: LP64 // Mismatched type between return and function result. Index: clang/test/CodeGen/pointer-to-int.c =================================================================== --- clang/test/CodeGen/pointer-to-int.c +++ clang/test/CodeGen/pointer-to-int.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -emit-llvm %s -o - +// RUN: %clang_cc1 -emit-llvm -Wno-int-conversion %s -o - int test(void* i) { Index: clang/test/CodeGen/pointer-arithmetic.c =================================================================== --- clang/test/CodeGen/pointer-arithmetic.c +++ clang/test/CodeGen/pointer-arithmetic.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -S %s -o - +// RUN: %clang_cc1 -S -Wno-int-conversions %s -o - typedef int Int; Index: clang/test/CodeGen/const-init.c =================================================================== --- clang/test/CodeGen/const-init.c +++ clang/test/CodeGen/const-init.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -no-opaque-pointers -triple i386-pc-linux-gnu -ffreestanding -Wno-pointer-to-int-cast -verify -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -no-opaque-pointers -triple i386-pc-linux-gnu -ffreestanding -Wno-pointer-to-int-cast -Wno-int-conversion -emit-llvm -o - %s | FileCheck %s #include <stdint.h> @@ -11,10 +11,10 @@ // Double-implicit-conversions of array/functions (not legal C, but // clang accepts it for gcc compat). -intptr_t b = a; // expected-warning {{incompatible pointer to integer conversion}} +intptr_t b = a; int c(void); void *d = c; -intptr_t e = c; // expected-warning {{incompatible pointer to integer conversion}} +intptr_t e = c; int f, *g = __extension__ &f, *h = (1 != 1) ? &f : &f; @@ -59,7 +59,7 @@ } __attribute__((__packed__)) gv1 = { .a = 0x0, .b = 7, }; // PR5118 -// CHECK: @gv2 ={{.*}} global %struct.anon.0 <{ i8 1, i8* null }>, align 1 +// CHECK: @gv2 ={{.*}} global %struct.anon.0 <{ i8 1, i8* null }>, align 1 struct { unsigned char a; char *b; @@ -67,9 +67,9 @@ // Global references // CHECK: @g11.l0 = internal global i32 ptrtoint (i32 ()* @g11 to i32) -long g11(void) { +long g11(void) { static long l0 = (long) g11; - return l0; + return l0; } // CHECK: @g12 ={{.*}} global i32 ptrtoint (i8* @g12_tmp to i32) @@ -156,7 +156,7 @@ // CHECK: @g29.b = internal global [1 x i32] [i32 ptrtoint ([5 x i8]* @.str.1 to i32)], align 4 // CHECK: @g29.c = internal global [1 x i32] [i32 97], align 4 static DCC_SRVR_NM a = { {"@"} }; - static int b[1] = { "asdf" }; // expected-warning {{incompatible pointer to integer conversion initializing 'int' with an expression of type 'char[5]'}} + static int b[1] = { "asdf" }; static int c[1] = { L"a" }; } Index: clang/test/CodeGen/address-space-cast.c =================================================================== --- clang/test/CodeGen/address-space-cast.c +++ clang/test/CodeGen/address-space-cast.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -emit-llvm < %s +// RUN: %clang_cc1 -emit-llvm -Wno-int-conversion < %s volatile unsigned char* const __attribute__((address_space(1))) serial_ctrl = 0x02; Index: clang/test/CodeGen/aarch64-mops.c =================================================================== --- clang/test/CodeGen/aarch64-mops.c +++ clang/test/CodeGen/aarch64-mops.c @@ -1,7 +1,7 @@ -// RUN: %clang_cc1 -triple aarch64-arm-unknown-eabi -target-feature +mops -target-feature +mte -w -S -emit-llvm -o - %s | FileCheck --check-prefix=CHECK-MOPS %s -// RUN: %clang_cc1 -triple aarch64-arm-unknown-eabi -target-feature +mops -Wno-implicit-function-declaration -w -S -emit-llvm -o - %s | FileCheck --check-prefix=CHECK-NOMOPS %s -// RUN: %clang_cc1 -triple aarch64-arm-unknown-eabi -Wno-implicit-function-declaration -target-feature +mte -w -S -emit-llvm -o - %s | FileCheck --check-prefix=CHECK-NOMOPS %s -// RUN: %clang_cc1 -triple aarch64-arm-unknown-eabi -Wno-implicit-function-declaration -w -S -emit-llvm -o - %s | FileCheck --check-prefix=CHECK-NOMOPS %s +// RUN: %clang_cc1 -triple aarch64-arm-unknown-eabi -Wno-int-conversion -target-feature +mops -target-feature +mte -w -S -emit-llvm -o - %s | FileCheck --check-prefix=CHECK-MOPS %s +// RUN: %clang_cc1 -triple aarch64-arm-unknown-eabi -Wno-int-conversion -target-feature +mops -Wno-implicit-function-declaration -w -S -emit-llvm -o - %s | FileCheck --check-prefix=CHECK-NOMOPS %s +// RUN: %clang_cc1 -triple aarch64-arm-unknown-eabi -Wno-int-conversion -Wno-implicit-function-declaration -target-feature +mte -w -S -emit-llvm -o - %s | FileCheck --check-prefix=CHECK-NOMOPS %s +// RUN: %clang_cc1 -triple aarch64-arm-unknown-eabi -Wno-int-conversion -Wno-implicit-function-declaration -w -S -emit-llvm -o - %s | FileCheck --check-prefix=CHECK-NOMOPS %s #include <arm_acle.h> #include <stddef.h> Index: clang/test/CodeGen/2008-07-31-promotion-of-compound-pointer-arithmetic.c =================================================================== --- clang/test/CodeGen/2008-07-31-promotion-of-compound-pointer-arithmetic.c +++ clang/test/CodeGen/2008-07-31-promotion-of-compound-pointer-arithmetic.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -triple i386-unknown-unknown -O1 -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -triple i386-unknown-unknown -O1 -Wno-int-conversion -emit-llvm -o - %s | FileCheck %s // CHECK-LABEL: define{{.*}} i32 @f0 // CHECK: ret i32 1 // CHECK-LABEL: define{{.*}} i32 @f1 Index: clang/test/CodeGen/2008-03-05-syncPtr.c =================================================================== --- clang/test/CodeGen/2008-03-05-syncPtr.c +++ clang/test/CodeGen/2008-03-05-syncPtr.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -no-opaque-pointers -triple x86_64-apple-darwin %s -emit-llvm -o - | FileCheck %s +// RUN: %clang_cc1 -no-opaque-pointers -triple x86_64-apple-darwin -Wno-int-conversion %s -emit-llvm -o - | FileCheck %s int* foo(int** a, int* b, int* c) { return __sync_val_compare_and_swap (a, b, c); Index: clang/test/C/drs/dr2xx.c =================================================================== --- clang/test/C/drs/dr2xx.c +++ clang/test/C/drs/dr2xx.c @@ -299,10 +299,10 @@ /* This is an invalid initialization/assignment because the right-hand side * does not have pointer to void or pointer to char type and is not the null * pointer constant. */ - char *p2 = (42, 1 - 1); /* expected-warning {{incompatible integer to pointer conversion initializing 'char *' with an expression of type 'int'}} + char *p2 = (42, 1 - 1); /* expected-error {{incompatible integer to pointer conversion initializing 'char *' with an expression of type 'int'}} expected-warning {{left operand of comma operator has no effect}} */ - p1 = (42, 1 - 1); /* expected-warning {{incompatible integer to pointer conversion assigning to 'char *' from 'int'}} + p1 = (42, 1 - 1); /* expected-error {{incompatible integer to pointer conversion assigning to 'char *' from 'int'}} expected-warning {{left operand of comma operator has no effect}} */ Index: clang/test/C/drs/dr0xx.c =================================================================== --- clang/test/C/drs/dr0xx.c +++ clang/test/C/drs/dr0xx.c @@ -363,7 +363,7 @@ } char *dr064_2(int i, int *pi) { - return (*pi = i, 0); /* expected-warning {{incompatible integer to pointer conversion returning 'int' from a function with result type 'char *'}} */ + return (*pi = i, 0); /* expected-error {{incompatible integer to pointer conversion returning 'int' from a function with result type 'char *'}} */ } /* WG14 DR068: yes Index: clang/test/Analysis/pr22954.c =================================================================== --- clang/test/Analysis/pr22954.c +++ clang/test/Analysis/pr22954.c @@ -3,7 +3,7 @@ // At the moment the whole of the destination array content is invalidated. // If a.s1 region has a symbolic offset, the whole region of 'a' is invalidated. // Specific triple set to test structures of size 0. -// RUN: %clang_analyze_cc1 -triple x86_64-pc-linux-gnu -analyzer-checker=core,unix.Malloc,debug.ExprInspection -verify -analyzer-config eagerly-assume=false %s +// RUN: %clang_analyze_cc1 -triple x86_64-pc-linux-gnu -analyzer-checker=core,unix.Malloc,debug.ExprInspection -Wno-error=int-conversion -verify -analyzer-config eagerly-assume=false %s typedef __typeof(sizeof(int)) size_t; Index: clang/test/Analysis/number-object-conversion.m =================================================================== --- clang/test/Analysis/number-object-conversion.m +++ clang/test/Analysis/number-object-conversion.m @@ -1,7 +1,7 @@ -// RUN: %clang_analyze_cc1 -triple i386-apple-darwin10 -fblocks -w -analyzer-checker=osx.NumberObjectConversion %s -verify -// RUN: %clang_analyze_cc1 -triple i386-apple-darwin10 -fblocks -w -analyzer-checker=osx.NumberObjectConversion -analyzer-config osx.NumberObjectConversion:Pedantic=true -DPEDANTIC %s -verify -// RUN: %clang_analyze_cc1 -triple i386-apple-darwin10 -fblocks -fobjc-arc -w -analyzer-checker=osx.NumberObjectConversion %s -verify -// RUN: %clang_analyze_cc1 -triple i386-apple-darwin10 -fblocks -fobjc-arc -w -analyzer-checker=osx.NumberObjectConversion -analyzer-config osx.NumberObjectConversion:Pedantic=true -DPEDANTIC %s -verify +// RUN: %clang_analyze_cc1 -triple i386-apple-darwin10 -fblocks -w -Wno-int-conversion -analyzer-checker=osx.NumberObjectConversion %s -verify +// RUN: %clang_analyze_cc1 -triple i386-apple-darwin10 -fblocks -w -Wno-int-conversion -analyzer-checker=osx.NumberObjectConversion -analyzer-config osx.NumberObjectConversion:Pedantic=true -DPEDANTIC %s -verify +// RUN: %clang_analyze_cc1 -triple i386-apple-darwin10 -fblocks -fobjc-arc -w -Wno-int-conversion -analyzer-checker=osx.NumberObjectConversion %s -verify +// RUN: %clang_analyze_cc1 -triple i386-apple-darwin10 -fblocks -fobjc-arc -w -Wno-int-conversion -analyzer-checker=osx.NumberObjectConversion -analyzer-config osx.NumberObjectConversion:Pedantic=true -DPEDANTIC %s -verify #include "Inputs/system-header-simulator-objc.h" Index: clang/test/Analysis/number-object-conversion.c =================================================================== --- clang/test/Analysis/number-object-conversion.c +++ clang/test/Analysis/number-object-conversion.c @@ -1,5 +1,5 @@ -// RUN: %clang_analyze_cc1 -triple i386-apple-darwin10 -w -analyzer-checker=osx.NumberObjectConversion %s -verify -// RUN: %clang_analyze_cc1 -triple i386-apple-darwin10 -w -analyzer-checker=osx.NumberObjectConversion -analyzer-config osx.NumberObjectConversion:Pedantic=true -DPEDANTIC %s -verify +// RUN: %clang_analyze_cc1 -triple i386-apple-darwin10 -w -Wno-int-conversion -analyzer-checker=osx.NumberObjectConversion %s -verify +// RUN: %clang_analyze_cc1 -triple i386-apple-darwin10 -w -Wno-int-conversion -analyzer-checker=osx.NumberObjectConversion -analyzer-config osx.NumberObjectConversion:Pedantic=true -DPEDANTIC %s -verify #define NULL ((void *)0) Index: clang/test/Analysis/null-deref-ps.c =================================================================== --- clang/test/Analysis/null-deref-ps.c +++ clang/test/Analysis/null-deref-ps.c @@ -1,5 +1,5 @@ -// RUN: %clang_analyze_cc1 -triple i386-apple-darwin10 -Wno-strict-prototypes -Wno-tautological-constant-compare -Wtautological-unsigned-zero-compare -analyzer-checker=core,deadcode,alpha.core -std=gnu99 -analyzer-purge=none -verify %s -Wno-error=return-type -// RUN: %clang_analyze_cc1 -triple i386-apple-darwin10 -Wno-strict-prototypes -Wno-tautological-constant-compare -Wtautological-unsigned-zero-compare -analyzer-checker=core,deadcode,alpha.core -std=gnu99 -verify %s -Wno-error=return-type +// RUN: %clang_analyze_cc1 -triple i386-apple-darwin10 -Wno-int-conversion -Wno-strict-prototypes -Wno-tautological-constant-compare -Wtautological-unsigned-zero-compare -analyzer-checker=core,deadcode,alpha.core -std=gnu99 -analyzer-purge=none -verify %s -Wno-error=return-type +// RUN: %clang_analyze_cc1 -triple i386-apple-darwin10 -Wno-int-conversion -Wno-strict-prototypes -Wno-tautological-constant-compare -Wtautological-unsigned-zero-compare -analyzer-checker=core,deadcode,alpha.core -std=gnu99 -verify %s -Wno-error=return-type typedef unsigned uintptr_t; @@ -10,7 +10,7 @@ #define assert(expr) \ ((expr) ? (void)(0) : __assert_fail (#expr, __FILE__, __LINE__, __func__)) -void f1(int *p) { +void f1(int *p) { if (p) *p = 1; else *p = 0; // expected-warning{{ereference}} } @@ -20,48 +20,48 @@ }; int f2(struct foo_struct* p) { - + if (p) p->x = 1; - + return p->x++; // expected-warning{{Access to field 'x' results in a dereference of a null pointer (loaded from variable 'p')}} } int f3(char* x) { - + int i = 2; - + if (x) return x[i - 1]; - + return x[i+1]; // expected-warning{{Array access (from variable 'x') results in a null pointer dereference}} } int f3_b(char* x) { - + int i = 2; - + if (x) return x[i - 1]; - + return x[i+1]++; // expected-warning{{Array access (from variable 'x') results in a null pointer dereference}} } int f4(int *p) { - + uintptr_t x = (uintptr_t) p; - + if (x) return 1; - + int *q = (int*) x; return *q; // expected-warning{{Dereference of null pointer (loaded from variable 'q')}} } int f4_b(void) { short array[2]; - uintptr_t x = array; // expected-warning{{incompatible pointer to integer conversion}} - short *p = x; // expected-warning{{incompatible integer to pointer conversion}} + uintptr_t x = array; + short *p = x; // The following branch should be infeasible. if (!(p == &array[0])) { @@ -80,21 +80,21 @@ } int f5(void) { - + char *s = "hello world"; return s[0]; // no-warning } int bar(int* p, int q) __attribute__((nonnull)); -int f6(int *p) { +int f6(int *p) { return !p ? bar(p, 1) // expected-warning {{Null pointer passed to 1st parameter expecting 'nonnull'}} : bar(p, 0); // no-warning } int bar2(int* p, int q) __attribute__((nonnull(1))); -int f6b(int *p) { +int f6b(int *p) { return !p ? bar2(p, 1) // expected-warning {{Null pointer passed to 1st parameter expecting 'nonnull'}} : bar2(p, 0); // no-warning } @@ -111,8 +111,8 @@ // At this point, 'p' cannot be null. if (!p) { int *q = 0; - *q = 0xDEADBEEF; // no-warning - } + *q = 0xDEADBEEF; // no-warning + } } void f6e(int *p, int offset) { @@ -123,38 +123,38 @@ int* qux(); int f7(int x) { - + int* p = 0; - + if (0 == x) p = qux(); - + if (0 == x) *p = 1; // no-warning - + return x; } int* f7b(int *x) { - + int* p = 0; - + if (((void*)0) == x) p = qux(); - + if (((void*)0) == x) *p = 1; // no-warning - + return x; } int* f7c(int *x) { - + int* p = 0; - + if (((void*)0) == x) p = qux(); - + if (((void*)0) != x) return x; @@ -164,15 +164,15 @@ } int* f7c2(int *x) { - + int* p = 0; - + if (((void*)0) == x) p = qux(); - + if (((void*)0) == x) return x; - + *p = 1; // expected-warning{{null}} return x; } @@ -182,7 +182,7 @@ if (!p) if (p) *p = 1; // no-warning - + if (q) if (!q) *q = 1; // no-warning @@ -217,7 +217,7 @@ // LHS and RHS have different bitwidths. The new symbolic value // for 'x' should have a bitwidth of 8. x &= y; - + // This tests that our symbolication worked, and that we correctly test // x against 0 (with the same bitwidth). if (!x) { @@ -270,7 +270,7 @@ default: return; } - + *p = 1; // no-warning } Index: clang/test/Analysis/novoidtypecrash.c =================================================================== --- clang/test/Analysis/novoidtypecrash.c +++ clang/test/Analysis/novoidtypecrash.c @@ -1,4 +1,4 @@ -// RUN: %clang_analyze_cc1 -std=c89 -analyzer-checker=core %s +// RUN: %clang_analyze_cc1 -std=c89 -Wno-int-conversion -analyzer-checker=core %s x; y(void **z) { // no-crash *z = x; Index: clang/test/Analysis/bsd-string.c =================================================================== --- clang/test/Analysis/bsd-string.c +++ clang/test/Analysis/bsd-string.c @@ -1,4 +1,4 @@ -// RUN: %clang_analyze_cc1 -w -verify %s \ +// RUN: %clang_analyze_cc1 -w -Wno-int-conversion -verify %s \ // RUN: -analyzer-checker=core \ // RUN: -analyzer-checker=unix.cstring.NullArg \ // RUN: -analyzer-checker=alpha.unix.cstring \ Index: clang/test/Analysis/ObjCProperties.m =================================================================== --- clang/test/Analysis/ObjCProperties.m +++ clang/test/Analysis/ObjCProperties.m @@ -1,4 +1,4 @@ -// RUN: %clang_analyze_cc1 -w %s -verify \ +// RUN: %clang_analyze_cc1 -w -Wno-int-conversion %s -verify \ // RUN: -analyzer-checker=core,alpha.core,debug.ExprInspection #ifdef HEADER // A clever trick to avoid splitting up the test. Index: clang/lib/Sema/SemaExprCXX.cpp =================================================================== --- clang/lib/Sema/SemaExprCXX.cpp +++ clang/lib/Sema/SemaExprCXX.cpp @@ -8479,7 +8479,8 @@ ExprResult TryTransform(Expr *E) { Sema::SFINAETrap Trap(SemaRef); ExprResult Res = TransformExpr(E); - if (Trap.hasErrorOccurred() || Res.isInvalid()) + if ((SemaRef.getLangOpts().CPlusPlus && Trap.hasErrorOccurred()) || + Res.isInvalid()) return ExprError(); return ExprFilter(Res.get()); Index: clang/include/clang/Basic/DiagnosticSemaKinds.td =================================================================== --- clang/include/clang/Basic/DiagnosticSemaKinds.td +++ clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -8037,24 +8037,6 @@ "sending type to parameter of incompatible type}0,1" "|%diff{casting $ to incompatible type $|" "casting type to incompatible type}0,1}2">; -def ext_typecheck_convert_pointer_int : ExtWarn< - "incompatible pointer to integer conversion " - "%select{%diff{assigning to $ from $|assigning to different types}0,1" - "|%diff{passing $ to parameter of type $|" - "passing to parameter of different type}0,1" - "|%diff{returning $ from a function with result type $|" - "returning from function with different return type}0,1" - "|%diff{converting $ to type $|converting between types}0,1" - "|%diff{initializing $ with an expression of type $|" - "initializing with expression of different type}0,1" - "|%diff{sending $ to parameter of type $|" - "sending to parameter of different type}0,1" - "|%diff{casting $ to type $|casting between types}0,1}2" - "%select{|; dereference with *|" - "; take the address with &|" - "; remove *|" - "; remove &}3">, - InGroup<IntConversion>; def err_typecheck_convert_pointer_int : Error< "incompatible pointer to integer conversion " "%select{%diff{assigning to $ from $|assigning to different types}0,1" @@ -8072,24 +8054,9 @@ "; take the address with &|" "; remove *|" "; remove &}3">; -def ext_typecheck_convert_int_pointer : ExtWarn< - "incompatible integer to pointer conversion " - "%select{%diff{assigning to $ from $|assigning to different types}0,1" - "|%diff{passing $ to parameter of type $|" - "passing to parameter of different type}0,1" - "|%diff{returning $ from a function with result type $|" - "returning from function with different return type}0,1" - "|%diff{converting $ to type $|converting between types}0,1" - "|%diff{initializing $ with an expression of type $|" - "initializing with expression of different type}0,1" - "|%diff{sending $ to parameter of type $|" - "sending to parameter of different type}0,1" - "|%diff{casting $ to type $|casting between types}0,1}2" - "%select{|; dereference with *|" - "; take the address with &|" - "; remove *|" - "; remove &}3">, - InGroup<IntConversion>, SFINAEFailure; +def ext_typecheck_convert_pointer_int : ExtWarn< + err_typecheck_convert_pointer_int.Text>, + InGroup<IntConversion>, SFINAEFailure, DefaultError; def err_typecheck_convert_int_pointer : Error< "incompatible integer to pointer conversion " "%select{%diff{assigning to $ from $|assigning to different types}0,1" @@ -8107,6 +8074,9 @@ "; take the address with &|" "; remove *|" "; remove &}3">; +def ext_typecheck_convert_int_pointer : ExtWarn< + err_typecheck_convert_int_pointer.Text>, + InGroup<IntConversion>, SFINAEFailure, DefaultError; def ext_typecheck_convert_pointer_void_func : Extension< "%select{%diff{assigning to $ from $|assigning to different types}0,1" "|%diff{passing $ to parameter of type $|" Index: clang/bindings/python/tests/cindex/test_diagnostics.py =================================================================== --- clang/bindings/python/tests/cindex/test_diagnostics.py +++ clang/bindings/python/tests/cindex/test_diagnostics.py @@ -26,7 +26,7 @@ # FIXME: We aren't getting notes here for some reason. tu = get_tu('#define A x\nvoid *A = 1;\n') self.assertEqual(len(tu.diagnostics), 1) - self.assertEqual(tu.diagnostics[0].severity, Diagnostic.Warning) + self.assertEqual(tu.diagnostics[0].severity, Diagnostic.Error) self.assertEqual(tu.diagnostics[0].location.line, 2) self.assertEqual(tu.diagnostics[0].location.column, 7) self.assertIn('incompatible', tu.diagnostics[0].spelling) @@ -53,7 +53,7 @@ def test_diagnostic_range(self): tu = get_tu('void f() { int i = "a"; }') self.assertEqual(len(tu.diagnostics), 1) - self.assertEqual(tu.diagnostics[0].severity, Diagnostic.Warning) + self.assertEqual(tu.diagnostics[0].severity, Diagnostic.Error) self.assertEqual(tu.diagnostics[0].location.line, 1) self.assertEqual(tu.diagnostics[0].location.column, 16) self.assertRegex(tu.diagnostics[0].spelling, Index: clang-tools-extra/test/clang-tidy/checkers/performance/no-int-to-ptr.c =================================================================== --- clang-tools-extra/test/clang-tidy/checkers/performance/no-int-to-ptr.c +++ clang-tools-extra/test/clang-tidy/checkers/performance/no-int-to-ptr.c @@ -1,4 +1,4 @@ -// RUN: %check_clang_tidy %s performance-no-int-to-ptr %t +// RUN: %check_clang_tidy %s performance-no-int-to-ptr %t -- -- -Wno-int-conversion void *t0(char x) { return x; Index: clang-tools-extra/test/clang-tidy/checkers/bugprone/no-escape.m =================================================================== --- clang-tools-extra/test/clang-tidy/checkers/bugprone/no-escape.m +++ clang-tools-extra/test/clang-tidy/checkers/bugprone/no-escape.m @@ -1,5 +1,5 @@ -// RUN: %check_clang_tidy %s bugprone-no-escape %t -// RUN: %check_clang_tidy %s -assume-filename=bugprone-no-escape.c bugprone-no-escape %t -- -- -fblocks +// RUN: %check_clang_tidy %s bugprone-no-escape %t -- -- -Wno-int-conversion +// RUN: %check_clang_tidy %s -assume-filename=bugprone-no-escape.c bugprone-no-escape %t -- -- -fblocks -Wno-int-conversion typedef struct dispatch_queue_s *dispatch_queue_t; typedef struct dispatch_time_s *dispatch_time_t;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits