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