1//===----------------------------------------------------------------------===//
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// UNSUPPORTED: c++03, c++11, c++14
10
11// template <class _Tp, template <class...> class _Template>
12// inline constexpr bool __is_specialization_v = true if and only if _Tp is a specialization of _Template
13//
14// Note instantiation for certain type combinations are ill-formed. These are
15// tested in is_specialization.verify.cpp.
16
17#include <type_traits>
18
19#include <array>
20#include <concepts>
21#include <string_view>
22#include <tuple>
23#include <utility>
24
25#include "test_macros.h"
26
27// Simple types
28static_assert(std::__is_specialization_v<std::pair<int, int>, std::pair>);
29static_assert(!std::__is_specialization_v<std::pair<int, int>, std::tuple>);
30static_assert(!std::__is_specialization_v<std::pair<int, int>, std::basic_string_view>);
31
32static_assert(std::__is_specialization_v<std::tuple<int>, std::tuple>);
33static_assert(std::__is_specialization_v<std::tuple<int, float>, std::tuple>);
34static_assert(std::__is_specialization_v<std::tuple<int, float, void*>, std::tuple>);
35
36static_assert(std::__is_specialization_v<std::string_view, std::basic_string_view>);
37#ifndef TEST_HAS_NO_WIDE_CHARACTERS
38static_assert(std::__is_specialization_v<std::wstring_view, std::basic_string_view>);
39#endif
40
41// Nested types
42static_assert(std::__is_specialization_v<std::pair<std::tuple<int>, int>, std::pair>);
43static_assert(!std::__is_specialization_v<std::pair<std::tuple<int>, int>, std::tuple>);
44
45// cvref _Tp is not a specialization.
46static_assert(!std::__is_specialization_v<const std::pair<int, int>, std::pair>);
47static_assert(!std::__is_specialization_v<volatile std::pair<int, int>, std::pair>);
48static_assert(!std::__is_specialization_v<const volatile std::pair<int, int>, std::pair>);
49
50static_assert(!std::__is_specialization_v<std::pair<int, int>&, std::pair>);
51static_assert(!std::__is_specialization_v<const std::pair<int, int>&, std::pair>);
52static_assert(!std::__is_specialization_v<volatile std::pair<int, int>&, std::pair>);
53static_assert(!std::__is_specialization_v<const volatile std::pair<int, int>&, std::pair>);
54
55static_assert(!std::__is_specialization_v<std::pair<int, int>&&, std::pair>);
56static_assert(!std::__is_specialization_v<const std::pair<int, int>&&, std::pair>);
57static_assert(!std::__is_specialization_v<volatile std::pair<int, int>&&, std::pair>);
58static_assert(!std::__is_specialization_v<const volatile std::pair<int, int>&&, std::pair>);
59

source code of libcxx/test/libcxx/type_traits/is_specialization.compile.pass.cpp