1 // RUN: %clang_cc1 -emit-llvm -triple x86_64 -Werror %s -o - | FileCheck %s
2 
3 // CHECK:      @llvm.used = appending global [7 x i8*]
4 // CHECK-SAME:   @_ZN2X0C2Ev
5 // CHECK-SAME:   @_ZN2X0C1Ev
6 // CHECK-SAME:   @_ZN2X0D2Ev
7 // CHECK-SAME:   @_ZN2X0D1Ev
8 // CHECK-SAME:   @_ZN2X16Nested2f1Ev
9 // CHECK-SAME:   @_ZN10merge_declL4funcEv
10 // CHECK-SAME:   @_ZN18instantiate_member1SIiE1fEv
11 
12 struct X0 {
13   // CHECK: define linkonce_odr{{.*}} @_ZN2X0C1Ev({{.*}}
X0X014   __attribute__((used, retain)) X0() {}
15   // CHECK: define linkonce_odr{{.*}} @_ZN2X0D1Ev({{.*}}
~X0X016   __attribute__((used, retain)) ~X0() {}
17 };
18 
19 struct X1 {
20   struct Nested {
21     // CHECK-NOT: 2f0Ev
22     // CHECK: define linkonce_odr{{.*}} @_ZN2X16Nested2f1Ev({{.*}}
f0X1::Nested23     void __attribute__((retain)) f0() {}
f1X1::Nested24     void __attribute__((used, retain)) f1() {}
25   };
26 };
27 
28 // CHECK: define internal void @_ZN10merge_declL4funcEv(){{.*}}
29 namespace merge_decl {
30 static void func();
bar()31 void bar() { void func() __attribute__((used, retain)); }
func()32 static void func() {}
33 } // namespace merge_decl
34 
35 namespace instantiate_member {
36 template <typename T>
37 struct S {
finstantiate_member::S38   void __attribute__((used, retain)) f() {}
39 };
40 
test()41 void test() {
42   // CHECK: define linkonce_odr{{.*}} void @_ZN18instantiate_member1SIiE1fEv({{.*}}
43   S<int> a;
44 }
45 } // namespace instantiate_member
46