Hi,
in this regression, an ICE is triggered in tsubst_decl, [case
FUNCTION_DECL] at:
/* Nobody should be tsubst'ing into non-template functions. */
gcc_assert (DECL_TEMPLATE_INFO (t) != NULL_TREE);
indeed, 't' is just the 'main' function. A simple way to avoid it is
tweaking the code recently changed in tsubst_copy, [case FUNCTION_DECL]
which calls tsubt_decl via tsusbt, to the effect of not calling the
latter at all when DECL_CONTEXT (t) isn't a template.
Tested x86_64-linux.
Thanks,
Paolo.
/////////////////
/cp
2015-09-08 Paolo Carlini <paolo.carl...@oracle.com>
PR c++/67369
* pt.c (tsubst_copy, [case FUNCTION_DECL]): Do not call tsubst
if the first argument isn't a template.
/testsuite
2015-09-08 Paolo Carlini <paolo.carl...@oracle.com>
PR c++/67369
* g++.dg/cpp1y/lambda-generic-ice4.C: New.
Index: cp/pt.c
===================================================================
--- cp/pt.c (revision 227528)
+++ cp/pt.c (working copy)
@@ -13599,8 +13599,9 @@ tsubst_copy (tree t, tree args, tsubst_flags_t com
if (r)
{
/* Make sure that the one we found is the one we want. */
- tree ctx = tsubst (DECL_CONTEXT (t), args,
- complain, in_decl);
+ tree ctx = DECL_CONTEXT (t);
+ if (DECL_LANG_SPECIFIC (ctx) && DECL_TEMPLATE_INFO (ctx))
+ ctx = tsubst (ctx, args, complain, in_decl);
if (ctx != DECL_CONTEXT (r))
r = NULL_TREE;
}
Index: testsuite/g++.dg/cpp1y/lambda-generic-ice4.C
===================================================================
--- testsuite/g++.dg/cpp1y/lambda-generic-ice4.C (revision 0)
+++ testsuite/g++.dg/cpp1y/lambda-generic-ice4.C (working copy)
@@ -0,0 +1,10 @@
+// PR c++/67369
+// { dg-do compile { target c++14 } }
+
+int main() {
+ unsigned const nsz = 0;
+ auto repeat_conditional = [&](auto) {
+ auto new_sz = nsz;
+ };
+ repeat_conditional(1);
+}