@@ -1612,6 +1612,9 @@ mod prim_ref {}
1612
1612
/// pointers, make your type [`Option<fn()>`](core::option#options-and-pointers-nullable-pointers)
1613
1613
/// with your required signature.
1614
1614
///
1615
+ /// Note that FFI requires additional care to ensure that the ABI for both sides of the call match.
1616
+ /// The exact requirements are not currently documented.
1617
+ ///
1615
1618
/// ### Safety
1616
1619
///
1617
1620
/// Plain function pointers are obtained by casting either plain functions, or closures that don't
@@ -1750,8 +1753,13 @@ mod prim_ref {}
1750
1753
/// is also used rarely. So, most likely you do not have to worry about ABI compatibility.
1751
1754
///
1752
1755
/// But assuming such circumstances, what are the rules? For this section, we are only considering
1753
- /// the ABI of direct Rust-to-Rust calls, not linking in general -- once functions are imported via
1754
- /// `extern` blocks, there are more things to consider that we do not go into here.
1756
+ /// the ABI of direct Rust-to-Rust calls (with both definition and callsite visible to the
1757
+ /// Rust compiler), not linking in general -- once functions are imported via `extern` blocks, there
1758
+ /// are more things to consider that we do not go into here. Note that this also applies to
1759
+ /// passing/calling functions across language boundaries via function pointers.
1760
+ ///
1761
+ /// **Nothing in this section should be taken as a guarantee for non-Rust-to-Rust calls, even with
1762
+ /// types from `core::ffi` or `libc`**.
1755
1763
///
1756
1764
/// For two signatures to be considered *ABI-compatible*, they must use a compatible ABI string,
1757
1765
/// must take the same number of arguments, the individual argument types and the return types must
0 commit comments