Skip to content

Commit

Permalink
Rollup merge of #108744 - compiler-errors:non_lifetime_binders-bad-co…
Browse files Browse the repository at this point in the history
…py-clone, r=jackh726

Don't ICE when encountering bound var in builtin copy/clone bounds

Fixes #108742
  • Loading branch information
matthiaskrgr committed Mar 5, 2023
2 parents 03c1e4d + 32f1f01 commit ec16270
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 5 deletions.
11 changes: 6 additions & 5 deletions compiler/rustc_trait_selection/src/traits/select/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2149,7 +2149,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
ty::Alias(..) | ty::Param(_) | ty::Placeholder(..) => None,
ty::Infer(ty::TyVar(_)) => Ambiguous,

// We can make this an ICE if/once we actually instantiate the trait obligation.
// We can make this an ICE if/once we actually instantiate the trait obligation eagerly.
ty::Bound(..) => None,

ty::Infer(ty::FreshTy(_) | ty::FreshIntTy(_) | ty::FreshFloatTy(_)) => {
Expand Down Expand Up @@ -2257,7 +2257,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
}
}

ty::Adt(..) | ty::Alias(..) | ty::Param(..) => {
ty::Adt(..) | ty::Alias(..) | ty::Param(..) | ty::Placeholder(..) => {
// Fallback to whatever user-defined impls exist in this case.
None
}
Expand All @@ -2269,9 +2269,10 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
Ambiguous
}

ty::Placeholder(..)
| ty::Bound(..)
| ty::Infer(ty::FreshTy(_) | ty::FreshIntTy(_) | ty::FreshFloatTy(_)) => {
// We can make this an ICE if/once we actually instantiate the trait obligation eagerly.
ty::Bound(..) => None,

ty::Infer(ty::FreshTy(_) | ty::FreshIntTy(_) | ty::FreshFloatTy(_)) => {
bug!("asked to assemble builtin bounds of unexpected type: {:?}", self_ty);
}
}
Expand Down
9 changes: 9 additions & 0 deletions tests/ui/traits/non_lifetime_binders/bad-copy-cond.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#![feature(non_lifetime_binders)]
//~^ WARN the feature `non_lifetime_binders` is incomplete

fn foo() where for<T> T: Copy {}

fn main() {
foo();
//~^ ERROR the trait bound `T: Copy` is not satisfied
}
24 changes: 24 additions & 0 deletions tests/ui/traits/non_lifetime_binders/bad-copy-cond.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
warning: the feature `non_lifetime_binders` is incomplete and may not be safe to use and/or cause compiler crashes
--> $DIR/bad-copy-cond.rs:1: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

error[E0277]: the trait bound `T: Copy` is not satisfied
--> $DIR/bad-copy-cond.rs:7:5
|
LL | foo();
| ^^^ the trait `Copy` is not implemented for `T`
|
note: required by a bound in `foo`
--> $DIR/bad-copy-cond.rs:4:26
|
LL | fn foo() where for<T> T: Copy {}
| ^^^^ required by this bound in `foo`

error: aborting due to previous error; 1 warning emitted

For more information about this error, try `rustc --explain E0277`.

0 comments on commit ec16270

Please sign in to comment.