190dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert//===----------------------------------------------------------------------===//
290dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert//
390dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert//                     The LLVM Compiler Infrastructure
490dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert//
590dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert// This file is dual licensed under the MIT and the University of Illinois Open
690dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert// Source Licenses. See LICENSE.TXT for details.
790dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert//
890dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert//===----------------------------------------------------------------------===//
990dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert
1090dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert// type_traits
1190dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert
1290dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert// member_function_pointer
1390dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert
1490dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert#define _LIBCPP_HAS_NO_VARIADICS
1590dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert#include <type_traits>
1690dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert
1790dc8dd841b975fccfa4a278b9b44065d3644839Dan Alberttemplate <class T>
1890dc8dd841b975fccfa4a278b9b44065d3644839Dan Albertvoid test_member_function_pointer_imp()
1990dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert{
2090dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    static_assert(!std::is_void<T>::value, "");
2190dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert#if _LIBCPP_STD_VER > 11
2290dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    static_assert(!std::is_null_pointer<T>::value, "");
2390dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert#endif
2490dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    static_assert(!std::is_integral<T>::value, "");
2590dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    static_assert(!std::is_floating_point<T>::value, "");
2690dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    static_assert(!std::is_array<T>::value, "");
2790dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    static_assert(!std::is_pointer<T>::value, "");
2890dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    static_assert(!std::is_lvalue_reference<T>::value, "");
2990dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    static_assert(!std::is_rvalue_reference<T>::value, "");
3090dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    static_assert(!std::is_member_object_pointer<T>::value, "");
3190dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    static_assert( std::is_member_function_pointer<T>::value, "");
3290dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    static_assert(!std::is_enum<T>::value, "");
3390dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    static_assert(!std::is_union<T>::value, "");
3490dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    static_assert(!std::is_class<T>::value, "");
3590dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    static_assert(!std::is_function<T>::value, "");
3690dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert}
3790dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert
3890dc8dd841b975fccfa4a278b9b44065d3644839Dan Alberttemplate <class T>
3990dc8dd841b975fccfa4a278b9b44065d3644839Dan Albertvoid test_member_function_pointer()
4090dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert{
4190dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    test_member_function_pointer_imp<T>();
4290dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    test_member_function_pointer_imp<const T>();
4390dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    test_member_function_pointer_imp<volatile T>();
4490dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    test_member_function_pointer_imp<const volatile T>();
4590dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert}
4690dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert
4790dc8dd841b975fccfa4a278b9b44065d3644839Dan Albertclass Class
4890dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert{
4990dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert};
5090dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert
5190dc8dd841b975fccfa4a278b9b44065d3644839Dan Albertint main()
5290dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert{
5390dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    test_member_function_pointer<void (Class::*)()>();
5490dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    test_member_function_pointer<void (Class::*)(int)>();
5590dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    test_member_function_pointer<void (Class::*)(int, char)>();
5690dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert
5790dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    test_member_function_pointer<void (Class::*)() const>();
5890dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    test_member_function_pointer<void (Class::*)(int) const>();
5990dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    test_member_function_pointer<void (Class::*)(int, char) const>();
6090dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert
6190dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    test_member_function_pointer<void (Class::*)() volatile>();
6290dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    test_member_function_pointer<void (Class::*)(int) volatile>();
6390dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    test_member_function_pointer<void (Class::*)(int, char) volatile>();
6490dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert
6590dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    test_member_function_pointer<void (Class::*)(...)>();
6690dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    test_member_function_pointer<void (Class::*)(int, ...)>();
6790dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    test_member_function_pointer<void (Class::*)(int, char, ...)>();
6890dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert
6990dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    test_member_function_pointer<void (Class::*)(...) const>();
7090dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    test_member_function_pointer<void (Class::*)(int, ...) const>();
7190dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    test_member_function_pointer<void (Class::*)(int, char, ...) const>();
7290dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert
7390dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    test_member_function_pointer<void (Class::*)(...) volatile>();
7490dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    test_member_function_pointer<void (Class::*)(int, ...) volatile>();
7590dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert    test_member_function_pointer<void (Class::*)(int, char, ...) volatile>();
7690dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert}
77