diff options
Diffstat (limited to 'clang/test')
| -rw-r--r-- | clang/test/Analysis/osobject-retain-release.cpp | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/clang/test/Analysis/osobject-retain-release.cpp b/clang/test/Analysis/osobject-retain-release.cpp index 18bdf0bafc5..c1b93fce50f 100644 --- a/clang/test/Analysis/osobject-retain-release.cpp +++ b/clang/test/Analysis/osobject-retain-release.cpp @@ -1,18 +1,46 @@ // RUN: %clang_analyze_cc1 -analyze -analyzer-checker=core,osx.cocoa.RetainCount -analyzer-config osx.cocoa.RetainCount:CheckOSObject=true -analyzer-output=text -verify %s +struct OSMetaClass; + +#define OSTypeID(type) (type::metaClass) + +#define OSDynamicCast(type, inst) \ + ((type *) OSMetaClassBase::safeMetaCast((inst), OSTypeID(type))) + struct OSObject { virtual void retain(); virtual void release(); - virtual ~OSObject(){} + + static OSObject *generateObject(int); + + static const OSMetaClass * const metaClass; }; struct OSArray : public OSObject { unsigned int getCount(); static OSArray *withCapacity(unsigned int capacity); + + static const OSMetaClass * const metaClass; }; +struct OSMetaClassBase { + static OSObject *safeMetaCast(const OSObject *inst, const OSMetaClass *meta); +}; + +void check_dynamic_cast() { + OSArray *arr = OSDynamicCast(OSArray, OSObject::generateObject(1)); + arr->release(); +} + +void check_dynamic_cast_null_check() { + OSArray *arr = OSDynamicCast(OSArray, OSObject::generateObject(1)); + if (!arr) + return; + arr->release(); +} + void use_after_release() { OSArray *arr = OSArray::withCapacity(10); // expected-note{{Call to function 'withCapacity' returns an OSObject of type struct OSArray * with a +1 retain count}} arr->release(); // expected-note{{Object released}} |

