brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.7 KiB · c7e7717 Raw
68 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++0310// UNSUPPORTED: no-threads11 12// XFAIL: LIBCXX-FREEBSD-FIXME13 14// TODO: This test does start working with newer updates of the mingw-w6415// toolchain, when it includes the following commit:16// https://github.com/mingw-w64/mingw-w64/commit/71eddccd746c56d9cde28bb5620d027d49259de917// Thus, remove this UNSUPPORTED marking after the next update of the CI18// toolchain.19// UNSUPPORTED: target={{.*-windows-gnu}}20 21#include <cassert>22#include <thread>23 24#include "make_test_thread.h"25 26int seq = 0;27 28class OrderChecker {29public:30  explicit OrderChecker(int n) : n_{n} { }31 32  ~OrderChecker() {33    assert(seq++ == n_);34  }35 36private:37  int n_;38};39 40template <int ID>41class CreatesThreadLocalInDestructor {42public:43  ~CreatesThreadLocalInDestructor() {44    thread_local OrderChecker checker{ID};45  }46};47 48OrderChecker global{7};49 50void thread_fn() {51  static OrderChecker fn_static{5};52  thread_local CreatesThreadLocalInDestructor<2> creates_tl2;53  thread_local OrderChecker fn_thread_local{1};54  thread_local CreatesThreadLocalInDestructor<0> creates_tl0;55}56 57int main(int, char**) {58  static OrderChecker fn_static{6};59 60  support::make_test_thread(thread_fn).join();61  assert(seq == 3);62 63  thread_local OrderChecker fn_thread_local{4};64  thread_local CreatesThreadLocalInDestructor<3> creates_tl;65 66  return 0;67}68