rust/tests
Matthias Krüger 4e510daed7
Rollup merge of #130866 - compiler-errors:dyn-instantiate-binder, r=lcnr
Allow instantiating object trait binder when upcasting

This PR fixes two bugs (that probably need an FCP).

### We use equality rather than subtyping for upcasting dyn conversions

This code should be valid:

```rust
#![feature(trait_upcasting)]

trait Foo: for<'h> Bar<'h> {}
trait Bar<'a> {}

fn foo(x: &dyn Foo) {
    let y: &dyn Bar<'static> = x;
}
```
But instead:

```
error[E0308]: mismatched types
 --> src/lib.rs:7:32
  |
7 |     let y: &dyn Bar<'static> = x;
  |                                ^ one type is more general than the other
  |
  = note: expected existential trait ref `for<'h> Bar<'h>`
             found existential trait ref `Bar<'_>`
```

And so should this:

```rust
#![feature(trait_upcasting)]

fn foo(x: &dyn for<'h> Fn(&'h ())) {
    let y: &dyn FnOnce(&'static ()) = x;
}
```

But instead:

```
error[E0308]: mismatched types
 --> src/lib.rs:4:39
  |
4 |     let y: &dyn FnOnce(&'static ()) = x;
  |                                       ^ one type is more general than the other
  |
  = note: expected existential trait ref `for<'h> FnOnce<(&'h (),)>`
             found existential trait ref `FnOnce<(&(),)>`
```

Specifically, both of these fail because we use *equality* when comparing the supertrait to the *target* of the unsize goal. For the first example, since our supertrait is `for<'h> Bar<'h>` but our target is `Bar<'static>`, there's a higher-ranked type mismatch even though we *should* be able to instantiate that supertrait binder when upcasting. Similarly for the second example.

### New solver uses equality rather than subtyping for no-op (i.e. non-upcasting) dyn conversions

This code should be valid in the new solver, like it is with the old solver:

```rust
// -Znext-solver

fn foo<'a>(x: &mut for<'h> dyn Fn(&'h ())) {
   let _: &mut dyn Fn(&'a ()) = x;
}
```

But instead:

```
error: lifetime may not live long enough
 --> <source>:2:11
  |
1 | fn foo<'a>(x: &mut dyn for<'h> Fn(&'h ())) {
  |        -- lifetime `'a` defined here
2 |    let _: &mut dyn Fn(&'a ()) = x;
  |           ^^^^^^^^^^^^^^^^^^^ type annotation requires that `'a` must outlive `'static`
  |
  = note: requirement occurs because of a mutable reference to `dyn Fn(&())`
```

Specifically, this fails because we try to coerce `&mut dyn for<'h> Fn(&'h ())` to `&mut dyn Fn(&'a ())`, which registers an `dyn for<'h> Fn(&'h ()): dyn Fn(&'a ())` goal. This fails because the new solver uses *equating* rather than *subtyping* in `Unsize` goals.

This is *mostly* not a problem... You may wonder why the same code passes on the new solver for immutable references:

```
// -Znext-solver

fn foo<'a>(x: &dyn Fn(&())) {
   let _: &dyn Fn(&'a ()) = x; // works
}
```

That's because in this case, we first try to coerce via `Unsize`, but due to the leak check the goal fails. Then, later in coercion, we fall back to a simple subtyping operation, which *does* work.

Since `&T` is covariant over `T`, but `&mut T` is invariant, that's where the discrepancy between these two examples crops up.

---

r? lcnr or reassign :D
2024-09-28 09:35:09 +02:00
..
assembly Rollup merge of #130549 - biabbas:riscv32_wrs_vxworks, r=nnethercote 2024-09-25 10:09:22 +02:00
auxiliary
codegen tests: Remove spuriously failing vec-tryinto-array codegen test 2024-09-22 16:46:10 -07:00
codegen-units Fix and enable disabled codegen-units tests 2024-08-10 14:03:27 -04:00
coverage Update the minimum external LLVM to 18 2024-09-18 13:53:31 -07:00
coverage-run-rustdoc coverage: Extract hole spans from HIR instead of MIR 2024-07-08 21:22:56 +10:00
crashes Rollup merge of #130917 - gurry:129503-ice-wrong-span-in-macros, r=chenyukang 2024-09-27 19:08:01 +02:00
debuginfo Reorder stack spills so that constants come later. 2024-09-17 16:45:26 -07:00
incremental simd_shuffle: require index argument to be a vector 2024-09-14 14:43:24 +02:00
mir-opt be even more precise about "cast" vs "coercion" 2024-09-24 23:12:02 +02:00
pretty Use doc(hidden) instead of allow(missing_docs) in the test harness 2024-09-11 12:14:35 +02:00
run-make Update run-make tests to use cargo wrapper cmd 2024-09-24 19:04:51 +08:00
run-pass-valgrind Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustdoc rustdoc: inherit parent's stability where applicable 2024-09-24 20:18:36 +02:00
rustdoc-gui Rollup merge of #129545 - notriddle:notriddle/toolbar-v2, r=GuillaumeGomez 2024-09-23 23:49:11 -04:00
rustdoc-js rustdoc-search: allow trailing Foo -> arg search 2024-09-05 17:58:05 -07:00
rustdoc-js-std Bless rustdoc-js-std test 2024-09-22 20:35:10 -04:00
rustdoc-json Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustdoc-ui Compiler: Rename "object safe" to "dyn compatible" 2024-09-25 13:26:48 +02:00
ui Rollup merge of #130866 - compiler-errors:dyn-instantiate-binder, r=lcnr 2024-09-28 09:35:09 +02:00
ui-fulldeps Auto merge of #130483 - matthiaskrgr:rollup-q1r0g0y, r=matthiaskrgr 2024-09-17 19:37:03 +00:00
COMPILER_TESTS.md