Skip to content

Commit

Permalink
Rollup merge of #116379 - fmease:opaq-hid-inf-bnds-non-lt-bndrs, r=co…
Browse files Browse the repository at this point in the history
…mpiler-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`
  • Loading branch information
matthiaskrgr authored Oct 3, 2023
2 parents 5dd9313 + 3f0a327 commit 9143370
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 7 deletions.
10 changes: 3 additions & 7 deletions compiler/rustc_lint/src/opaque_hidden_inferred_bound.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,6 @@ declare_lint! {
/// type Assoc: Duh;
/// }
///
/// struct Struct;
///
/// impl<F: Duh> Trait for F {
/// type Assoc = F;
/// }
Expand All @@ -53,12 +51,12 @@ declare_lint! {
/// {{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"
Expand All @@ -79,9 +77,7 @@ impl<'tcx> LateLintPass<'tcx> for OpaqueHiddenInferredBound {
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;
};
Expand Down
16 changes: 16 additions & 0 deletions tests/ui/traits/non_lifetime_binders/on-rpit.rs
Original file line number Diff line number Diff line change
@@ -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();
}
11 changes: 11 additions & 0 deletions tests/ui/traits/non_lifetime_binders/on-rpit.stderr
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 9143370

Please sign in to comment.