From: Patrick Palka Date: Sat, 5 Mar 2016 01:59:04 +0000 (+0000) Subject: Fix PR c++/66786 (ICE with nested lambdas in variable template) X-Git-Tag: basepoints/gcc-7~571 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7a3a3fadb050d9e49b18d052cfc20191acdf4126;p=thirdparty%2Fgcc.git Fix PR c++/66786 (ICE with nested lambdas in variable template) gcc/cp/ChangeLog: PR c++/66786 * pt.c (template_class_depth): Given a lambda type, iterate into its LAMBDA_TYPE_EXTRA_SCOPE field instead of its TYPE_CONTEXT. Given a VAR_DECL, iterate into its CP_DECL_CONTEXT. gcc/testsuite/ChangeLog: PR c++/66786 * g++.dg/cpp1y/var-templ48.C: New test. * g++.dg/cpp1y/var-templ49.C: New test. From-SVN: r233997 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index f4c8744eb60e..0ef1ac744add 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2016-03-05 Patrick Palka + + PR c++/66786 + * pt.c (template_class_depth): Given a lambda type, iterate + into its LAMBDA_TYPE_EXTRA_SCOPE field instead of its + TYPE_CONTEXT. Given a VAR_DECL, iterate into its + CP_DECL_CONTEXT. + 2016-03-04 Jason Merrill PR c++/69203 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index e8cd7367f563..f6dd75a89aad 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -370,16 +370,20 @@ template_class_depth (tree type) { int depth; - for (depth = 0; - type && TREE_CODE (type) != NAMESPACE_DECL; - type = (TREE_CODE (type) == FUNCTION_DECL) - ? CP_DECL_CONTEXT (type) : CP_TYPE_CONTEXT (type)) + for (depth = 0; type && TREE_CODE (type) != NAMESPACE_DECL; ) { tree tinfo = get_template_info (type); if (tinfo && PRIMARY_TEMPLATE_P (TI_TEMPLATE (tinfo)) && uses_template_parms (INNERMOST_TEMPLATE_ARGS (TI_ARGS (tinfo)))) ++depth; + + if (VAR_OR_FUNCTION_DECL_P (type)) + type = CP_DECL_CONTEXT (type); + else if (LAMBDA_TYPE_P (type)) + type = LAMBDA_TYPE_EXTRA_SCOPE (type); + else + type = CP_TYPE_CONTEXT (type); } return depth; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 03ee5293700d..ca65abf63389 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2016-03-05 Patrick Palka + + PR c++/66786 + * g++.dg/cpp1y/var-templ48.C: New test. + * g++.dg/cpp1y/var-templ49.C: New test. + 2016-03-04 Eric Botcazou * g++.dg/Wno-frame-address.C: Skip on IA-64. diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ48.C b/gcc/testsuite/g++.dg/cpp1y/var-templ48.C new file mode 100644 index 000000000000..f0c7693f03fd --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/var-templ48.C @@ -0,0 +1,5 @@ +// PR c++/66786 +// { dg-do compile { target c++14 } } + +template auto list = [](T... xs) { [=](auto f) { f(xs...); }; }; +int main() { list(0); } diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ49.C b/gcc/testsuite/g++.dg/cpp1y/var-templ49.C new file mode 100644 index 000000000000..7ac574420f42 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/var-templ49.C @@ -0,0 +1,9 @@ +// PR c++/66786 +// { dg-do compile { target c++14 } } + +int f (int, bool); + +template +auto list = [](auto... xs) { return [=](auto f, auto... ys) { return f(xs..., ys...); }; }; + +const int &a = list(0)(f, true);