Delay a bug when encountering an impl with unconstrained generics in codegen_select
This commit is contained in:
parent
f5be3ca1e3
commit
50fb40a987
4 changed files with 44 additions and 24 deletions
|
@ -74,12 +74,21 @@ pub(crate) fn codegen_select_candidate<'tcx>(
|
||||||
}
|
}
|
||||||
|
|
||||||
let impl_source = infcx.resolve_vars_if_possible(impl_source);
|
let impl_source = infcx.resolve_vars_if_possible(impl_source);
|
||||||
let impl_source = infcx.tcx.erase_regions(impl_source);
|
let impl_source = tcx.erase_regions(impl_source);
|
||||||
if impl_source.has_infer() {
|
if impl_source.has_non_region_infer() {
|
||||||
// Unused lifetimes on an impl get replaced with inference vars, but never resolved,
|
// Unused generic types or consts on an impl get replaced with inference vars,
|
||||||
// causing the return value of a query to contain inference vars. We do not have a concept
|
// but never resolved, causing the return value of a query to contain inference
|
||||||
// for this and will in fact ICE in stable hashing of the return value. So bail out instead.
|
// vars. We do not have a concept for this and will in fact ICE in stable hashing
|
||||||
infcx.tcx.dcx().has_errors().unwrap();
|
// of the return value. So bail out instead.
|
||||||
|
match impl_source {
|
||||||
|
ImplSource::UserDefined(impl_) => {
|
||||||
|
tcx.dcx().span_delayed_bug(
|
||||||
|
tcx.def_span(impl_.impl_def_id),
|
||||||
|
"this impl has unconstrained generic parameters",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
_ => unreachable!(),
|
||||||
|
}
|
||||||
return Err(CodegenObligationError::FulfillmentError);
|
return Err(CodegenObligationError::FulfillmentError);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,18 +0,0 @@
|
||||||
//@ known-bug: rust-lang/rust#126646
|
|
||||||
mod foo {
|
|
||||||
pub trait Callable {
|
|
||||||
type Output;
|
|
||||||
fn call() -> Self::Output;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a, V: ?Sized> Callable for &'a () {
|
|
||||||
type Output = ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
use foo::*;
|
|
||||||
|
|
||||||
fn test<'a>() -> impl Sized {
|
|
||||||
<&'a () as Callable>::call()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {}
|
|
20
tests/ui/traits/resolve-impl-before-constrain-check.rs
Normal file
20
tests/ui/traits/resolve-impl-before-constrain-check.rs
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
// Need a different module so we try to build the mir for `test`
|
||||||
|
// before analyzing `mod foo`.
|
||||||
|
|
||||||
|
mod foo {
|
||||||
|
pub trait Callable {
|
||||||
|
fn call();
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<V: ?Sized> Callable for () {
|
||||||
|
//~^ ERROR the type parameter `V` is not constrained by the impl trait, self type, or predicates
|
||||||
|
fn call() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
use foo::*;
|
||||||
|
|
||||||
|
fn test() -> impl Sized {
|
||||||
|
<() as Callable>::call()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
|
@ -0,0 +1,9 @@
|
||||||
|
error[E0207]: the type parameter `V` is not constrained by the impl trait, self type, or predicates
|
||||||
|
--> $DIR/resolve-impl-before-constrain-check.rs:9:10
|
||||||
|
|
|
||||||
|
LL | impl<V: ?Sized> Callable for () {
|
||||||
|
| ^ unconstrained type parameter
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0207`.
|
Loading…
Add table
Add a link
Reference in a new issue