This performs one of the optimizations added by the previous patch to lookup_template_class, to instantiate_template as well. (For the libstdc++ ranges tests this optimization appears to be effective around 30% of the time, i.e. 30% of the time context of 'tmpl' is non-dependent while the context of 'gen_tmpl' is dependent.)
gcc/cp/ChangeLog: * pt.cc (instantiate_template): Don't substitute the context of the most general template if that of the partially instantiated template is non-dependent. --- gcc/cp/pt.cc | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index e021c254872..208daad298a 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -21661,8 +21661,14 @@ instantiate_template (tree tmpl, tree orig_args, tsubst_flags_t complain) ++processing_template_decl; if (DECL_CLASS_SCOPE_P (gen_tmpl)) { - tree ctx = tsubst_aggr_type (DECL_CONTEXT (gen_tmpl), targ_ptr, - complain, gen_tmpl, true); + tree ctx; + if (!uses_template_parms (DECL_CONTEXT (tmpl))) + /* If the context of the partially instantiated template is already + non-dependent, then we might as well use it. */ + ctx = DECL_CONTEXT (tmpl); + else + ctx = tsubst_aggr_type (DECL_CONTEXT (gen_tmpl), targ_ptr, + complain, gen_tmpl, true); push_nested_class (ctx); } -- 2.36.1.363.g9c897eef06