summaryrefslogtreecommitdiff
path: root/lib/BlocksRuntime/tests/reference.C
diff options
context:
space:
mode:
Diffstat (limited to 'lib/BlocksRuntime/tests/reference.C')
-rw-r--r--lib/BlocksRuntime/tests/reference.C95
1 files changed, 95 insertions, 0 deletions
diff --git a/lib/BlocksRuntime/tests/reference.C b/lib/BlocksRuntime/tests/reference.C
new file mode 100644
index 000000000..f86f11e86
--- /dev/null
+++ b/lib/BlocksRuntime/tests/reference.C
@@ -0,0 +1,95 @@
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+
+#import <Block.h>
+#import <stdio.h>
+#import <stdlib.h>
+
+// CONFIG C++
+
+int recovered = 0;
+
+
+
+int constructors = 0;
+int destructors = 0;
+
+#define CONST const
+
+class TestObject
+{
+public:
+ TestObject(CONST TestObject& inObj);
+ TestObject();
+ ~TestObject();
+
+ TestObject& operator=(CONST TestObject& inObj);
+
+ void test(void);
+
+ int version() CONST { return _version; }
+private:
+ mutable int _version;
+};
+
+TestObject::TestObject(CONST TestObject& inObj)
+
+{
+ ++constructors;
+ _version = inObj._version;
+ //printf("%p (%d) -- TestObject(const TestObject&) called", this, _version);
+}
+
+
+TestObject::TestObject()
+{
+ _version = ++constructors;
+ //printf("%p (%d) -- TestObject() called\n", this, _version);
+}
+
+
+TestObject::~TestObject()
+{
+ //printf("%p -- ~TestObject() called\n", this);
+ ++destructors;
+}
+
+#if 1
+TestObject& TestObject::operator=(CONST TestObject& inObj)
+{
+ //printf("%p -- operator= called", this);
+ _version = inObj._version;
+ return *this;
+}
+#endif
+
+void TestObject::test(void) {
+ void (^b)(void) = ^{ recovered = _version; };
+ void (^b2)(void) = Block_copy(b);
+ b2();
+ Block_release(b2);
+}
+
+
+
+void testRoutine() {
+ TestObject one;
+
+
+ one.test();
+}
+
+
+
+int main(int argc, char *argv[]) {
+ testRoutine();
+ if (recovered == 1) {
+ printf("%s: success\n", argv[0]);
+ exit(0);
+ }
+ printf("%s: *** didn't recover byref block variable\n", argv[0]);
+ exit(1);
+}