diff options
Diffstat (limited to 'clang/test')
-rw-r--r-- | clang/test/Analysis/osobject-retain-release.cpp | 38 |
1 files changed, 35 insertions, 3 deletions
diff --git a/clang/test/Analysis/osobject-retain-release.cpp b/clang/test/Analysis/osobject-retain-release.cpp index 1b54008e4bd..398857f4545 100644 --- a/clang/test/Analysis/osobject-retain-release.cpp +++ b/clang/test/Analysis/osobject-retain-release.cpp @@ -21,12 +21,13 @@ struct OSObject { unsigned int foo() { return 42; } + virtual OS_RETURNS_NOT_RETAINED OSObject *identity(); + static OSObject *generateObject(int); static OSObject *getObject(); static OSObject *GetObject(); - static void * operator new(size_t size); static const OSMetaClass * const metaClass; @@ -40,6 +41,12 @@ struct OSIterator : public OSObject { struct OSArray : public OSObject { unsigned int getCount(); + OSIterator * getIterator(); + + OSObject *identity() override; + + virtual void consumeReference(OS_CONSUME OSArray *other); + static OSArray *generateArrayHasCode() { return new OSArray; } @@ -51,14 +58,18 @@ struct OSArray : public OSObject { return nullptr; } - OSIterator * getIterator(); - static OS_RETURNS_NOT_RETAINED OSArray *MaskedGetter(); static OS_RETURNS_RETAINED OSArray *getOoopsActuallyCreate(); static const OSMetaClass * const metaClass; }; +struct MyArray : public OSArray { + void consumeReference(OSArray *other) override; + + OSObject *identity() override; +}; + struct OtherStruct { static void doNothingToArray(OSArray *array); OtherStruct(OSArray *arr); @@ -68,6 +79,27 @@ struct OSMetaClassBase { static OSObject *safeMetaCast(const OSObject *inst, const OSMetaClass *meta); }; +void check_param_attribute_propagation(MyArray *parent) { + OSArray *arr = new OSArray; + parent->consumeReference(arr); +} + +unsigned int check_attribute_propagation(OSArray *arr) { + OSObject *other = arr->identity(); + OSArray *casted = OSDynamicCast(OSArray, other); + if (casted) + return casted->getCount(); + return 0; +} + +unsigned int check_attribute_indirect_propagation(MyArray *arr) { + OSObject *other = arr->identity(); + OSArray *casted = OSDynamicCast(OSArray, other); + if (casted) + return casted->getCount(); + return 0; +} + void check_free_no_error() { OSArray *arr = OSArray::withCapacity(10); arr->retain(); |