Rollup merge of #123689 - spastorino:pattern_types_const_generics, r=oli-obk
Add const generics support for pattern types r? `@oli-obk`
This commit is contained in:
commit
3f7ae6803b
3 changed files with 37 additions and 2 deletions
|
@ -2223,6 +2223,24 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
||||||
Err(LitToConstError::TypeError) => todo!(),
|
Err(LitToConstError::TypeError) => todo!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hir::ExprKind::Path(hir::QPath::Resolved(
|
||||||
|
_,
|
||||||
|
&hir::Path {
|
||||||
|
res: Res::Def(DefKind::ConstParam, def_id), ..
|
||||||
|
},
|
||||||
|
)) => {
|
||||||
|
let ty = tcx
|
||||||
|
.type_of(def_id)
|
||||||
|
.no_bound_vars()
|
||||||
|
.expect("const parameter types cannot be generic");
|
||||||
|
let item_def_id = tcx.parent(def_id);
|
||||||
|
let generics = tcx.generics_of(item_def_id);
|
||||||
|
let index = generics.param_def_id_to_index[&def_id];
|
||||||
|
let name = tcx.item_name(def_id);
|
||||||
|
ty::Const::new_param(tcx, ty::ParamConst::new(index, name), ty)
|
||||||
|
}
|
||||||
|
|
||||||
_ => {
|
_ => {
|
||||||
let err = tcx
|
let err = tcx
|
||||||
.dcx()
|
.dcx()
|
||||||
|
|
|
@ -133,10 +133,14 @@ fn layout_of_uncached<'tcx>(
|
||||||
ty::PatternKind::Range { start, end, include_end } => {
|
ty::PatternKind::Range { start, end, include_end } => {
|
||||||
if let Abi::Scalar(scalar) | Abi::ScalarPair(scalar, _) = &mut layout.abi {
|
if let Abi::Scalar(scalar) | Abi::ScalarPair(scalar, _) = &mut layout.abi {
|
||||||
if let Some(start) = start {
|
if let Some(start) = start {
|
||||||
scalar.valid_range_mut().start = start.eval_bits(tcx, param_env);
|
scalar.valid_range_mut().start = start
|
||||||
|
.try_eval_bits(tcx, param_env)
|
||||||
|
.ok_or_else(|| error(cx, LayoutError::Unknown(ty)))?;
|
||||||
}
|
}
|
||||||
if let Some(end) = end {
|
if let Some(end) = end {
|
||||||
let mut end = end.eval_bits(tcx, param_env);
|
let mut end = end
|
||||||
|
.try_eval_bits(tcx, param_env)
|
||||||
|
.ok_or_else(|| error(cx, LayoutError::Unknown(ty)))?;
|
||||||
if !include_end {
|
if !include_end {
|
||||||
end = end.wrapping_sub(1);
|
end = end.wrapping_sub(1);
|
||||||
}
|
}
|
||||||
|
|
13
tests/ui/type/pattern_types/const_generics.rs
Normal file
13
tests/ui/type/pattern_types/const_generics.rs
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
//@ check-pass
|
||||||
|
|
||||||
|
#![feature(pattern_types)]
|
||||||
|
#![feature(core_pattern_types)]
|
||||||
|
#![feature(core_pattern_type)]
|
||||||
|
|
||||||
|
use std::pat::pattern_type;
|
||||||
|
|
||||||
|
trait Foo {}
|
||||||
|
|
||||||
|
impl<const START: u32, const END: u32> Foo for pattern_type!(u32 is START..=END) {}
|
||||||
|
|
||||||
|
fn main() {}
|
Loading…
Add table
Add a link
Reference in a new issue