Rollup merge of #116379 - fmease:opaq-hid-inf-bnds-non-lt-bndrs, r=compiler-errors

non_lifetime_binders: fix ICE in lint opaque-hidden-inferred-bound

Opaque types like `impl for<T> Trait<T>` would previously lead to an ICE.

r? `@compiler-errors`
This commit is contained in:
Matthias Krüger 2023-10-03 16:24:17 +02:00 committed by GitHub
commit 9143370868
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 30 additions and 7 deletions

View File

@ -37,8 +37,6 @@
/// type Assoc: Duh;
/// }
///
/// struct Struct;
///
/// impl<F: Duh> Trait for F {
/// type Assoc = F;
/// }
@ -53,12 +51,12 @@
/// {{produces}}
///
/// In this example, `test` declares that the associated type `Assoc` for
/// `impl Trait` is `impl Sized`, which does not satisfy the `Send` bound
/// `impl Trait` is `impl Sized`, which does not satisfy the bound `Duh`
/// on the associated type.
///
/// Although the hidden type, `i32` does satisfy this bound, we do not
/// consider the return type to be well-formed with this lint. It can be
/// fixed by changing `Tait = impl Sized` into `Tait = impl Sized + Send`.
/// fixed by changing `Tait = impl Sized` into `Tait = impl Sized + Duh`.
pub OPAQUE_HIDDEN_INFERRED_BOUND,
Warn,
"detects the use of nested `impl Trait` types in associated type bounds that are not general enough"
@ -79,9 +77,7 @@ fn check_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx hir::Item<'tcx>) {
for (pred, pred_span) in
cx.tcx.explicit_item_bounds(def_id).instantiate_identity_iter_copied()
{
// Liberate bound regions in the predicate since we
// don't actually care about lifetimes in this check.
let predicate = cx.tcx.liberate_late_bound_regions(def_id, pred.kind());
let predicate = infcx.instantiate_binder_with_placeholders(pred.kind());
let ty::ClauseKind::Projection(proj) = predicate else {
continue;
};

View File

@ -0,0 +1,16 @@
// check-pass
#![feature(non_lifetime_binders)]
//~^ WARN the feature `non_lifetime_binders` is incomplete
trait Trait<T: ?Sized> {}
impl<T: ?Sized> Trait<T> for i32 {}
fn produce() -> impl for<T> Trait<T> {
16
}
fn main() {
let _ = produce();
}

View File

@ -0,0 +1,11 @@
warning: the feature `non_lifetime_binders` is incomplete and may not be safe to use and/or cause compiler crashes
--> $DIR/on-rpit.rs:3:12
|
LL | #![feature(non_lifetime_binders)]
| ^^^^^^^^^^^^^^^^^^^^
|
= note: see issue #108185 <https://github.com/rust-lang/rust/issues/108185> for more information
= note: `#[warn(incomplete_features)]` on by default
warning: 1 warning emitted