PR tree-optimization/86415 - strlen() not folded for substrings within constant arrays
[official-gcc.git] / gcc / testsuite / g++.dg / cpp1y / lambda-generic-variadic17.C
blob4a7392f93bc788cb4326e11585d789e1e2e9ca4c
1 // PR c++/85118
2 // { dg-do compile { target c++14 } }
4 namespace std
6   template<typename _Tp>
7     struct remove_const
8     { typedef _Tp type; };
10   template<typename _Tp>
11     struct remove_const<_Tp const>
12     { typedef _Tp type; };
15   template<typename _Tp>
16     struct remove_volatile
17     { typedef _Tp type; };
19   template<typename _Tp>
20     struct remove_volatile<_Tp volatile>
21     { typedef _Tp type; };
24   template<typename _Tp>
25     struct remove_cv
26     {
27       typedef typename
28       remove_const<typename remove_volatile<_Tp>::type>::type type;
29     };
31   template<typename _Tp>
32     struct remove_reference
33     { typedef _Tp type; };
35   template<typename _Tp>
36     struct remove_reference<_Tp&>
37     { typedef _Tp type; };
39   template<typename _Tp>
40     struct remove_reference<_Tp&&>
41     { typedef _Tp type; };
43   template<typename _Tp>
44     struct decay
45     {
46       using type = typename remove_reference<typename remove_const<_Tp>::type>::type;
47     };
49   template<typename _Tp>
50     _Tp&&
51     declval() noexcept;
53   template<typename _Tp>
54     constexpr _Tp&&
55     forward(typename std::remove_reference<_Tp>::type& __t) noexcept
56     { return static_cast<_Tp&&>(__t); }
59   template<typename _Arg>
60     struct _Mu
61     {
62       template<typename _CVArg, typename _Tuple>
63          _CVArg&&
64          operator()(_CVArg&& __arg, _Tuple&) const volatile
65          { return std::forward<_CVArg>(__arg); }
66     };
68    template<typename _Functor, typename _Bound_args>
69     struct _Bind
70     {
71       _Functor _M_f;
72       _Bound_args _M_bound_args;
74       template<typename _Args, typename _Result
75          = decltype( std::declval<_Functor&>()(
76                _Mu<_Bound_args>()( std::declval<_Bound_args&>(),
77               std::declval<_Args&>() ) ) )>
78          _Result
79       operator()(_Args&& __args) { return {}; }
81       template<typename _Args, typename _Result
82          = decltype( std::declval<volatile _Functor&>()(
83                _Mu<_Bound_args>()( std::declval<volatile _Bound_args&>(),
84               std::declval<_Args&>() ) ) )>
85          _Result
86          operator()(_Args&& __args) volatile;
88     };
90   template<typename _Func, typename _BoundArgs>
91     _Bind<typename decay<_Func>::type, typename decay<_BoundArgs>::type>
92     bind(_Func&& __f, _BoundArgs&& __args)
93     {
94       return {
95         std::forward<_Func>(__f),
96           std::forward<_BoundArgs>(__args)
97       };
98     }
100 } // namespace std
103 template <typename T>
104 bool isOneOf(const T& )
106     return false;
109 template <typename T, typename FirstType, typename... Tail>
110 bool isOneOf(const T& t, const FirstType& firstValue, const Tail&... tail)
112     return t == firstValue || isOneOf(t, tail...);
115 int main()
117     const auto isOneOfHelper = [](auto&&... params)
118     {
119       return isOneOf(std::forward<decltype(params)>(params)...);
120     };
122     auto isO = std::bind(isOneOfHelper, 'o');
124     isO('o');