xref: /openbsd-src/gnu/llvm/compiler-rt/lib/sanitizer_common/tests/sanitizer_type_traits_test.cpp (revision 810390e339a5425391477d5d41c78d7cab2424ac)
1 //===-- sanitizer_type_traits_test.cpp ------------------------------------===//
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 // This file is a part of ThreadSanitizer/AddressSanitizer runtime.
10 //
11 //===----------------------------------------------------------------------===//
12 #include "sanitizer_common/sanitizer_type_traits.h"
13 
14 #include <vector>
15 
16 #include "gtest/gtest.h"
17 #include "sanitizer_common/sanitizer_internal_defs.h"
18 
19 namespace __sanitizer {
20 
TEST(SanitizerCommon,IsSame)21 TEST(SanitizerCommon, IsSame) {
22   ASSERT_TRUE((is_same<unsigned, unsigned>::value));
23   ASSERT_TRUE((is_same<uptr, uptr>::value));
24   ASSERT_TRUE((is_same<sptr, sptr>::value));
25   ASSERT_TRUE((is_same<const uptr, const uptr>::value));
26 
27   ASSERT_FALSE((is_same<unsigned, signed>::value));
28   ASSERT_FALSE((is_same<uptr, sptr>::value));
29   ASSERT_FALSE((is_same<uptr, const uptr>::value));
30 }
31 
TEST(SanitizerCommon,Conditional)32 TEST(SanitizerCommon, Conditional) {
33   ASSERT_TRUE((is_same<int, conditional<true, int, double>::type>::value));
34   ASSERT_TRUE((is_same<double, conditional<false, int, double>::type>::value));
35 }
36 
TEST(SanitizerCommon,RemoveReference)37 TEST(SanitizerCommon, RemoveReference) {
38   ASSERT_TRUE((is_same<int, remove_reference<int>::type>::value));
39   ASSERT_TRUE((is_same<const int, remove_reference<const int>::type>::value));
40   ASSERT_TRUE((is_same<int, remove_reference<int&>::type>::value));
41   ASSERT_TRUE((is_same<const int, remove_reference<const int&>::type>::value));
42   ASSERT_TRUE((is_same<int, remove_reference<int&&>::type>::value));
43 }
44 
TEST(SanitizerCommon,Move)45 TEST(SanitizerCommon, Move) {
46   std::vector<int> v = {1, 2, 3};
47   auto v2 = __sanitizer::move(v);
48   EXPECT_EQ(3u, v2.size());
49   EXPECT_TRUE(v.empty());
50 }
51 
TEST(SanitizerCommon,Forward)52 TEST(SanitizerCommon, Forward) {
53   std::vector<int> v = {1, 2, 3};
54   auto v2 = __sanitizer::forward<std::vector<int>>(v);
55   EXPECT_EQ(3u, v2.size());
56   EXPECT_TRUE(v.empty());
57 }
58 
TEST(SanitizerCommon,ForwardConst)59 TEST(SanitizerCommon, ForwardConst) {
60   const std::vector<int> v = {1, 2, 3};
61   auto v2 = __sanitizer::forward<const std::vector<int>&>(v);
62   EXPECT_EQ(3u, v2.size());
63   EXPECT_EQ(3u, v.size());
64 }
65 
66 struct TestStruct {
67   int a;
68   float b;
69 };
70 
TEST(SanitizerCommon,IsTriviallyDestructible)71 TEST(SanitizerCommon, IsTriviallyDestructible) {
72   ASSERT_TRUE((is_trivially_destructible<int>::value));
73   ASSERT_TRUE((is_trivially_destructible<TestStruct>::value));
74   ASSERT_FALSE((is_trivially_destructible<std::vector<int>>::value));
75 }
76 
TEST(SanitizerCommon,IsTriviallyCopyable)77 TEST(SanitizerCommon, IsTriviallyCopyable) {
78   ASSERT_TRUE((is_trivially_copyable<int>::value));
79   ASSERT_TRUE((is_trivially_copyable<TestStruct>::value));
80   ASSERT_FALSE((is_trivially_copyable<std::vector<int>>::value));
81 }
82 
83 }  // namespace __sanitizer