summaryrefslogtreecommitdiffstats
path: root/clang/test
diff options
context:
space:
mode:
Diffstat (limited to 'clang/test')
-rw-r--r--clang/test/Analysis/osobject-retain-release.cpp38
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();
OpenPOWER on IntegriCloud