This is a very serious regression because it affects Boost.Hana directly. template < int ... I > struct A{}; template < typename T > void f(){ [](auto ... i){ return A< decltype(i){} ... >{}; }; } int main(){ f< int >(); } $ g++ -std=c++14 main.cpp main.cpp: In instantiation of 'void f() [with T = int]': main.cpp:12:14: required from here main.cpp:7:39: internal compiler error: in strip_typedefs_expr, at cp/tree.c:1690 return A< decltype(i){} ... >{}; ^ 0x63696d strip_typedefs_expr(tree_node*, bool*) ../../gcc/gcc/cp/tree.c:1690 0x997709 strip_typedefs_expr(tree_node*, bool*) ../../gcc/gcc/cp/tree.c:1795 0x90f33c canonicalize_expr_argument ../../gcc/gcc/cp/pt.c:7489 0x9477db canonicalize_expr_argument ../../gcc/gcc/cp/pt.c:7486 0x9477db convert_template_argument ../../gcc/gcc/cp/pt.c:7823 0x945ada coerce_template_parameter_pack ../../gcc/gcc/cp/pt.c:7971 0x945ada coerce_template_parms ../../gcc/gcc/cp/pt.c:8191 0x93f2b6 lookup_template_class_1 ../../gcc/gcc/cp/pt.c:8818 0x93f2b6 lookup_template_class(tree_node*, tree_node*, tree_node*, tree_node*, int, int) ../../gcc/gcc/cp/pt.c:9167 0x940d5a tsubst_aggr_type ../../gcc/gcc/cp/pt.c:12073 0x93b27e tsubst(tree_node*, tree_node*, int, tree_node*) ../../gcc/gcc/cp/pt.c:13706 0x926e14 tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool, bool) ../../gcc/gcc/cp/pt.c:18153 0x934e49 tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool, bool) ../../gcc/gcc/cp/pt.c:17100 0x934e49 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/gcc/cp/pt.c:16838 0x932ea0 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/gcc/cp/pt.c:16055 0x931f61 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/gcc/cp/pt.c:16322 0x931f61 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/gcc/cp/pt.c:16322 0x925b9b tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/gcc/cp/pt.c:16030 0x925b9b tsubst_lambda_expr(tree_node*, tree_node*, int, tree_node*) ../../gcc/gcc/cp/pt.c:17056 0x927498 tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool, bool) ../../gcc/gcc/cp/pt.c:18346 Please submit a full bug report, with preprocessed source if appropriate. Please include the complete backtrace with any bug report. See <https://gcc.gnu.org/bugs/> for instructions. $ g++ --version g++ (GCC) 8.0.1 20180202 (experimental) Copyright (C) 2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Known to work with GCC 6.3 and 5.4: $ g++-6 --version g++-6 (Ubuntu/Linaro 6.3.0-18ubuntu2~16.04) 6.3.0 20170519 Copyright (C) 2016 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. $ g++-5 --version g++-5 (Ubuntu 5.4.1-2ubuntu1~16.04) 5.4.1 20160904 Copyright (C) 2015 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Same with: template < int ... I > struct A{}; template < typename T > void f(){ [](auto ... i){ return A< decltype(i)::x ... >{}; }; } int main(){ f< int >(); } $ g++ -std=c++14 main2.cpp main2.cpp: In instantiation of 'void f() [with T = int]': main2.cpp:12:14: required from here main2.cpp:7:40: internal compiler error: in strip_typedefs_expr, at cp/tree.c:1690 return A< decltype(i)::x ... >{}; ^ 0x63696d strip_typedefs_expr(tree_node*, bool*) ../../gcc/gcc/cp/tree.c:1690 0x997709 strip_typedefs_expr(tree_node*, bool*) ../../gcc/gcc/cp/tree.c:1795 0x90f33c canonicalize_expr_argument ../../gcc/gcc/cp/pt.c:7489 0x9477db canonicalize_expr_argument ../../gcc/gcc/cp/pt.c:7486 0x9477db convert_template_argument ../../gcc/gcc/cp/pt.c:7823 0x945ada coerce_template_parameter_pack ../../gcc/gcc/cp/pt.c:7971 0x945ada coerce_template_parms ../../gcc/gcc/cp/pt.c:8191 0x93f2b6 lookup_template_class_1 ../../gcc/gcc/cp/pt.c:8818 0x93f2b6 lookup_template_class(tree_node*, tree_node*, tree_node*, tree_node*, int, int) ../../gcc/gcc/cp/pt.c:9167 0x940d5a tsubst_aggr_type ../../gcc/gcc/cp/pt.c:12073 0x93b27e tsubst(tree_node*, tree_node*, int, tree_node*) ../../gcc/gcc/cp/pt.c:13706 0x926e14 tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool, bool) ../../gcc/gcc/cp/pt.c:18153 0x934e49 tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool, bool) ../../gcc/gcc/cp/pt.c:17100 0x934e49 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/gcc/cp/pt.c:16838 0x932ea0 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/gcc/cp/pt.c:16055 0x931f61 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/gcc/cp/pt.c:16322 0x931f61 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/gcc/cp/pt.c:16322 0x925b9b tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/gcc/cp/pt.c:16030 0x925b9b tsubst_lambda_expr(tree_node*, tree_node*, int, tree_node*) ../../gcc/gcc/cp/pt.c:17056 0x927498 tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool, bool) ../../gcc/gcc/cp/pt.c:18346 Please submit a full bug report, with preprocessed source if appropriate. Please include the complete backtrace with any bug report. See <https://gcc.gnu.org/bugs/> for instructions.
Author: jason Date: Fri Feb 2 16:42:46 2018 New Revision: 257339 URL: https://gcc.gnu.org/viewcvs?rev=257339&root=gcc&view=rev Log: PR c++/84181 - ICE with lambda parm in template argument. * tree.c (strip_typedefs_expr): Use cp_tree_operand_length. Added: trunk/gcc/testsuite/g++.dg/cpp1y/lambda-generic-targ1.C Modified: trunk/gcc/cp/ChangeLog trunk/gcc/cp/tree.c
Fixed.
Thanks for your fast patching! I found another variant of this bug if you use a variable template instead of a function: template < int ... I > struct A{}; template < typename T > auto var = [](auto ... i){ return A< decltype(i)::x ... >{}; }; int main(){ var< int >(); } $ g++ -std=c++14 main3.cpp main3.cpp: In instantiation of '<lambda(auto:1 ...)> [with auto:1 = {}]': main3.cpp:10:16: required from here main3.cpp:6:40: internal compiler error: Segmentation fault return A< decltype(i)::x ... >{}; ^ 0xe79ecf crash_signal ../../gcc/gcc/toplev.c:325 0x916d50 contains_struct_check(tree_node*, tree_node_structure_enum, char const*, int, char const*) ../../gcc/gcc/tree.h:3245 0x916d50 enclosing_instantiation_of ../../gcc/gcc/cp/pt.c:12694 0x942a7e tsubst_pack_expansion(tree_node*, tree_node*, int, tree_node*) ../../gcc/gcc/cp/pt.c:11450 0x94452a tsubst_template_args ../../gcc/gcc/cp/pt.c:11836 0x944438 tsubst_template_args ../../gcc/gcc/cp/pt.c:11854 0x940d15 tsubst_aggr_type ../../gcc/gcc/cp/pt.c:12067 0x93b25e tsubst(tree_node*, tree_node*, int, tree_node*) ../../gcc/gcc/cp/pt.c:13706 0x926df4 tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool, bool) ../../gcc/gcc/cp/pt.c:18153 0x934e29 tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool, bool) ../../gcc/gcc/cp/pt.c:17100 0x934e29 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/gcc/cp/pt.c:16838 0x932e80 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/gcc/cp/pt.c:16055 0x931f41 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/gcc/cp/pt.c:16322 0x931f41 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/gcc/cp/pt.c:16322 0x931f41 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/gcc/cp/pt.c:16322 0x9311d8 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/gcc/cp/pt.c:16030 0x9311d8 instantiate_decl(tree_node*, bool, bool) ../../gcc/gcc/cp/pt.c:23384 0x87aeeb maybe_instantiate_decl ../../gcc/gcc/cp/decl2.c:5178 0x87ccf8 mark_used(tree_node*, int) ../../gcc/gcc/cp/decl2.c:5273 0x7e7c90 build_over_call ../../gcc/gcc/cp/call.c:8201 Please submit a full bug report, with preprocessed source if appropriate. Please include the complete backtrace with any bug report. See <https://gcc.gnu.org/bugs/> for instructions.
I'm not completely sure anymore whether this is related, another version of the new bug is: template < typename ... T > void sink(T ...){} template < typename T > auto var = [](auto ... i){ sink(i + 0 ...); }(); int main(){ var< int >; } $ g++ -std=c++14 main3.cpp main3.cpp: In instantiation of '<lambda(auto:1 ...)> [with auto:1 = {}]': main3.cpp:5:46: required from 'auto var<int>' main3.cpp:8:5: required from here main3.cpp:5:32: internal compiler error: Segmentation fault auto var = [](auto ... i){ sink(i + 0 ...); }(); ~~~~^~~~~~~~~~~ 0xe79ecf crash_signal ../../gcc/gcc/toplev.c:325 0x916d50 contains_struct_check(tree_node*, tree_node_structure_enum, char const*, int, char const*) ../../gcc/gcc/tree.h:3245 0x916d50 enclosing_instantiation_of ../../gcc/gcc/cp/pt.c:12694 0x942a7e tsubst_pack_expansion(tree_node*, tree_node*, int, tree_node*) ../../gcc/gcc/cp/pt.c:11450 0x927dcd tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool, bool) ../../gcc/gcc/cp/pt.c:17684 0x934e29 tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool, bool) ../../gcc/gcc/cp/pt.c:17100 0x934e29 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/gcc/cp/pt.c:16838 0x933950 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/gcc/cp/pt.c:16059 0x931f41 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/gcc/cp/pt.c:16322 0x931f41 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/gcc/cp/pt.c:16322 0x931f41 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/gcc/cp/pt.c:16322 0x9311d8 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/gcc/cp/pt.c:16030 0x9311d8 instantiate_decl(tree_node*, bool, bool) ../../gcc/gcc/cp/pt.c:23384 0x87aeeb maybe_instantiate_decl ../../gcc/gcc/cp/decl2.c:5178 0x87ccf8 mark_used(tree_node*, int) ../../gcc/gcc/cp/decl2.c:5273 0x7e7c90 build_over_call ../../gcc/gcc/cp/call.c:8201 0x7f5f1c build_op_call_1 ../../gcc/gcc/cp/call.c:4567 0x7f5f1c build_op_call(tree_node*, vec<tree_node*, va_gc, vl_embed>**, int) ../../gcc/gcc/cp/call.c:4596 0x970075 finish_call_expr(tree_node*, vec<tree_node*, va_gc, vl_embed>**, bool, bool, int) ../../gcc/gcc/cp/semantics.c:2506 0x92849e tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool, bool) ../../gcc/gcc/cp/pt.c:17874 Please submit a full bug report, with preprocessed source if appropriate. Please include the complete backtrace with any bug report. See <https://gcc.gnu.org/bugs/> for instructions.
Yet another version: template < typename T > auto var = [](auto ... i){ [i ...]{}; }(); int main(){ var< int >; } $ g++ -std=c++14 main4.cpp main4.cpp: In instantiation of '<lambda(auto:1 ...)> [with auto:1 = {}]': main4.cpp:2:40: required from 'auto var<int>' main4.cpp:5:5: required from here main4.cpp:2:31: internal compiler error: Segmentation fault auto var = [](auto ... i){ [i ...]{}; }(); ^~~ 0xe79ecf crash_signal ../../gcc/gcc/toplev.c:325 0x916d50 contains_struct_check(tree_node*, tree_node_structure_enum, char const*, int, char const*) ../../gcc/gcc/tree.h:3245 0x916d50 enclosing_instantiation_of ../../gcc/gcc/cp/pt.c:12694 0x942a7e tsubst_pack_expansion(tree_node*, tree_node*, int, tree_node*) ../../gcc/gcc/cp/pt.c:11450 0x941bc8 tsubst_decl ../../gcc/gcc/cp/pt.c:12858 0x92571d tsubst_lambda_expr(tree_node*, tree_node*, int, tree_node*) ../../gcc/gcc/cp/pt.c:16970 0x927478 tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool, bool) ../../gcc/gcc/cp/pt.c:18346 0x934e29 tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool, bool) ../../gcc/gcc/cp/pt.c:17100 0x934e29 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/gcc/cp/pt.c:16838 0x933950 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/gcc/cp/pt.c:16059 0x932751 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/gcc/cp/pt.c:16045 0x931f41 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/gcc/cp/pt.c:16322 0x931f41 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/gcc/cp/pt.c:16322 0x931f41 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/gcc/cp/pt.c:16322 0x9311d8 tsubst_expr(tree_node*, tree_node*, int, tree_node*, bool) ../../gcc/gcc/cp/pt.c:16030 0x9311d8 instantiate_decl(tree_node*, bool, bool) ../../gcc/gcc/cp/pt.c:23384 0x87aeeb maybe_instantiate_decl ../../gcc/gcc/cp/decl2.c:5178 0x87ccf8 mark_used(tree_node*, int) ../../gcc/gcc/cp/decl2.c:5273 0x7e7c90 build_over_call ../../gcc/gcc/cp/call.c:8201 0x7f5f1c build_op_call_1 ../../gcc/gcc/cp/call.c:4567 Please submit a full bug report, with preprocessed source if appropriate. Please include the complete backtrace with any bug report. See <https://gcc.gnu.org/bugs/> for instructions. $ g++ --version g++ (GCC) 8.0.1 20180202 (experimental) Copyright (C) 2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Author: jason Date: Wed Feb 7 16:02:50 2018 New Revision: 257454 URL: https://gcc.gnu.org/viewcvs?rev=257454&root=gcc&view=rev Log: PR c++/84182 - ICE with captured lambda PR c++/84181 * pt.c (extract_locals_r, extract_local_specs): New. (tsubst_pack_expansion): Use them. Added: trunk/gcc/testsuite/g++.dg/cpp1y/lambda-generic-targ2.C trunk/gcc/testsuite/g++.dg/cpp1y/lambda-generic-variadic10.C Modified: trunk/gcc/cp/ChangeLog trunk/gcc/cp/pt.c
Additional testcases now fixed as well.