1 // RUN: %clang_cc1 -S -emit-llvm %s -triple x86_64-unknown-linux-gnu -o - | FileCheck %s
2 
3 class A {
4 public:
5   [[clang::nomerge]] A();
6   [[clang::nomerge]] ~A();
7   [[clang::nomerge]] void f();
8   [[clang::nomerge]] virtual void g();
9   [[clang::nomerge]] static void f1();
10 };
11 
12 class B : public A {
13 public:
14   void g() override;
15 };
16 
17 [[clang::nomerge]] bool bar();
18 [[clang::nomerge]] void f(bool, bool);
19 
20 void foo(int i, A *ap, B *bp) {
21   [[clang::nomerge]] bar();
22   [[clang::nomerge]] (i = 4, bar());
23   [[clang::nomerge]] (void)(bar());
24   [[clang::nomerge]] f(bar(), bar());
25   [[clang::nomerge]] [] { bar(); bar(); }(); // nomerge only applies to the anonymous function call
26   [[clang::nomerge]] for (bar(); bar(); bar()) {}
27   [[clang::nomerge]] { asm("nop"); }
28   bar();
29 
30   ap->g();
31   bp->g();
32 
33   A a;
34   a.f();
35   a.g();
36   A::f1();
37 
38   B b;
39   b.g();
40 }
41 
42 int g(int i);
43 
44 void something() {
45   g(1);
46 }
47 
48 [[clang::nomerge]] int g(int i);
49 
50 void something_else() {
51   g(1);
52 }
53 
54 int g(int i) { return i; }
55 
56 void something_else_again() {
57   g(1);
58 }
59 
60 // CHECK: call zeroext i1 @_Z3barv(){{$}}
61 // CHECK: call zeroext i1 @_Z3barv(){{$}}
62 // CHECK: call zeroext i1 @_Z3barv(){{$}}
63 // CHECK: call zeroext i1 @_Z3barv(){{$}}
64 // CHECK: call zeroext i1 @_Z3barv(){{$}}
65 // CHECK: call void @_Z1fbb({{.*}}){{$}}
66 // CHECK: call void @"_ZZ3fooiP1AP1BENK3$_0clEv"{{.*}} #[[ATTR0:[0-9]+]]
67 // CHECK: call zeroext i1 @_Z3barv(){{$}}
68 // CHECK: call zeroext i1 @_Z3barv(){{$}}
69 // CHECK: call zeroext i1 @_Z3barv(){{$}}
70 // CHECK: call void asm sideeffect "nop"{{.*}} #[[ATTR1:[0-9]+]]
71 // CHECK: call zeroext i1 @_Z3barv(){{$}}
72 // CHECK: %[[AG:.*]] = load void (%class.A*)*, void (%class.A*)**
73 // CHECK-NEXT: call void %[[AG]](%class.A* nonnull dereferenceable
74 // CHECK: %[[BG:.*]] = load void (%class.B*)*, void (%class.B*)**
75 // CHECK-NEXT: call void %[[BG]](%class.B* nonnull dereferenceable
76 
77 
78 // CHECK-DAG: declare zeroext i1 @_Z3barv() #[[ATTR2:[0-9]+]]
79 // CHECK-DAG: declare void @_Z1fbb(i1 zeroext, i1 zeroext) #[[ATTR2]]
80 // CHECK-DAG: declare void @_ZN1AC1Ev{{.*}} #[[ATTR2]]
81 // CHECK-DAG: declare void @_ZN1A1fEv{{.*}} #[[ATTR2]]
82 // CHECK-DAG: declare void @_ZN1A1gEv{{.*}} #[[ATTR2]]
83 // CHECK-DAG: declare void @_ZN1A2f1Ev{{.*}} #[[ATTR2]]
84 // CHECK-DAG: declare void @_ZN1AC2Ev{{.*}} #[[ATTR2]]
85 // CHECK-DAG: declare void @_ZN1AD1Ev{{.*}} #[[ATTR3:[0-9]+]]
86 // CHECK-DAG: declare void @_ZN1AD2Ev{{.*}} #[[ATTR3]]
87 // CHECK-DAG: define i32 @_Z1gi(i32 %i) #[[ATTR4:[0-9]+]] {
88 
89 // CHECK-DAG: attributes #[[ATTR0]] = {{{.*}}nomerge{{.*}}}
90 // CHECK-DAG: attributes #[[ATTR1]] = {{{.*}}nomerge{{.*}}}
91 // CHECK-DAG: attributes #[[ATTR2]] = {{{.*}}nomerge{{.*}}}
92 // CHECK-DAG: attributes #[[ATTR3]] = {{{.*}}nomerge{{.*}}}
93 // CHECK-DAG: attributes #[[ATTR4]] = {{{.*}}nomerge{{.*}}}
94