| // RUN: %clang_cc1 -triple x86_64-apple-macosx10.8 -std=c++1y -emit-llvm %s -o - | FileCheck %s | |
| // RUN: %clang_cc1 -triple x86_64-windows-gnu -std=c++1y -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>; } |