Constrain const vars to error if const types are mismatched
This commit is contained in:
parent
ab9bb3ea36
commit
322c7b6269
5 changed files with 39 additions and 8 deletions
|
@ -189,10 +189,19 @@ impl<'tcx> InferCtxt<'tcx> {
|
||||||
// the expected const's type. Specifically, we don't want const infer vars
|
// the expected const's type. Specifically, we don't want const infer vars
|
||||||
// to do any type shapeshifting before and after resolution.
|
// to do any type shapeshifting before and after resolution.
|
||||||
if let Err(guar) = compatible_types {
|
if let Err(guar) = compatible_types {
|
||||||
return Ok(self.tcx.const_error_with_guaranteed(
|
// HACK: equating both sides with `[const error]` eagerly prevents us
|
||||||
if relation.a_is_expected() { a.ty() } else { b.ty() },
|
// from leaving unconstrained inference vars during things like impl
|
||||||
guar,
|
// matching in the solver.
|
||||||
));
|
let a_error = self.tcx.const_error_with_guaranteed(a.ty(), guar);
|
||||||
|
if let ty::ConstKind::Infer(InferConst::Var(vid)) = a.kind() {
|
||||||
|
return self.unify_const_variable(vid, a_error);
|
||||||
|
}
|
||||||
|
let b_error = self.tcx.const_error_with_guaranteed(b.ty(), guar);
|
||||||
|
if let ty::ConstKind::Infer(InferConst::Var(vid)) = b.kind() {
|
||||||
|
return self.unify_const_variable(vid, b_error);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Ok(if relation.a_is_expected() { a_error } else { b_error });
|
||||||
}
|
}
|
||||||
|
|
||||||
match (a.kind(), b.kind()) {
|
match (a.kind(), b.kind()) {
|
||||||
|
|
13
tests/ui/const-generics/bad-subst-const-kind.rs
Normal file
13
tests/ui/const-generics/bad-subst-const-kind.rs
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
// incremental
|
||||||
|
#![crate_type = "lib"]
|
||||||
|
|
||||||
|
trait Q {
|
||||||
|
const ASSOC: usize;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<const N: u64> Q for [u8; N] {
|
||||||
|
//~^ ERROR mismatched types
|
||||||
|
const ASSOC: usize = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn test() -> [u8; <[u8; 13] as Q>::ASSOC] { todo!() }
|
9
tests/ui/const-generics/bad-subst-const-kind.stderr
Normal file
9
tests/ui/const-generics/bad-subst-const-kind.stderr
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/bad-subst-const-kind.rs:8:31
|
||||||
|
|
|
||||||
|
LL | impl<const N: u64> Q for [u8; N] {
|
||||||
|
| ^ expected `usize`, found `u64`
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0308`.
|
|
@ -2,11 +2,11 @@
|
||||||
|
|
||||||
// An impl that has an erroneous const substitution should not specialize one
|
// An impl that has an erroneous const substitution should not specialize one
|
||||||
// that is well-formed.
|
// that is well-formed.
|
||||||
|
#[derive(Clone)]
|
||||||
struct S<const L: usize>;
|
struct S<const L: usize>;
|
||||||
|
|
||||||
impl<const N: i32> Copy for S<N> {}
|
impl<const N: i32> Copy for S<N> {}
|
||||||
impl<const M: usize> Copy for S<M> {}
|
impl<const M: usize> Copy for S<M> {}
|
||||||
//~^ ERROR conflicting implementations of trait `Copy` for type `S<_>`
|
//~^ ERROR conflicting implementations of trait `Copy` for type `S<[const error]>`
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
error[E0119]: conflicting implementations of trait `Copy` for type `S<_>`
|
error[E0119]: conflicting implementations of trait `Copy` for type `S<[const error]>`
|
||||||
--> $DIR/bad-const-wf-doesnt-specialize.rs:9:1
|
--> $DIR/bad-const-wf-doesnt-specialize.rs:9:1
|
||||||
|
|
|
|
||||||
LL | impl<const N: i32> Copy for S<N> {}
|
LL | impl<const N: i32> Copy for S<N> {}
|
||||||
| -------------------------------- first implementation here
|
| -------------------------------- first implementation here
|
||||||
LL | impl<const M: usize> Copy for S<M> {}
|
LL | impl<const M: usize> Copy for S<M> {}
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `S<_>`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `S<[const error]>`
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue