xref: /llvm-project/llvm/unittests/ADT/TypeTraitsTest.cpp (revision 6aa050a69041e610587c51032fa477dd3d6da787)
1 //===- TypeTraitsTest.cpp - type_traits unit 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/ADT/STLExtras.h"
10 #include "gtest/gtest.h"
11 
12 using namespace llvm;
13 
14 //===----------------------------------------------------------------------===//
15 // function_traits
16 //===----------------------------------------------------------------------===//
17 
18 namespace {
19 /// Check a callable type of the form `bool(const int &)`.
20 template <typename CallableT> struct CheckFunctionTraits {
21   static_assert(
22       std::is_same_v<typename function_traits<CallableT>::result_t, bool>,
23       "expected result_t to be `bool`");
24   static_assert(
25       std::is_same_v<typename function_traits<CallableT>::template arg_t<0>,
26                      const int &>,
27       "expected arg_t<0> to be `const int &`");
28   static_assert(function_traits<CallableT>::num_args == 1,
29                 "expected num_args to be 1");
30 };
31 
32 /// Test function pointers.
33 using FuncType = bool (*)(const int &);
34 struct CheckFunctionPointer : CheckFunctionTraits<FuncType> {};
35 
36 /// Test method pointers.
37 struct Foo {
38   bool func(const int &v);
39 };
40 struct CheckMethodPointer : CheckFunctionTraits<decltype(&Foo::func)> {};
41 
42 /// Test lambda references.
__anon49e6b1000202(const int &v) 43 LLVM_ATTRIBUTE_UNUSED auto lambdaFunc = [](const int &v) -> bool {
44   return true;
45 };
46 struct CheckLambda : CheckFunctionTraits<decltype(lambdaFunc)> {};
47 
48 } // end anonymous namespace
49 
50 //===----------------------------------------------------------------------===//
51 // is_detected
52 //===----------------------------------------------------------------------===//
53 
54 namespace {
55 struct HasFooMethod {
foo__anon49e6b1000311::HasFooMethod56   void foo() {}
57 };
58 struct NoFooMethod {};
59 
60 template <class T> using has_foo_method_t = decltype(std::declval<T &>().foo());
61 
62 static_assert(is_detected<has_foo_method_t, HasFooMethod>::value,
63               "expected foo method to be detected");
64 static_assert(!is_detected<has_foo_method_t, NoFooMethod>::value,
65               "expected no foo method to be detected");
66 } // end anonymous namespace
67