1 // PR c++/85149
2 // { dg-do run { target c++17 } }
3 
4 template <typename T> struct is_void { static constexpr bool value = false; };
5 template <> struct is_void<void> { static constexpr bool value = true; };
6 
7 template<typename S, typename T>
8 constexpr decltype(auto) pipeline(S source, T target)
9 {
10   return [=](auto... args)
11     {
12       if constexpr(false
13 		   && is_void<decltype(source(args...))>::value)
14 	{
15 	  source(args...);
16 	  return target();
17 	}
18       else
19 	{
20 	  return target(source(args...));
21         }
22     };
23 }
24 
25 int main() {
26   int i = 10;
27   int j = 42;
28   auto p = pipeline([&]{ return j; },
29 		    [=](int val){ return val * i; });
30   if (p() != 420)
31     __builtin_abort();
32 }
33