1//===----------------------------------------------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10// <tuple>
11
12// template <class... Types> class tuple;
13
14// template <class... Types>
15//   class tuple_size<tuple<Types...>>
16//     : public integral_constant<size_t, sizeof...(Types)> { };
17
18// XFAIL: gcc-4.9
19// UNSUPPORTED: c++98, c++03
20
21#include <tuple>
22#include <type_traits>
23
24template <class T, class = decltype(std::tuple_size<T>::value)>
25constexpr bool has_value(int) { return true; }
26template <class> constexpr bool has_value(long) { return false; }
27template <class T> constexpr bool has_value() { return has_value<T>(0); }
28
29struct Dummy {};
30
31int main() {
32  // Test that the ::value member does not exist
33  static_assert(has_value<std::tuple<int> const>(), "");
34  static_assert(has_value<std::pair<int, long> volatile>(), "");
35  static_assert(!has_value<int>(), "");
36  static_assert(!has_value<const int>(), "");
37  static_assert(!has_value<volatile void>(), "");
38  static_assert(!has_value<const volatile std::tuple<int>&>(), "");
39}
40