1// RUN: %clang_cc1 -emit-llvm %s -o - -cxx-abi microsoft -triple=i386-pc-win32 | FileCheck %s 2 3struct S { 4 S() {} 5 ~S() {} 6} s; 7 8// CHECK: define internal void [[INIT_s:@.*global_var.*]] [[NUW:#[0-9]+]] 9// CHECK: %{{[.0-9A-Z_a-z]+}} = call x86_thiscallcc %struct.S* @"\01??0S@@QAE@XZ" 10// CHECK: call i32 @atexit(void ()* @"__dtor_\01?s@@3US@@A") 11// CHECK: ret void 12 13// CHECK: define internal void @"__dtor_\01?s@@3US@@A"() [[NUW]] { 14// CHECK: call x86_thiscallcc void @"\01??1S@@QAE@XZ" 15// CHECK: ret void 16 17// Force WeakODRLinkage by using templates 18class A { 19 public: 20 A() {} 21 ~A() {} 22}; 23 24template<typename T> 25class B { 26 public: 27 static A foo; 28}; 29 30template<typename T> A B<T>::foo; 31 32void force_usage() { 33 (void)B<int>::foo; // (void) - force usage 34} 35 36// CHECK: define internal void [[INIT_foo:@.*global_var.*]] [[NUW]] 37// CHECK: %{{[.0-9A-Z_a-z]+}} = call x86_thiscallcc %class.A* @"\01??0A@@QAE@XZ" 38// CHECK: call i32 @atexit(void ()* [[FOO_DTOR:@"__dtor_.*foo@.*]]) 39// CHECK: ret void 40 41// CHECK: define linkonce_odr x86_thiscallcc %class.A* @"\01??0A@@QAE@XZ" 42 43// CHECK: define linkonce_odr x86_thiscallcc void @"\01??1A@@QAE@XZ" 44 45// CHECK: define internal void [[FOO_DTOR]] 46// CHECK: call x86_thiscallcc void @"\01??1A@@QAE@XZ"{{.*}}foo 47// CHECK: ret void 48 49// CHECK: define internal void @_GLOBAL__I_a() [[NUW]] { 50// CHECK: call void [[INIT_s]] 51// CHECK: call void [[INIT_foo]] 52// CHECK: ret void 53 54// CHECK: attributes [[NUW]] = { nounwind } 55