| // RUN: %clang_cc1 %s -I%S -triple=x86_64-apple-darwin10 -emit-llvm -O3 -o - | FileCheck %s |
| |
| // CHECK: %"struct.rdar20621065::B" = type { float, float } |
| |
| struct Empty { }; |
| |
| struct A { |
| explicit A(unsigned a = 0xffffffff) : a(a) { } |
| |
| unsigned a; |
| }; |
| |
| struct B : A, Empty { |
| B() : A(), Empty() { } |
| }; |
| |
| struct C : A, Empty { |
| C() : A(), Empty() { } |
| C(const C& other) : A(0x12345678), Empty(other) { } |
| }; |
| |
| struct D : A, Empty { |
| D& operator=(const D& other) { |
| a = 0x87654321; |
| Empty::operator=(other); |
| |
| return *this; |
| } |
| }; |
| |
| #define CHECK(x) if (!(x)) return __LINE__ |
| |
| // PR7012 |
| // CHECK-LABEL: define i32 @_Z1fv() |
| int f() { |
| B b1; |
| |
| // Check that A::a is not overwritten by the Empty default constructor. |
| CHECK(b1.a == 0xffffffff); |
| |
| C c1; |
| C c2(c1); |
| |
| // Check that A::a has the value set in the C::C copy constructor. |
| CHECK(c2.a == 0x12345678); |
| |
| D d1, d2; |
| d2 = d1; |
| |
| // Check that A::as has the value set in the D copy assignment operator. |
| CHECK(d2.a == 0x87654321); |
| |
| // Success! |
| // CHECK: ret i32 0 |
| return 0; |
| } |
| |
| namespace PR8796 { |
| struct FreeCell { |
| }; |
| union ThingOrCell { |
| FreeCell t; |
| FreeCell cell; |
| }; |
| struct Things { |
| ThingOrCell things; |
| }; |
| Things x; |
| } |
| |
| #ifdef HARNESS |
| extern "C" void printf(const char *, ...); |
| |
| int main() { |
| int result = f(); |
| |
| if (result == 0) |
| printf("success!\n"); |
| else |
| printf("test on line %d failed!\n", result); |
| |
| return result; |
| } |
| #endif |
| |
| namespace rdar20621065 { |
| struct A { |
| float array[0]; |
| }; |
| |
| struct B : A { |
| float left; |
| float right; |
| }; |
| |
| // Type checked at the top of the file. |
| B b; |
| }; |
| |
| // This test used to crash when CGRecordLayout::getNonVirtualBaseLLVMFieldNo was called. |
| namespace record_layout { |
| struct X0 { |
| int x[0]; |
| }; |
| |
| template<typename> |
| struct X2 : X0 { |
| }; |
| |
| template<typename> |
| struct X3 : X2<int> { |
| X3() : X2<int>() {} |
| }; |
| |
| |
| void test0() { |
| X3<int>(); |
| } |
| } |