Great! thank you. This is what I was looking for 
So to sum up, it proves that extern fn (as well as fn and not all builtin primitive are bivariant) is a type aggregator (while “extern type” Foreign(DefId) is plain bivariant) because of
FnPtr(PolyFnSig<'tcx>)
type PolyFnSig<'tcx> = Binder<FnSig<'tcx>>
-
pub struct FnSig<'tcx> {
pub inputs_and_output: &'tcx List<Ty<'tcx>>,
pub variadic: bool,
pub unsafety: hir::Unsafety,
pub abi: abi::Abi,
}
so glb is applied internally and proves the variance by respecting variances of arguments and output types.
Btw, Foreign(DefId) is the only enum variant with no doc!