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