diff options
| author | Guillaume Gomez <guillaume1.gomez@gmail.com> | 2024-11-28 12:06:00 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-11-28 12:06:00 +0100 |
| commit | bda28518261081f0105b33bee379f6ac71dd8a3f (patch) | |
| tree | 45c090b83edfdb5f40b2abc395259687a5ef4051 | |
| parent | f005c7437def424a1c43cbc380352a58d8ac920b (diff) | |
| parent | 9455373d203addf6f34fc8ee25a9ee5211314dcb (diff) | |
| download | rust-bda28518261081f0105b33bee379f6ac71dd8a3f.tar.gz rust-bda28518261081f0105b33bee379f6ac71dd8a3f.zip | |
Rollup merge of #133358 - compiler-errors:pin-coerce, r=eholk
Don't type error if we fail to coerce `Pin<T>` because it doesnt contain a ref Fixes https://github.com/rust-lang/rust/issues/133222. Also moves some tests into a directory for better bookkeeping. r? eholk or re-roll
| -rw-r--r-- | compiler/rustc_hir_typeck/src/coercion.rs | 11 | ||||
| -rw-r--r-- | tests/ui/async-await/pin-ergonomics/coerce-non-pointer-pin.rs | 10 | ||||
| -rw-r--r-- | tests/ui/async-await/pin-ergonomics/coerce-non-pointer-pin.stderr | 11 | ||||
| -rw-r--r-- | tests/ui/async-await/pin-ergonomics/reborrow-arg.rs (renamed from tests/ui/async-await/pin-reborrow-arg.rs) | 0 | ||||
| -rw-r--r-- | tests/ui/async-await/pin-ergonomics/reborrow-const-as-mut.rs (renamed from tests/ui/async-await/pin-reborrow-const-as-mut.rs) | 0 | ||||
| -rw-r--r-- | tests/ui/async-await/pin-ergonomics/reborrow-const-as-mut.stderr (renamed from tests/ui/async-await/pin-reborrow-const-as-mut.stderr) | 4 | ||||
| -rw-r--r-- | tests/ui/async-await/pin-ergonomics/reborrow-once.rs (renamed from tests/ui/async-await/pin-reborrow-once.rs) | 0 | ||||
| -rw-r--r-- | tests/ui/async-await/pin-ergonomics/reborrow-once.stderr (renamed from tests/ui/async-await/pin-reborrow-once.stderr) | 2 | ||||
| -rw-r--r-- | tests/ui/async-await/pin-ergonomics/reborrow-self.rs (renamed from tests/ui/async-await/pin-reborrow-self.rs) | 0 | ||||
| -rw-r--r-- | tests/ui/async-await/pin-ergonomics/reborrow-shorter.rs (renamed from tests/ui/async-await/pin-reborrow-shorter.rs) | 0 | ||||
| -rw-r--r-- | tests/ui/async-await/pin-ergonomics/sugar-ambiguity.rs (renamed from tests/ui/async-await/pin-sugar-ambiguity.rs) | 0 | ||||
| -rw-r--r-- | tests/ui/async-await/pin-ergonomics/sugar-no-const.rs (renamed from tests/ui/async-await/pin-sugar-no-const.rs) | 0 | ||||
| -rw-r--r-- | tests/ui/async-await/pin-ergonomics/sugar-no-const.stderr (renamed from tests/ui/async-await/pin-sugar-no-const.stderr) | 2 | ||||
| -rw-r--r-- | tests/ui/async-await/pin-ergonomics/sugar.rs (renamed from tests/ui/async-await/pin-sugar.rs) | 0 |
14 files changed, 33 insertions, 7 deletions
diff --git a/compiler/rustc_hir_typeck/src/coercion.rs b/compiler/rustc_hir_typeck/src/coercion.rs index 11e03229265..bf41dcbe4a3 100644 --- a/compiler/rustc_hir_typeck/src/coercion.rs +++ b/compiler/rustc_hir_typeck/src/coercion.rs @@ -215,7 +215,9 @@ impl<'f, 'tcx> Coerce<'f, 'tcx> { } } - // Examine the supertype and consider auto-borrowing. + // Examine the supertype and consider type-specific coercions, such + // as auto-borrowing, coercing pointer mutability, a `dyn*` coercion, + // or pin-ergonomics. match *b.kind() { ty::RawPtr(_, b_mutbl) => { return self.coerce_unsafe_ptr(a, b, b_mutbl); @@ -230,7 +232,10 @@ impl<'f, 'tcx> Coerce<'f, 'tcx> { if self.tcx.features().pin_ergonomics() && self.tcx.is_lang_item(pin.did(), hir::LangItem::Pin) => { - return self.coerce_pin(a, b); + let pin_coerce = self.commit_if_ok(|_| self.coerce_pin_ref(a, b)); + if pin_coerce.is_ok() { + return pin_coerce; + } } _ => {} } @@ -797,7 +802,7 @@ impl<'f, 'tcx> Coerce<'f, 'tcx> { /// - `Pin<Box<T>>` as `Pin<&T>` /// - `Pin<Box<T>>` as `Pin<&mut T>` #[instrument(skip(self), level = "trace")] - fn coerce_pin(&self, a: Ty<'tcx>, b: Ty<'tcx>) -> CoerceResult<'tcx> { + fn coerce_pin_ref(&self, a: Ty<'tcx>, b: Ty<'tcx>) -> CoerceResult<'tcx> { // We need to make sure the two types are compatible for coercion. // Then we will build a ReborrowPin adjustment and return that as an InferOk. diff --git a/tests/ui/async-await/pin-ergonomics/coerce-non-pointer-pin.rs b/tests/ui/async-await/pin-ergonomics/coerce-non-pointer-pin.rs new file mode 100644 index 00000000000..a95665f126d --- /dev/null +++ b/tests/ui/async-await/pin-ergonomics/coerce-non-pointer-pin.rs @@ -0,0 +1,10 @@ +//@ check-pass + +#![feature(pin_ergonomics)] +//~^ WARN the feature `pin_ergonomics` is incomplete + +use std::pin::Pin; + +fn main() { + let _: Pin<Box<()>> = Box::pin(()); +} diff --git a/tests/ui/async-await/pin-ergonomics/coerce-non-pointer-pin.stderr b/tests/ui/async-await/pin-ergonomics/coerce-non-pointer-pin.stderr new file mode 100644 index 00000000000..2deb5b09884 --- /dev/null +++ b/tests/ui/async-await/pin-ergonomics/coerce-non-pointer-pin.stderr @@ -0,0 +1,11 @@ +warning: the feature `pin_ergonomics` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/coerce-non-pointer-pin.rs:3:12 + | +LL | #![feature(pin_ergonomics)] + | ^^^^^^^^^^^^^^ + | + = note: see issue #130494 <https://github.com/rust-lang/rust/issues/130494> for more information + = note: `#[warn(incomplete_features)]` on by default + +warning: 1 warning emitted + diff --git a/tests/ui/async-await/pin-reborrow-arg.rs b/tests/ui/async-await/pin-ergonomics/reborrow-arg.rs index 2008bd1f52d..2008bd1f52d 100644 --- a/tests/ui/async-await/pin-reborrow-arg.rs +++ b/tests/ui/async-await/pin-ergonomics/reborrow-arg.rs diff --git a/tests/ui/async-await/pin-reborrow-const-as-mut.rs b/tests/ui/async-await/pin-ergonomics/reborrow-const-as-mut.rs index 27c70a7b4df..27c70a7b4df 100644 --- a/tests/ui/async-await/pin-reborrow-const-as-mut.rs +++ b/tests/ui/async-await/pin-ergonomics/reborrow-const-as-mut.rs diff --git a/tests/ui/async-await/pin-reborrow-const-as-mut.stderr b/tests/ui/async-await/pin-ergonomics/reborrow-const-as-mut.stderr index 2c2d9ec2717..36bbf1c493a 100644 --- a/tests/ui/async-await/pin-reborrow-const-as-mut.stderr +++ b/tests/ui/async-await/pin-ergonomics/reborrow-const-as-mut.stderr @@ -1,5 +1,5 @@ error[E0308]: mismatched types - --> $DIR/pin-reborrow-const-as-mut.rs:14:9 + --> $DIR/reborrow-const-as-mut.rs:14:9 | LL | foo(x); | --- ^ types differ in mutability @@ -9,7 +9,7 @@ LL | foo(x); = note: expected struct `Pin<&mut Foo>` found struct `Pin<&Foo>` note: function defined here - --> $DIR/pin-reborrow-const-as-mut.rs:10:4 + --> $DIR/reborrow-const-as-mut.rs:10:4 | LL | fn foo(_: Pin<&mut Foo>) { | ^^^ ---------------- diff --git a/tests/ui/async-await/pin-reborrow-once.rs b/tests/ui/async-await/pin-ergonomics/reborrow-once.rs index 241efadef7d..241efadef7d 100644 --- a/tests/ui/async-await/pin-reborrow-once.rs +++ b/tests/ui/async-await/pin-ergonomics/reborrow-once.rs diff --git a/tests/ui/async-await/pin-reborrow-once.stderr b/tests/ui/async-await/pin-ergonomics/reborrow-once.stderr index b8fde8ffee8..a1ea2b4a57a 100644 --- a/tests/ui/async-await/pin-reborrow-once.stderr +++ b/tests/ui/async-await/pin-ergonomics/reborrow-once.stderr @@ -1,5 +1,5 @@ error[E0499]: cannot borrow `*x.__pointer` as mutable more than once at a time - --> $DIR/pin-reborrow-once.rs:12:14 + --> $DIR/reborrow-once.rs:12:14 | LL | twice(x, x); | ----- - ^ second mutable borrow occurs here diff --git a/tests/ui/async-await/pin-reborrow-self.rs b/tests/ui/async-await/pin-ergonomics/reborrow-self.rs index ee617617da0..ee617617da0 100644 --- a/tests/ui/async-await/pin-reborrow-self.rs +++ b/tests/ui/async-await/pin-ergonomics/reborrow-self.rs diff --git a/tests/ui/async-await/pin-reborrow-shorter.rs b/tests/ui/async-await/pin-ergonomics/reborrow-shorter.rs index 06c266e0035..06c266e0035 100644 --- a/tests/ui/async-await/pin-reborrow-shorter.rs +++ b/tests/ui/async-await/pin-ergonomics/reborrow-shorter.rs diff --git a/tests/ui/async-await/pin-sugar-ambiguity.rs b/tests/ui/async-await/pin-ergonomics/sugar-ambiguity.rs index d183000931e..d183000931e 100644 --- a/tests/ui/async-await/pin-sugar-ambiguity.rs +++ b/tests/ui/async-await/pin-ergonomics/sugar-ambiguity.rs diff --git a/tests/ui/async-await/pin-sugar-no-const.rs b/tests/ui/async-await/pin-ergonomics/sugar-no-const.rs index dd6456b6034..dd6456b6034 100644 --- a/tests/ui/async-await/pin-sugar-no-const.rs +++ b/tests/ui/async-await/pin-ergonomics/sugar-no-const.rs diff --git a/tests/ui/async-await/pin-sugar-no-const.stderr b/tests/ui/async-await/pin-ergonomics/sugar-no-const.stderr index 5f01156c1f0..822cfffcb8c 100644 --- a/tests/ui/async-await/pin-sugar-no-const.stderr +++ b/tests/ui/async-await/pin-ergonomics/sugar-no-const.stderr @@ -1,5 +1,5 @@ error: expected one of `!`, `(`, `::`, `;`, `<`, or `=`, found `i32` - --> $DIR/pin-sugar-no-const.rs:7:18 + --> $DIR/sugar-no-const.rs:7:18 | LL | let _x: &pin i32 = todo!(); | - ^^^ expected one of `!`, `(`, `::`, `;`, `<`, or `=` diff --git a/tests/ui/async-await/pin-sugar.rs b/tests/ui/async-await/pin-ergonomics/sugar.rs index 8dbdec418b1..8dbdec418b1 100644 --- a/tests/ui/async-await/pin-sugar.rs +++ b/tests/ui/async-await/pin-ergonomics/sugar.rs |
