https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91793

            Bug ID: 91793
           Summary: [8/9/trunk regression] ICE on unexpanded parameter
                    pack in lambda
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: cyp561 at gmail dot com
  Target Milestone: ---

<eric-wieser> Managed to produce a parameter pack expansion that works in clang
trunk but not GCC trunk today: https://godbolt.org/z/PkaZqQ. No bugzilla
account, so can't report it.
<eric-wieser> Also some deliberately incorrect expansion that causes GCC to
segfault: https://godbolt.org/z/rpi-qC


Might be related to Bug 84936.


#include <initializer_list>
#include <utility>
#include <tuple>

template<typename... Funcs>
void invoke_all_of(Funcs&&... f) {
    // initializer_list is special, and guarantees that the ... is expanded in
order.
    (void)std::initializer_list<bool>{(void(
        std::forward<Funcs>(f)()
    ), false)...};
}

int main() {
    std::apply([](auto... a) {
        invoke_all_of([&]{
            using A = decltype(a);
        }/*...*/);
    }, std::make_tuple(1));
}



<source>: In instantiation of 'main()::<lambda(auto:1 ...)> [with auto:1 =
{int}]':
/opt/compiler-explorer/gcc-trunk-20190917/include/c++/10.0.0/type_traits:2490:26:
  required by substitution of 'template<class _Fn, class ... _Args> static
std::__result_of_success<decltype (declval<_Fn>()((declval<_Args>)()...)),
std::__invoke_other> std::__result_of_other_impl::_S_test(int) [with _Fn =
main()::<lambda(auto:1 ...)>; _Args = {int}]'
/opt/compiler-explorer/gcc-trunk-20190917/include/c++/10.0.0/type_traits:2501:55:
  required from 'struct std::__result_of_impl<false, false,
main()::<lambda(auto:1 ...)>, int>'
/opt/compiler-explorer/gcc-trunk-20190917/include/c++/10.0.0/type_traits:138:12:
  recursively required by substitution of 'template<class _Result, class _Ret>
struct std::__is_invocable_impl<_Result, _Ret, true, std::__void_t<typename
_CTp::type> > [with _Result = std::__invoke_result<main()::<lambda(auto:1
...)>, int>; _Ret = void]'
/opt/compiler-explorer/gcc-trunk-20190917/include/c++/10.0.0/type_traits:138:12:
  required from 'struct
std::__and_<std::__is_invocable_impl<std::__invoke_result<main()::<lambda(auto:1
...)>, int>, void, true, void>,
std::__call_is_nothrow<std::__invoke_result<main()::<lambda(auto:1 ...)>, int>,
main()::<lambda(auto:1 ...)>, int> >'
/opt/compiler-explorer/gcc-trunk-20190917/include/c++/10.0.0/type_traits:2963:12:
  required from 'struct std::is_nothrow_invocable<main()::<lambda(auto:1 ...)>,
int>'
/opt/compiler-explorer/gcc-trunk-20190917/include/c++/10.0.0/tuple:1603:27:  
required from 'constexpr const bool std::__unpack_std_tuple<template<class _Fn,
class ... _ArgTypes> struct std::is_nothrow_invocable, main()::<lambda(auto:1
...)>, std::tuple<int> >'
/opt/compiler-explorer/gcc-trunk-20190917/include/c++/10.0.0/tuple:1631:14:  
required from 'constexpr decltype(auto) std::apply(_Fn&&, _Tuple&&) [with _Fn =
main()::<lambda(auto:1 ...)>; _Tuple = std::tuple<int>]'
<source>:18:26:   required from here
<source>:16:19: internal compiler error: Segmentation fault
   16 |             using A = decltype(a);
      |                   ^
Please submit a full bug report,
with preprocessed source if appropriate.
See <https://gcc.gnu.org/bugs/> for instructions.
Compiler returned: 1


Leaving out the "/*" and "*/" gives: (compiles in clang)
<source>: In lambda function:
<source>:17:10: error: expansion pattern '<lambda>' contains no parameter packs
   17 |         }...);
      |          ^~~
Compiler returned: 1

Reply via email to