1421c89deSDavid Majnemer //===- llvm/unittest/Support/ThreadLocalTest.cpp - ThreadLocal tests ------===//
2fabf8bfdSHans Wennborg //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6fabf8bfdSHans Wennborg //
7fabf8bfdSHans Wennborg //===----------------------------------------------------------------------===//
8fabf8bfdSHans Wennborg
9fabf8bfdSHans Wennborg #include "llvm/Support/ThreadLocal.h"
10fabf8bfdSHans Wennborg #include "gtest/gtest.h"
11421c89deSDavid Majnemer #include <type_traits>
12fabf8bfdSHans Wennborg
13fabf8bfdSHans Wennborg using namespace llvm;
14fabf8bfdSHans Wennborg using namespace sys;
15fabf8bfdSHans Wennborg
16fabf8bfdSHans Wennborg namespace {
17fabf8bfdSHans Wennborg
18fabf8bfdSHans Wennborg class ThreadLocalTest : public ::testing::Test {
19fabf8bfdSHans Wennborg };
20fabf8bfdSHans Wennborg
21fabf8bfdSHans Wennborg struct S {
22fabf8bfdSHans Wennborg int i;
23fabf8bfdSHans Wennborg };
24fabf8bfdSHans Wennborg
TEST_F(ThreadLocalTest,Basics)25fabf8bfdSHans Wennborg TEST_F(ThreadLocalTest, Basics) {
26fabf8bfdSHans Wennborg ThreadLocal<const S> x;
27fabf8bfdSHans Wennborg
28421c89deSDavid Majnemer static_assert(
29421c89deSDavid Majnemer std::is_const<std::remove_pointer<decltype(x.get())>::type>::value,
30421c89deSDavid Majnemer "ThreadLocal::get didn't return a pointer to const object");
31421c89deSDavid Majnemer
3266f09ad0SCraig Topper EXPECT_EQ(nullptr, x.get());
33fabf8bfdSHans Wennborg
34fabf8bfdSHans Wennborg S s;
35fabf8bfdSHans Wennborg x.set(&s);
36fabf8bfdSHans Wennborg EXPECT_EQ(&s, x.get());
37fabf8bfdSHans Wennborg
38fabf8bfdSHans Wennborg x.erase();
3966f09ad0SCraig Topper EXPECT_EQ(nullptr, x.get());
40421c89deSDavid Majnemer
41421c89deSDavid Majnemer ThreadLocal<S> y;
42421c89deSDavid Majnemer
43421c89deSDavid Majnemer static_assert(
44421c89deSDavid Majnemer !std::is_const<std::remove_pointer<decltype(y.get())>::type>::value,
45421c89deSDavid Majnemer "ThreadLocal::get returned a pointer to const object");
46421c89deSDavid Majnemer
47421c89deSDavid Majnemer EXPECT_EQ(nullptr, y.get());
48421c89deSDavid Majnemer
49421c89deSDavid Majnemer y.set(&s);
50421c89deSDavid Majnemer EXPECT_EQ(&s, y.get());
51421c89deSDavid Majnemer
52421c89deSDavid Majnemer y.erase();
53421c89deSDavid Majnemer EXPECT_EQ(nullptr, y.get());
54fabf8bfdSHans Wennborg }
55fabf8bfdSHans Wennborg
56fabf8bfdSHans Wennborg }
57