diff options
author | Patrick Palka <ppalka@redhat.com> | 2021-05-26 16:02:33 -0400 |
---|---|---|
committer | Patrick Palka <ppalka@redhat.com> | 2021-05-26 16:02:33 -0400 |
commit | abe8787a8492013145b275b858f70943522d7226 (patch) | |
tree | 80d38eeb8404bab663d93960aff4c75be5711640 /gcc/fortran/trans-array.c | |
parent | a42220f0164eeb11b5e1ab87ce5b8f448141ba60 (diff) | |
download | gcc-abe8787a8492013145b275b858f70943522d7226.zip gcc-abe8787a8492013145b275b858f70943522d7226.tar.gz gcc-abe8787a8492013145b275b858f70943522d7226.tar.bz2 |
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.
Diffstat (limited to 'gcc/fortran/trans-array.c')
0 files changed, 0 insertions, 0 deletions