summaryrefslogtreecommitdiffstats
path: root/clang/test/Analysis/osobjectcstylecastchecker_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/test/Analysis/osobjectcstylecastchecker_test.cpp')
-rw-r--r--clang/test/Analysis/osobjectcstylecastchecker_test.cpp39
1 files changed, 39 insertions, 0 deletions
diff --git a/clang/test/Analysis/osobjectcstylecastchecker_test.cpp b/clang/test/Analysis/osobjectcstylecastchecker_test.cpp
new file mode 100644
index 00000000000..bc9fb3ee780
--- /dev/null
+++ b/clang/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();
+}
+
+unsigned long no_warn_on_primitive_conversion(OSArray *arr) {
+ return (unsigned long) arr;
+}
+
+unsigned no_warn_on_other_type_cast(A *a) {
+ B *b = (B *) a;
+ return b->getCount();
+}
+
OpenPOWER on IntegriCloud