1 // RUN: %clang_cc1 %s -I%S -triple=x86_64-apple-darwin10 -emit-llvm -O3 -o - | FileCheck %s
2
3 // CHECK: %"struct.rdar20621065::B" = type { float, float }
4
5 struct Empty { };
6
7 struct A {
AA8 explicit A(unsigned a = 0xffffffff) : a(a) { }
9
10 unsigned a;
11 };
12
13 struct B : A, Empty {
BB14 B() : A(), Empty() { }
15 };
16
17 struct C : A, Empty {
CC18 C() : A(), Empty() { }
CC19 C(const C& other) : A(0x12345678), Empty(other) { }
20 };
21
22 struct D : A, Empty {
operator =D23 D& operator=(const D& other) {
24 a = 0x87654321;
25 Empty::operator=(other);
26
27 return *this;
28 }
29 };
30
31 #define CHECK(x) if (!(x)) return __LINE__
32
33 // PR7012
34 // CHECK-LABEL: define i32 @_Z1fv()
f()35 int f() {
36 B b1;
37
38 // Check that A::a is not overwritten by the Empty default constructor.
39 CHECK(b1.a == 0xffffffff);
40
41 C c1;
42 C c2(c1);
43
44 // Check that A::a has the value set in the C::C copy constructor.
45 CHECK(c2.a == 0x12345678);
46
47 D d1, d2;
48 d2 = d1;
49
50 // Check that A::as has the value set in the D copy assignment operator.
51 CHECK(d2.a == 0x87654321);
52
53 // Success!
54 // CHECK: ret i32 0
55 return 0;
56 }
57
58 namespace PR8796 {
59 struct FreeCell {
60 };
61 union ThingOrCell {
62 FreeCell t;
63 FreeCell cell;
64 };
65 struct Things {
66 ThingOrCell things;
67 };
68 Things x;
69 }
70
71 #ifdef HARNESS
72 extern "C" void printf(const char *, ...);
73
main()74 int main() {
75 int result = f();
76
77 if (result == 0)
78 printf("success!\n");
79 else
80 printf("test on line %d failed!\n", result);
81
82 return result;
83 }
84 #endif
85
86 namespace rdar20621065 {
87 struct A {
88 float array[0];
89 };
90
91 struct B : A {
92 float left;
93 float right;
94 };
95
96 // Type checked at the top of the file.
97 B b;
98 };
99