Use param's real type in try_eval_lit_or_param
This commit is contained in:
parent
39f2657d11
commit
9574f39c2d
10 changed files with 59 additions and 27 deletions
|
@ -135,6 +135,9 @@ impl<'tcx> Const<'tcx> {
|
||||||
_,
|
_,
|
||||||
&hir::Path { res: Res::Def(DefKind::ConstParam, def_id), .. },
|
&hir::Path { res: Res::Def(DefKind::ConstParam, def_id), .. },
|
||||||
)) => {
|
)) => {
|
||||||
|
// Use the type from the param's definition, since we can resolve it,
|
||||||
|
// not the expected parameter type from WithOptConstParam.
|
||||||
|
let param_ty = tcx.type_of(def_id).subst_identity();
|
||||||
match tcx.named_bound_var(expr.hir_id) {
|
match tcx.named_bound_var(expr.hir_id) {
|
||||||
Some(rbv::ResolvedArg::EarlyBound(_)) => {
|
Some(rbv::ResolvedArg::EarlyBound(_)) => {
|
||||||
// Find the name and index of the const parameter by indexing the generics of
|
// Find the name and index of the const parameter by indexing the generics of
|
||||||
|
@ -143,14 +146,14 @@ impl<'tcx> Const<'tcx> {
|
||||||
let generics = tcx.generics_of(item_def_id);
|
let generics = tcx.generics_of(item_def_id);
|
||||||
let index = generics.param_def_id_to_index[&def_id];
|
let index = generics.param_def_id_to_index[&def_id];
|
||||||
let name = tcx.item_name(def_id);
|
let name = tcx.item_name(def_id);
|
||||||
Some(tcx.mk_const(ty::ParamConst::new(index, name), ty))
|
Some(tcx.mk_const(ty::ParamConst::new(index, name), param_ty))
|
||||||
}
|
}
|
||||||
Some(rbv::ResolvedArg::LateBound(debruijn, index, _)) => Some(tcx.mk_const(
|
Some(rbv::ResolvedArg::LateBound(debruijn, index, _)) => Some(tcx.mk_const(
|
||||||
ty::ConstKind::Bound(debruijn, ty::BoundVar::from_u32(index)),
|
ty::ConstKind::Bound(debruijn, ty::BoundVar::from_u32(index)),
|
||||||
ty,
|
param_ty,
|
||||||
)),
|
)),
|
||||||
Some(rbv::ResolvedArg::Error(guar)) => {
|
Some(rbv::ResolvedArg::Error(guar)) => {
|
||||||
Some(tcx.const_error_with_guaranteed(ty, guar))
|
Some(tcx.const_error_with_guaranteed(param_ty, guar))
|
||||||
}
|
}
|
||||||
arg => bug!("unexpected bound var resolution for {:?}: {arg:?}", expr.hir_id),
|
arg => bug!("unexpected bound var resolution for {:?}: {arg:?}", expr.hir_id),
|
||||||
}
|
}
|
||||||
|
|
|
@ -99,10 +99,10 @@ pub fn translate_substs<'tcx>(
|
||||||
}
|
}
|
||||||
|
|
||||||
fulfill_implication(infcx, param_env, source_trait_ref, target_impl).unwrap_or_else(
|
fulfill_implication(infcx, param_env, source_trait_ref, target_impl).unwrap_or_else(
|
||||||
|_| {
|
|()| {
|
||||||
bug!(
|
bug!(
|
||||||
"When translating substitutions for specialization, the expected \
|
"When translating substitutions from {source_impl:?} to {target_impl:?}, \
|
||||||
specialization failed to hold"
|
the expected specialization failed to hold"
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
fn foo<const N: usize>() -> [u8; N] {
|
fn foo<const N: usize>() -> [u8; N] {
|
||||||
bar::<N>() //~ ERROR mismatched types
|
bar::<N>() //~ ERROR mismatched types
|
||||||
|
//~^ ERROR the constant `N` is not of type `u8`
|
||||||
}
|
}
|
||||||
|
|
||||||
fn bar<const N: u8>() -> [u8; N] {}
|
fn bar<const N: u8>() -> [u8; N] {}
|
||||||
|
|
|
@ -1,3 +1,15 @@
|
||||||
|
error: the constant `N` is not of type `u8`
|
||||||
|
--> $DIR/type_mismatch.rs:2:5
|
||||||
|
|
|
||||||
|
LL | bar::<N>()
|
||||||
|
| ^^^^^^^^
|
||||||
|
|
|
||||||
|
note: required by a bound in `bar`
|
||||||
|
--> $DIR/type_mismatch.rs:6:8
|
||||||
|
|
|
||||||
|
LL | fn bar<const N: u8>() -> [u8; N] {}
|
||||||
|
| ^^^^^^^^^^^ required by this bound in `bar`
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
error[E0308]: mismatched types
|
||||||
--> $DIR/type_mismatch.rs:2:11
|
--> $DIR/type_mismatch.rs:2:11
|
||||||
|
|
|
|
||||||
|
@ -5,7 +17,7 @@ LL | bar::<N>()
|
||||||
| ^ expected `u8`, found `usize`
|
| ^ expected `u8`, found `usize`
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
error[E0308]: mismatched types
|
||||||
--> $DIR/type_mismatch.rs:5:26
|
--> $DIR/type_mismatch.rs:6:26
|
||||||
|
|
|
|
||||||
LL | fn bar<const N: u8>() -> [u8; N] {}
|
LL | fn bar<const N: u8>() -> [u8; N] {}
|
||||||
| --- ^^^^^^^ expected `[u8; N]`, found `()`
|
| --- ^^^^^^^ expected `[u8; N]`, found `()`
|
||||||
|
@ -13,11 +25,11 @@ LL | fn bar<const N: u8>() -> [u8; N] {}
|
||||||
| implicitly returns `()` as its body has no tail or `return` expression
|
| implicitly returns `()` as its body has no tail or `return` expression
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
error[E0308]: mismatched types
|
||||||
--> $DIR/type_mismatch.rs:5:31
|
--> $DIR/type_mismatch.rs:6:31
|
||||||
|
|
|
|
||||||
LL | fn bar<const N: u8>() -> [u8; N] {}
|
LL | fn bar<const N: u8>() -> [u8; N] {}
|
||||||
| ^ expected `usize`, found `u8`
|
| ^ expected `usize`, found `u8`
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: aborting due to 4 previous errors
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0308`.
|
For more information about this error, try `rustc --explain E0308`.
|
||||||
|
|
|
@ -6,6 +6,5 @@ impl X {
|
||||||
}
|
}
|
||||||
fn getn<const N: cfg_attr>() -> [u8; N] {}
|
fn getn<const N: cfg_attr>() -> [u8; N] {}
|
||||||
//~^ ERROR expected type, found built-in attribute `cfg_attr`
|
//~^ ERROR expected type, found built-in attribute `cfg_attr`
|
||||||
//~| ERROR mismatched types
|
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
|
@ -10,15 +10,7 @@ error[E0573]: expected type, found built-in attribute `cfg_attr`
|
||||||
LL | fn getn<const N: cfg_attr>() -> [u8; N] {}
|
LL | fn getn<const N: cfg_attr>() -> [u8; N] {}
|
||||||
| ^^^^^^^^ not a type
|
| ^^^^^^^^ not a type
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
error: aborting due to 2 previous errors
|
||||||
--> $DIR/type_not_in_scope.rs:7:33
|
|
||||||
|
|
|
||||||
LL | fn getn<const N: cfg_attr>() -> [u8; N] {}
|
|
||||||
| ---- ^^^^^^^ expected `[u8; N]`, found `()`
|
|
||||||
| |
|
|
||||||
| implicitly returns `()` as its body has no tail or `return` expression
|
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
Some errors have detailed explanations: E0412, E0573.
|
||||||
|
For more information about an error, try `rustc --explain E0412`.
|
||||||
Some errors have detailed explanations: E0308, E0412, E0573.
|
|
||||||
For more information about an error, try `rustc --explain E0308`.
|
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
#![feature(min_specialization)]
|
||||||
|
|
||||||
|
// An impl that has an erroneous const substitution should not specialize one
|
||||||
|
// that is well-formed.
|
||||||
|
|
||||||
|
struct S<const L: usize>;
|
||||||
|
|
||||||
|
impl<const N: i32> Copy for S<N> {}
|
||||||
|
impl<const M: usize> Copy for S<M> {}
|
||||||
|
//~^ ERROR conflicting implementations of trait `Copy` for type `S<_>`
|
||||||
|
|
||||||
|
fn main() {}
|
|
@ -0,0 +1,11 @@
|
||||||
|
error[E0119]: conflicting implementations of trait `Copy` for type `S<_>`
|
||||||
|
--> $DIR/bad-const-wf-doesnt-specialize.rs:9:1
|
||||||
|
|
|
||||||
|
LL | impl<const N: i32> Copy for S<N> {}
|
||||||
|
| -------------------------------- first implementation here
|
||||||
|
LL | impl<const M: usize> Copy for S<M> {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `S<_>`
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0119`.
|
|
@ -6,7 +6,7 @@ mod assert {
|
||||||
pub fn is_transmutable<Src, Context, const ASSUME_ALIGNMENT: bool>()
|
pub fn is_transmutable<Src, Context, const ASSUME_ALIGNMENT: bool>()
|
||||||
where
|
where
|
||||||
Dst: BikeshedIntrinsicFrom<Src, Context, ASSUME_ALIGNMENT>, //~ ERROR cannot find type `Dst` in this scope
|
Dst: BikeshedIntrinsicFrom<Src, Context, ASSUME_ALIGNMENT>, //~ ERROR cannot find type `Dst` in this scope
|
||||||
//~^ ERROR mismatched types
|
//~^ the constant `ASSUME_ALIGNMENT` is not of type `Assume`
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,13 +4,15 @@ error[E0412]: cannot find type `Dst` in this scope
|
||||||
LL | Dst: BikeshedIntrinsicFrom<Src, Context, ASSUME_ALIGNMENT>,
|
LL | Dst: BikeshedIntrinsicFrom<Src, Context, ASSUME_ALIGNMENT>,
|
||||||
| ^^^ not found in this scope
|
| ^^^ not found in this scope
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
error: the constant `ASSUME_ALIGNMENT` is not of type `Assume`
|
||||||
--> $DIR/issue-101739-1.rs:8:50
|
--> $DIR/issue-101739-1.rs:8:14
|
||||||
|
|
|
|
||||||
LL | Dst: BikeshedIntrinsicFrom<Src, Context, ASSUME_ALIGNMENT>,
|
LL | Dst: BikeshedIntrinsicFrom<Src, Context, ASSUME_ALIGNMENT>,
|
||||||
| ^^^^^^^^^^^^^^^^ expected `Assume`, found `bool`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
note: required by a bound in `BikeshedIntrinsicFrom`
|
||||||
|
--> $SRC_DIR/core/src/mem/transmutability.rs:LL:COL
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
Some errors have detailed explanations: E0308, E0412.
|
For more information about this error, try `rustc --explain E0412`.
|
||||||
For more information about an error, try `rustc --explain E0308`.
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue