https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85569
Jonathan Wakely <redi at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Known to work| |7.3.0 Version|8.0.1 |8.1.0 Keywords| |rejects-valid Last reconfirmed| |2018-07-03 CC| |jason at gcc dot gnu.org Ever confirmed|0 |1 Summary|is_invocable(F, |[8/9 Regression] |decltype(objs)...) fails |is_invocable(F, |with "not supported by |decltype(objs)...) fails |dump_expr#" unless via |with "not supported by |indirection |dump_expr#" unless via | |indirection Known to fail| |8.1.0, 9.0 --- Comment #4 from Jonathan Wakely <redi at gcc dot gnu.org> --- Preprocessing it with GCC 7.3 and trying to compile it shows it started to be rejected with r251433 ("Reimplement handling of lambdas in templates") with this diagnostic: 85569-gcc7.cc: In instantiation of ‘compose(F&&, Fs&& ...) [with F = const equal(T&&) [with T = int]::<lambda(const auto:1&)>&; Fs = {std::plus<void>}]::<lambda(auto:2&& ...)> [with auto:2 = {int, int}; decltype (detail::compose(typename std::is_invocable<std::plus<void>, decltype (objs)...>::type{}, f, compose(forward<std::plus<void> >(fs#0)), (forward<decltype(compose::__lambda1::operator()::objs)>)(compose::__lambda1::operator()::objs)...)) = bool; decltype (objs) = int&&]’: 85569-gcc7.cc:90:23: required from here 85569-gcc7.cc:79:20: error: use ‘...’ to expand argument pack 85569-gcc7.cc:89:1: error: non-constant condition for static assertion 85569-gcc7.cc:90:23: in constexpr expansion of ‘compose<const equal(T&&) [with T = int]::<lambda(const auto:1&)>&, std::plus<void> >(eq<3>, std::plus<void>{}).compose(F&&, Fs&& ...) [with F = const equal(T&&) [with T = int]::<lambda(const auto:1&)>&; Fs = {std::plus<void>}]::<lambda(auto:2&& ...)>(1, 2)’ 85569-gcc7.cc:89:1: error: constexpr call flows off the end of the function Then the diagnostic regressed with r257018 ("PR c++/82249 - wrong mismatched pack length error"): 85569-gcc7.cc: In instantiation of ‘constexpr auto compose(F&&, Fs&& ...) [with F = const equal(T&&) [with T = int]::<lambda(const auto:1&)>&; Fs = {std::plus<void>}]’: 85569-gcc7.cc:90:22: required from here 85569-gcc7.cc:79:20: error: expansion pattern ‘decltype (#‘nontype_argument_pack’ not supported by dump_expr#<expression error>)’ contains no argument packs 85569-gcc7.cc:90:23: error: non-constant condition for static assertion 85569-gcc7.cc:90:23: error: call to non-‘constexpr’ function ‘compose(F&&, Fs&& ...) [with F = const equal(T&&) [with T = int]::<lambda(const auto:1&)>&; Fs = {std::plus<void>}]::<lambda(auto:2&& ...)> [with auto:2 = {int, int}; decltype (detail::compose(typename std::is_invocable<std::plus<void>, decltype (objs)...>::type{}, f, compose(forward<std::plus<void> >(fs#0)), (forward<decltype(compose::__lambda1::operator()::objs)>)(compose::__lambda1::operator()::objs)...)) = bool; decltype (objs) = int&&]’ 85569-gcc7.cc:68:8: note: ‘compose(F&&, Fs&& ...) [with F = const equal(T&&) [with T = int]::<lambda(const auto:1&)>&; Fs = {std::plus<void>}]::<lambda(auto:2&& ...)> [with auto:2 = {int, int}; decltype (detail::compose(typename std::is_invocable<std::plus<void>, decltype (objs)...>::type{}, f, compose(forward<std::plus<void> >(fs#0)), (forward<decltype(compose::__lambda1::operator()::objs)>)(compose::__lambda1::operator()::objs)...)) = bool; decltype (objs) = int&&]’ is not usable as a ‘constexpr’ function because: