-
Notifications
You must be signed in to change notification settings - Fork 12.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Resolve type aliases to the type they point to in intra-doc links #86334
Resolve type aliases to the type they point to in intra-doc links #86334
Conversation
Some changes occurred in intra-doc-links. cc @jyn514 |
Res::Def(DefKind::TyAlias, did) => { | ||
// Resolve the link on the type the alias points to. | ||
// FIXME: if the associated item is defined directly on the type alias, | ||
// it will show up on its documentation page, we should link there instead. | ||
let res = self.resolve_type_alias(did)?; | ||
self.resolve_associated_item(res, item_name, ns, module_id) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you help me understand why this wasn't working before? Does inherent_impls
not work at all for type aliases?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
(I'm not especially familiar with this part of the compiler, these are the results of skimming the source code, so take it with a grain of salt)
inherent_impls
uses the impls_map
that is collected by InherentCollect
in this somewhat lengthy function:
rust/compiler/rustc_typeck/src/coherence/inherent_impls.rs
Lines 43 to 354 in 4d3ce2e
fn visit_item(&mut self, item: &hir::Item<'_>) { | |
let (ty, assoc_items) = match item.kind { | |
hir::ItemKind::Impl(hir::Impl { of_trait: None, ref self_ty, items, .. }) => { | |
(self_ty, items) | |
} | |
_ => return, | |
}; | |
let self_ty = self.tcx.type_of(item.def_id); | |
let lang_items = self.tcx.lang_items(); | |
match *self_ty.kind() { | |
ty::Adt(def, _) => { | |
self.check_def_id(item, def.did); | |
} | |
ty::Foreign(did) => { | |
self.check_def_id(item, did); | |
} | |
ty::Dynamic(ref data, ..) if data.principal_def_id().is_some() => { | |
self.check_def_id(item, data.principal_def_id().unwrap()); | |
} | |
ty::Bool => { | |
self.check_primitive_impl( | |
item.def_id, | |
lang_items.bool_impl(), | |
None, | |
"bool", | |
"bool", | |
item.span, | |
assoc_items, | |
); | |
} | |
ty::Char => { | |
self.check_primitive_impl( | |
item.def_id, | |
lang_items.char_impl(), | |
None, | |
"char", | |
"char", | |
item.span, | |
assoc_items, | |
); | |
} | |
ty::Str => { | |
self.check_primitive_impl( | |
item.def_id, | |
lang_items.str_impl(), | |
lang_items.str_alloc_impl(), | |
"str", | |
"str", | |
item.span, | |
assoc_items, | |
); | |
} | |
ty::Slice(slice_item) if slice_item == self.tcx.types.u8 => { | |
self.check_primitive_impl( | |
item.def_id, | |
lang_items.slice_u8_impl(), | |
lang_items.slice_u8_alloc_impl(), | |
"slice_u8", | |
"[u8]", | |
item.span, | |
assoc_items, | |
); | |
} | |
ty::Slice(_) => { | |
self.check_primitive_impl( | |
item.def_id, | |
lang_items.slice_impl(), | |
lang_items.slice_alloc_impl(), | |
"slice", | |
"[T]", | |
item.span, | |
assoc_items, | |
); | |
} | |
ty::Array(_, _) => { | |
self.check_primitive_impl( | |
item.def_id, | |
lang_items.array_impl(), | |
None, | |
"array", | |
"[T; N]", | |
item.span, | |
assoc_items, | |
); | |
} | |
ty::RawPtr(ty::TypeAndMut { ty: inner, mutbl: hir::Mutability::Not }) | |
if matches!(inner.kind(), ty::Slice(_)) => | |
{ | |
self.check_primitive_impl( | |
item.def_id, | |
lang_items.const_slice_ptr_impl(), | |
None, | |
"const_slice_ptr", | |
"*const [T]", | |
item.span, | |
assoc_items, | |
); | |
} | |
ty::RawPtr(ty::TypeAndMut { ty: inner, mutbl: hir::Mutability::Mut }) | |
if matches!(inner.kind(), ty::Slice(_)) => | |
{ | |
self.check_primitive_impl( | |
item.def_id, | |
lang_items.mut_slice_ptr_impl(), | |
None, | |
"mut_slice_ptr", | |
"*mut [T]", | |
item.span, | |
assoc_items, | |
); | |
} | |
ty::RawPtr(ty::TypeAndMut { ty: _, mutbl: hir::Mutability::Not }) => { | |
self.check_primitive_impl( | |
item.def_id, | |
lang_items.const_ptr_impl(), | |
None, | |
"const_ptr", | |
"*const T", | |
item.span, | |
assoc_items, | |
); | |
} | |
ty::RawPtr(ty::TypeAndMut { ty: _, mutbl: hir::Mutability::Mut }) => { | |
self.check_primitive_impl( | |
item.def_id, | |
lang_items.mut_ptr_impl(), | |
None, | |
"mut_ptr", | |
"*mut T", | |
item.span, | |
assoc_items, | |
); | |
} | |
ty::Int(ty::IntTy::I8) => { | |
self.check_primitive_impl( | |
item.def_id, | |
lang_items.i8_impl(), | |
None, | |
"i8", | |
"i8", | |
item.span, | |
assoc_items, | |
); | |
} | |
ty::Int(ty::IntTy::I16) => { | |
self.check_primitive_impl( | |
item.def_id, | |
lang_items.i16_impl(), | |
None, | |
"i16", | |
"i16", | |
item.span, | |
assoc_items, | |
); | |
} | |
ty::Int(ty::IntTy::I32) => { | |
self.check_primitive_impl( | |
item.def_id, | |
lang_items.i32_impl(), | |
None, | |
"i32", | |
"i32", | |
item.span, | |
assoc_items, | |
); | |
} | |
ty::Int(ty::IntTy::I64) => { | |
self.check_primitive_impl( | |
item.def_id, | |
lang_items.i64_impl(), | |
None, | |
"i64", | |
"i64", | |
item.span, | |
assoc_items, | |
); | |
} | |
ty::Int(ty::IntTy::I128) => { | |
self.check_primitive_impl( | |
item.def_id, | |
lang_items.i128_impl(), | |
None, | |
"i128", | |
"i128", | |
item.span, | |
assoc_items, | |
); | |
} | |
ty::Int(ty::IntTy::Isize) => { | |
self.check_primitive_impl( | |
item.def_id, | |
lang_items.isize_impl(), | |
None, | |
"isize", | |
"isize", | |
item.span, | |
assoc_items, | |
); | |
} | |
ty::Uint(ty::UintTy::U8) => { | |
self.check_primitive_impl( | |
item.def_id, | |
lang_items.u8_impl(), | |
None, | |
"u8", | |
"u8", | |
item.span, | |
assoc_items, | |
); | |
} | |
ty::Uint(ty::UintTy::U16) => { | |
self.check_primitive_impl( | |
item.def_id, | |
lang_items.u16_impl(), | |
None, | |
"u16", | |
"u16", | |
item.span, | |
assoc_items, | |
); | |
} | |
ty::Uint(ty::UintTy::U32) => { | |
self.check_primitive_impl( | |
item.def_id, | |
lang_items.u32_impl(), | |
None, | |
"u32", | |
"u32", | |
item.span, | |
assoc_items, | |
); | |
} | |
ty::Uint(ty::UintTy::U64) => { | |
self.check_primitive_impl( | |
item.def_id, | |
lang_items.u64_impl(), | |
None, | |
"u64", | |
"u64", | |
item.span, | |
assoc_items, | |
); | |
} | |
ty::Uint(ty::UintTy::U128) => { | |
self.check_primitive_impl( | |
item.def_id, | |
lang_items.u128_impl(), | |
None, | |
"u128", | |
"u128", | |
item.span, | |
assoc_items, | |
); | |
} | |
ty::Uint(ty::UintTy::Usize) => { | |
self.check_primitive_impl( | |
item.def_id, | |
lang_items.usize_impl(), | |
None, | |
"usize", | |
"usize", | |
item.span, | |
assoc_items, | |
); | |
} | |
ty::Float(ty::FloatTy::F32) => { | |
self.check_primitive_impl( | |
item.def_id, | |
lang_items.f32_impl(), | |
lang_items.f32_runtime_impl(), | |
"f32", | |
"f32", | |
item.span, | |
assoc_items, | |
); | |
} | |
ty::Float(ty::FloatTy::F64) => { | |
self.check_primitive_impl( | |
item.def_id, | |
lang_items.f64_impl(), | |
lang_items.f64_runtime_impl(), | |
"f64", | |
"f64", | |
item.span, | |
assoc_items, | |
); | |
} | |
ty::Error(_) => {} | |
_ => { | |
let mut err = struct_span_err!( | |
self.tcx.sess, | |
ty.span, | |
E0118, | |
"no nominal type found for inherent implementation" | |
); | |
err.span_label(ty.span, "impl requires a nominal type") | |
.note("either implement a trait on it or create a newtype to wrap it instead"); | |
if let ty::Ref(_, subty, _) = self_ty.kind() { | |
err.note(&format!( | |
"you could also try moving the reference to \ | |
uses of `{}` (such as `self`) within the implementation", | |
subty | |
)); | |
} | |
err.emit(); | |
} | |
} | |
} |
Notice this line:
let self_ty = self.tcx.type_of(item.def_id); |
This has the effect of converting the
Self
type to a semantic ty::Ty
, resolving any type alias, so no type alias's DefId
ever gets registered in there, hence inherent_impls
returns nothing.
// FIXME: if the associated item is defined directly on the type alias, | ||
// it will show up on its documentation page, we should link there instead. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could we do that by checking inherent_impls(did)
before calling resolve_associated_item
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If I'm right in #86334 (comment), inherent_impls
won't return anything for a type alias. I think rustdoc
is able to display the implementations for type aliases because it does its own visit of the HIR to collect them. Maybe there's a way to use that here, but when I tried the cache was still empty, I'm assuming it gets populated later in the process.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Got it. As long as the link works I'm not super concerned about whether it goes to the type alias or not.
75a6060
to
566c98a
Compare
@jyn514 Pushed the code cleanups you requested. Is there anything else you'd want to see in this PR regarding the two remaining review comments? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I was surprised too, but I couldn't find anything. Maybe I should ask on Zulip.
Opened https://rust-lang.zulipchat.com/#narrow/stream/182449-t-compiler.2Fhelp/topic/DefId.20to.20Res.3F. r=me with the nit fixed if no one responds in the next couple days.
312ab56
to
1b77b91
Compare
This comment has been minimized.
This comment has been minimized.
1b77b91
to
dd90900
Compare
According to |
📌 Commit dd90900 has been approved by |
…iases, r=jyn514 Resolve type aliases to the type they point to in intra-doc links This feels a bit sketchy, but I think it's better than just rejecting the link. Helps with rust-lang#86120, r? `@jyn514`
Rollup of 11 pull requests Successful merges: - rust-lang#85054 (Revert SGX inline asm syntax) - rust-lang#85182 (Move `available_concurrency` implementation to `sys`) - rust-lang#86037 (Add `io::Cursor::{remaining, remaining_slice, is_empty}`) - rust-lang#86114 (Reopen rust-lang#79692 (Format symbols under shared frames)) - rust-lang#86297 (Allow to pass arguments to rustdoc-gui tool) - rust-lang#86334 (Resolve type aliases to the type they point to in intra-doc links) - rust-lang#86367 (Fix comment about rustc_inherit_overflow_checks in abs().) - rust-lang#86381 (Add regression test for issue rust-lang#39161) - rust-lang#86387 (Remove `#[allow(unused_lifetimes)]` which is now unnecessary) - rust-lang#86398 (Add regression test for issue rust-lang#54685) - rust-lang#86493 (Say "this enum variant takes"/"this struct takes" instead of "this function takes") Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
Pkgsrc changes: * Bump bootstrap kit version to 1.55.0. * Adjust patches as needed, some no longer apply (so removed) * Update checksum adjustments. * Avoid rust-llvm on SunOS * Optionally build docs * Remove reference to closed/old PR#54621 Upstream changes: Version 1.56.1 (2021-11-01) =========================== - New lints to detect the presence of bidirectional-override Unicode codepoints in the compiled source code ([CVE-2021-42574]) [CVE-2021-42574]: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-42574 Version 1.56.0 (2021-10-21) ======================== Language -------- - [The 2021 Edition is now stable.][rust#88100] See [the edition guide][rust-2021-edition-guide] for more details. - [The pattern in `binding @ pattern` can now also introduce new bindings.] [rust#85305] - [Union field access is permitted in `const fn`.][rust#85769] [rust-2021-edition-guide]: https://doc.rust-lang.org/nightly/edition-guide/rust-2021/index.html Compiler -------- - [Upgrade to LLVM 13.][rust#87570] - [Support memory, address, and thread sanitizers on aarch64-unknown-freebsd.] [rust#88023] - [Allow specifying a deployment target version for all iOS targets][rust#87699] - [Warnings can be forced on with `--force-warn`.][rust#87472] This feature is primarily intended for usage by `cargo fix`, rather than end users. - [Promote `aarch64-apple-ios-sim` to Tier 2\*.][rust#87760] - [Add `powerpc-unknown-freebsd` at Tier 3\*.][rust#87370] - [Add `riscv32imc-esp-espidf` at Tier 3\*.][rust#87666] \* Refer to Rust's [platform support page][platform-support-doc] for more information on Rust's tiered platform support. Libraries --------- - [Allow writing of incomplete UTF-8 sequences via stdout/stderr on Windows.] [rust#83342] The Windows console still requires valid Unicode, but this change allows splitting a UTF-8 character across multiple write calls. This allows, for instance, programs that just read and write data buffers (e.g. copying a file to stdout) without regard for Unicode or character boundaries. - [Prefer `AtomicU{64,128}` over Mutex for Instant backsliding protection.] [rust#83093] For this use case, atomics scale much better under contention. - [Implement `Extend<(A, B)>` for `(Extend<A>, Extend<B>)`][rust#85835] - [impl Default, Copy, Clone for std::io::Sink and std::io::Empty][rust#86744] - [`impl From<[(K, V); N]>` for all collections.][rust#84111] - [Remove `P: Unpin` bound on impl Future for Pin.][rust#81363] - [Treat invalid environment variable names as non-existent.][rust#86183] Previously, the environment functions would panic if given a variable name with an internal null character or equal sign (`=`). Now, these functions will just treat such names as non-existent variables, since the OS cannot represent the existence of a variable with such a name. Stabilised APIs --------------- - [`std::os::unix::fs::chroot`] - [`UnsafeCell::raw_get`] - [`BufWriter::into_parts`] - [`core::panic::{UnwindSafe, RefUnwindSafe, AssertUnwindSafe}`] These APIs were previously stable in `std`, but are now also available in `core`. - [`Vec::shrink_to`] - [`String::shrink_to`] - [`OsString::shrink_to`] - [`PathBuf::shrink_to`] - [`BinaryHeap::shrink_to`] - [`VecDeque::shrink_to`] - [`HashMap::shrink_to`] - [`HashSet::shrink_to`] These APIs are now usable in const contexts: - [`std::mem::transmute`] - [`[T]::first`][`slice::first`] - [`[T]::split_first`][`slice::split_first`] - [`[T]::last`][`slice::last`] - [`[T]::split_last`][`slice::split_last`] Cargo ----- - [Cargo supports specifying a minimum supported Rust version in Cargo.toml.] [`rust-version`] This has no effect at present on dependency version selection. We encourage crates to specify their minimum supported Rust version, and we encourage CI systems that support Rust code to include a crate's specified minimum version in the text matrix for that crate by default. Compatibility notes ------------------- - [Update to new argument parsing rules on Windows.][rust#87580] This adjusts Rust's standard library to match the behavior of the standard libraries for C/C++. The rules have changed slightly over time, and this PR brings us to the latest set of rules (changed in 2008). - [Disallow the aapcs calling convention on aarch64][rust#88399] This was already not supported by LLVM; this change surfaces this lack of support with a better error message. - [Make `SEMICOLON_IN_EXPRESSIONS_FROM_MACROS` warn by default][rust#87385] - [Warn when an escaped newline skips multiple lines.][rust#87671] - [Calls to `libc::getpid` / `std::process::id` from `Command::pre_exec` may return different values on glibc <= 2.24.][rust#81825] Rust now invokes the `clone3` system call directly, when available, to use new functionality available via that system call. Older versions of glibc cache the result of `getpid`, and only update that cache when calling glibc's clone/fork functions, so a direct system call bypasses that cache update. glibc 2.25 and newer no longer cache `getpid` for exactly this reason. Internal changes ---------------- These changes provide no direct user facing benefits, but represent significant improvements to the internals and overall performance of rustc and related tools. - [LLVM is compiled with PGO in published x86_64-unknown-linux-gnu artifacts.] [rust#88069] This improves the performance of most Rust builds. - [Unify representation of macros in internal data structures.][rust#88019] This change fixes a host of bugs with the handling of macros by the compiler, as well as rustdoc. [`std::os::unix::fs::chroot`]: https://doc.rust-lang.org/stable/std/os/unix/fs/fn.chroot.html [`Iterator::intersperse`]: https://doc.rust-lang.org/stable/std/iter/trait.Iterator.html#method.intersperse [`Iterator::intersperse_with`]: https://doc.rust-lang.org/stable/std/iter/trait.Iterator.html#method.intersperse [`UnsafeCell::raw_get`]: https://doc.rust-lang.org/stable/std/cell/struct.UnsafeCell.html#method.raw_get [`BufWriter::into_parts`]: https://doc.rust-lang.org/stable/std/io/struct.BufWriter.html#method.into_parts [`core::panic::{UnwindSafe, RefUnwindSafe, AssertUnwindSafe}`]: rust-lang/rust#84662 [`Vec::shrink_to`]: https://doc.rust-lang.org/stable/std/vec/struct.Vec.html#method.shrink_to [`String::shrink_to`]: https://doc.rust-lang.org/stable/std/string/struct.String.html#method.shrink_to [`OsString::shrink_to`]: https://doc.rust-lang.org/stable/std/ffi/struct.OsString.html#method.shrink_to [`PathBuf::shrink_to`]: https://doc.rust-lang.org/stable/std/path/struct.PathBuf.html#method.shrink_to [`BinaryHeap::shrink_to`]: https://doc.rust-lang.org/stable/std/collections/struct.BinaryHeap.html#method.shrink_to [`VecDeque::shrink_to`]: https://doc.rust-lang.org/stable/std/collections/struct.VecDeque.html#method.shrink_to [`HashMap::shrink_to`]: https://doc.rust-lang.org/stable/std/collections/hash_map/struct.HashMap.html#method.shrink_to [`HashSet::shrink_to`]: https://doc.rust-lang.org/stable/std/collections/hash_set/struct.HashSet.html#method.shrink_to [`std::mem::transmute`]: https://doc.rust-lang.org/stable/std/mem/fn.transmute.html [`slice::first`]: https://doc.rust-lang.org/stable/std/primitive.slice.html#method.first [`slice::split_first`]: https://doc.rust-lang.org/stable/std/primitive.slice.html#method.split_first [`slice::last`]: https://doc.rust-lang.org/stable/std/primitive.slice.html#method.last [`slice::split_last`]: https://doc.rust-lang.org/stable/std/primitive.slice.html#method.split_last [`rust-version`]: https://doc.rust-lang.org/nightly/cargo/reference/manifest.html#the-rust-version-field [rust#87671]: rust-lang/rust#87671 [rust#86183]: rust-lang/rust#86183 [rust#87385]: rust-lang/rust#87385 [rust#88100]: rust-lang/rust#88100 [rust#86860]: rust-lang/rust#86860 [rust#84039]: rust-lang/rust#84039 [rust#86492]: rust-lang/rust#86492 [rust#88363]: rust-lang/rust#88363 [rust#85305]: rust-lang/rust#85305 [rust#87832]: rust-lang/rust#87832 [rust#88069]: rust-lang/rust#88069 [rust#87472]: rust-lang/rust#87472 [rust#87699]: rust-lang/rust#87699 [rust#87570]: rust-lang/rust#87570 [rust#88023]: rust-lang/rust#88023 [rust#87760]: rust-lang/rust#87760 [rust#87370]: rust-lang/rust#87370 [rust#87580]: rust-lang/rust#87580 [rust#83342]: rust-lang/rust#83342 [rust#83093]: rust-lang/rust#83093 [rust#88177]: rust-lang/rust#88177 [rust#88548]: rust-lang/rust#88548 [rust#88551]: rust-lang/rust#88551 [rust#88299]: rust-lang/rust#88299 [rust#88220]: rust-lang/rust#88220 [rust#85835]: rust-lang/rust#85835 [rust#86879]: rust-lang/rust#86879 [rust#86744]: rust-lang/rust#86744 [rust#84662]: rust-lang/rust#84662 [rust#86593]: rust-lang/rust#86593 [rust#81050]: rust-lang/rust#81050 [rust#81363]: rust-lang/rust#81363 [rust#84111]: rust-lang/rust#84111 [rust#85769]: rust-lang/rust#85769 (comment) [rust#88490]: rust-lang/rust#88490 [rust#88269]: rust-lang/rust#88269 [rust#84176]: rust-lang/rust#84176 [rust#88399]: rust-lang/rust#88399 [rust#88227]: rust-lang/rust#88227 [rust#88200]: rust-lang/rust#88200 [rust#82776]: rust-lang/rust#82776 [rust#88077]: rust-lang/rust#88077 [rust#87728]: rust-lang/rust#87728 [rust#87050]: rust-lang/rust#87050 [rust#87619]: rust-lang/rust#87619 [rust#81825]: rust-lang/rust#81825 (comment) [rust#88019]: rust-lang/rust#88019 [rust#87666]: rust-lang/rust#87666 Version 1.55.0 (2021-09-09) ============================ Language -------- - [You can now write open "from" range patterns (`X..`), which will start at `X` and will end at the maximum value of the integer.][83918] - [You can now explicitly import the prelude of different editions through `std::prelude` (e.g. `use std::prelude::rust_2021::*;`).][86294] Compiler -------- - [Added tier 3\* support for `powerpc64le-unknown-freebsd`.][83572] \* Refer to Rust's [platform support page][platform-support-doc] for more information on Rust's tiered platform support. Libraries --------- - [Updated std's float parsing to use the Eisel-Lemire algorithm.][86761] These improvements should in general provide faster string parsing of floats, no longer reject certain valid floating point values, and reduce the produced code size for non-stripped artifacts. - [`string::Drain` now implements `AsRef<str>` and `AsRef<[u8]>`.][86858] Stabilised APIs --------------- - [`Bound::cloned`] - [`Drain::as_str`] - [`IntoInnerError::into_error`] - [`IntoInnerError::into_parts`] - [`MaybeUninit::assume_init_mut`] - [`MaybeUninit::assume_init_ref`] - [`MaybeUninit::write`] - [`array::map`] - [`ops::ControlFlow`] - [`x86::_bittest`] - [`x86::_bittestandcomplement`] - [`x86::_bittestandreset`] - [`x86::_bittestandset`] - [`x86_64::_bittest64`] - [`x86_64::_bittestandcomplement64`] - [`x86_64::_bittestandreset64`] - [`x86_64::_bittestandset64`] The following previously stable functions are now `const`. - [`str::from_utf8_unchecked`] Cargo ----- - [Cargo will now deduplicate compiler diagnostics to the terminal when invoking rustc in parallel such as when using `cargo test`.][cargo/9675] - [The package definition in `cargo metadata` now includes the `"default_run"` field from the manifest.][cargo/9550] - [Added `cargo d` as an alias for `cargo doc`.][cargo/9680] - [Added `{lib}` as formatting option for `cargo tree` to print the `"lib_name"` of packages.][cargo/9663] Rustdoc ------- - [Added "Go to item on exact match" search option.][85876] - [The "Implementors" section on traits no longer shows redundant method definitions.][85970] - [Trait implementations are toggled open by default.][86260] This should make the implementations more searchable by tools like `CTRL+F` in your browser. - [Intra-doc links should now correctly resolve associated items (e.g. methods) through type aliases.][86334] - [Traits which are marked with `#[doc(hidden)]` will no longer appear in the "Trait Implementations" section.][86513] Compatibility Notes ------------------- - [std functions that return an `io::Error` will no longer use the `ErrorKind::Other` variant.][85746] This is to better reflect that these kinds of errors could be categorised [into newer more specific `ErrorKind` variants][79965], and that they do not represent a user error. - [Using environment variable names with `process::Command` on Windows now behaves as expected.][85270] Previously using envionment variables with `Command` would cause them to be ASCII-uppercased. - [Rustdoc will now warn on using rustdoc lints that aren't prefixed with `rustdoc::`][86849] [86849]: rust-lang/rust#86849 [86513]: rust-lang/rust#86513 [86334]: rust-lang/rust#86334 [86260]: rust-lang/rust#86260 [85970]: rust-lang/rust#85970 [85876]: rust-lang/rust#85876 [83572]: rust-lang/rust#83572 [86294]: rust-lang/rust#86294 [86858]: rust-lang/rust#86858 [86761]: rust-lang/rust#86761 [85769]: rust-lang/rust#85769 [85746]: rust-lang/rust#85746 [85305]: rust-lang/rust#85305 [85270]: rust-lang/rust#85270 [84111]: rust-lang/rust#84111 [83918]: rust-lang/rust#83918 [79965]: rust-lang/rust#79965 [87370]: rust-lang/rust#87370 [87298]: rust-lang/rust#87298 [cargo/9663]: rust-lang/cargo#9663 [cargo/9675]: rust-lang/cargo#9675 [cargo/9550]: rust-lang/cargo#9550 [cargo/9680]: rust-lang/cargo#9680 [cargo/9663]: rust-lang/cargo#9663 [`array::map`]: https://doc.rust-lang.org/stable/std/primitive.array.html#method.map [`Bound::cloned`]: https://doc.rust-lang.org/stable/std/ops/enum.Bound.html#method.cloned [`Drain::as_str`]: https://doc.rust-lang.org/stable/std/string/struct.Drain.html#method.as_str [`IntoInnerError::into_error`]: https://doc.rust-lang.org/stable/std/io/struct.IntoInnerError.html#method.into_error [`IntoInnerError::into_parts`]: https://doc.rust-lang.org/stable/std/io/struct.IntoInnerError.html#method.into_parts [`MaybeUninit::assume_init_mut`]: https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#method.assume_init_mut [`MaybeUninit::assume_init_ref`]: https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#method.assume_init_ref [`MaybeUninit::write`]: https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#method.write [`Seek::rewind`]: https://doc.rust-lang.org/stable/std/io/trait.Seek.html#method.rewind [`ops::ControlFlow`]: https://doc.rust-lang.org/stable/std/ops/enum.ControlFlow.html [`str::from_utf8_unchecked`]: https://doc.rust-lang.org/stable/std/str/fn.from_utf8_unchecked.html [`x86::_bittest`]: https://doc.rust-lang.org/stable/core/arch/x86/fn._bittest.html [`x86::_bittestandcomplement`]: https://doc.rust-lang.org/stable/core/arch/x86/fn._bittestandcomplement.html [`x86::_bittestandreset`]: https://doc.rust-lang.org/stable/core/arch/x86/fn._bittestandreset.html [`x86::_bittestandset`]: https://doc.rust-lang.org/stable/core/arch/x86/fn._bittestandset.html [`x86_64::_bittest64`]: https://doc.rust-lang.org/stable/core/arch/x86_64/fn._bittest64.html [`x86_64::_bittestandcomplement64`]: https://doc.rust-lang.org/stable/core/arch/x86_64/fn._bittestandcomplement64.html [`x86_64::_bittestandreset64`]: https://doc.rust-lang.org/stable/core/arch/x86_64/fn._bittestandreset64.html [`x86_64::_bittestandset64`]: https://doc.rust-lang.org/stable/core/arch/x86_64/fn._bittestandset64.html
This feels a bit sketchy, but I think it's better than just rejecting the link.
Helps with #86120, r? @jyn514