diff options
author | Bill Wendling <isanbard@gmail.com> | 2011-06-02 22:26:15 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2011-06-02 22:26:15 +0000 |
commit | 76dd0de6d5f05024f6870fd053c45953f80d710e (patch) | |
tree | 60553aca53b9112f952d1b6ec7ad56a2aa6a4b90 /test/FrontendC++ | |
parent | 6edf90b8a7168e53409d161fb8b285094c4c9182 (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.cpp | 93 |
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, +}; |