blob: 01d36637e1c3e5a0ede2de212734e240d5249a4f [file] [log] [blame]
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: c++98, c++03, c++11
// <experimental/tuple>
// template <class F, class T> constexpr decltype(auto) apply(F &&, T &&)
// Test the return type deduction.
#include <experimental/tuple>
#include <cassert>
static int my_int = 42;
template <int N> struct index_t {};
void f(index_t<0>) {}
int f(index_t<1>) { return 0; }
int & f(index_t<2>) { return static_cast<int &>(my_int); }
int const & f(index_t<3>) { return static_cast<int const &>(my_int); }
int volatile & f(index_t<4>) { return static_cast<int volatile &>(my_int); }
int const volatile & f(index_t<5>) { return static_cast<int const volatile &>(my_int); }
int && f(index_t<6>) { return static_cast<int &&>(my_int); }
int const && f(index_t<7>) { return static_cast<int const &&>(my_int); }
int volatile && f(index_t<8>) { return static_cast<int volatile &&>(my_int); }
int const volatile && f(index_t<9>) { return static_cast<int const volatile &&>(my_int); }
int * f(index_t<10>) { return static_cast<int *>(&my_int); }
int const * f(index_t<11>) { return static_cast<int const *>(&my_int); }
int volatile * f(index_t<12>) { return static_cast<int volatile *>(&my_int); }
int const volatile * f(index_t<13>) { return static_cast<int const volatile *>(&my_int); }
template <int Func, class Expect>
void test()
{
using F = decltype(f(index_t<Func>{}));
static_assert(std::is_same<F, Expect>::value, "");
}
namespace ex = std::experimental;
int main()
{
test<0, void>();
test<1, int>();
test<2, int &>();
test<3, int const &>();
test<4, int volatile &>();
test<5, int const volatile &>();
test<6, int &&>();
test<7, int const &&>();
test<8, int volatile &&>();
test<9, int const volatile &&>();
test<10, int *>();
test<11, int const *>();
test<12, int volatile *>();
test<13, int const volatile *>();
}