Pattern types: Prohibit generic args on const params
This commit is contained in:
parent
7c4ac0603e
commit
7faa879486
6 changed files with 66 additions and 13 deletions
|
@ -371,9 +371,9 @@ hir_analysis_pass_to_variadic_function = can't pass `{$ty}` to variadic function
|
||||||
.suggestion = cast the value to `{$cast_ty}`
|
.suggestion = cast the value to `{$cast_ty}`
|
||||||
.help = cast the value to `{$cast_ty}`
|
.help = cast the value to `{$cast_ty}`
|
||||||
|
|
||||||
hir_analysis_pattern_type_non_const_range = "range patterns must have constant range start and end"
|
hir_analysis_pattern_type_non_const_range = range patterns must have constant range start and end
|
||||||
hir_analysis_pattern_type_wild_pat = "wildcard patterns are not permitted for pattern types"
|
hir_analysis_pattern_type_wild_pat = wildcard patterns are not permitted for pattern types
|
||||||
.label = "this type is the same as the inner type without a pattern"
|
.label = this type is the same as the inner type without a pattern
|
||||||
hir_analysis_placeholder_not_allowed_item_signatures = the placeholder `_` is not allowed within types on item signatures for {$kind}
|
hir_analysis_placeholder_not_allowed_item_signatures = the placeholder `_` is not allowed within types on item signatures for {$kind}
|
||||||
.label = not allowed in type signatures
|
.label = not allowed in type signatures
|
||||||
|
|
||||||
|
|
|
@ -1388,7 +1388,7 @@ pub enum GenericsArgsErrExtend<'tcx> {
|
||||||
span: Span,
|
span: Span,
|
||||||
},
|
},
|
||||||
SelfTyParam(Span),
|
SelfTyParam(Span),
|
||||||
TyParam(DefId),
|
Param(DefId),
|
||||||
DefVariant,
|
DefVariant,
|
||||||
None,
|
None,
|
||||||
}
|
}
|
||||||
|
@ -1504,11 +1504,11 @@ fn generics_args_err_extend<'a>(
|
||||||
GenericsArgsErrExtend::DefVariant => {
|
GenericsArgsErrExtend::DefVariant => {
|
||||||
err.note("enum variants can't have type parameters");
|
err.note("enum variants can't have type parameters");
|
||||||
}
|
}
|
||||||
GenericsArgsErrExtend::TyParam(def_id) => {
|
GenericsArgsErrExtend::Param(def_id) => {
|
||||||
if let Some(span) = tcx.def_ident_span(def_id) {
|
let span = tcx.def_ident_span(def_id).unwrap();
|
||||||
let name = tcx.item_name(def_id);
|
let kind = tcx.def_descr(def_id);
|
||||||
err.span_note(span, format!("type parameter `{name}` defined here"));
|
let name = tcx.item_name(def_id);
|
||||||
}
|
err.span_note(span, format!("{kind} `{name}` defined here"));
|
||||||
}
|
}
|
||||||
GenericsArgsErrExtend::SelfTyParam(span) => {
|
GenericsArgsErrExtend::SelfTyParam(span) => {
|
||||||
err.span_suggestion_verbose(
|
err.span_suggestion_verbose(
|
||||||
|
|
|
@ -1756,7 +1756,7 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
||||||
assert_eq!(opt_self_ty, None);
|
assert_eq!(opt_self_ty, None);
|
||||||
let _ = self.prohibit_generic_args(
|
let _ = self.prohibit_generic_args(
|
||||||
path.segments.iter(),
|
path.segments.iter(),
|
||||||
GenericsArgsErrExtend::TyParam(def_id),
|
GenericsArgsErrExtend::Param(def_id),
|
||||||
);
|
);
|
||||||
self.lower_ty_param(hir_id)
|
self.lower_ty_param(hir_id)
|
||||||
}
|
}
|
||||||
|
@ -2196,10 +2196,15 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
||||||
|
|
||||||
hir::ExprKind::Path(hir::QPath::Resolved(
|
hir::ExprKind::Path(hir::QPath::Resolved(
|
||||||
_,
|
_,
|
||||||
&hir::Path {
|
path @ &hir::Path {
|
||||||
res: Res::Def(DefKind::ConstParam, def_id), ..
|
res: Res::Def(DefKind::ConstParam, def_id),
|
||||||
|
..
|
||||||
},
|
},
|
||||||
)) => {
|
)) => {
|
||||||
|
let _ = self.prohibit_generic_args(
|
||||||
|
path.segments.iter(),
|
||||||
|
GenericsArgsErrExtend::Param(def_id),
|
||||||
|
);
|
||||||
let ty = tcx
|
let ty = tcx
|
||||||
.type_of(def_id)
|
.type_of(def_id)
|
||||||
.no_bound_vars()
|
.no_bound_vars()
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
#![feature(pattern_types, core_pattern_type)]
|
||||||
|
#![allow(internal_features)]
|
||||||
|
|
||||||
|
type Pat<const START: u32, const END: u32> =
|
||||||
|
std::pat::pattern_type!(u32 is START::<(), i32, 2>..=END::<_, Assoc = ()>);
|
||||||
|
//~^ ERROR type and const arguments are not allowed on const parameter `START`
|
||||||
|
//~| ERROR type arguments are not allowed on const parameter `END`
|
||||||
|
//~| ERROR associated type bindings are not allowed here
|
||||||
|
|
||||||
|
fn main() {}
|
|
@ -0,0 +1,38 @@
|
||||||
|
error[E0109]: type and const arguments are not allowed on const parameter `START`
|
||||||
|
--> $DIR/bad_const_generics_args_on_const_param.rs:5:44
|
||||||
|
|
|
||||||
|
LL | std::pat::pattern_type!(u32 is START::<(), i32, 2>..=END::<_, Assoc = ()>);
|
||||||
|
| ----- ^^ ^^^ ^ type and const arguments not allowed
|
||||||
|
| |
|
||||||
|
| not allowed on const parameter `START`
|
||||||
|
|
|
||||||
|
note: const parameter `START` defined here
|
||||||
|
--> $DIR/bad_const_generics_args_on_const_param.rs:4:16
|
||||||
|
|
|
||||||
|
LL | type Pat<const START: u32, const END: u32> =
|
||||||
|
| ^^^^^
|
||||||
|
|
||||||
|
error[E0109]: type arguments are not allowed on const parameter `END`
|
||||||
|
--> $DIR/bad_const_generics_args_on_const_param.rs:5:64
|
||||||
|
|
|
||||||
|
LL | std::pat::pattern_type!(u32 is START::<(), i32, 2>..=END::<_, Assoc = ()>);
|
||||||
|
| --- ^ type argument not allowed
|
||||||
|
| |
|
||||||
|
| not allowed on const parameter `END`
|
||||||
|
|
|
||||||
|
note: const parameter `END` defined here
|
||||||
|
--> $DIR/bad_const_generics_args_on_const_param.rs:4:34
|
||||||
|
|
|
||||||
|
LL | type Pat<const START: u32, const END: u32> =
|
||||||
|
| ^^^
|
||||||
|
|
||||||
|
error[E0229]: associated type bindings are not allowed here
|
||||||
|
--> $DIR/bad_const_generics_args_on_const_param.rs:5:67
|
||||||
|
|
|
||||||
|
LL | std::pat::pattern_type!(u32 is START::<(), i32, 2>..=END::<_, Assoc = ()>);
|
||||||
|
| ^^^^^^^^^^ associated type not allowed here
|
||||||
|
|
||||||
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0109, E0229.
|
||||||
|
For more information about an error, try `rustc --explain E0109`.
|
|
@ -14,7 +14,7 @@ LL | type Positive2 = pattern_type!(i32 is 0..=);
|
||||||
|
|
|
|
||||||
= note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`)
|
= note: inclusive ranges must be bounded at the end (`..=b` or `a..=b`)
|
||||||
|
|
||||||
error: "wildcard patterns are not permitted for pattern types"
|
error: wildcard patterns are not permitted for pattern types
|
||||||
--> $DIR/bad_pat.rs:11:33
|
--> $DIR/bad_pat.rs:11:33
|
||||||
|
|
|
|
||||||
LL | type Wild = pattern_type!(() is _);
|
LL | type Wild = pattern_type!(() is _);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue