// RUN: %clang_cc1 -emit-llvm -triple x86_64 -Werror %s -o - | FileCheck %s // CHECK: @llvm.used = appending global [7 x ptr] // CHECK-SAME: @_ZN2X0C2Ev // CHECK-SAME: @_ZN2X0C1Ev // CHECK-SAME: @_ZN2X0D2Ev // CHECK-SAME: @_ZN2X0D1Ev // CHECK-SAME: @_ZN2X16Nested2f1Ev // CHECK-SAME: @_ZN10merge_declL4funcEv // CHECK-SAME: @_ZN18instantiate_member1SIiE1fEv struct X0 { // CHECK: define linkonce_odr{{.*}} @_ZN2X0C1Ev({{.*}} __attribute__((used, retain)) X0() {} // CHECK: define linkonce_odr{{.*}} @_ZN2X0D1Ev({{.*}} __attribute__((used, retain)) ~X0() {} }; struct X1 { struct Nested { // CHECK-NOT: 2f0Ev // CHECK: define linkonce_odr{{.*}} @_ZN2X16Nested2f1Ev({{.*}} void __attribute__((retain)) f0() {} void __attribute__((used, retain)) f1() {} }; }; // CHECK: define internal void @_ZN10merge_declL4funcEv(){{.*}} namespace merge_decl { static void func(); void bar() { void func() __attribute__((used, retain)); } static void func() {} } // namespace merge_decl namespace instantiate_member { template struct S { void __attribute__((used, retain)) f() {} }; void test() { // CHECK: define linkonce_odr{{.*}} void @_ZN18instantiate_member1SIiE1fEv({{.*}} S a; } } // namespace instantiate_member