1 // RUN: %clang_cc1 %s -emit-llvm -O1 -o - -triple=i686-apple-darwin9 -std=c++11 | FileCheck %s
2 
3 // CHECK-DAG: @_ZN7PR180978constant1aE = global {{.*}} { i16 1, i8 6, i8 undef }, align 4
4 // CHECK-DAG: @_ZN7PR180978constant1bE = global {{.*}} { i16 2, i8 6, i8 undef }, align 4
5 // CHECK-DAG: @_ZN7PR180978constant1cE = global {{.*}} { i16 3, i8 6, i8 undef }, align 4
6 // CHECK-DAG: @_ZN7PR180978constant1yE = global {{.*}} { {{.*}} { i16 4, i8 6, i8 undef }, i32 5 }, align 4
7 
8 struct A {
9   _Atomic(int) i;
10   A(int j);
11   void v(int j);
12 };
13 // Storing to atomic values should be atomic
14 // CHECK: store atomic i32
15 void A::v(int j) { i = j; }
16 // Initialising atomic values should not be atomic
17 // CHECK-NOT: store atomic
18 A::A(int j) : i(j) {}
19 
20 struct B {
21   int i;
22   B(int x) : i(x) {}
23 };
24 
25 _Atomic(B) b;
26 
27 // CHECK-LABEL: define void @_Z11atomic_initR1Ai
28 void atomic_init(A& a, int i) {
29   // CHECK-NOT: atomic
30   // CHECK: tail call void @_ZN1BC1Ei
31   __c11_atomic_init(&b, B(i));
32   // CHECK-NEXT: ret void
33 }
34 
35 // CHECK-LABEL: define void @_Z16atomic_init_boolPU7_Atomicbb
36 void atomic_init_bool(_Atomic(bool) *ab, bool b) {
37   // CHECK-NOT: atomic
38   // CHECK: {{zext i1.*to i8}}
39   // CHECK-NEXT: store i8
40   __c11_atomic_init(ab, b);
41   // CHECK-NEXT: ret void
42 }
43 
44 struct AtomicBoolMember {
45   _Atomic(bool) ab;
46   AtomicBoolMember(bool b);
47 };
48 
49 // CHECK-LABEL: define void @_ZN16AtomicBoolMemberC2Eb
50 // CHECK: {{zext i1.*to i8}}
51 // CHECK-NEXT: store i8
52 // CHECK-NEXT: ret void
53 AtomicBoolMember::AtomicBoolMember(bool b) : ab(b) { }
54 
55 namespace PR18097 {
56   namespace dynamic {
57     struct X {
58       X(int);
59       short n;
60       char c;
61     };
62 
63     // CHECK-LABEL: define {{.*}} @__cxx_global_var_init
64     // CHECK: call void @_ZN7PR180977dynamic1XC1Ei({{.*}}* @_ZN7PR180977dynamic1aE, i32 1)
65     _Atomic(X) a = X(1);
66 
67     // CHECK-LABEL: define {{.*}} @__cxx_global_var_init
68     // CHECK: call void @_ZN7PR180977dynamic1XC1Ei({{.*}}* @_ZN7PR180977dynamic1bE, i32 2)
69     _Atomic(X) b(X(2));
70 
71     // CHECK-LABEL: define {{.*}} @__cxx_global_var_init
72     // CHECK: call void @_ZN7PR180977dynamic1XC1Ei({{.*}}* @_ZN7PR180977dynamic1cE, i32 3)
73     _Atomic(X) c{X(3)};
74 
75     struct Y {
76       _Atomic(X) a;
77       _Atomic(int) b;
78     };
79     // CHECK-LABEL: define {{.*}} @__cxx_global_var_init
80     // CHECK: call void @_ZN7PR180977dynamic1XC1Ei({{.*}}* getelementptr inbounds ({{.*}}* @_ZN7PR180977dynamic1yE, i32 0, i32 0), i32 4)
81     // CHECK: store i32 5, i32* getelementptr inbounds ({{.*}}* @_ZN7PR180977dynamic1yE, i32 0, i32 1)
82     Y y = { X(4), 5 };
83   }
84 
85   // CHECKs at top of file.
86   namespace constant {
87     struct X {
88       constexpr X(int n) : n(n) {}
89       short n;
90       char c = 6;
91     };
92     _Atomic(X) a = X(1);
93     _Atomic(X) b(X(2));
94     _Atomic(X) c{X(3)};
95 
96     struct Y {
97       _Atomic(X) a;
98       _Atomic(int) b;
99     };
100     Y y = { X(4), 5 };
101   }
102 }
103