@@ -1916,10 +1916,6 @@ mod type_keyword {}
19161916/// - and to declare that a programmer has checked that these contracts have been upheld (`unsafe
19171917/// {}` and `unsafe impl`, but also `unsafe fn` -- see below).
19181918///
1919- /// They are not mutually exclusive, as can be seen in `unsafe fn`: the body of an `unsafe fn` is,
1920- /// by default, treated like an unsafe block. The `unsafe_op_in_unsafe_fn` lint can be enabled to
1921- /// change that.
1922- ///
19231919/// # Unsafe abilities
19241920///
19251921/// **No matter what, Safe Rust can't cause Undefined Behavior**. This is
@@ -1961,13 +1957,6 @@ mod type_keyword {}
19611957/// - `unsafe impl`: the contract necessary to implement the trait has been
19621958/// checked by the programmer and is guaranteed to be respected.
19631959///
1964- /// By default, `unsafe fn` also acts like an `unsafe {}` block
1965- /// around the code inside the function. This means it is not just a signal to
1966- /// the caller, but also promises that the preconditions for the operations
1967- /// inside the function are upheld. Mixing these two meanings can be confusing, so the
1968- /// `unsafe_op_in_unsafe_fn` lint can be enabled to warn against that and require explicit unsafe
1969- /// blocks even inside `unsafe fn`.
1970- ///
19711960/// See the [Rustonomicon] and the [Reference] for more information.
19721961///
19731962/// # Examples
@@ -2109,6 +2098,7 @@ mod type_keyword {}
21092098/// impl Indexable for i32 {
21102099/// const LEN: usize = 1;
21112100///
2101+ /// /// See `Indexable` for the safety contract.
21122102/// unsafe fn idx_unchecked(&self, idx: usize) -> i32 {
21132103/// debug_assert_eq!(idx, 0);
21142104/// *self
@@ -2120,6 +2110,7 @@ mod type_keyword {}
21202110/// impl Indexable for [i32; 42] {
21212111/// const LEN: usize = 42;
21222112///
2113+ /// /// See `Indexable` for the safety contract.
21232114/// unsafe fn idx_unchecked(&self, idx: usize) -> i32 {
21242115/// // SAFETY: As per this trait's documentation, the caller ensures
21252116/// // that `idx < 42`.
@@ -2132,6 +2123,7 @@ mod type_keyword {}
21322123/// impl Indexable for ! {
21332124/// const LEN: usize = 0;
21342125///
2126+ /// /// See `Indexable` for the safety contract.
21352127/// unsafe fn idx_unchecked(&self, idx: usize) -> i32 {
21362128/// // SAFETY: As per this trait's documentation, the caller ensures
21372129/// // that `idx < 0`, which is impossible, so this is dead code.
@@ -2153,11 +2145,14 @@ mod type_keyword {}
21532145/// contract of `idx_unchecked`. Implementing `Indexable` is safe because when writing
21542146/// `idx_unchecked`, we don't have to worry: our *callers* need to discharge a proof obligation
21552147/// (like `use_indexable` does), but the *implementation* of `get_unchecked` has no proof obligation
2156- /// to contend with. Of course, the implementation of `Indexable` may choose to call other unsafe
2157- /// operations, and then it needs an `unsafe` *block* to indicate it discharged the proof
2158- /// obligations of its callees. (We enabled `unsafe_op_in_unsafe_fn`, so the body of `idx_unchecked`
2159- /// is not implicitly an unsafe block.) For that purpose it can make use of the contract that all
2160- /// its callers must uphold -- the fact that `idx < LEN`.
2148+ /// to contend with. Of course, the implementation may choose to call other unsafe operations, and
2149+ /// then it needs an `unsafe` *block* to indicate it discharged the proof obligations of its
2150+ /// callees. For that purpose it can make use of the contract that all its callers must uphold --
2151+ /// the fact that `idx < LEN`.
2152+ ///
2153+ /// Note that unlike normal `unsafe fn`, an `unsafe fn` in a trait implementation does not get to
2154+ /// just pick an arbitrary safety contract! It *has* to use the safety contract defined by the trait
2155+ /// (or one with weaker preconditions).
21612156///
21622157/// Formally speaking, an `unsafe fn` in a trait is a function with *preconditions* that go beyond
21632158/// those encoded by the argument types (such as `idx < LEN`), whereas an `unsafe trait` can declare
0 commit comments