annotate gcc/testsuite/g++.dg/cpp1y/pr69066.C @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 // PR c++/69066
kono
parents:
diff changeset
2 // { dg-do compile { target c++14 } }
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 template <typename T> T&& declval();
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 template<typename T, T v>
kono
parents:
diff changeset
7 struct integral_constant
kono
parents:
diff changeset
8 {
kono
parents:
diff changeset
9 static constexpr T value = v;
kono
parents:
diff changeset
10 typedef T value_type;
kono
parents:
diff changeset
11 typedef integral_constant<T, v> type;
kono
parents:
diff changeset
12 constexpr operator value_type() const { return value; }
kono
parents:
diff changeset
13 };
kono
parents:
diff changeset
14
kono
parents:
diff changeset
15 typedef integral_constant<bool, true> true_type;
kono
parents:
diff changeset
16 typedef integral_constant<bool, false> false_type;
kono
parents:
diff changeset
17
kono
parents:
diff changeset
18 template <typename...>
kono
parents:
diff changeset
19 using void_t = void;
kono
parents:
diff changeset
20
kono
parents:
diff changeset
21 template <typename, typename = void>
kono
parents:
diff changeset
22 class is_zero_callable : public false_type
kono
parents:
diff changeset
23 {
kono
parents:
diff changeset
24 };
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 template <typename T>
kono
parents:
diff changeset
27 class is_zero_callable<T, void_t<decltype(declval<T>()())>>
kono
parents:
diff changeset
28 : public true_type
kono
parents:
diff changeset
29 {
kono
parents:
diff changeset
30 };
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 template <typename TF, bool TLastStep>
kono
parents:
diff changeset
33 struct curry_impl
kono
parents:
diff changeset
34 {
kono
parents:
diff changeset
35 static auto exec(TF f)
kono
parents:
diff changeset
36 {
kono
parents:
diff changeset
37 // Bind `x` to subsequent calls.
kono
parents:
diff changeset
38 return [=](auto x)
kono
parents:
diff changeset
39 {
kono
parents:
diff changeset
40 auto bound_f = [=](auto... xs) -> decltype(f(x, xs...))
kono
parents:
diff changeset
41 {
kono
parents:
diff changeset
42 return f(x, xs...);
kono
parents:
diff changeset
43 };
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 // Recursive step.
kono
parents:
diff changeset
46 return curry_impl<decltype(bound_f),
kono
parents:
diff changeset
47 is_zero_callable<decltype(bound_f)>{}>::exec(bound_f);
kono
parents:
diff changeset
48 };
kono
parents:
diff changeset
49 }
kono
parents:
diff changeset
50 };
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 template <typename TF>
kono
parents:
diff changeset
53 struct curry_impl<TF, true>
kono
parents:
diff changeset
54 {
kono
parents:
diff changeset
55 static auto exec(TF f)
kono
parents:
diff changeset
56 {
kono
parents:
diff changeset
57 return f();
kono
parents:
diff changeset
58 }
kono
parents:
diff changeset
59 };
kono
parents:
diff changeset
60
kono
parents:
diff changeset
61 template <typename TF>
kono
parents:
diff changeset
62 auto curry(TF f)
kono
parents:
diff changeset
63 {
kono
parents:
diff changeset
64 return curry_impl<TF, is_zero_callable<decltype(f)>{}>::exec(f);
kono
parents:
diff changeset
65 }
kono
parents:
diff changeset
66
kono
parents:
diff changeset
67 int main()
kono
parents:
diff changeset
68 {
kono
parents:
diff changeset
69 auto sum = [](int x, int y)
kono
parents:
diff changeset
70 {
kono
parents:
diff changeset
71 return x + y;
kono
parents:
diff changeset
72 };
kono
parents:
diff changeset
73
kono
parents:
diff changeset
74 (void)curry(sum)(1)(1);
kono
parents:
diff changeset
75 }