Auto merge of #105918 - matthiaskrgr:rollup-mmazd62, r=matthiaskrgr
Rollup of 7 pull requests Successful merges: - #105801 (Realistic `Path::as_mut_os_str` doctest) - #105860 (Add long error docs for `E0460` and `E0457`) - #105895 (Test that we don't add a new kind of breaking change with TAITs) - #105902 (docs: improve pin docs) - #105910 (Update books) - #105913 (rustdoc: remove width-limiter from source pages, stop overriding CSS) - #105915 (Revert "Replace usage of `ResumeTy` in async lowering with `Context`") Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
c43bc13562
36 changed files with 250 additions and 85 deletions
|
@ -16,7 +16,7 @@ use rustc_hir::def::Res;
|
|||
use rustc_hir::definitions::DefPathData;
|
||||
use rustc_session::errors::report_lit_error;
|
||||
use rustc_span::source_map::{respan, DesugaringKind, Span, Spanned};
|
||||
use rustc_span::symbol::{kw, sym, Ident};
|
||||
use rustc_span::symbol::{sym, Ident};
|
||||
use rustc_span::DUMMY_SP;
|
||||
use thin_vec::thin_vec;
|
||||
|
||||
|
@ -596,38 +596,14 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
) -> hir::ExprKind<'hir> {
|
||||
let output = ret_ty.unwrap_or_else(|| hir::FnRetTy::DefaultReturn(self.lower_span(span)));
|
||||
|
||||
// Resume argument type, which should be `&mut Context<'_>`.
|
||||
// NOTE: Using the `'static` lifetime here is technically cheating.
|
||||
// The `Future::poll` argument really is `&'a mut Context<'b>`, but we cannot
|
||||
// express the fact that we are not storing it across yield-points yet,
|
||||
// and we would thus run into lifetime errors.
|
||||
// See <https://github.com/rust-lang/rust/issues/68923>.
|
||||
// Our lowering makes sure we are not mis-using the `_task_context` input type
|
||||
// in the sense that we are indeed not using it across yield points. We
|
||||
// get a fresh `&mut Context` for each resume / call of `Future::poll`.
|
||||
// This "cheating" was previously done with a `ResumeTy` that contained a raw
|
||||
// pointer, and a `get_context` accessor that pulled the `Context` lifetimes
|
||||
// out of thin air.
|
||||
let context_lifetime_ident = Ident::with_dummy_span(kw::StaticLifetime);
|
||||
let context_lifetime = self.arena.alloc(hir::Lifetime {
|
||||
hir_id: self.next_id(),
|
||||
ident: context_lifetime_ident,
|
||||
res: hir::LifetimeName::Static,
|
||||
});
|
||||
let context_path =
|
||||
hir::QPath::LangItem(hir::LangItem::Context, self.lower_span(span), None);
|
||||
let context_ty = hir::MutTy {
|
||||
ty: self.arena.alloc(hir::Ty {
|
||||
hir_id: self.next_id(),
|
||||
kind: hir::TyKind::Path(context_path),
|
||||
span: self.lower_span(span),
|
||||
}),
|
||||
mutbl: hir::Mutability::Mut,
|
||||
};
|
||||
// Resume argument type: `ResumeTy`
|
||||
let unstable_span =
|
||||
self.mark_span_with_reason(DesugaringKind::Async, span, self.allow_gen_future.clone());
|
||||
let resume_ty = hir::QPath::LangItem(hir::LangItem::ResumeTy, unstable_span, None);
|
||||
let input_ty = hir::Ty {
|
||||
hir_id: self.next_id(),
|
||||
kind: hir::TyKind::Rptr(context_lifetime, context_ty),
|
||||
span: self.lower_span(span),
|
||||
kind: hir::TyKind::Path(resume_ty),
|
||||
span: unstable_span,
|
||||
};
|
||||
|
||||
// The closure/generator `FnDecl` takes a single (resume) argument of type `input_ty`.
|
||||
|
@ -686,9 +662,12 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
.map_or(false, |attrs| attrs.into_iter().any(|attr| attr.has_name(sym::track_caller)));
|
||||
|
||||
let hir_id = self.lower_node_id(closure_node_id);
|
||||
let unstable_span =
|
||||
self.mark_span_with_reason(DesugaringKind::Async, span, self.allow_gen_future.clone());
|
||||
if track_caller {
|
||||
let unstable_span = self.mark_span_with_reason(
|
||||
DesugaringKind::Async,
|
||||
span,
|
||||
self.allow_gen_future.clone(),
|
||||
);
|
||||
self.lower_attrs(
|
||||
hir_id,
|
||||
&[Attribute {
|
||||
|
@ -731,7 +710,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
/// mut __awaitee => loop {
|
||||
/// match unsafe { ::std::future::Future::poll(
|
||||
/// <::std::pin::Pin>::new_unchecked(&mut __awaitee),
|
||||
/// task_context,
|
||||
/// ::std::future::get_context(task_context),
|
||||
/// ) } {
|
||||
/// ::std::task::Poll::Ready(result) => break result,
|
||||
/// ::std::task::Poll::Pending => {}
|
||||
|
@ -772,7 +751,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
// unsafe {
|
||||
// ::std::future::Future::poll(
|
||||
// ::std::pin::Pin::new_unchecked(&mut __awaitee),
|
||||
// task_context,
|
||||
// ::std::future::get_context(task_context),
|
||||
// )
|
||||
// }
|
||||
let poll_expr = {
|
||||
|
@ -790,10 +769,16 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
arena_vec![self; ref_mut_awaitee],
|
||||
Some(expr_hir_id),
|
||||
);
|
||||
let get_context = self.expr_call_lang_item_fn_mut(
|
||||
gen_future_span,
|
||||
hir::LangItem::GetContext,
|
||||
arena_vec![self; task_context],
|
||||
Some(expr_hir_id),
|
||||
);
|
||||
let call = self.expr_call_lang_item_fn(
|
||||
span,
|
||||
hir::LangItem::FuturePoll,
|
||||
arena_vec![self; new_unchecked, task_context],
|
||||
arena_vec![self; new_unchecked, get_context],
|
||||
Some(expr_hir_id),
|
||||
);
|
||||
self.arena.alloc(self.expr_unsafe(call))
|
||||
|
|
|
@ -239,8 +239,10 @@ E0452: include_str!("./error_codes/E0452.md"),
|
|||
E0453: include_str!("./error_codes/E0453.md"),
|
||||
E0454: include_str!("./error_codes/E0454.md"),
|
||||
E0455: include_str!("./error_codes/E0455.md"),
|
||||
E0457: include_str!("./error_codes/E0457.md"),
|
||||
E0458: include_str!("./error_codes/E0458.md"),
|
||||
E0459: include_str!("./error_codes/E0459.md"),
|
||||
E0460: include_str!("./error_codes/E0460.md"),
|
||||
E0463: include_str!("./error_codes/E0463.md"),
|
||||
E0464: include_str!("./error_codes/E0464.md"),
|
||||
E0466: include_str!("./error_codes/E0466.md"),
|
||||
|
@ -592,8 +594,6 @@ E0791: include_str!("./error_codes/E0791.md"),
|
|||
// E0421, // merged into 531
|
||||
// E0427, // merged into 530
|
||||
// E0456, // plugin `..` is not available for triple `..`
|
||||
E0457, // plugin `..` only found in rlib format, but must be available...
|
||||
E0460, // found possibly newer version of crate `..`
|
||||
E0461, // couldn't find crate `..` with expected target triple ..
|
||||
E0462, // found staticlib `..` instead of rlib or dylib
|
||||
E0465, // multiple .. candidates for `..` found
|
||||
|
|
36
compiler/rustc_error_codes/src/error_codes/E0457.md
Normal file
36
compiler/rustc_error_codes/src/error_codes/E0457.md
Normal file
|
@ -0,0 +1,36 @@
|
|||
Plugin `..` only found in rlib format, but must be available in dylib format.
|
||||
|
||||
Erroronous code example:
|
||||
|
||||
`rlib-plugin.rs`
|
||||
```ignore (needs-linkage-with-other-tests)
|
||||
#![crate_type = "rlib"]
|
||||
#![feature(rustc_private)]
|
||||
|
||||
extern crate rustc_middle;
|
||||
extern crate rustc_driver;
|
||||
|
||||
use rustc_driver::plugin::Registry;
|
||||
|
||||
#[no_mangle]
|
||||
fn __rustc_plugin_registrar(_: &mut Registry) {}
|
||||
```
|
||||
|
||||
`main.rs`
|
||||
```ignore (needs-linkage-with-other-tests)
|
||||
#![feature(plugin)]
|
||||
#![plugin(rlib_plugin)] // error: plugin `rlib_plugin` only found in rlib
|
||||
// format, but must be available in dylib
|
||||
|
||||
fn main() {}
|
||||
```
|
||||
|
||||
The compiler exposes a plugin interface to allow altering the compile process
|
||||
(adding lints, etc). Plugins must be defined in their own crates (similar to
|
||||
[proc-macro](../reference/procedural-macros.html) isolation) and then compiled
|
||||
and linked to another crate. Plugin crates *must* be compiled to the
|
||||
dynamically-linked dylib format, and not the statically-linked rlib format.
|
||||
Learn more about different output types in
|
||||
[this section](../reference/linkage.html) of the Rust reference.
|
||||
|
||||
This error is easily fixed by recompiling the plugin crate in the dylib format.
|
71
compiler/rustc_error_codes/src/error_codes/E0460.md
Normal file
71
compiler/rustc_error_codes/src/error_codes/E0460.md
Normal file
|
@ -0,0 +1,71 @@
|
|||
Found possibly newer version of crate `..` which `..` depends on.
|
||||
|
||||
Consider these erroneous files:
|
||||
|
||||
`a1.rs`
|
||||
```ignore (needs-linkage-with-other-tests)
|
||||
#![crate_name = "a"]
|
||||
|
||||
pub fn foo<T>() {}
|
||||
```
|
||||
|
||||
`a2.rs`
|
||||
```ignore (needs-linkage-with-other-tests)
|
||||
#![crate_name = "a"]
|
||||
|
||||
pub fn foo<T>() {
|
||||
println!("foo<T>()");
|
||||
}
|
||||
```
|
||||
|
||||
`b.rs`
|
||||
```ignore (needs-linkage-with-other-tests)
|
||||
#![crate_name = "b"]
|
||||
|
||||
extern crate a; // linked with `a1.rs`
|
||||
|
||||
pub fn foo() {
|
||||
a::foo::<isize>();
|
||||
}
|
||||
```
|
||||
|
||||
`main.rs`
|
||||
```ignore (needs-linkage-with-other-tests)
|
||||
extern crate a; // linked with `a2.rs`
|
||||
extern crate b; // error: found possibly newer version of crate `a` which `b`
|
||||
// depends on
|
||||
|
||||
fn main() {}
|
||||
```
|
||||
|
||||
The dependency graph of this program can be represented as follows:
|
||||
```text
|
||||
crate `main`
|
||||
|
|
||||
+-------------+
|
||||
| |
|
||||
| v
|
||||
depends: | crate `b`
|
||||
`a` v1 | |
|
||||
| | depends:
|
||||
| | `a` v2
|
||||
v |
|
||||
crate `a` <------+
|
||||
```
|
||||
|
||||
Crate `main` depends on crate `a` (version 1) and crate `b` which in turn
|
||||
depends on crate `a` (version 2); this discrepancy in versions cannot be
|
||||
reconciled. This difference in versions typically occurs when one crate is
|
||||
compiled and linked, then updated and linked to another crate. The crate
|
||||
"version" is a SVH (Strict Version Hash) of the crate in an
|
||||
implementation-specific way. Note that this error can *only* occur when
|
||||
directly compiling and linking with `rustc`; [Cargo] automatically resolves
|
||||
dependencies, without using the compiler's own dependency management that
|
||||
causes this issue.
|
||||
|
||||
This error can be fixed by:
|
||||
* Using [Cargo], the Rust package manager, automatically fixing this issue.
|
||||
* Recompiling crate `a` so that both crate `b` and `main` have a uniform
|
||||
version to depend on.
|
||||
|
||||
[Cargo]: ../cargo/index.html
|
|
@ -286,9 +286,10 @@ language_item_table! {
|
|||
|
||||
// FIXME(swatinem): the following lang items are used for async lowering and
|
||||
// should become obsolete eventually.
|
||||
ResumeTy, sym::ResumeTy, resume_ty, Target::Struct, GenericRequirement::None;
|
||||
IdentityFuture, sym::identity_future, identity_future_fn, Target::Fn, GenericRequirement::None;
|
||||
GetContext, sym::get_context, get_context_fn, Target::Fn, GenericRequirement::None;
|
||||
|
||||
Context, sym::Context, context, Target::Struct, GenericRequirement::None;
|
||||
FuturePoll, sym::poll, future_poll_fn, Target::Method(MethodKind::Trait { body: false }), GenericRequirement::None;
|
||||
|
||||
FromFrom, sym::from, from_fn, Target::Method(MethodKind::Trait { body: false }), GenericRequirement::None;
|
||||
|
|
|
@ -164,7 +164,6 @@ symbols! {
|
|||
Capture,
|
||||
Center,
|
||||
Clone,
|
||||
Context,
|
||||
Continue,
|
||||
Copy,
|
||||
Count,
|
||||
|
@ -264,6 +263,7 @@ symbols! {
|
|||
Relaxed,
|
||||
Release,
|
||||
Result,
|
||||
ResumeTy,
|
||||
Return,
|
||||
Right,
|
||||
Rust,
|
||||
|
@ -753,6 +753,7 @@ symbols! {
|
|||
generic_associated_types_extended,
|
||||
generic_const_exprs,
|
||||
generic_param_attrs,
|
||||
get_context,
|
||||
global_allocator,
|
||||
global_asm,
|
||||
globs,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue