Commit 47cd5a85 by Paolo Carlini Committed by Paolo Carlini

re PR c++/69066 (SFINAE compilation error on lambda with trailing return type)

2016-04-10  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/69066
	* g++.dg/cpp1y/pr69066.C: New.

From-SVN: r234869
parent c27e432e
2016-04-10 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/69066
* g++.dg/cpp1y/pr69066.C: New.
2016-04-09 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/68566
......
// PR c++/69066
// { dg-do compile { target c++14 } }
template <typename T> T&& declval();
template<typename T, T v>
struct integral_constant
{
static constexpr T value = v;
typedef T value_type;
typedef integral_constant<T, v> type;
constexpr operator value_type() const { return value; }
};
typedef integral_constant<bool, true> true_type;
typedef integral_constant<bool, false> false_type;
template <typename...>
using void_t = void;
template <typename, typename = void>
class is_zero_callable : public false_type
{
};
template <typename T>
class is_zero_callable<T, void_t<decltype(declval<T>()())>>
: public true_type
{
};
template <typename TF, bool TLastStep>
struct curry_impl
{
static auto exec(TF f)
{
// Bind `x` to subsequent calls.
return [=](auto x)
{
auto bound_f = [=](auto... xs) -> decltype(f(x, xs...))
{
return f(x, xs...);
};
// Recursive step.
return curry_impl<decltype(bound_f),
is_zero_callable<decltype(bound_f)>{}>::exec(bound_f);
};
}
};
template <typename TF>
struct curry_impl<TF, true>
{
static auto exec(TF f)
{
return f();
}
};
template <typename TF>
auto curry(TF f)
{
return curry_impl<TF, is_zero_callable<decltype(f)>{}>::exec(f);
}
int main()
{
auto sum = [](int x, int y)
{
return x + y;
};
(void)curry(sum)(1)(1);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment