Rollup merge of #136584 - oli-obk:pattern-types-generic, r=BoxyUwU
Prevent generic pattern types from being used in libstd Pattern types should follow the same rules that patterns follow. So a pattern type range must not wrap and not be empty. While we reject such invalid ranges at layout computation time, that only happens during monomorphization in the case of const generics. This is the exact same issue as other const generic math has, and since there's no solution there yet, I put these pattern types behind a separate incomplete feature. These are not necessary for the pattern types MVP (replacing the layout range attributes in libcore and rustc). cc #136574 (new tracking issue for the `generic_pattern_types` feature gate) r? ``@lcnr`` cc ``@scottmcm`` ``@joshtriplett``
This commit is contained in:
commit
c92aae90e4
7 changed files with 101 additions and 11 deletions
|
@ -8,8 +8,9 @@ use rustc_middle::ty::{
|
|||
self, GenericArg, GenericArgKind, GenericArgsRef, Ty, TyCtxt, TypeSuperVisitable,
|
||||
TypeVisitable, TypeVisitableExt, TypeVisitor,
|
||||
};
|
||||
use rustc_span::Span;
|
||||
use rustc_session::parse::feature_err;
|
||||
use rustc_span::def_id::{DefId, LocalDefId};
|
||||
use rustc_span::{Span, sym};
|
||||
use tracing::{debug, instrument, trace};
|
||||
|
||||
use crate::infer::InferCtxt;
|
||||
|
@ -704,8 +705,47 @@ impl<'a, 'tcx> TypeVisitor<TyCtxt<'tcx>> for WfPredicates<'a, 'tcx> {
|
|||
));
|
||||
}
|
||||
|
||||
ty::Pat(subty, _) => {
|
||||
ty::Pat(subty, pat) => {
|
||||
self.require_sized(subty, ObligationCauseCode::Misc);
|
||||
match *pat {
|
||||
ty::PatternKind::Range { start, end, include_end: _ } => {
|
||||
let mut check = |c| {
|
||||
let cause = self.cause(ObligationCauseCode::Misc);
|
||||
self.out.push(traits::Obligation::with_depth(
|
||||
tcx,
|
||||
cause.clone(),
|
||||
self.recursion_depth,
|
||||
self.param_env,
|
||||
ty::Binder::dummy(ty::PredicateKind::Clause(
|
||||
ty::ClauseKind::ConstArgHasType(c, subty),
|
||||
)),
|
||||
));
|
||||
if !tcx.features().generic_pattern_types() {
|
||||
if c.has_param() {
|
||||
if self.span.is_dummy() {
|
||||
self.tcx().dcx().delayed_bug(
|
||||
"feature error should be reported elsewhere, too",
|
||||
);
|
||||
} else {
|
||||
feature_err(
|
||||
&self.tcx().sess,
|
||||
sym::generic_pattern_types,
|
||||
self.span,
|
||||
"wraparound pattern type ranges cause monomorphization time errors",
|
||||
)
|
||||
.emit();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
if let Some(start) = start {
|
||||
check(start)
|
||||
}
|
||||
if let Some(end) = end {
|
||||
check(end)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ty::Tuple(tys) => {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue