summaryrefslogtreecommitdiffstats
path: root/clang/test
diff options
context:
space:
mode:
authorRichard Trieu <rtrieu@google.com>2014-01-28 23:40:26 +0000
committerRichard Trieu <rtrieu@google.com>2014-01-28 23:40:26 +0000
commit1e632af0d4989357836a52ff8a0e237e69ca81d3 (patch)
tree7eb2d52f01f30076c258c7459197eb8a99f24f4d /clang/test
parenta86694ca7a25d299d015c62cd711c46dc8bc563a (diff)
downloadbcm5719-llvm-1e632af0d4989357836a52ff8a0e237e69ca81d3.tar.gz
bcm5719-llvm-1e632af0d4989357836a52ff8a0e237e69ca81d3.zip
A new conversion warning for when an Objective-C object literal is implicitly
cast into a boolean true value. This warning will catch code like: if (@0) {} if (@"foo") {} llvm-svn: 200356
Diffstat (limited to 'clang/test')
-rw-r--r--clang/test/Analysis/objc-string.mm2
-rw-r--r--clang/test/SemaObjCXX/warn-objc-literal-conversion.mm74
2 files changed, 75 insertions, 1 deletions
diff --git a/clang/test/Analysis/objc-string.mm b/clang/test/Analysis/objc-string.mm
index c67ab5e8919..a32b740bba0 100644
--- a/clang/test/Analysis/objc-string.mm
+++ b/clang/test/Analysis/objc-string.mm
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -verify %s
+// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -verify -Wno-objc-literal-conversion %s
void clang_analyzer_eval(bool);
@class NSString;
diff --git a/clang/test/SemaObjCXX/warn-objc-literal-conversion.mm b/clang/test/SemaObjCXX/warn-objc-literal-conversion.mm
new file mode 100644
index 00000000000..44645613e31
--- /dev/null
+++ b/clang/test/SemaObjCXX/warn-objc-literal-conversion.mm
@@ -0,0 +1,74 @@
+// RUN: %clang_cc1 -fsyntax-only -verify -Wobjc-literal-conversion %s
+
+@class NSString;
+
+@interface NSNumber
++ (NSNumber *)numberWithChar:(char)value;
++ (NSNumber *)numberWithInt:(int)value;
++ (NSNumber *)numberWithLongLong:(long long)value;
++ (NSNumber *)numberWithFloat:(float)value;
++ (NSNumber *)numberWithDouble:(double)value;
++ (NSNumber *)numberWithBool:(bool)value;
+@end
+
+@interface NSArray
++ (id)arrayWithObjects:(const id [])objects count:(int)cnt;
+@end
+
+@interface NSDictionary
++ (id)dictionaryWithObjects:(const id [])objects forKeys:(const id [])keys count:(unsigned long)cnt;
+@end
+
+void char_test() {
+ if (@'a') {}
+ // expected-warning@-1{{implicit boolean conversion of Objective-C object literal always evaluates to true}}
+}
+
+void int_test() {
+ if (@12) {}
+ // expected-warning@-1{{implicit boolean conversion of Objective-C object literal always evaluates to true}}
+ if (@-12) {}
+ // expected-warning@-1{{implicit boolean conversion of Objective-C object literal always evaluates to true}}
+ if (@12LL) {}
+ // expected-warning@-1{{implicit boolean conversion of Objective-C object literal always evaluates to true}}
+ if (@-12LL) {}
+ // expected-warning@-1{{implicit boolean conversion of Objective-C object literal always evaluates to true}}
+}
+
+void float_test() {
+ if (@12.55) {}
+ // expected-warning@-1{{implicit boolean conversion of Objective-C object literal always evaluates to true}}
+ if (@-12.55) {}
+ // expected-warning@-1{{implicit boolean conversion of Objective-C object literal always evaluates to true}}
+ if (@12.55F) {}
+ // expected-warning@-1{{implicit boolean conversion of Objective-C object literal always evaluates to true}}
+ if (@-12.55F) {}
+ // expected-warning@-1{{implicit boolean conversion of Objective-C object literal always evaluates to true}}
+}
+
+void bool_test() {
+ if (@true) {}
+ // expected-warning@-1{{implicit boolean conversion of Objective-C object literal always evaluates to true}}
+ if (@false) {}
+ // expected-warning@-1{{implicit boolean conversion of Objective-C object literal always evaluates to true}}
+}
+
+void string_test() {
+ if (@"asdf") {}
+ // expected-warning@-1{{implicit boolean conversion of Objective-C object literal always evaluates to true}}
+}
+
+void array_test() {
+ if (@[ @313, @331, @367, @379 ]) {}
+ // expected-warning@-1{{implicit boolean conversion of Objective-C object literal always evaluates to true}}
+}
+
+void dictionary_test() {
+ if (@{ @0: @0, @1: @1, @2: @1, @3: @3 }) {}
+ // expected-warning@-1{{implicit boolean conversion of Objective-C object literal always evaluates to true}}
+}
+
+void objc_bool_test () {
+ if (__objc_yes) {}
+ if (__objc_no) {}
+}
OpenPOWER on IntegriCloud