Home | History | Annotate | Download | only in CodeGenCXX
      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