1 // RUN: %clang_cc1 -std=gnu++11 -emit-llvm -triple=x86_64-linux-gnu -o - %s | FileCheck %s
2 
3 _Atomic unsigned an_atomic_uint;
4 
5 enum { an_enum_value = 1 };
6 
7 // CHECK-LABEL: define {{.*}}void @_Z5enum1v()
8 void enum1() {
9   an_atomic_uint += an_enum_value;
10   // CHECK: atomicrmw add ptr
11 }
12 
13 // CHECK-LABEL: define {{.*}}void @_Z5enum2v()
14 void enum2() {
15   an_atomic_uint |= an_enum_value;
16   // CHECK: atomicrmw or ptr
17 }
18 
19 // CHECK-LABEL: define {{.*}}void @_Z5enum3RU7_Atomicj({{.*}})
20 void enum3(_Atomic unsigned &an_atomic_uint_param) {
21   an_atomic_uint_param += an_enum_value;
22   // CHECK: atomicrmw add ptr
23 }
24 
25 // CHECK-LABEL: define {{.*}}void @_Z5enum4RU7_Atomicj({{.*}})
26 void enum4(_Atomic unsigned &an_atomic_uint_param) {
27   an_atomic_uint_param |= an_enum_value;
28   // CHECK: atomicrmw or ptr
29 }
30 
31 volatile _Atomic unsigned an_volatile_atomic_uint;
32 
33 // CHECK-LABEL: define {{.*}}void @_Z5enum5v()
34 void enum5() {
35   an_volatile_atomic_uint += an_enum_value;
36   // CHECK: atomicrmw add ptr
37 }
38 
39 // CHECK-LABEL: define {{.*}}void @_Z5enum6v()
40 void enum6() {
41   an_volatile_atomic_uint |= an_enum_value;
42   // CHECK: atomicrmw or ptr
43 }
44 
45 // CHECK-LABEL: define {{.*}}void @_Z5enum7RVU7_Atomicj({{.*}})
46 void enum7(volatile _Atomic unsigned &an_volatile_atomic_uint_param) {
47   an_volatile_atomic_uint_param += an_enum_value;
48   // CHECK: atomicrmw add ptr
49 }
50 
51 // CHECK-LABEL: define {{.*}}void @_Z5enum8RVU7_Atomicj({{.*}})
52 void enum8(volatile _Atomic unsigned &an_volatile_atomic_uint_param) {
53   an_volatile_atomic_uint_param |= an_enum_value;
54   // CHECK: atomicrmw or ptr
55 }
56