Skip to content

Commit

Permalink
Pattern types: Prohibit generic args on const params
Browse files Browse the repository at this point in the history
  • Loading branch information
fmease committed May 11, 2024
1 parent 7c4ac06 commit 2bc234b
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 6 deletions.
6 changes: 3 additions & 3 deletions compiler/rustc_hir_analysis/messages.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -371,9 +371,9 @@ hir_analysis_pass_to_variadic_function = can't pass `{$ty}` to variadic function
.suggestion = 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_wild_pat = "wildcard patterns are not permitted for pattern types"
.label = "this type is the same as the inner type without a pattern"
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
.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}
.label = not allowed in type signatures
Expand Down
9 changes: 7 additions & 2 deletions compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2196,10 +2196,15 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {

hir::ExprKind::Path(hir::QPath::Resolved(
_,
&hir::Path {
res: Res::Def(DefKind::ConstParam, def_id), ..
path @ &hir::Path {
res: Res::Def(DefKind::ConstParam, def_id),
..
},
)) => {
let _ = self.prohibit_generic_args(
path.segments.iter(),
GenericsArgsErrExtend::TyParam(def_id),
);
let ty = tcx
.type_of(def_id)
.no_bound_vars()
Expand Down
Original file line number Diff line number Diff line change
@@ -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() {}
Original file line number Diff line number Diff line change
@@ -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: type 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: type 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`.
2 changes: 1 addition & 1 deletion tests/ui/type/pattern_types/bad_pat.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -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`)

error: "wildcard patterns are not permitted for pattern types"
error: wildcard patterns are not permitted for pattern types
--> $DIR/bad_pat.rs:11:33
|
LL | type Wild = pattern_type!(() is _);
Expand Down

0 comments on commit 2bc234b

Please sign in to comment.