Don't ICE when computing PointerLike trait when region vars are in param-env
This commit is contained in:
parent
1b67f8b013
commit
3a2710cdb6
5 changed files with 68 additions and 10 deletions
|
@ -177,14 +177,18 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> {
|
||||||
return Err(NoSolution);
|
return Err(NoSolution);
|
||||||
}
|
}
|
||||||
|
|
||||||
if goal.predicate.self_ty().has_non_region_infer() {
|
// The regions of a type don't affect the size of the type
|
||||||
|
let tcx = ecx.tcx();
|
||||||
|
// We should erase regions from both the param-env and type, since both
|
||||||
|
// may have infer regions. Specifically, after canonicalizing and instantiating,
|
||||||
|
// early bound regions turn into region vars in both the new and old solver.
|
||||||
|
let key = tcx.erase_regions(goal.param_env.and(goal.predicate.self_ty()));
|
||||||
|
// But if there are inference variables, we have to wait until it's resolved.
|
||||||
|
if key.has_non_region_infer() {
|
||||||
return ecx.evaluate_added_goals_and_make_canonical_response(Certainty::AMBIGUOUS);
|
return ecx.evaluate_added_goals_and_make_canonical_response(Certainty::AMBIGUOUS);
|
||||||
}
|
}
|
||||||
|
|
||||||
let tcx = ecx.tcx();
|
if let Ok(layout) = tcx.layout_of(key)
|
||||||
let self_ty = tcx.erase_regions(goal.predicate.self_ty());
|
|
||||||
|
|
||||||
if let Ok(layout) = tcx.layout_of(goal.param_env.and(self_ty))
|
|
||||||
&& layout.layout.is_pointer_like(&tcx.data_layout)
|
&& layout.layout.is_pointer_like(&tcx.data_layout)
|
||||||
{
|
{
|
||||||
// FIXME: We could make this faster by making a no-constraints response
|
// FIXME: We could make this faster by making a no-constraints response
|
||||||
|
|
|
@ -967,16 +967,18 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||||
) {
|
) {
|
||||||
// The regions of a type don't affect the size of the type
|
// The regions of a type don't affect the size of the type
|
||||||
let tcx = self.tcx();
|
let tcx = self.tcx();
|
||||||
let self_ty =
|
let self_ty = tcx.erase_late_bound_regions(obligation.predicate.self_ty());
|
||||||
tcx.erase_regions(tcx.erase_late_bound_regions(obligation.predicate.self_ty()));
|
// We should erase regions from both the param-env and type, since both
|
||||||
|
// may have infer regions. Specifically, after canonicalizing and instantiating,
|
||||||
|
// early bound regions turn into region vars in both the new and old solver.
|
||||||
|
let key = tcx.erase_regions(obligation.param_env.and(self_ty));
|
||||||
// But if there are inference variables, we have to wait until it's resolved.
|
// But if there are inference variables, we have to wait until it's resolved.
|
||||||
if self_ty.has_non_region_infer() {
|
if key.has_non_region_infer() {
|
||||||
candidates.ambiguous = true;
|
candidates.ambiguous = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Ok(layout) = tcx.layout_of(obligation.param_env.and(self_ty))
|
if let Ok(layout) = tcx.layout_of(key)
|
||||||
&& layout.layout.is_pointer_like(&tcx.data_layout)
|
&& layout.layout.is_pointer_like(&tcx.data_layout)
|
||||||
{
|
{
|
||||||
candidates.vec.push(BuiltinCandidate { has_nested: false });
|
candidates.vec.push(BuiltinCandidate { has_nested: false });
|
||||||
|
|
18
tests/ui/dyn-star/param-env-infer.current.stderr
Normal file
18
tests/ui/dyn-star/param-env-infer.current.stderr
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
warning: the feature `dyn_star` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||||
|
--> $DIR/param-env-infer.rs:5:12
|
||||||
|
|
|
||||||
|
LL | #![feature(dyn_star, pointer_like_trait)]
|
||||||
|
| ^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: see issue #102425 <https://github.com/rust-lang/rust/issues/102425> for more information
|
||||||
|
= note: `#[warn(incomplete_features)]` on by default
|
||||||
|
|
||||||
|
error[E0282]: type annotations needed
|
||||||
|
--> $DIR/param-env-infer.rs:12:10
|
||||||
|
|
|
||||||
|
LL | t as _
|
||||||
|
| ^ cannot infer type
|
||||||
|
|
||||||
|
error: aborting due to previous error; 1 warning emitted
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0282`.
|
18
tests/ui/dyn-star/param-env-infer.next.stderr
Normal file
18
tests/ui/dyn-star/param-env-infer.next.stderr
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
warning: the feature `dyn_star` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||||
|
--> $DIR/param-env-infer.rs:5:12
|
||||||
|
|
|
||||||
|
LL | #![feature(dyn_star, pointer_like_trait)]
|
||||||
|
| ^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: see issue #102425 <https://github.com/rust-lang/rust/issues/102425> for more information
|
||||||
|
= note: `#[warn(incomplete_features)]` on by default
|
||||||
|
|
||||||
|
error[E0282]: type annotations needed
|
||||||
|
--> $DIR/param-env-infer.rs:12:10
|
||||||
|
|
|
||||||
|
LL | t as _
|
||||||
|
| ^ cannot infer type
|
||||||
|
|
||||||
|
error: aborting due to previous error; 1 warning emitted
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0282`.
|
16
tests/ui/dyn-star/param-env-infer.rs
Normal file
16
tests/ui/dyn-star/param-env-infer.rs
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
// revisions: current next
|
||||||
|
//[next] compile-flags: -Ztrait-solver=next
|
||||||
|
// incremental
|
||||||
|
|
||||||
|
#![feature(dyn_star, pointer_like_trait)]
|
||||||
|
//~^ WARN the feature `dyn_star` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||||
|
|
||||||
|
use std::fmt::Debug;
|
||||||
|
use std::marker::PointerLike;
|
||||||
|
|
||||||
|
fn make_dyn_star<'a, T: PointerLike + Debug + 'a>(t: T) -> impl PointerLike + Debug + 'a {
|
||||||
|
t as _
|
||||||
|
//~^ ERROR type annotations needed
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
Loading…
Add table
Add a link
Reference in a new issue