aboutsummaryrefslogtreecommitdiff
path: root/test/Analysis/osobjectcstylecastchecker_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/Analysis/osobjectcstylecastchecker_test.cpp')
-rw-r--r--test/Analysis/osobjectcstylecastchecker_test.cpp39
1 files changed, 39 insertions, 0 deletions
diff --git a/test/Analysis/osobjectcstylecastchecker_test.cpp b/test/Analysis/osobjectcstylecastchecker_test.cpp
new file mode 100644
index 0000000000..07f878cd39
--- /dev/null
+++ b/test/Analysis/osobjectcstylecastchecker_test.cpp
@@ -0,0 +1,39 @@
+// RUN: %clang_analyze_cc1 -analyzer-checker=optin.osx.OSObjectCStyleCast %s -verify
+#include "os_object_base.h"
+
+struct OSArray : public OSObject {
+ unsigned getCount();
+};
+
+struct A {
+ int x;
+};
+struct B : public A {
+ unsigned getCount();
+};
+
+unsigned warn_on_explicit_downcast(OSObject * obj) {
+ OSArray *a = (OSArray *) obj; // expected-warning{{C-style cast of OSObject. Use OSDynamicCast instead}}
+ return a->getCount();
+}
+
+void no_warn_on_upcast(OSArray *arr) {
+ OSObject *obj = (OSObject *) arr;
+ obj->retain();
+ obj->release();
+}
+
+unsigned no_warn_on_dynamic_cast(OSObject *obj) {
+ OSArray *a = OSDynamicCast(OSArray, obj);
+ return a->getCount();
+}
+
+__SIZE_TYPE__ no_warn_on_primitive_conversion(OSArray *arr) {
+ return (__SIZE_TYPE__) arr;
+}
+
+unsigned no_warn_on_other_type_cast(A *a) {
+ B *b = (B *) a;
+ return b->getCount();
+}
+