blob: 35e343bc4d3c43561234ba71b44d813a87c6941d [file] [log] [blame]
John McCall20bb1752012-05-01 06:13:13 +00001// 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
Bill Wendling89924572013-02-27 00:06:04 +00008// CHECK: define internal void [[INIT_s:@.*global_var.*]] [[NUW:#[0-9]+]]
NAKAMURA Takumi0e33dcd2012-09-25 09:53:18 +00009// CHECK: %{{[.0-9A-Z_a-z]+}} = call x86_thiscallcc %struct.S* @"\01??0S@@QAE@XZ"
John McCall20bb1752012-05-01 06:13:13 +000010// CHECK: call i32 @atexit(void ()* @"__dtor_\01?s@@3US@@A")
11// CHECK: ret void
12
Bill Wendling89924572013-02-27 00:06:04 +000013// CHECK: define internal void @"__dtor_\01?s@@3US@@A"() [[NUW]] {
Timur Iskhodzhanov8f88a1d2012-07-12 09:50:54 +000014// CHECK: call x86_thiscallcc void @"\01??1S@@QAE@XZ"
John McCall20bb1752012-05-01 06:13:13 +000015// 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
Bill Wendling89924572013-02-27 00:06:04 +000036// CHECK: define internal void [[INIT_foo:@.*global_var.*]] [[NUW]]
NAKAMURA Takumi0e33dcd2012-09-25 09:53:18 +000037// CHECK: %{{[.0-9A-Z_a-z]+}} = call x86_thiscallcc %class.A* @"\01??0A@@QAE@XZ"
John McCall20bb1752012-05-01 06:13:13 +000038// CHECK: call i32 @atexit(void ()* [[FOO_DTOR:@"__dtor_.*foo@.*]])
39// CHECK: ret void
40
John McCallbd315742012-09-25 08:00:39 +000041// CHECK: define linkonce_odr x86_thiscallcc %class.A* @"\01??0A@@QAE@XZ"
John McCall20bb1752012-05-01 06:13:13 +000042
Timur Iskhodzhanov8f88a1d2012-07-12 09:50:54 +000043// CHECK: define linkonce_odr x86_thiscallcc void @"\01??1A@@QAE@XZ"
John McCall20bb1752012-05-01 06:13:13 +000044
45// CHECK: define internal void [[FOO_DTOR]]
Timur Iskhodzhanov8f88a1d2012-07-12 09:50:54 +000046// CHECK: call x86_thiscallcc void @"\01??1A@@QAE@XZ"{{.*}}foo
John McCall20bb1752012-05-01 06:13:13 +000047// CHECK: ret void
48
Bill Wendling89924572013-02-27 00:06:04 +000049// CHECK: define internal void @_GLOBAL__I_a() [[NUW]] {
John McCall20bb1752012-05-01 06:13:13 +000050// CHECK: call void [[INIT_s]]
51// CHECK: call void [[INIT_foo]]
52// CHECK: ret void
Bill Wendlingf7a9da02013-02-20 07:22:19 +000053
Bill Wendling89924572013-02-27 00:06:04 +000054// CHECK: attributes [[NUW]] = { nounwind }