annotate libcxxabi/test/thread_local_destruction_order.pass.cpp @ 192:d7606dcf6fce

Added tag llvm10 for changeset 0572611fdcc8
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 14 Dec 2020 18:01:34 +0900
parents 0572611fdcc8
children 2e18cbf3894f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===-------------- thread_local_destruction_order.pass.cpp ---------------===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
9 // Darwin TLV finalization routines used to fail when creating a thread-local
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
10 // variable in the destructor for another thread-local variable:
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
11 // - http://lists.llvm.org/pipermail/cfe-dev/2016-November/051376.html
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
12 // - rdar://29523281
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
13 // This was fixed in dyld in macos 10.15.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
14 //
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
15 // XFAIL: macosx10.14
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
16 // XFAIL: macosx10.13
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
17 // XFAIL: macosx10.12
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
18 // XFAIL: macosx10.11
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
19 // XFAIL: macosx10.10
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
20 // XFAIL: macosx10.9
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
21
150
anatofuz
parents:
diff changeset
22 // UNSUPPORTED: c++98, c++03
anatofuz
parents:
diff changeset
23 // UNSUPPORTED: libcxxabi-no-threads
anatofuz
parents:
diff changeset
24
anatofuz
parents:
diff changeset
25 #include <cassert>
anatofuz
parents:
diff changeset
26 #include <thread>
anatofuz
parents:
diff changeset
27
anatofuz
parents:
diff changeset
28 int seq = 0;
anatofuz
parents:
diff changeset
29
anatofuz
parents:
diff changeset
30 class OrderChecker {
anatofuz
parents:
diff changeset
31 public:
anatofuz
parents:
diff changeset
32 explicit OrderChecker(int n) : n_{n} { }
anatofuz
parents:
diff changeset
33
anatofuz
parents:
diff changeset
34 ~OrderChecker() {
anatofuz
parents:
diff changeset
35 assert(seq++ == n_);
anatofuz
parents:
diff changeset
36 }
anatofuz
parents:
diff changeset
37
anatofuz
parents:
diff changeset
38 private:
anatofuz
parents:
diff changeset
39 int n_;
anatofuz
parents:
diff changeset
40 };
anatofuz
parents:
diff changeset
41
anatofuz
parents:
diff changeset
42 template <int ID>
anatofuz
parents:
diff changeset
43 class CreatesThreadLocalInDestructor {
anatofuz
parents:
diff changeset
44 public:
anatofuz
parents:
diff changeset
45 ~CreatesThreadLocalInDestructor() {
anatofuz
parents:
diff changeset
46 thread_local OrderChecker checker{ID};
anatofuz
parents:
diff changeset
47 }
anatofuz
parents:
diff changeset
48 };
anatofuz
parents:
diff changeset
49
anatofuz
parents:
diff changeset
50 OrderChecker global{7};
anatofuz
parents:
diff changeset
51
anatofuz
parents:
diff changeset
52 void thread_fn() {
anatofuz
parents:
diff changeset
53 static OrderChecker fn_static{5};
anatofuz
parents:
diff changeset
54 thread_local CreatesThreadLocalInDestructor<2> creates_tl2;
anatofuz
parents:
diff changeset
55 thread_local OrderChecker fn_thread_local{1};
anatofuz
parents:
diff changeset
56 thread_local CreatesThreadLocalInDestructor<0> creates_tl0;
anatofuz
parents:
diff changeset
57 }
anatofuz
parents:
diff changeset
58
anatofuz
parents:
diff changeset
59 int main() {
anatofuz
parents:
diff changeset
60 static OrderChecker fn_static{6};
anatofuz
parents:
diff changeset
61
anatofuz
parents:
diff changeset
62 std::thread{thread_fn}.join();
anatofuz
parents:
diff changeset
63 assert(seq == 3);
anatofuz
parents:
diff changeset
64
anatofuz
parents:
diff changeset
65 thread_local OrderChecker fn_thread_local{4};
anatofuz
parents:
diff changeset
66 thread_local CreatesThreadLocalInDestructor<3> creates_tl;
anatofuz
parents:
diff changeset
67
anatofuz
parents:
diff changeset
68 return 0;
anatofuz
parents:
diff changeset
69 }