• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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