https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100918
--- Comment #2 from CVS Commits <cvs-commit at gcc dot gnu.org> --- The master branch has been updated by Patrick Palka <ppa...@gcc.gnu.org>: https://gcc.gnu.org/g:6cb35b606c39d5f21f3298c77bfbcaaef3fbc872 commit r12-1263-g6cb35b606c39d5f21f3298c77bfbcaaef3fbc872 Author: Patrick Palka <ppa...@redhat.com> Date: Mon Jun 7 12:02:08 2021 -0400 c++: access of dtor named by qualified template-id [PR100918] Here, when resolving the destructor named by Inner<int>::~Inner<int> (which is valid until C++20) we end up in cp_parser_lookup_name called indirectly from cp_parser_template_id to look up the name Inner from the scope Inner<int>. The lookup naturally finds the injected-class-name, and because the flag is_template is true, we adjust this lookup result to the TEMPLATE_DECL Inner. We then check access of this adjusted lookup result. But this access check fails because the lookup scope is Inner<int> and the context_for_name_lookup for the TEMPLATE_DECL is Outer (whereas for the injected-class-name it's also Inner<int>). The simplest fix seems to be to check access of the original lookup result (the injected-class-name) instead of the adjusted result (the TEMPLATE_DECL). So this patch moves the access check in cp_parser_lookup_name to before the injected-class-name adjustment. PR c++/100918 gcc/cp/ChangeLog: * parser.c (cp_parser_lookup_name): Check access of the lookup result before we potentially adjust an injected-class-name to its TEMPLATE_DECL. gcc/testsuite/ChangeLog: * g++.dg/template/access38.C: New test.