2021-11-18 05:25:01 +08:00
|
|
|
//===----------------------------------------------------------------------===//
|
2016-10-12 16:54:10 +08:00
|
|
|
//
|
2019-01-19 18:56:40 +08:00
|
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
2016-10-12 16:54:10 +08:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
2020-06-01 22:38:23 +08:00
|
|
|
// UNSUPPORTED: c++03
|
2016-10-14 17:12:53 +08:00
|
|
|
// UNSUPPORTED: libcxxabi-no-threads
|
2016-10-12 16:54:10 +08:00
|
|
|
|
2021-07-13 05:50:21 +08:00
|
|
|
// TODO: Investigate this failure
|
|
|
|
// XFAIL: target=arm64-apple-{{.+}}
|
|
|
|
|
2016-10-12 16:54:10 +08:00
|
|
|
#include <cassert>
|
|
|
|
#include <thread>
|
|
|
|
|
2020-11-24 04:52:03 +08:00
|
|
|
#include "make_test_thread.h"
|
|
|
|
|
2016-10-12 16:54:10 +08:00
|
|
|
int seq = 0;
|
|
|
|
|
|
|
|
class OrderChecker {
|
|
|
|
public:
|
|
|
|
explicit OrderChecker(int n) : n_{n} { }
|
|
|
|
|
|
|
|
~OrderChecker() {
|
|
|
|
assert(seq++ == n_);
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
int n_;
|
|
|
|
};
|
|
|
|
|
|
|
|
template <int ID>
|
|
|
|
class CreatesThreadLocalInDestructor {
|
|
|
|
public:
|
|
|
|
~CreatesThreadLocalInDestructor() {
|
|
|
|
thread_local OrderChecker checker{ID};
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
OrderChecker global{7};
|
|
|
|
|
|
|
|
void thread_fn() {
|
|
|
|
static OrderChecker fn_static{5};
|
|
|
|
thread_local CreatesThreadLocalInDestructor<2> creates_tl2;
|
|
|
|
thread_local OrderChecker fn_thread_local{1};
|
|
|
|
thread_local CreatesThreadLocalInDestructor<0> creates_tl0;
|
|
|
|
}
|
|
|
|
|
2020-10-09 01:36:33 +08:00
|
|
|
int main(int, char**) {
|
2016-10-12 16:54:10 +08:00
|
|
|
static OrderChecker fn_static{6};
|
|
|
|
|
2020-11-24 04:52:03 +08:00
|
|
|
support::make_test_thread(thread_fn).join();
|
2016-10-12 16:54:10 +08:00
|
|
|
assert(seq == 3);
|
|
|
|
|
|
|
|
thread_local OrderChecker fn_thread_local{4};
|
|
|
|
thread_local CreatesThreadLocalInDestructor<3> creates_tl;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|