// RUN: %llvmgxx -S %s -o - | FileCheck %s // 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; inumberOfFixtuers; 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, };