summaryrefslogtreecommitdiff
path: root/test/std/utilities/meta/meta.trans/meta.trans.other/result_of11.pass.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/std/utilities/meta/meta.trans/meta.trans.other/result_of11.pass.cpp')
-rw-r--r--test/std/utilities/meta/meta.trans/meta.trans.other/result_of11.pass.cpp70
1 files changed, 70 insertions, 0 deletions
diff --git a/test/std/utilities/meta/meta.trans/meta.trans.other/result_of11.pass.cpp b/test/std/utilities/meta/meta.trans/meta.trans.other/result_of11.pass.cpp
index 6996cddc08b90..8cb5853bbc6d7 100644
--- a/test/std/utilities/meta/meta.trans/meta.trans.other/result_of11.pass.cpp
+++ b/test/std/utilities/meta/meta.trans/meta.trans.other/result_of11.pass.cpp
@@ -14,6 +14,8 @@
// result_of<Fn(ArgTypes...)>
#include <type_traits>
+#include <memory>
+#include <utility>
#include "test_macros.h"
struct wat
@@ -23,6 +25,8 @@ struct wat
};
struct F {};
+struct FD : public F {};
+struct NotDerived {};
template <class T, class U>
void test_result_of_imp()
@@ -31,10 +35,15 @@ void test_result_of_imp()
#if TEST_STD_VER > 11
static_assert((std::is_same<std::result_of_t<T>, U>::value), "");
#endif
+#if TEST_STD_VER > 14
+ static_assert(std::is_callable<T>::value, "");
+ static_assert(std::is_callable<T, U>::value, "");
+#endif
}
int main()
{
+ typedef NotDerived ND;
{
typedef char F::*PMD;
test_result_of_imp<PMD(F &), char &>();
@@ -51,6 +60,31 @@ int main()
test_result_of_imp<PMD(F const ), char &&>();
test_result_of_imp<PMD(F volatile ), char &&>();
test_result_of_imp<PMD(F const volatile ), char &&>();
+
+ test_result_of_imp<PMD(FD &), char &>();
+ test_result_of_imp<PMD(FD const &), char const &>();
+ test_result_of_imp<PMD(FD volatile &), char volatile &>();
+ test_result_of_imp<PMD(FD const volatile &), char const volatile &>();
+
+ test_result_of_imp<PMD(FD &&), char &&>();
+ test_result_of_imp<PMD(FD const &&), char const &&>();
+ test_result_of_imp<PMD(FD volatile &&), char volatile &&>();
+ test_result_of_imp<PMD(FD const volatile &&), char const volatile &&>();
+
+ test_result_of_imp<PMD(FD ), char &&>();
+ test_result_of_imp<PMD(FD const ), char &&>();
+ test_result_of_imp<PMD(FD volatile ), char &&>();
+ test_result_of_imp<PMD(FD const volatile ), char &&>();
+
+ test_result_of_imp<PMD(std::unique_ptr<F>), char &>();
+ test_result_of_imp<PMD(std::unique_ptr<F const>), const char &>();
+ test_result_of_imp<PMD(std::unique_ptr<FD>), char &>();
+ test_result_of_imp<PMD(std::unique_ptr<FD const>), const char &>();
+
+ test_result_of_imp<PMD(std::reference_wrapper<F>), char &>();
+ test_result_of_imp<PMD(std::reference_wrapper<F const>), const char &>();
+ test_result_of_imp<PMD(std::reference_wrapper<FD>), char &>();
+ test_result_of_imp<PMD(std::reference_wrapper<FD const>), const char &>();
}
{
test_result_of_imp<int (F::* (F &)) () &, int> ();
@@ -83,6 +117,42 @@ int main()
test_result_of_imp<int (F::* (F volatile )) () const volatile &&, int> ();
test_result_of_imp<int (F::* (F const volatile )) () const volatile &&, int> ();
}
+ {
+ test_result_of_imp<int (F::* (FD &)) () &, int> ();
+ test_result_of_imp<int (F::* (FD &)) () const &, int> ();
+ test_result_of_imp<int (F::* (FD &)) () volatile &, int> ();
+ test_result_of_imp<int (F::* (FD &)) () const volatile &, int> ();
+ test_result_of_imp<int (F::* (FD const &)) () const &, int> ();
+ test_result_of_imp<int (F::* (FD const &)) () const volatile &, int> ();
+ test_result_of_imp<int (F::* (FD volatile &)) () volatile &, int> ();
+ test_result_of_imp<int (F::* (FD volatile &)) () const volatile &, int> ();
+ test_result_of_imp<int (F::* (FD const volatile &)) () const volatile &, int> ();
+
+ test_result_of_imp<int (F::* (FD &&)) () &&, int> ();
+ test_result_of_imp<int (F::* (FD &&)) () const &&, int> ();
+ test_result_of_imp<int (F::* (FD &&)) () volatile &&, int> ();
+ test_result_of_imp<int (F::* (FD &&)) () const volatile &&, int> ();
+ test_result_of_imp<int (F::* (FD const &&)) () const &&, int> ();
+ test_result_of_imp<int (F::* (FD const &&)) () const volatile &&, int> ();
+ test_result_of_imp<int (F::* (FD volatile &&)) () volatile &&, int> ();
+ test_result_of_imp<int (F::* (FD volatile &&)) () const volatile &&, int> ();
+ test_result_of_imp<int (F::* (FD const volatile &&)) () const volatile &&, int> ();
+ test_result_of_imp<int (F::* (FD )) () &&, int> ();
+ test_result_of_imp<int (F::* (FD )) () const &&, int> ();
+ test_result_of_imp<int (F::* (FD )) () volatile &&, int> ();
+ test_result_of_imp<int (F::* (FD )) () const volatile &&, int> ();
+ test_result_of_imp<int (F::* (FD const )) () const &&, int> ();
+ test_result_of_imp<int (F::* (FD const )) () const volatile &&, int> ();
+ test_result_of_imp<int (F::* (FD volatile )) () volatile &&, int> ();
+ test_result_of_imp<int (F::* (FD volatile )) () const volatile &&, int> ();
+ test_result_of_imp<int (F::* (FD const volatile )) () const volatile &&, int> ();
+ }
+ {
+ test_result_of_imp<int (F::* (std::reference_wrapper<F>)) (), int>();
+ test_result_of_imp<int (F::* (std::reference_wrapper<const F>)) () const, int>();
+ test_result_of_imp<int (F::* (std::unique_ptr<F> )) (), int>();
+ test_result_of_imp<int (F::* (std::unique_ptr<const F> )) () const, int>();
+ }
test_result_of_imp<decltype(&wat::foo)(wat), void>();
}