rustdoc: remove explicit boolean comparisons.
For boolean variables it's shorter and more readable to check the value directly, or negate it with `!`.
In a couple of cases I reordered an if/else pair because it made the initial `if` statement simpler.
An example of a style guide recommending this: https://airbnb.io/javascript/#comparison--shortcuts
r? `@GuillaumeGomez`
BTree: no longer copy keys and values before dropping them
When dropping BTreeMap or BTreeSet instances, keys-value pairs are up to now each copied and then dropped, at least according to source code. This is because the code for dropping and for iterators is shared.
This PR postpones the treatment of doomed key-value pairs from the intermediate functions `deallocating_next`(`_back`) to the last minute, so the we can drop the keys and values in place. According to the library/alloc benchmarks, this does make a difference, (and a positive difference with an `#[inline]` on `drop_key_val`). It does not change anything for #81444 though.
r? `@Mark-Simulacrum`
For boolean variables it's shorter and more readable to check the value
directly, or negate it with `!`.
In a couple of cases I reordered an if/else pair because it made the
initial `if` statement simpler.
Removed unused isType parameter from two functions.
At first you might think "why not just click through to the aliased
type?", but if a type alias instantiates all of the generic parameters
of the aliased type, then it can show layout info even though the
aliased type cannot (because we can't compute the layout of a generic
type). So I think it's still useful to show layout info for type
aliases.
Emit errors/warns on some wrong uses of rustdoc attributes
This PR adds a few diagnostics:
- error if conflicting `#[doc(inline)]`/`#[doc(no_inline)]` are found
- introduce the `invalid_doc_attributes` lint (warn-by-default) which triggers:
- if a crate-level attribute is used on a non-`crate` item
- if `#[doc(inline)]`/`#[doc(no_inline)]` is used on a non-`use` item
The code could probably be improved but I wanted to get feedback first. Also, some of those changes could be considered breaking changes, so I don't know what the procedure would be? ~~And finally, for the warnings, they are currently hard warnings, maybe it would be better to introduce a lint?~~ (EDIT: introduced the `invalid_doc_attributes` lint)
Closes#80275.
r? `@jyn514`
RELEASES.md: Use broken_intra_doc_links as an example, not nightly lint
`non_autolinks` has since been renamed and also was unstable at the time
this was written.
Show nicer error when an 'unstable fingerprints' error occurs
An example of the error produced by this PR:
```
error: internal compiler error: encountered incremental compilation error with evaluate_obligation(9f2ad55260c30262-c36667639674ad83)
|
= help: This is a known issue with the compiler. Run `cargo clean -p syn` or `cargo clean` to allow your project to compile
= note: Please follow the instructions below to create a bug report with the provided information
thread 'rustc' panicked at 'Found unstable fingerprints for evaluate_obligation(9f2ad55260c30262-c36667639674ad83): Ok(EvaluatedToOk)', /home/aaron/repos/rust/compiler/rustc_query_system/src/query/plumbing.rs:595:9
stack backtrace:
0: rust_begin_unwind
at /home/aaron/repos/rust/library/std/src/panicking.rs:493:5
1: std::panicking::begin_panic_fmt
at /home/aaron/repos/rust/library/std/src/panicking.rs:435:5
2: rustc_query_system::query::plumbing::incremental_verify_ich
at /home/aaron/repos/rust/compiler/rustc_query_system/src/query/plumbing.rs:595:9
3: rustc_query_system::query::plumbing::load_from_disk_and_cache_in_memory
at /home/aaron/repos/rust/compiler/rustc_query_system/src/query/plumbing.rs:557:9
4: rustc_query_system::query::plumbing::try_execute_query::{{closure}}::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_query_system/src/query/plumbing.rs:473:21
5: core::option::Option<T>::map
at /home/aaron/repos/rust/library/core/src/option.rs:487:29
6: rustc_query_system::query::plumbing::try_execute_query::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_query_system/src/query/plumbing.rs:471:13
7: stacker::maybe_grow
at /home/aaron/.cargo/registry/src/github.com-1ecc6299db9ec823/stacker-0.1.12/src/lib.rs:55:9
8: rustc_data_structures::stack::ensure_sufficient_stack
at /home/aaron/repos/rust/compiler/rustc_data_structures/src/stack.rs:16:5
9: <rustc_query_impl::plumbing::QueryCtxt as rustc_query_system::query::QueryContext>::start_query::{{closure}}::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_query_impl/src/plumbing.rs:169:17
10: rustc_middle::ty::context::tls::enter_context::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1736:50
11: rustc_middle::ty::context::tls::set_tlv
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1720:9
12: rustc_middle::ty::context::tls::enter_context
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1736:9
13: <rustc_query_impl::plumbing::QueryCtxt as rustc_query_system::query::QueryContext>::start_query::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_query_impl/src/plumbing.rs:168:13
14: rustc_middle::ty::context::tls::with_related_context::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1780:13
15: rustc_middle::ty::context::tls::with_context::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1764:40
16: rustc_middle::ty::context::tls::with_context_opt
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1753:22
17: rustc_middle::ty::context::tls::with_context
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1764:9
18: rustc_middle::ty::context::tls::with_related_context
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1777:9
19: <rustc_query_impl::plumbing::QueryCtxt as rustc_query_system::query::QueryContext>::start_query
at /home/aaron/repos/rust/compiler/rustc_query_impl/src/plumbing.rs:157:9
20: rustc_query_system::query::plumbing::try_execute_query
at /home/aaron/repos/rust/compiler/rustc_query_system/src/query/plumbing.rs:469:22
21: rustc_query_system::query::plumbing::get_query_impl
at /home/aaron/repos/rust/compiler/rustc_query_system/src/query/plumbing.rs:674:5
22: rustc_query_system::query::plumbing::get_query
at /home/aaron/repos/rust/compiler/rustc_query_system/src/query/plumbing.rs:785:9
23: <rustc_query_impl::Queries as rustc_middle::ty::query::QueryEngine>::evaluate_obligation
at /home/aaron/repos/rust/compiler/rustc_query_impl/src/plumbing.rs:603:17
24: rustc_middle::ty::query::TyCtxtAt::evaluate_obligation
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/query/mod.rs:204:17
25: rustc_middle::ty::query::<impl rustc_middle::ty::context::TyCtxt>::evaluate_obligation
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/query/mod.rs:185:17
26: <rustc_infer::infer::InferCtxt as rustc_trait_selection::traits::query::evaluate_obligation::InferCtxtExt>::evaluate_obligation
at /home/aaron/repos/rust/compiler/rustc_trait_selection/src/traits/query/evaluate_obligation.rs:72:9
27: <rustc_infer::infer::InferCtxt as rustc_trait_selection::traits::query::evaluate_obligation::InferCtxtExt>::evaluate_obligation_no_overflow
at /home/aaron/repos/rust/compiler/rustc_trait_selection/src/traits/query/evaluate_obligation.rs:82:15
28: <rustc_infer::infer::InferCtxt as rustc_trait_selection::traits::query::evaluate_obligation::InferCtxtExt>::predicate_must_hold_modulo_regions
at /home/aaron/repos/rust/compiler/rustc_trait_selection/src/traits/query/evaluate_obligation.rs:58:9
29: rustc_trait_selection::traits::type_known_to_meet_bound_modulo_regions
at /home/aaron/repos/rust/compiler/rustc_trait_selection/src/traits/mod.rs:146:18
30: rustc_ty_utils::common_traits::is_item_raw::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_ty_utils/src/common_traits.rs:33:9
31: rustc_infer::infer::InferCtxtBuilder::enter
at /home/aaron/repos/rust/compiler/rustc_infer/src/infer/mod.rs:582:9
32: rustc_ty_utils::common_traits::is_item_raw
at /home/aaron/repos/rust/compiler/rustc_ty_utils/src/common_traits.rs:32:5
33: rustc_query_system::query::config::QueryVtable<CTX,K,V>::compute
at /home/aaron/repos/rust/compiler/rustc_query_system/src/query/config.rs:44:9
34: rustc_query_system::query::plumbing::load_from_disk_and_cache_in_memory::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_query_system/src/query/plumbing.rs:544:67
35: rustc_middle::dep_graph::<impl rustc_query_system::dep_graph::DepKind for rustc_middle::dep_graph::dep_node::DepKind>::with_deps::{{closure}}::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/dep_graph/mod.rs:77:46
36: rustc_middle::ty::context::tls::enter_context::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1736:50
37: rustc_middle::ty::context::tls::set_tlv
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1720:9
38: rustc_middle::ty::context::tls::enter_context
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1736:9
39: rustc_middle::dep_graph::<impl rustc_query_system::dep_graph::DepKind for rustc_middle::dep_graph::dep_node::DepKind>::with_deps::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/dep_graph/mod.rs:77:13
40: rustc_middle::ty::context::tls::with_context::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1764:40
41: rustc_middle::ty::context::tls::with_context_opt
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1753:22
42: rustc_middle::ty::context::tls::with_context
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1764:9
43: rustc_middle::dep_graph::<impl rustc_query_system::dep_graph::DepKind for rustc_middle::dep_graph::dep_node::DepKind>::with_deps
at /home/aaron/repos/rust/compiler/rustc_middle/src/dep_graph/mod.rs:74:9
44: rustc_query_system::dep_graph::graph::DepGraph<K>::with_ignore
at /home/aaron/repos/rust/compiler/rustc_query_system/src/dep_graph/graph.rs:167:9
45: rustc_query_system::query::plumbing::load_from_disk_and_cache_in_memory
at /home/aaron/repos/rust/compiler/rustc_query_system/src/query/plumbing.rs:544:22
46: rustc_query_system::query::plumbing::try_execute_query::{{closure}}::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_query_system/src/query/plumbing.rs:473:21
47: core::option::Option<T>::map
at /home/aaron/repos/rust/library/core/src/option.rs:487:29
48: rustc_query_system::query::plumbing::try_execute_query::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_query_system/src/query/plumbing.rs:471:13
49: stacker::maybe_grow
at /home/aaron/.cargo/registry/src/github.com-1ecc6299db9ec823/stacker-0.1.12/src/lib.rs:55:9
50: rustc_data_structures::stack::ensure_sufficient_stack
at /home/aaron/repos/rust/compiler/rustc_data_structures/src/stack.rs:16:5
51: <rustc_query_impl::plumbing::QueryCtxt as rustc_query_system::query::QueryContext>::start_query::{{closure}}::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_query_impl/src/plumbing.rs:169:17
52: rustc_middle::ty::context::tls::enter_context::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1736:50
53: rustc_middle::ty::context::tls::set_tlv
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1720:9
54: rustc_middle::ty::context::tls::enter_context
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1736:9
55: <rustc_query_impl::plumbing::QueryCtxt as rustc_query_system::query::QueryContext>::start_query::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_query_impl/src/plumbing.rs:168:13
56: rustc_middle::ty::context::tls::with_related_context::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1780:13
57: rustc_middle::ty::context::tls::with_context::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1764:40
58: rustc_middle::ty::context::tls::with_context_opt
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1753:22
59: rustc_middle::ty::context::tls::with_context
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1764:9
60: rustc_middle::ty::context::tls::with_related_context
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1777:9
61: <rustc_query_impl::plumbing::QueryCtxt as rustc_query_system::query::QueryContext>::start_query
at /home/aaron/repos/rust/compiler/rustc_query_impl/src/plumbing.rs:157:9
62: rustc_query_system::query::plumbing::try_execute_query
at /home/aaron/repos/rust/compiler/rustc_query_system/src/query/plumbing.rs:469:22
63: rustc_query_system::query::plumbing::get_query_impl
at /home/aaron/repos/rust/compiler/rustc_query_system/src/query/plumbing.rs:674:5
64: rustc_query_system::query::plumbing::get_query
at /home/aaron/repos/rust/compiler/rustc_query_system/src/query/plumbing.rs:785:9
65: rustc_middle::ty::query::TyCtxtAt::is_unpin_raw
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/query/mod.rs:204:17
66: rustc_middle::ty::util::<impl rustc_middle::ty::TyS>::is_unpin
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/util.rs:727:38
67: rustc_middle::ty::layout::<impl rustc_target::abi::TyAndLayoutMethods<C> for &rustc_middle::ty::TyS>::pointee_info_at
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/layout.rs:2341:32
68: rustc_target::abi::TyAndLayout<Ty>::pointee_info_at
at /home/aaron/repos/rust/compiler/rustc_target/src/abi/mod.rs:1164:9
69: <rustc_target::abi::call::FnAbi<&rustc_middle::ty::TyS> as rustc_middle::ty::layout::FnAbiExt<C>>::new_internal::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/layout.rs:2781:36
70: <rustc_target::abi::call::FnAbi<&rustc_middle::ty::TyS> as rustc_middle::ty::layout::FnAbiExt<C>>::new_internal::{{closure}}::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/layout.rs:2840:17
71: rustc_target::abi::call::ArgAbi<Ty>::new
at /home/aaron/repos/rust/compiler/rustc_target/src/abi/call/mod.rs:457:53
72: <rustc_target::abi::call::FnAbi<&rustc_middle::ty::TyS> as rustc_middle::ty::layout::FnAbiExt<C>>::new_internal::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/layout.rs:2838:27
73: <rustc_target::abi::call::FnAbi<&rustc_middle::ty::TyS> as rustc_middle::ty::layout::FnAbiExt<C>>::new_internal::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/layout.rs:2870:32
74: core::iter::adapters::map::map_fold::{{closure}}
at /home/aaron/repos/rust/library/core/src/iter/adapters/map.rs:82:28
75: <core::iter::adapters::enumerate::Enumerate<I> as core::iter::traits::iterator::Iterator>::fold::enumerate::{{closure}}
at /home/aaron/repos/rust/library/core/src/iter/adapters/enumerate.rs:104:27
76: core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut
at /home/aaron/repos/rust/library/core/src/ops/function.rs:269:13
77: core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut
at /home/aaron/repos/rust/library/core/src/ops/function.rs:269:13
78: core::iter::adapters::map::map_fold::{{closure}}
at /home/aaron/repos/rust/library/core/src/iter/adapters/map.rs:82:21
79: core::iter::traits::iterator::Iterator::fold
at /home/aaron/repos/rust/library/core/src/iter/traits/iterator.rs:2146:21
80: <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold
at /home/aaron/repos/rust/library/core/src/iter/adapters/map.rs:122:9
81: <core::iter::adapters::cloned::Cloned<I> as core::iter::traits::iterator::Iterator>::fold
at /home/aaron/repos/rust/library/core/src/iter/adapters/cloned.rs:58:9
82: <core::iter::adapters::chain::Chain<A,B> as core::iter::traits::iterator::Iterator>::fold
at /home/aaron/repos/rust/library/core/src/iter/adapters/chain.rs:119:19
83: <core::iter::adapters::chain::Chain<A,B> as core::iter::traits::iterator::Iterator>::fold
at /home/aaron/repos/rust/library/core/src/iter/adapters/chain.rs:119:19
84: <core::iter::adapters::enumerate::Enumerate<I> as core::iter::traits::iterator::Iterator>::fold
at /home/aaron/repos/rust/library/core/src/iter/adapters/enumerate.rs:110:9
85: <core::iter::adapters::map::Map<I,F> as core::iter::traits::iterator::Iterator>::fold
at /home/aaron/repos/rust/library/core/src/iter/adapters/map.rs:122:9
86: core::iter::traits::iterator::Iterator::for_each
at /home/aaron/repos/rust/library/core/src/iter/traits/iterator.rs:776:9
87: <alloc::vec::Vec<T,A> as alloc::vec::spec_extend::SpecExtend<T,I>>::spec_extend
at /home/aaron/repos/rust/library/alloc/src/vec/spec_extend.rs:40:17
88: <alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter
at /home/aaron/repos/rust/library/alloc/src/vec/spec_from_iter_nested.rs:56:9
89: <alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter
at /home/aaron/repos/rust/library/alloc/src/vec/spec_from_iter.rs:36:9
90: <alloc::vec::Vec<T> as core::iter::traits::collect::FromIterator<T>>::from_iter
at /home/aaron/repos/rust/library/alloc/src/vec/mod.rs:2448:9
91: core::iter::traits::iterator::Iterator::collect
at /home/aaron/repos/rust/library/core/src/iter/traits/iterator.rs:1788:9
92: <rustc_target::abi::call::FnAbi<&rustc_middle::ty::TyS> as rustc_middle::ty::layout::FnAbiExt<C>>::new_internal
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/layout.rs:2864:19
93: <rustc_target::abi::call::FnAbi<&rustc_middle::ty::TyS> as rustc_middle::ty::layout::FnAbiExt<C>>::of_instance
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/layout.rs:2670:9
94: rustc_codegen_llvm::mono_item::<impl rustc_codegen_ssa::traits::declare::PreDefineMethods for rustc_codegen_llvm::context::CodegenCx>::predefine_fn
at /home/aaron/repos/rust/compiler/rustc_codegen_llvm/src/mono_item.rs:57:22
95: <rustc_middle::mir::mono::MonoItem as rustc_codegen_ssa::mono_item::MonoItemExt>::predefine
at /home/aaron/repos/rust/compiler/rustc_codegen_ssa/src/mono_item.rs:76:17
96: rustc_codegen_llvm::base::compile_codegen_unit::module_codegen
at /home/aaron/repos/rust/compiler/rustc_codegen_llvm/src/base.rs:122:17
97: rustc_query_system::dep_graph::graph::DepGraph<K>::with_task_impl::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_query_system/src/dep_graph/graph.rs:235:62
98: rustc_middle::dep_graph::<impl rustc_query_system::dep_graph::DepKind for rustc_middle::dep_graph::dep_node::DepKind>::with_deps::{{closure}}::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/dep_graph/mod.rs:77:46
99: rustc_middle::ty::context::tls::enter_context::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1736:50
100: rustc_middle::ty::context::tls::set_tlv
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1720:9
101: rustc_middle::ty::context::tls::enter_context
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1736:9
102: rustc_middle::dep_graph::<impl rustc_query_system::dep_graph::DepKind for rustc_middle::dep_graph::dep_node::DepKind>::with_deps::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/dep_graph/mod.rs:77:13
103: rustc_middle::ty::context::tls::with_context::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1764:40
104: rustc_middle::ty::context::tls::with_context_opt
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1753:22
105: rustc_middle::ty::context::tls::with_context
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1764:9
106: rustc_middle::dep_graph::<impl rustc_query_system::dep_graph::DepKind for rustc_middle::dep_graph::dep_node::DepKind>::with_deps
at /home/aaron/repos/rust/compiler/rustc_middle/src/dep_graph/mod.rs:74:9
107: rustc_query_system::dep_graph::graph::DepGraph<K>::with_task_impl
at /home/aaron/repos/rust/compiler/rustc_query_system/src/dep_graph/graph.rs:235:26
108: rustc_query_system::dep_graph::graph::DepGraph<K>::with_task
at /home/aaron/repos/rust/compiler/rustc_query_system/src/dep_graph/graph.rs:205:9
109: rustc_codegen_llvm::base::compile_codegen_unit
at /home/aaron/repos/rust/compiler/rustc_codegen_llvm/src/base.rs:103:9
110: <rustc_codegen_llvm::LlvmCodegenBackend as rustc_codegen_ssa::traits::backend::ExtraBackendMethods>::compile_codegen_unit
at /home/aaron/repos/rust/compiler/rustc_codegen_llvm/src/lib.rs:109:9
111: rustc_codegen_ssa::base::codegen_crate
at /home/aaron/repos/rust/compiler/rustc_codegen_ssa/src/base.rs:655:38
112: <rustc_codegen_llvm::LlvmCodegenBackend as rustc_codegen_ssa::traits::backend::CodegenBackend>::codegen_crate
at /home/aaron/repos/rust/compiler/rustc_codegen_llvm/src/lib.rs:270:18
113: rustc_interface::passes::start_codegen::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_interface/src/passes.rs:1021:9
114: rustc_data_structures::profiling::VerboseTimingGuard::run
at /home/aaron/repos/rust/compiler/rustc_data_structures/src/profiling.rs:573:9
115: rustc_session::utils::<impl rustc_session::session::Session>::time
at /home/aaron/repos/rust/compiler/rustc_session/src/utils.rs:16:9
116: rustc_interface::passes::start_codegen
at /home/aaron/repos/rust/compiler/rustc_interface/src/passes.rs:1020:19
117: rustc_interface::queries::Queries::ongoing_codegen::{{closure}}::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_interface/src/queries.rs:296:20
118: rustc_interface::passes::QueryContext::enter::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_interface/src/passes.rs:755:42
119: rustc_middle::ty::context::tls::enter_context::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1736:50
120: rustc_middle::ty::context::tls::set_tlv
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1720:9
121: rustc_middle::ty::context::tls::enter_context
at /home/aaron/repos/rust/compiler/rustc_middle/src/ty/context.rs:1736:9
122: rustc_interface::passes::QueryContext::enter
at /home/aaron/repos/rust/compiler/rustc_interface/src/passes.rs:755:9
123: rustc_interface::queries::Queries::ongoing_codegen::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_interface/src/queries.rs:287:13
124: rustc_interface::queries::Query<T>::compute
at /home/aaron/repos/rust/compiler/rustc_interface/src/queries.rs:40:28
125: rustc_interface::queries::Queries::ongoing_codegen
at /home/aaron/repos/rust/compiler/rustc_interface/src/queries.rs:285:9
126: rustc_driver::run_compiler::{{closure}}::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_driver/src/lib.rs:442:13
127: rustc_interface::queries::<impl rustc_interface::interface::Compiler>::enter
at /home/aaron/repos/rust/compiler/rustc_interface/src/queries.rs:428:19
128: rustc_driver::run_compiler::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_driver/src/lib.rs:337:22
129: rustc_interface::interface::create_compiler_and_run::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_interface/src/interface.rs:208:13
130: rustc_span::with_source_map
at /home/aaron/repos/rust/compiler/rustc_span/src/lib.rs:788:5
131: rustc_interface::interface::create_compiler_and_run
at /home/aaron/repos/rust/compiler/rustc_interface/src/interface.rs:202:5
132: rustc_interface::interface::run_compiler::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_interface/src/interface.rs:224:12
133: rustc_interface::util::setup_callbacks_and_run_in_thread_pool_with_globals::{{closure}}::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_interface/src/util.rs:155:13
134: scoped_tls::ScopedKey<T>::set
at /home/aaron/.cargo/registry/src/github.com-1ecc6299db9ec823/scoped-tls-1.0.0/src/lib.rs:137:9
135: rustc_span::with_session_globals
at /home/aaron/repos/rust/compiler/rustc_span/src/lib.rs:105:5
136: rustc_interface::util::setup_callbacks_and_run_in_thread_pool_with_globals::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_interface/src/util.rs:153:9
137: rustc_interface::util::scoped_thread::{{closure}}
at /home/aaron/repos/rust/compiler/rustc_interface/src/util.rs:128:24
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
error: internal compiler error: unexpected panic
note: the compiler unexpectedly panicked. this is a bug.
note: we would appreciate a bug report: https://github.com/rust-lang/rust/issues/new?labels=C-bug%2C+I-ICE%2C+T-compiler&template=ice.md
note: rustc 1.54.0-dev running on x86_64-unknown-linux-gnu
note: compiler flags: -C opt-level=3 -C embed-bitcode=no -C incremental --crate-type lib
note: some of the compiler flags provided by cargo are hidden
query stack during panic:
#0 [evaluate_obligation] evaluating trait selection obligation `quote::Tokens: std::marker::Unpin`
#1 [is_unpin_raw] computing whether `quote::Tokens` is `Unpin`
end of query stack
error: aborting due to previous error
error: could not compile `syn`
To learn more, run the command again with --verbose.
```
I've left in the panic and ICE following the pretty error, so that we still have all of the debug information available in a bug report.
This message can be reproduced by cloning the repository `https://github.com/Aaron1011/syn-crash`, and running the following shell script (with a `rustup override` set in the directory):
```
set -xe
cargo clean -p syn
cargo clean --release -p syn
git checkout minimize
cargo build --release -j 1
git checkout minimize-change
cargo build --release -j 1
```
r? ``@Mark-Simulacrum``
Fix stack overflow when checking for structural recursion
This pull request aims to fix#74224 and fix#84611. The current logic for detecting ADTs with structural recursion is flawed because it only looks at the root type, and then for exact matches. What I mean by this is that for examples such as:
```rust
struct A<T> {
x: T,
y: A<A<T>>,
}
struct B {
z: A<usize>
}
fn main() {}
```
When checking `A`, the compiler correctly determines that it has an infinite size (because the "root" type is `A`, and `A` occurs, albeit with different type arguments, as a nested type in `A`).
However, when checking `B`, it also recurses into `A`, but now `B` is the root type, and it only checks for _exact_ matches of `A`, but since `A` never precisely contains itself (only `A<A<T>>`, `A<A<A<T>>>`, etc.), an endless recursion ensues until the stack overflows.
In this PR, I have attempted to fix this behavior by implementing a two-phase checking: When checking `B`, my code first checks `A` _separately_ and stops if `A` already turns out to be infinite. If not (such as for `Option<T>`), the second phase checks whether the root type (`B`) is ever nested inside itself, e.g.:
```rust
struct Foo { x: Option<Option<Foo>> }
```
Special care needs to be taken for mutually recursive types, e.g.:
```rust
struct A<T> {
z: T,
x: B<T>,
}
struct B<T> {
y: A<T>
}
```
Here, both `A` and `B` both _are_ `SelfRecursive` and _contain_ a recursive type. The current behavior, which I have maintained, is to treat both `A` and `B` as `SelfRecursive`, and accordingly report errors for both.
Fix `tidy` platform-specific code check
I noticed new platform-specific code was introduced outside of `std::sys` ([example](https://github.com/rust-lang/rust/blob/master/library/std/src/thread/available_concurrency.rs)), which should have been checked against by `tidy`. Apparently there are 2 problems with the current check implementation:
- It ignores everything after encountering "mod tests", which is often at the very top of a file.
- There was a bug where when checking the byte immediately before a found string, the first byte of the file was checked instead.
I fixed the bug and made excluding tests a bit more robust by instead adding the following rules:
- Files with a path containing either `tests` or `benches` are excluded.
- A `cfg(...)` containing `test` is excluded.
(Tests are excluded because almost all tests have something like `#[cfg(not(target_os = "emscripten"))]` somewhere.)
The fixed check found some more cases of platform-specific code; for now I have explicitly excluded them and added a FIXME stating that the platform-specific code must be moved to `sys`.
Rollup of 4 pull requests
Successful merges:
- #84465 (rustdoc: Implement `is_primitive` in terms of `primitive_type()`)
- #85118 (Use an SVG image for clipboard instead of unicode character)
- #85148 (Fix source code line number display and make it clickable again)
- #85152 (Adjust target search algorithm for rustlib path)
Failed merges:
r? `@ghost`
`@rustbot` modify labels: rollup
Fix source code line number display and make it clickable again
Fixes https://github.com/rust-lang/rust/issues/85119.
I used the same logic we're using for other codeblocks: putting the line number `<span>`s into the `example-wrap` directly and then add `display: inline-flex` on `example-wrap`.
r? `@jsha`