consider the following (also on https://gcc.godbolt.org/z/6ikNyq):

struct S; // (1)

struct U {
    S* sp_;
    U(S* sp) : sp_{sp} {}
    auto p() -> int;
};

struct B {
    int i_ = 42;
    auto p(int a) -> int { return a + i_; }
};

struct S : B { // (2)  Type S is completed here ... legal to introduce B as base?
    auto p() -> int { return B::p(3); }
};

auto U::p() -> int { return sp_->p(); }

int main() {
S s{};
U u{&s};
return u.p();
}

Is this legal? Reading the standard I do not find anything that either forbids it, but neither do I find anything that allows it.
All compilers that I tried are fine with it, but does anyone know whether this is intentional?