diff options
| author | Erik Pilkington <erik.pilkington@gmail.com> | 2019-07-09 17:29:40 +0000 |
|---|---|---|
| committer | Erik Pilkington <erik.pilkington@gmail.com> | 2019-07-09 17:29:40 +0000 |
| commit | abffae3a563d67d0a31a9687aecc4de33a4cc273 (patch) | |
| tree | 42e62001dc2067d512719cc27b5f798f1fa901bf /clang/test/Sema | |
| parent | 0efac296f140f9e6eac31a9f979dbd0dc0659c24 (diff) | |
| download | bcm5719-llvm-abffae3a563d67d0a31a9687aecc4de33a4cc273.tar.gz bcm5719-llvm-abffae3a563d67d0a31a9687aecc4de33a4cc273.zip | |
[ObjC] Add a warning for implicit conversions of a constant non-boolean value to BOOL
rdar://51954400
Differential revision: https://reviews.llvm.org/D63912
llvm-svn: 365518
Diffstat (limited to 'clang/test/Sema')
| -rw-r--r-- | clang/test/Sema/objc-bool-constant-conversion-fixit.m | 40 | ||||
| -rw-r--r-- | clang/test/Sema/objc-bool-constant-conversion.m | 38 |
2 files changed, 78 insertions, 0 deletions
diff --git a/clang/test/Sema/objc-bool-constant-conversion-fixit.m b/clang/test/Sema/objc-bool-constant-conversion-fixit.m new file mode 100644 index 00000000000..57f575222ee --- /dev/null +++ b/clang/test/Sema/objc-bool-constant-conversion-fixit.m @@ -0,0 +1,40 @@ +// RUN: %clang_cc1 -Werror=constant-conversion %s -fixit-recompile -fixit-to-temporary -E -o - | FileCheck %s + +typedef signed char BOOL; + +BOOL b; + +int main() { + BOOL b = 2; + // CHECK: BOOL b = 2 ? YES : NO; + + b = b ? 2 : 1; + // CHECK: b = b ? 2 ? YES : NO : 1; + + b = b ? 1 : 2; + // CHECK: b = b ? 1 : 2 ? YES : NO; + + b = b ? 2 : 2; + // CHECK: b = b ? 2 ? YES : NO : 2 ? YES : NO; + + b = 1 + 1; + // CHECK: b = (1 + 1) ? YES : NO; + + b = 1 | 2; + // CHECK: b = (1 | 2) ? YES : NO; + + b = 1 << 1; + // CHECK: b = (1 << 1) ? YES : NO; +} + +@interface BoolProp +@property BOOL b; +@end + +void f(BoolProp *bp) { + bp.b = 43; + // CHECK: bp.b = 43 ? YES : NO; + + [bp setB:43]; + // CHECK: [bp setB:43 ? YES : NO]; +} diff --git a/clang/test/Sema/objc-bool-constant-conversion.m b/clang/test/Sema/objc-bool-constant-conversion.m new file mode 100644 index 00000000000..3638e2f8a9d --- /dev/null +++ b/clang/test/Sema/objc-bool-constant-conversion.m @@ -0,0 +1,38 @@ +// RUN: %clang_cc1 %s -verify -fsyntax-only + +typedef signed char BOOL; +#define YES __objc_yes +#define NO __objc_no + +BOOL B; + +int main() { + B = 0; + B = 1; + B = YES; + B = NO; + + B = -1; // expected-warning{{implicit conversion from constant value -1 to BOOL; the only well defined values for BOOL are YES and NO}} + B = 0 - 1; // expected-warning{{implicit conversion from constant value -1 to BOOL; the only well defined values for BOOL are YES and NO}} + B = YES + YES; // expected-warning {{implicit conversion from constant value 2 to BOOL; the only well defined values for BOOL are YES and NO}} + B = YES | YES; + + B = B ? 2 : 2; // expected-warning 2 {{implicit conversion from constant value 2 to BOOL; the only well defined values for BOOL are YES and NO}} + + BOOL Init = -1; // expected-warning{{implicit conversion from constant value -1 to BOOL; the only well defined values for BOOL are YES and NO}} + BOOL Init2 = B ? 2 : 2; // expected-warning 2 {{implicit conversion from constant value 2 to BOOL; the only well defined values for BOOL are YES and NO}} + + void takesbool(BOOL); + takesbool(43); // expected-warning {{implicit conversion from constant value 43 to BOOL; the only well defined values for BOOL are YES and NO}} + + BOOL OutOfRange = 400; // expected-warning{{implicit conversion from constant value 400 to BOOL; the only well defined values for BOOL are YES and NO}} +} + +@interface BoolProp +@property BOOL b; +@end + +void f(BoolProp *bp) { + bp.b = 43; // expected-warning {{implicit conversion from constant value 43 to BOOL; the only well defined values for BOOL are YES and NO}} + [bp setB:43]; // expected-warning {{implicit conversion from constant value 43 to BOOL; the only well defined values for BOOL are YES and NO}} +} |

