17112dae6acac544a0271a85d95342c583441e2d1Dan Albert//===----------------------------------------------------------------------===//
27112dae6acac544a0271a85d95342c583441e2d1Dan Albert//
37112dae6acac544a0271a85d95342c583441e2d1Dan Albert//                     The LLVM Compiler Infrastructure
47112dae6acac544a0271a85d95342c583441e2d1Dan Albert//
57112dae6acac544a0271a85d95342c583441e2d1Dan Albert// This file is dual licensed under the MIT and the University of Illinois Open
67112dae6acac544a0271a85d95342c583441e2d1Dan Albert// Source Licenses. See LICENSE.TXT for details.
77112dae6acac544a0271a85d95342c583441e2d1Dan Albert//
87112dae6acac544a0271a85d95342c583441e2d1Dan Albert//===----------------------------------------------------------------------===//
97112dae6acac544a0271a85d95342c583441e2d1Dan Albert
107112dae6acac544a0271a85d95342c583441e2d1Dan Albert// type_traits
117112dae6acac544a0271a85d95342c583441e2d1Dan Albert
127112dae6acac544a0271a85d95342c583441e2d1Dan Albert// void_t
137112dae6acac544a0271a85d95342c583441e2d1Dan Albert
147112dae6acac544a0271a85d95342c583441e2d1Dan Albert#include <type_traits>
157112dae6acac544a0271a85d95342c583441e2d1Dan Albert
167112dae6acac544a0271a85d95342c583441e2d1Dan Albert#if _LIBCPP_STD_VER <= 14
177112dae6acac544a0271a85d95342c583441e2d1Dan Albertint main () {}
187112dae6acac544a0271a85d95342c583441e2d1Dan Albert#else
197112dae6acac544a0271a85d95342c583441e2d1Dan Albert
207112dae6acac544a0271a85d95342c583441e2d1Dan Alberttemplate <class T>
217112dae6acac544a0271a85d95342c583441e2d1Dan Albertvoid test1()
227112dae6acac544a0271a85d95342c583441e2d1Dan Albert{
237112dae6acac544a0271a85d95342c583441e2d1Dan Albert    static_assert( std::is_same<void, std::void_t<T>>::value, "");
247112dae6acac544a0271a85d95342c583441e2d1Dan Albert    static_assert( std::is_same<void, std::void_t<const T>>::value, "");
257112dae6acac544a0271a85d95342c583441e2d1Dan Albert    static_assert( std::is_same<void, std::void_t<volatile T>>::value, "");
267112dae6acac544a0271a85d95342c583441e2d1Dan Albert    static_assert( std::is_same<void, std::void_t<const volatile T>>::value, "");
277112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
287112dae6acac544a0271a85d95342c583441e2d1Dan Albert
297112dae6acac544a0271a85d95342c583441e2d1Dan Alberttemplate <class T, class U>
307112dae6acac544a0271a85d95342c583441e2d1Dan Albertvoid test2()
317112dae6acac544a0271a85d95342c583441e2d1Dan Albert{
327112dae6acac544a0271a85d95342c583441e2d1Dan Albert    static_assert( std::is_same<void, std::void_t<T, U>>::value, "");
337112dae6acac544a0271a85d95342c583441e2d1Dan Albert    static_assert( std::is_same<void, std::void_t<const T, U>>::value, "");
347112dae6acac544a0271a85d95342c583441e2d1Dan Albert    static_assert( std::is_same<void, std::void_t<volatile T, U>>::value, "");
357112dae6acac544a0271a85d95342c583441e2d1Dan Albert    static_assert( std::is_same<void, std::void_t<const volatile T, U>>::value, "");
367112dae6acac544a0271a85d95342c583441e2d1Dan Albert
377112dae6acac544a0271a85d95342c583441e2d1Dan Albert    static_assert( std::is_same<void, std::void_t<T, const U>>::value, "");
387112dae6acac544a0271a85d95342c583441e2d1Dan Albert    static_assert( std::is_same<void, std::void_t<const T, const U>>::value, "");
397112dae6acac544a0271a85d95342c583441e2d1Dan Albert    static_assert( std::is_same<void, std::void_t<volatile T, const U>>::value, "");
407112dae6acac544a0271a85d95342c583441e2d1Dan Albert    static_assert( std::is_same<void, std::void_t<const volatile T, const U>>::value, "");
417112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
427112dae6acac544a0271a85d95342c583441e2d1Dan Albert
437112dae6acac544a0271a85d95342c583441e2d1Dan Albertclass Class
447112dae6acac544a0271a85d95342c583441e2d1Dan Albert{
457112dae6acac544a0271a85d95342c583441e2d1Dan Albertpublic:
467112dae6acac544a0271a85d95342c583441e2d1Dan Albert    ~Class();
477112dae6acac544a0271a85d95342c583441e2d1Dan Albert};
487112dae6acac544a0271a85d95342c583441e2d1Dan Albert
497112dae6acac544a0271a85d95342c583441e2d1Dan Albertint main()
507112dae6acac544a0271a85d95342c583441e2d1Dan Albert{
517112dae6acac544a0271a85d95342c583441e2d1Dan Albert    static_assert( std::is_same<void, std::void_t<>>::value, "");
527112dae6acac544a0271a85d95342c583441e2d1Dan Albert
535cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    test1<void>();
545cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    test1<int>();
555cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    test1<double>();
565cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    test1<int&>();
575cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    test1<Class>();
585cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    test1<Class[]>();
595cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    test1<Class[5]>();
605cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert
615cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    test2<void, int>();
625cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    test2<double, int>();
635cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    test2<int&, int>();
645cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    test2<Class&, bool>();
655cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    test2<void *, int&>();
667112dae6acac544a0271a85d95342c583441e2d1Dan Albert
677112dae6acac544a0271a85d95342c583441e2d1Dan Albert    static_assert( std::is_same<void, std::void_t<int, double const &, Class, volatile int[], void>>::value, "");
687112dae6acac544a0271a85d95342c583441e2d1Dan Albert}
697112dae6acac544a0271a85d95342c583441e2d1Dan Albert#endif
70