From 13f7c5d504b5fe6c233f2e68acd10bd4fc9007ac Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Wed, 23 Sep 2020 07:01:10 -0700 Subject: [PATCH] c++: dependent local extern decl ICE [PR97171] I'd missed the piece of substutution for the uses of a local extern decl. Just grab the local specialization. We need to do this regardless of dependentness because we always cloned the local extern. PR c++/97171 gcc/cp/ * pt.c (tsubst_copy) [FUNCTION_DECL,VAR_DECL]: Retrieve local specialization for DECL_LOCAL_P decls. gcc/testsuite/ * g++.dg/template/local10.C: New. --- gcc/cp/pt.c | 8 ++++++++ gcc/testsuite/g++.dg/template/local10.C | 15 +++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 gcc/testsuite/g++.dg/template/local10.C diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 314bd038c6d..1ec039d0793 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -16531,6 +16531,14 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl) case FUNCTION_DECL: if (DECL_LANG_SPECIFIC (t) && DECL_TEMPLATE_INFO (t)) r = tsubst (t, args, complain, in_decl); + else if (DECL_LOCAL_DECL_P (t)) + { + /* Local specialization will have been created when we + instantiated the DECL_EXPR_DECL. */ + r = retrieve_local_specialization (t); + if (!r) + r = error_mark_node; + } else if (local_variable_p (t) && uses_template_parms (DECL_CONTEXT (t))) { diff --git a/gcc/testsuite/g++.dg/template/local10.C b/gcc/testsuite/g++.dg/template/local10.C new file mode 100644 index 00000000000..a2ffc1e7306 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/local10.C @@ -0,0 +1,15 @@ +// PR c++/97171 +// { dg-additional-options -flto } + +template +void transform(_UnaryOperation); + +template +void Apply () +{ + extern T Maker (void); // block-scope extern with dependent type + + transform (Maker); +} + +template void Apply ();