1 // RUN: %clang_cc1 -emit-llvm %s -o - -cxx-abi microsoft -triple=i386-pc-win32 | FileCheck %s
2
3 struct S {
SS4 S() {}
~SS5 ~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:
A()20 A() {}
~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
force_usage()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