1 // RUN: %clang_cc1 -emit-llvm %s -o - -cxx-abi microsoft -triple=i386-pc-win32 | FileCheck %s 2 3 struct S { 4 S() {} 5 ~S() {} 6 } s; 7 8 // CHECK: define internal void [[INIT_s:@.*global_var.*]] nounwind 9 // CHECK: call x86_thiscallcc void @"\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"() nounwind { 14 // CHECK: call x86_thiscallcc void @"\01??1S@@QAE@XZ" 15 // CHECK: ret void 16 17 // Force WeakODRLinkage by using templates 18 class A { 19 public: 20 A() {} 21 ~A() {} 22 }; 23 24 template<typename T> 25 class B { 26 public: 27 static A foo; 28 }; 29 30 template<typename T> A B<T>::foo; 31 32 void force_usage() { 33 (void)B<int>::foo; // (void) - force usage 34 } 35 36 // CHECK: define internal void [[INIT_foo:@.*global_var.*]] nounwind 37 // CHECK: call x86_thiscallcc void @"\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 void @"\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() nounwind { 50 // CHECK: call void [[INIT_s]] 51 // CHECK: call void [[INIT_foo]] 52 // CHECK: ret void 53