}
}
-declare_lint! {
- pub ILLEGAL_FLOATING_POINT_LITERAL_PATTERN,
- Warn,
- "floating-point literals cannot be used in patterns"
-}
-
-/// Checks for floating point literals in patterns.
-#[derive(Clone)]
-pub struct IllegalFloatLiteralPattern;
-
-impl LintPass for IllegalFloatLiteralPattern {
- fn get_lints(&self) -> LintArray {
- lint_array!(ILLEGAL_FLOATING_POINT_LITERAL_PATTERN)
- }
-}
-
-fn fl_lit_check_expr(cx: &EarlyContext, expr: &ast::Expr) {
- use self::ast::{ExprKind, LitKind};
- match expr.node {
- ExprKind::Lit(ref l) => {
- match l.node {
- LitKind::FloatUnsuffixed(..) |
- LitKind::Float(..) => {
- cx.span_lint(ILLEGAL_FLOATING_POINT_LITERAL_PATTERN,
- l.span,
- "floating-point literals cannot be used in patterns");
- },
- _ => (),
- }
- }
- // These may occur in patterns
- // and can maybe contain float literals
- ExprKind::Unary(_, ref f) => fl_lit_check_expr(cx, f),
- // Other kinds of exprs can't occur in patterns so we don't have to check them
- // (ast_validation will emit an error if they occur)
- _ => (),
- }
-}
-
-impl EarlyLintPass for IllegalFloatLiteralPattern {
- fn check_pat(&mut self, cx: &EarlyContext, pat: &ast::Pat) {
- use self::ast::PatKind;
- pat.walk(&mut |p| {
- match p.node {
- // Wildcard patterns and paths are uninteresting for the lint
- PatKind::Wild |
- PatKind::Path(..) => (),
-
- // The walk logic recurses inside these
- PatKind::Ident(..) |
- PatKind::Struct(..) |
- PatKind::Tuple(..) |
- PatKind::TupleStruct(..) |
- PatKind::Ref(..) |
- PatKind::Box(..) |
- PatKind::Paren(..) |
- PatKind::Slice(..) => (),
-
- // Extract the expressions and check them
- PatKind::Lit(ref e) => fl_lit_check_expr(cx, e),
- PatKind::Range(ref st, ref en, _) => {
- fl_lit_check_expr(cx, st);
- fl_lit_check_expr(cx, en);
- },
-
- PatKind::Mac(_) => bug!("lint must run post-expansion"),
- }
- true
- });
- }
-}
-
declare_lint! {
pub UNUSED_DOC_COMMENT,
Warn,