|  | // RUN: %clang_cc1 -triple x86_64-apple-macosx10.8 -std=c++1y -S -emit-llvm %s -o - | FileCheck %s | 
|  | // RUN: %clang_cc1 -triple x86_64-windows-gnu -std=c++1y -S -emit-llvm %s -o - | FileCheck %s --check-prefix=MINGW | 
|  |  | 
|  | // CHECK: @a = internal thread_local global | 
|  | // CHECK: @_Z2vtIiE = linkonce_odr thread_local global i32 5 | 
|  | // CHECK: @_ZZ3inlvE3loc = linkonce_odr thread_local global i32 0 | 
|  | // CHECK: @_tlv_atexit({{.*}}@_ZN1AD1Ev | 
|  | // CHECK: call cxx_fast_tlscc ptr @_ZTW3ext() | 
|  | // CHECK: declare cxx_fast_tlscc noundef ptr @_ZTW3ext() | 
|  | // CHECK-DAG: define weak_odr hidden cxx_fast_tlscc noundef ptr @_ZTW2vtIiE() | 
|  | // CHECK-DAG: define weak_odr hidden cxx_fast_tlscc noundef ptr @_ZTW2vtIvE() | 
|  | // CHECK-DAG: define {{.*}} @_ZTW1a | 
|  |  | 
|  | // MINGW-DAG: define weak_odr hidden noundef ptr @_ZTW2vtIiE() {{.*}} comdat | 
|  | // MINGW-DAG: define weak_odr hidden noundef ptr @_ZTW2vtIvE() {{.*}} comdat | 
|  |  | 
|  | struct A { | 
|  | ~A(); | 
|  | }; | 
|  |  | 
|  | thread_local A a; | 
|  |  | 
|  | extern thread_local int ext; | 
|  | int &get_ext() { return ext; } | 
|  |  | 
|  | template <typename T> | 
|  | thread_local int vt = 5; | 
|  |  | 
|  | int get_vt() { return vt<int>; } | 
|  |  | 
|  | inline int &inl() { | 
|  | thread_local int loc; | 
|  | return loc; | 
|  | } | 
|  | int &use_inl() { return inl(); } | 
|  |  | 
|  | template int vt<void>; | 
|  | int &get_vt_void() { return vt<void>; } |