{
if (DECL_FUNCTION_MEMBER_P (supplicant))
context = DECL_CONTEXT (supplicant);
+ else if (tree fc = DECL_FRIEND_CONTEXT (supplicant))
+ context = fc;
else
context = NULL_TREE;
}
&& friend_accessible_p (DECL_CONTEXT (scope), decl, type, otype))
return 1;
/* Perhaps SCOPE is a friend function defined inside a class from which
- DECL is accessible. Checking this is necessary only when the class
- is dependent, for otherwise add_friend will already have added the
- class to SCOPE's DECL_BEFRIENDING_CLASSES. */
+ DECL is accessible. */
if (tree fctx = DECL_FRIEND_CONTEXT (scope))
- if (dependent_type_p (fctx)
- && protected_accessible_p (decl, fctx, type, otype))
+ if (friend_accessible_p (fctx, decl, type, otype))
return 1;
}
--- /dev/null
+template <class Derived>
+struct base {
+ friend void bar(Derived& d) {
+ d.bar(); // access in inline friend of friend, ok?
+ }
+};
+
+class derived : base<derived> {
+ friend class base<derived>;
+ void bar() {}
+};
+
+int main() {
+ derived d;
+ bar(d);
+}
+
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" }
+ i.range_.end_reached_;
+ i.range_.EnumeratorRange::end_reached_;
+ &i.range_.end_reached_;
+ &i.range_.EnumeratorRange::end_reached_;
}
};
struct A {
friend void g(A) {
- B::f(); // { dg-error "private" }
- B::g(); // { dg-error "protected" }
+ B::f();
+ B::g();
}
};