1 //===- llvm/unittest/Support/ThreadLocalTest.cpp - ThreadLocal tests ------===// 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-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "llvm/Support/ThreadLocal.h" 10 #include "gtest/gtest.h" 11 #include <type_traits> 12 13 using namespace llvm; 14 using namespace sys; 15 16 namespace { 17 18 class ThreadLocalTest : public ::testing::Test { 19 }; 20 21 struct S { 22 int i; 23 }; 24 25 TEST_F(ThreadLocalTest, Basics) { 26 ThreadLocal<const S> x; 27 28 static_assert( 29 std::is_const<std::remove_pointer<decltype(x.get())>::type>::value, 30 "ThreadLocal::get didn't return a pointer to const object"); 31 32 EXPECT_EQ(nullptr, x.get()); 33 34 S s; 35 x.set(&s); 36 EXPECT_EQ(&s, x.get()); 37 38 x.erase(); 39 EXPECT_EQ(nullptr, x.get()); 40 41 ThreadLocal<S> y; 42 43 static_assert( 44 !std::is_const<std::remove_pointer<decltype(y.get())>::type>::value, 45 "ThreadLocal::get returned a pointer to const object"); 46 47 EXPECT_EQ(nullptr, y.get()); 48 49 y.set(&s); 50 EXPECT_EQ(&s, y.get()); 51 52 y.erase(); 53 EXPECT_EQ(nullptr, y.get()); 54 } 55 56 } 57