diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2024-03-13 20:01:58 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-03-13 20:01:58 +0100 |
| commit | c52ce4eabba65fcc47ce92c20c3e7e6dd73f77df (patch) | |
| tree | 17ee68472dd40a4f37c33118f0fa4c2ffd5bafe0 | |
| parent | 8d2f79c3f189f552e0dbc5fdfafcf3fc6b9e6037 (diff) | |
| parent | 026eb3dd6457f223ff1c3a3b40bf59898a25061a (diff) | |
| download | rust-c52ce4eabba65fcc47ce92c20c3e7e6dd73f77df.tar.gz rust-c52ce4eabba65fcc47ce92c20c3e7e6dd73f77df.zip | |
Rollup merge of #122449 - compiler-errors:stranded-opaque, r=oli-obk
Delay a bug for stranded opaques r? oli-obk Fixes #122445
| -rw-r--r-- | compiler/rustc_hir_analysis/src/check/check.rs | 8 | ||||
| -rw-r--r-- | tests/ui/impl-trait/stranded-opaque.rs | 13 | ||||
| -rw-r--r-- | tests/ui/impl-trait/stranded-opaque.stderr | 9 |
3 files changed, 29 insertions, 1 deletions
diff --git a/compiler/rustc_hir_analysis/src/check/check.rs b/compiler/rustc_hir_analysis/src/check/check.rs index 1b8174d3d18..d1fed13ee9f 100644 --- a/compiler/rustc_hir_analysis/src/check/check.rs +++ b/compiler/rustc_hir_analysis/src/check/check.rs @@ -381,11 +381,17 @@ fn check_opaque_meets_bounds<'tcx>( match ocx.eq(&misc_cause, param_env, opaque_ty, hidden_ty) { Ok(()) => {} Err(ty_err) => { + // Some types may be left "stranded" if they can't be reached + // from an astconv'd bound but they're mentioned in the HIR. This + // will happen, e.g., when a nested opaque is inside of a non- + // existent associated type, like `impl Trait<Missing = impl Trait>`. + // See <tests/ui/impl-trait/stranded-opaque.rs>. let ty_err = ty_err.to_string(tcx); - tcx.dcx().span_bug( + let guar = tcx.dcx().span_delayed_bug( span, format!("could not unify `{hidden_ty}` with revealed type:\n{ty_err}"), ); + return Err(guar); } } diff --git a/tests/ui/impl-trait/stranded-opaque.rs b/tests/ui/impl-trait/stranded-opaque.rs new file mode 100644 index 00000000000..c7ab390e1fd --- /dev/null +++ b/tests/ui/impl-trait/stranded-opaque.rs @@ -0,0 +1,13 @@ +trait Trait {} + +impl Trait for i32 {} + +// Since `Assoc` doesn't actually exist, it's "stranded", and won't show up in +// the list of opaques that may be defined by the function. Make sure we don't +// ICE in this case. +fn produce<T>() -> impl Trait<Assoc = impl Trait> { + //~^ ERROR associated type `Assoc` not found for `Trait` + 16 +} + +fn main () {} diff --git a/tests/ui/impl-trait/stranded-opaque.stderr b/tests/ui/impl-trait/stranded-opaque.stderr new file mode 100644 index 00000000000..75f5480bc8b --- /dev/null +++ b/tests/ui/impl-trait/stranded-opaque.stderr @@ -0,0 +1,9 @@ +error[E0220]: associated type `Assoc` not found for `Trait` + --> $DIR/stranded-opaque.rs:8:31 + | +LL | fn produce<T>() -> impl Trait<Assoc = impl Trait> { + | ^^^^^ associated type `Assoc` not found + +error: aborting due to 1 previous error + +For more information about this error, try `rustc --explain E0220`. |
