diff options
| author | Michael Goulet <michael@errs.io> | 2025-04-08 17:00:11 +0000 |
|---|---|---|
| committer | Michael Goulet <michael@errs.io> | 2025-04-08 17:00:29 +0000 |
| commit | 68692b7fbb674ea51c0b504ac4b8cc791311b10d (patch) | |
| tree | 23d1c8d1efac365ade1c177697f6d44a8b4cdcc7 | |
| parent | c6c179662d5a6fc0520e05b5c0682dcfc7333f77 (diff) | |
| download | rust-68692b7fbb674ea51c0b504ac4b8cc791311b10d.tar.gz rust-68692b7fbb674ea51c0b504ac4b8cc791311b10d.zip | |
Instantiate higher-ranked transmute goal
| -rw-r--r-- | compiler/rustc_trait_selection/src/traits/select/confirmation.rs | 6 | ||||
| -rw-r--r-- | tests/ui/transmutability/transmute-higher-ranked.rs | 18 |
2 files changed, 21 insertions, 3 deletions
diff --git a/compiler/rustc_trait_selection/src/traits/select/confirmation.rs b/compiler/rustc_trait_selection/src/traits/select/confirmation.rs index 2cb7d2d8931..e78abc84137 100644 --- a/compiler/rustc_trait_selection/src/traits/select/confirmation.rs +++ b/compiler/rustc_trait_selection/src/traits/select/confirmation.rs @@ -317,7 +317,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { obligation.cause.clone(), obligation.recursion_depth + 1, obligation.param_env, - obligation.predicate.rebind(trait_ref), + trait_ref, ) }; @@ -343,7 +343,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { obligation.cause.clone(), obligation.recursion_depth + 1, obligation.param_env, - obligation.predicate.rebind(outlives), + outlives, ) }; @@ -404,7 +404,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { } } - let predicate = obligation.predicate.skip_binder(); + let predicate = self.infcx.enter_forall_and_leak_universe(obligation.predicate); let mut assume = predicate.trait_ref.args.const_at(2); // FIXME(mgca): We should shallowly normalize this. diff --git a/tests/ui/transmutability/transmute-higher-ranked.rs b/tests/ui/transmutability/transmute-higher-ranked.rs new file mode 100644 index 00000000000..f0fe02a7908 --- /dev/null +++ b/tests/ui/transmutability/transmute-higher-ranked.rs @@ -0,0 +1,18 @@ +// Ensure we don't ICE when transmuting higher-ranked types via a +// higher-ranked transmute goal. + +//@ check-pass + +#![feature(transmutability)] + +use std::mem::TransmuteFrom; + +pub fn transmute() +where + for<'a> &'a &'a i32: TransmuteFrom<&'a &'a u32>, +{ +} + +fn main() { + transmute(); +} |
