https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100918
--- Comment #3 from CVS Commits <cvs-commit at gcc dot gnu.org> --- The releases/gcc-11 branch has been updated by Patrick Palka <ppa...@gcc.gnu.org>: https://gcc.gnu.org/g:6530cf0d50ae4c23c8e1ba908d1d0d4472e2966c commit r11-8727-g6530cf0d50ae4c23c8e1ba908d1d0d4472e2966c 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. (cherry picked from commit 6cb35b606c39d5f21f3298c77bfbcaaef3fbc872)