Only allow negation on literals in patterns if it's on integers or floats
This commit is contained in:
parent
24d94b2db9
commit
f44794f455
3 changed files with 38 additions and 4 deletions
|
@ -570,8 +570,16 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
|
|
||||||
fn check_pat_expr_unadjusted(&self, lt: &'tcx hir::PatExpr<'tcx>) -> Ty<'tcx> {
|
fn check_pat_expr_unadjusted(&self, lt: &'tcx hir::PatExpr<'tcx>) -> Ty<'tcx> {
|
||||||
let ty = match <.kind {
|
let ty = match <.kind {
|
||||||
rustc_hir::PatExprKind::Lit { lit, .. } => {
|
rustc_hir::PatExprKind::Lit { lit, negated } => {
|
||||||
self.check_expr_lit(lit, Expectation::NoExpectation)
|
let ty = self.check_expr_lit(lit, Expectation::NoExpectation);
|
||||||
|
if *negated {
|
||||||
|
self.register_bound(
|
||||||
|
ty,
|
||||||
|
self.tcx.require_lang_item(LangItem::Neg, Some(lt.span)),
|
||||||
|
ObligationCause::dummy_with_span(lt.span),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
ty
|
||||||
}
|
}
|
||||||
rustc_hir::PatExprKind::ConstBlock(c) => {
|
rustc_hir::PatExprKind::ConstBlock(c) => {
|
||||||
self.check_expr_const_block(c, Expectation::NoExpectation)
|
self.check_expr_const_block(c, Expectation::NoExpectation)
|
||||||
|
|
|
@ -12,11 +12,13 @@ type SignedChar = pattern_type!(char is -'A'..);
|
||||||
fn main() {
|
fn main() {
|
||||||
match 42_u8 {
|
match 42_u8 {
|
||||||
-10..253 => {}
|
-10..253 => {}
|
||||||
|
//~^ ERROR `u8: Neg` is not satisfied
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
|
|
||||||
match 'A' {
|
match 'A' {
|
||||||
-'\0'..'a' => {}
|
-'\0'..'a' => {}
|
||||||
|
//~^ ERROR `char: Neg` is not satisfied
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,26 @@
|
||||||
|
error[E0277]: the trait bound `u8: Neg` is not satisfied
|
||||||
|
--> $DIR/signed_ranges.rs:14:9
|
||||||
|
|
|
||||||
|
LL | -10..253 => {}
|
||||||
|
| ^^^ the trait `Neg` is not implemented for `u8`
|
||||||
|
|
|
||||||
|
= help: the following other types implement trait `Neg`:
|
||||||
|
&f128
|
||||||
|
&f16
|
||||||
|
&f32
|
||||||
|
&f64
|
||||||
|
&i128
|
||||||
|
&i16
|
||||||
|
&i32
|
||||||
|
&i64
|
||||||
|
and 12 others
|
||||||
|
|
||||||
|
error[E0277]: the trait bound `char: Neg` is not satisfied
|
||||||
|
--> $DIR/signed_ranges.rs:20:9
|
||||||
|
|
|
||||||
|
LL | -'\0'..'a' => {}
|
||||||
|
| ^^^^^ the trait `Neg` is not implemented for `char`
|
||||||
|
|
||||||
error[E0600]: cannot apply unary operator `-` to type `u32`
|
error[E0600]: cannot apply unary operator `-` to type `u32`
|
||||||
--> $DIR/signed_ranges.rs:6:34
|
--> $DIR/signed_ranges.rs:6:34
|
||||||
|
|
|
|
||||||
|
@ -12,6 +35,7 @@ error[E0600]: cannot apply unary operator `-` to type `char`
|
||||||
LL | type SignedChar = pattern_type!(char is -'A'..);
|
LL | type SignedChar = pattern_type!(char is -'A'..);
|
||||||
| ^^^^ cannot apply unary operator `-`
|
| ^^^^ cannot apply unary operator `-`
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 4 previous errors
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0600`.
|
Some errors have detailed explanations: E0277, E0600.
|
||||||
|
For more information about an error, try `rustc --explain E0277`.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue