Created attachment 419934 [details] This is the source that was being compiled. I am very hesitant to report this bug, but the compiler asked me to... Which was interesting. This is the compiler output. allenh1@tuxbox ~ $ make g++ --std=c++17 -g lambda.cpp -o LambdaExample lambda.cpp: In lambda function: lambda.cpp:24:33: internal compiler error: in create_tmp_var, at gimple-expr.c:519 return [=] { printer(ts ...); }; ^ Please submit a full bug report, with preprocessed source if appropriate. See <https://bugs.gentoo.org/> for instructions. Makefile:19: recipe for target 'LambdaExample' failed make: *** [LambdaExample] Error 1
For some reason, a standard string cannot be placed in the labmda expression the way I attempted here. If you change it to a string literal, the source compiles and executes as intended.
Fails for me too with almost trunk gcc-5.3.0. Please do report it upstream. I am trying to reduce it.
Here is what creduce did: namespace std { inline namespace __cxx11 {} template <typename> class allocator; namespace __cxx11 { template <typename _CharT, typename = _CharT, typename = allocator<_CharT>> class basic_string; typedef basic_string<char> string; } template <typename> class allocator { public: template <typename> struct rebind { typedef allocator other; }; }; template <typename _Alloc, typename _Tp> struct __alloctr_rebind { typedef typename _Alloc::template rebind<_Tp>::other __type; }; template <typename _Alloc> struct allocator_traits { typedef decltype(0) pointer; template <typename _Tp> using rebind_alloc = typename __alloctr_rebind<_Alloc, _Tp>::__type; }; } namespace __gnu_cxx { template <typename _Alloc> struct __alloc_traits : std::allocator_traits<_Alloc> { typedef std::allocator_traits<_Alloc> _Base_type; template <typename _Tp> struct rebind { typedef typename _Base_type::template rebind_alloc<_Tp> other; }; }; } namespace std { namespace __cxx11 { template <typename _CharT, typename, typename _Alloc> class basic_string { typedef typename __gnu_cxx::__alloc_traits<_Alloc>::template rebind<_CharT>::other _Char_alloc_type; typedef __gnu_cxx::__alloc_traits<_Char_alloc_type> _Alloc_traits; public: typedef _Char_alloc_type allocator_type; typedef typename _Alloc_traits::pointer pointer; struct _Alloc_hider { _Alloc_hider(pointer, _Alloc); } _M_dataplus; pointer _M_local_data(); allocator_type _M_get_allocator(); basic_string(const basic_string &) : _M_dataplus(_M_local_data(), _M_get_allocator()) {} basic_string(_CharT *, _Alloc __a = _Alloc()) : _M_dataplus(_M_local_data(), __a) {} }; } } auto vglambda = [](auto printer) { return [=](auto &&... ts) { return [=] { printer(ts...); }; }; }; main() { vglambda([](auto, auto, auto) {})(std::string(""), "", ""); }
Interesting... This is the first bug I've reported, so... Can you make precise what you mean by "upstream it." I can open it with GCC, if that's what you mean.
Tomáš found an existing GCC bug report and linked it to this your report and I added your finding to it.
As requested by Jakub Jelinek I opened a standalone PR69001 for you. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69001.
Upstream bug: Jakub Jelinek 2017-01-10 10:31:16 UTC Fixed with r242766 and r243407 for 6.x.
Fixed in 6.4 and future 5.5
Fixed upstream in 6.x