aboutsummaryrefslogtreecommitdiff
path: root/test/FrontendC++
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2011-06-02 22:26:15 +0000
committerBill Wendling <isanbard@gmail.com>2011-06-02 22:26:15 +0000
commit76dd0de6d5f05024f6870fd053c45953f80d710e (patch)
tree60553aca53b9112f952d1b6ec7ad56a2aa6a4b90 /test/FrontendC++
parent6edf90b8a7168e53409d161fb8b285094c4c9182 (diff)
This should have been a C++ testcase.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@132504 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/FrontendC++')
-rw-r--r--test/FrontendC++/unnamed-addr.cpp93
1 files changed, 93 insertions, 0 deletions
diff --git a/test/FrontendC++/unnamed-addr.cpp b/test/FrontendC++/unnamed-addr.cpp
new file mode 100644
index 0000000000..2f7598ff27
--- /dev/null
+++ b/test/FrontendC++/unnamed-addr.cpp
@@ -0,0 +1,93 @@
+// RUN: %llvmgxx -S %s -o - | FileCheck %s
+// <rdar://problem/9402870>
+extern "C" {
+typedef struct __TestResult TestResult;
+typedef struct __TestResult* TestResultRef;
+
+typedef struct __TestImplement TestImplement;
+typedef struct __TestImplement* TestImplementRef;
+
+typedef char*(*TestNameFunction)(void*);
+typedef void(*TestRunFunction)(void*,TestResult*);
+typedef int(*TestCountTestCasesFunction)(void*);
+
+struct __TestImplement {
+ TestNameFunction name;
+ TestRunFunction run;
+ TestCountTestCasesFunction countTestCases;
+};
+
+typedef struct __Test Test;
+typedef struct __Test* TestRef;
+
+struct __Test {
+ TestImplement* isa;
+};
+
+typedef struct __TestCase TestCase;
+typedef struct __TestCase* TestCaseRef;
+
+struct __TestCase {
+ TestImplement* isa;
+ const char *name;
+ void(*setUp)(void);
+ void(*tearDown)(void);
+ void(*runTest)(void);
+};
+
+extern const TestImplement TestCaseImplement;
+
+typedef struct __TestFixture TestFixture;
+typedef struct __TestFixture* TestFixtureRef;
+
+struct __TestFixture {
+ const char *name;
+ void(*test)(void);
+};
+
+typedef struct __TestCaller TestCaller;
+typedef struct __TestCaller* TestCallerRef;
+
+struct __TestCaller {
+ TestImplement* isa;
+ const char *name;
+ void(*setUp)(void);
+ void(*tearDown)(void);
+ int numberOfFixtuers;
+ TestFixture *fixtuers;
+};
+
+extern const TestImplement TestCallerImplement;
+}
+
+void PassToFunction(const TestImplement*);
+
+const char* TestCaller_name(TestCaller* self) {
+ return self->name;
+}
+
+void TestCaller_run(TestCaller* self,TestResult* result) {
+ TestCase cs = { (TestImplement*)&TestCaseImplement, 0, 0, 0, 0, };
+ int i;
+ cs.setUp = self->setUp;
+ cs.tearDown = self->tearDown;
+ for (i=0; i<self->numberOfFixtuers; i++) {
+ cs.name = self->fixtuers[i].name;
+ cs.runTest = self->fixtuers[i].test;
+ ((Test*)(void *)&cs)->isa->run((void *)&cs,result);
+ }
+}
+
+int TestCaller_countTestCases(TestCaller* self) {
+ PassToFunction(&TestCallerImplement);
+ return self->numberOfFixtuers;
+}
+
+// CHECK: @_ZZ14TestCaller_runP12__TestCallerP12__TestResultE3C.0 = internal unnamed_addr constant
+// CHECK-NOT: @TestCaseImplement = external unnamed_addr constant %struct.TestImplement
+// CHECK: @TestCaseImplement = external constant %struct.TestImplement
+const TestImplement TestCallerImplement = {
+ (TestNameFunction)TestCaller_name,
+ (TestRunFunction)TestCaller_run,
+ (TestCountTestCasesFunction)TestCaller_countTestCases,
+};