[Bug c++/100502] [11/12 Regression] ICE in enforce_access at cp/semantics.c:368 since r11-6800-g29853c653245c37e

cvs-commit at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Fri May 28 14:21:41 GMT 2021


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100502

--- Comment #4 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-11 branch has been updated by Patrick Palka
<ppalka@gcc.gnu.org>:

https://gcc.gnu.org/g:365deb8399262033ac766b924c35d31db3d621ca

commit r11-8475-g365deb8399262033ac766b924c35d31db3d621ca
Author: Patrick Palka <ppalka@redhat.com>
Date:   Wed May 26 16:02:33 2021 -0400

    c++: access for hidden friend of nested class template [PR100502]

    Here, during ahead of time access checking for the private member
    EnumeratorRange<T>::end_reached_ in the hidden friend f, we're triggering
    the assert in enforce_access that verifies we're not trying to add a
    access check for a dependent decl onto TI_DEFERRED_ACCESS_CHECKS.

    The special thing about this class member access expression is that
    the overall expression is non-dependent (so finish_class_member_access_expr
    doesn't exit early at parse time), and then accessible_p rejects the
    access (so we don't exit early from enforce access either, and end up
    triggering the assert b/c the member itself is dependent).  I think
    we're correct to reject the access because a hidden friend is not a
    member function, so [class.access.nest] doesn't apply, and also a hidden
    friend of a nested class is not a friend of the enclosing class.

    To fix this ICE, this patch disables ahead of time access checking
    during the member lookup in finish_class_member_access_expr.  This
    avoids potentially pushing an access check for a dependent member onto
    TI_DEFERRED_ACCESS_CHECKS, and it's safe because we're going to redo the
    same lookup at instantiation time anyway.

            PR c++/100502

    gcc/cp/ChangeLog:

            * typeck.c (finish_class_member_access_expr): Disable ahead
            of time access checking during the member lookup.

    gcc/testsuite/ChangeLog:

            * g++.dg/template/access37.C: New test.
            * g++.dg/template/access37a.C: New test.

    (cherry picked from commit abe8787a8492013145b275b858f70943522d7226)


More information about the Gcc-bugs mailing list