[Bug c++/100918] [9/10/11/12 Regression] Naming a destructor as a qualified template-id results in bogus access error

cvs-commit at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Mon Jun 7 16:06:38 GMT 2021


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 <ppalka@gcc.gnu.org>:

https://gcc.gnu.org/g:6cb35b606c39d5f21f3298c77bfbcaaef3fbc872

commit r12-1263-g6cb35b606c39d5f21f3298c77bfbcaaef3fbc872
Author: Patrick Palka <ppalka@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.


More information about the Gcc-bugs mailing list