{
/* Look up the member. */
access_failure_info afi;
+ if (processing_template_decl)
+ /* Even though this class member access expression is at this
+ point not dependent, the member itself may be dependent, and
+ we must not potentially push a access check for a dependent
+ member onto TI_DEFERRED_ACCESS_CHECKS. So don't check access
+ ahead of time here; we're going to redo this member lookup at
+ instantiation time anyway. */
+ push_deferring_access_checks (dk_no_check);
member = lookup_member (access_path, name, /*protect=*/1,
/*want_type=*/false, complain,
&afi);
+ if (processing_template_decl)
+ pop_deferring_access_checks ();
afi.maybe_suggest_accessor (TYPE_READONLY (object_type));
if (member == NULL_TREE)
{
--- /dev/null
+// PR c++/100502
+
+template <class T>
+struct EnumeratorRange {
+ struct Iterator {
+ EnumeratorRange range_;
+
+ friend void f(Iterator i) {
+ i.range_.end_reached_; // { dg-error "private" }
+ i.range_.EnumeratorRange::end_reached_; // { dg-error "private" }
+ &i.range_.end_reached_; // { dg-error "private" }
+ &i.range_.EnumeratorRange::end_reached_; // { dg-error "private" }
+ }
+ };
+
+ private:
+ bool end_reached_;
+#if DECLARE_FRIEND
+ friend void f(Iterator);
+#endif
+};
+
+int main() {
+ EnumeratorRange<int>::Iterator i;
+ f(i);
+}
--- /dev/null
+// PR c++/100502
+// { dg-additional-options "-DDECLARE_FRIEND -Wno-non-template-friend" }
+
+// Verify that access37.C is accepted if the appropriate friend relation
+// is declared (controlled by the macro DECLARE_FRIEND).
+#include "access37.C"