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