Make sure we can produce ConstArgHasWrongType errors for valtree consts
This commit is contained in:
parent
8c39ce5b4f
commit
516a93353d
4 changed files with 110 additions and 2 deletions
|
@ -264,9 +264,10 @@ fn fulfillment_error_for_no_solution<'tcx>(
|
||||||
infcx.tcx.type_of(uv.def).instantiate(infcx.tcx, uv.args)
|
infcx.tcx.type_of(uv.def).instantiate(infcx.tcx, uv.args)
|
||||||
}
|
}
|
||||||
ty::ConstKind::Param(param_ct) => param_ct.find_ty_from_env(obligation.param_env),
|
ty::ConstKind::Param(param_ct) => param_ct.find_ty_from_env(obligation.param_env),
|
||||||
_ => span_bug!(
|
ty::ConstKind::Value(ty, _) => ty,
|
||||||
|
kind => span_bug!(
|
||||||
obligation.cause.span,
|
obligation.cause.span,
|
||||||
"ConstArgHasWrongType failed but we don't know how to compute type"
|
"ConstArgHasWrongType failed but we don't know how to compute type for {kind:?}"
|
||||||
),
|
),
|
||||||
};
|
};
|
||||||
FulfillmentErrorCode::Select(SelectionError::ConstArgHasWrongType {
|
FulfillmentErrorCode::Select(SelectionError::ConstArgHasWrongType {
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
error: the constant `N` is not of type `bool`
|
||||||
|
--> $DIR/type-mismatch-in-nested-goal.rs:9:50
|
||||||
|
|
|
||||||
|
LL | fn needs_a<const N: usize>(_: [u8; N]) where (): A<N> {}
|
||||||
|
| ^^^^ expected `bool`, found `usize`
|
||||||
|
|
|
||||||
|
note: required by a const generic parameter in `A`
|
||||||
|
--> $DIR/type-mismatch-in-nested-goal.rs:5:9
|
||||||
|
|
|
||||||
|
LL | trait A<const B: bool> {}
|
||||||
|
| ^^^^^^^^^^^^^ required by this const generic parameter in `A`
|
||||||
|
|
||||||
|
error: the constant `true` is not of type `usize`
|
||||||
|
--> $DIR/type-mismatch-in-nested-goal.rs:13:13
|
||||||
|
|
|
||||||
|
LL | needs_a([]);
|
||||||
|
| ------- ^^ expected `usize`, found `bool`
|
||||||
|
| |
|
||||||
|
| required by a bound introduced by this call
|
||||||
|
|
|
||||||
|
note: required by a const generic parameter in `needs_a`
|
||||||
|
--> $DIR/type-mismatch-in-nested-goal.rs:9:12
|
||||||
|
|
|
||||||
|
LL | fn needs_a<const N: usize>(_: [u8; N]) where (): A<N> {}
|
||||||
|
| ^^^^^^^^^^^^^^ required by this const generic parameter in `needs_a`
|
||||||
|
|
||||||
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/type-mismatch-in-nested-goal.rs:13:13
|
||||||
|
|
|
||||||
|
LL | needs_a([]);
|
||||||
|
| ------- ^^ expected an array with a size of true, found one with a size of 0
|
||||||
|
| |
|
||||||
|
| arguments to this function are incorrect
|
||||||
|
|
|
||||||
|
= note: expected array `[u8; true]`
|
||||||
|
found array `[_; 0]`
|
||||||
|
note: function defined here
|
||||||
|
--> $DIR/type-mismatch-in-nested-goal.rs:9:4
|
||||||
|
|
|
||||||
|
LL | fn needs_a<const N: usize>(_: [u8; N]) where (): A<N> {}
|
||||||
|
| ^^^^^^^ ----------
|
||||||
|
|
||||||
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0308`.
|
|
@ -0,0 +1,45 @@
|
||||||
|
error: the constant `N` is not of type `bool`
|
||||||
|
--> $DIR/type-mismatch-in-nested-goal.rs:9:50
|
||||||
|
|
|
||||||
|
LL | fn needs_a<const N: usize>(_: [u8; N]) where (): A<N> {}
|
||||||
|
| ^^^^ expected `bool`, found `usize`
|
||||||
|
|
|
||||||
|
note: required by a const generic parameter in `A`
|
||||||
|
--> $DIR/type-mismatch-in-nested-goal.rs:5:9
|
||||||
|
|
|
||||||
|
LL | trait A<const B: bool> {}
|
||||||
|
| ^^^^^^^^^^^^^ required by this const generic parameter in `A`
|
||||||
|
|
||||||
|
error: the constant `true` is not of type `usize`
|
||||||
|
--> $DIR/type-mismatch-in-nested-goal.rs:13:13
|
||||||
|
|
|
||||||
|
LL | needs_a([]);
|
||||||
|
| ------- ^^ expected `usize`, found `bool`
|
||||||
|
| |
|
||||||
|
| required by a bound introduced by this call
|
||||||
|
|
|
||||||
|
note: required by a const generic parameter in `needs_a`
|
||||||
|
--> $DIR/type-mismatch-in-nested-goal.rs:9:12
|
||||||
|
|
|
||||||
|
LL | fn needs_a<const N: usize>(_: [u8; N]) where (): A<N> {}
|
||||||
|
| ^^^^^^^^^^^^^^ required by this const generic parameter in `needs_a`
|
||||||
|
|
||||||
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/type-mismatch-in-nested-goal.rs:13:13
|
||||||
|
|
|
||||||
|
LL | needs_a([]);
|
||||||
|
| ------- ^^ expected an array with a size of true, found one with a size of 0
|
||||||
|
| |
|
||||||
|
| arguments to this function are incorrect
|
||||||
|
|
|
||||||
|
= note: expected array `[u8; true]`
|
||||||
|
found array `[_; 0]`
|
||||||
|
note: function defined here
|
||||||
|
--> $DIR/type-mismatch-in-nested-goal.rs:9:4
|
||||||
|
|
|
||||||
|
LL | fn needs_a<const N: usize>(_: [u8; N]) where (): A<N> {}
|
||||||
|
| ^^^^^^^ ----------
|
||||||
|
|
||||||
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0308`.
|
17
tests/ui/const-generics/type-mismatch-in-nested-goal.rs
Normal file
17
tests/ui/const-generics/type-mismatch-in-nested-goal.rs
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
//@ revisions: current next
|
||||||
|
//@[next] compile-flags: -Znext-solver
|
||||||
|
//@ ignore-compare-mode-next-solver (explicit revisions)
|
||||||
|
|
||||||
|
trait A<const B: bool> {}
|
||||||
|
|
||||||
|
impl A<true> for () {}
|
||||||
|
|
||||||
|
fn needs_a<const N: usize>(_: [u8; N]) where (): A<N> {}
|
||||||
|
//~^ ERROR the constant `N` is not of type `bool`
|
||||||
|
|
||||||
|
pub fn main() {
|
||||||
|
needs_a([]);
|
||||||
|
//~^ ERROR the constant `true` is not of type `usize`
|
||||||
|
//~| ERROR mismatched types
|
||||||
|
// FIXME(const_generics): we should hide this error as we've already errored above
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue