Согласно стандарту C ++ 17 (14,3 друзей)
10 Дружба не наследуется и не является переходной
Таким образом, клан компилятора имеет ошибка.
Интересно отметить, что если определить функцию вне class B
подобно
class B
{
public:
friend void f(A* p);
};
void f(A* p) { p->m = 32; }
, то в этом случае компилятор clang HEAD 10.0.0 выдает ошибку
rog.cc:18:19: error: 'm' is a private member of 'A'
void f(A* p) { p->m = 32; }
^
prog.cc:9:7: note: implicitly declared private here
int m;
^
1 error generated.
Так что, без всяких сомнений, в компиляторе есть ошибка.