1 | // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s -std=c++11 | FileCheck %s |
2 | |
3 | struct A { |
4 | A(); |
5 | A(const A&); |
6 | A(A&); |
7 | ~A(); |
8 | }; |
9 | |
10 | struct B { |
11 | B(); |
12 | B(B&); |
13 | }; |
14 | |
15 | struct C { |
16 | C() {} |
17 | C(C& other, A a = A()); |
18 | int i, j; |
19 | }; |
20 | |
21 | struct POD { |
22 | int array[3][4]; |
23 | }; |
24 | |
25 | struct D : A, B, virtual C { |
26 | D(); |
27 | int scalar; |
28 | int scalar_array[2][3]; |
29 | B class_member; |
30 | C class_member_array[2][3]; |
31 | POD pod_array[2][3]; |
32 | |
33 | union { |
34 | int x; |
35 | float f[3]; |
36 | }; |
37 | }; |
38 | |
39 | void f(D d) { |
40 | D d2(d); |
41 | } |
42 | |
43 | // CHECK-LABEL: define linkonce_odr void @_ZN1DC1ERS_(%struct.D* %this, %struct.D* dereferenceable({{[0-9]+}})) unnamed_addr |
44 | // CHECK: call void @_ZN1AC1Ev |
45 | // CHECK: call void @_ZN1CC2ERS_1A |
46 | // CHECK: call void @_ZN1AD1Ev |
47 | // CHECK: call void @_ZN1AC2ERS_ |
48 | // CHECK: call void @_ZN1BC2ERS_ |
49 | // CHECK: {{call void @llvm.memcpy.p0i8.p0i8.i64.*i64 28}} |
50 | // CHECK: call void @_ZN1BC1ERS_ |
51 | // CHECK: br label |
52 | // CHECK: call void @_ZN1AC1Ev |
53 | // CHECK: call void @_ZN1CC1ERS_1A |
54 | // CHECK: call void @_ZN1AD1Ev |
55 | // CHECK: {{icmp eq.*, 3}} |
56 | // CHECK: br i1 |
57 | // CHECK: {{icmp eq.*, 2}} |
58 | // CHECK: br i1 |
59 | // CHECK: {{call void @llvm.memcpy.p0i8.p0i8.i64.*i64 300}} |
60 | // CHECK: ret void |
61 | |
62 | |
63 | template<class T> struct X0 { void f0(T * ) { } }; |
64 | template <class > struct X1 { X1( X1& , int = 0 ) { } }; |
65 | struct X2 { X1<int> result; }; |
66 | void test_X2() |
67 | { |
68 | typedef X2 impl; |
69 | typedef X0<impl> pimpl; |
70 | impl* i; |
71 | pimpl pdata; |
72 | pdata.f0( new impl(*i)); |
73 | } |
74 | |
75 | // rdar://problem/9598341 |
76 | namespace test3 { |
77 | struct A { A(const A&); A&operator=(const A&); }; |
78 | struct B { A a; unsigned : 0; }; |
79 | void test(const B &x) { |
80 | B y = x; |
81 | y = x; |
82 | } |
83 | } |
84 | |
85 | namespace test4 { |
86 | // When determining whether to implement an array copy as a memcpy, look at |
87 | // whether the *selected* constructor is trivial. |
88 | struct S { |
89 | int arr[5][5]; |
90 | S(S &); |
91 | S(const S &) = default; |
92 | }; |
93 | // CHECK: @_ZN5test42f1 |
94 | void f1(S a) { |
95 | // CHECK-NOT: memcpy |
96 | // CHECK: call void @_ZN5test41SC1ERS0_ |
97 | // CHECK-NOT: memcpy |
98 | S b(a); |
99 | // CHECK: } |
100 | } |
101 | // CHECK: @_ZN5test42f2 |
102 | void f2(const S a) { |
103 | // CHECK-NOT: call void @_ZN5test41SC1ERS0_ |
104 | // CHECK: memcpy |
105 | // CHECK-NOT: call void @_ZN5test41SC1ERS0_ |
106 | S b(a); |
107 | // CHECK: } |
108 | } |
109 | } |
110 | |