xref: /llvm-project/libcxx/test/std/utilities/variant/variant.helpers/variant_size.pass.cpp (revision fb855eb941b6d740cc6560297d0b4d3201dcaf9f)
180e66ac1SEric Fiselier //===----------------------------------------------------------------------===//
280e66ac1SEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
680e66ac1SEric Fiselier //
780e66ac1SEric Fiselier //===----------------------------------------------------------------------===//
880e66ac1SEric Fiselier 
931cbe0f2SLouis Dionne // UNSUPPORTED: c++03, c++11, c++14
1080e66ac1SEric Fiselier 
1180e66ac1SEric Fiselier // <variant>
1280e66ac1SEric Fiselier 
1380e66ac1SEric Fiselier // template <class T> struct variant_size; // undefined
1480e66ac1SEric Fiselier // template <class T> struct variant_size<const T>;
1580e66ac1SEric Fiselier // template <class T> struct variant_size<volatile T>;
1680e66ac1SEric Fiselier // template <class T> struct variant_size<const volatile T>;
1780e66ac1SEric Fiselier // template <class T> constexpr size_t variant_size_v
1880e66ac1SEric Fiselier //     = variant_size<T>::value;
1980e66ac1SEric Fiselier 
2080e66ac1SEric Fiselier #include <memory>
2180e66ac1SEric Fiselier #include <type_traits>
2280e66ac1SEric Fiselier #include <variant>
2380e66ac1SEric Fiselier 
247fc6a556SMarshall Clow #include "test_macros.h"
257fc6a556SMarshall Clow 
test()26*fb855eb9SMark de Wever template <class V, std::size_t E> void test() {
2780e66ac1SEric Fiselier   static_assert(std::variant_size<V>::value == E, "");
2880e66ac1SEric Fiselier   static_assert(std::variant_size<const V>::value == E, "");
2980e66ac1SEric Fiselier   static_assert(std::variant_size<volatile V>::value == E, "");
3080e66ac1SEric Fiselier   static_assert(std::variant_size<const volatile V>::value == E, "");
3180e66ac1SEric Fiselier   static_assert(std::variant_size_v<V> == E, "");
3280e66ac1SEric Fiselier   static_assert(std::variant_size_v<const V> == E, "");
3380e66ac1SEric Fiselier   static_assert(std::variant_size_v<volatile V> == E, "");
3480e66ac1SEric Fiselier   static_assert(std::variant_size_v<const volatile V> == E, "");
3580e66ac1SEric Fiselier   static_assert(std::is_base_of<std::integral_constant<std::size_t, E>,
3680e66ac1SEric Fiselier                                 std::variant_size<V>>::value,
3780e66ac1SEric Fiselier                 "");
3880e66ac1SEric Fiselier };
3980e66ac1SEric Fiselier 
main(int,char **)402df59c50SJF Bastien int main(int, char**) {
4180e66ac1SEric Fiselier   test<std::variant<>, 0>();
4280e66ac1SEric Fiselier   test<std::variant<void *>, 1>();
4380e66ac1SEric Fiselier   test<std::variant<long, long, void *, double>, 4>();
442df59c50SJF Bastien 
452df59c50SJF Bastien   return 0;
4680e66ac1SEric Fiselier }
47