]> git.lizzy.rs Git - rust.git/commitdiff
Rename instances of `array_indexing`
authorShea Newton <shnewto@gmail.com>
Wed, 23 May 2018 05:02:07 +0000 (22:02 -0700)
committerShea Newton <shnewto@gmail.com>
Tue, 19 Jun 2018 16:27:39 +0000 (16:27 +0000)
This commit renames instances of `array_indexing` to `indexing_slicing` and moves the `indexing_slicing` lint to the `clippy_pedantic` group. The justification for this commit's changes are detailed in the previous commit's message.

clippy_lints/src/array_indexing.rs [deleted file]
clippy_lints/src/indexing_slicing.rs [new file with mode: 0644]
clippy_lints/src/lib.rs
tests/ui/array_indexing.rs [deleted file]
tests/ui/array_indexing.stderr [deleted file]
tests/ui/indexing_slicing.rs [new file with mode: 0644]
tests/ui/indexing_slicing.stderr [new file with mode: 0644]

diff --git a/clippy_lints/src/array_indexing.rs b/clippy_lints/src/array_indexing.rs
deleted file mode 100644 (file)
index e7bb590..0000000
+++ /dev/null
@@ -1,201 +0,0 @@
-//! lint on indexing and slicing operations
-
-use crate::consts::{constant, Constant};
-use crate::utils::higher::Range;
-use crate::utils::{self, higher};
-use rustc::hir;
-use rustc::lint::*;
-use rustc::ty;
-use syntax::ast::RangeLimits;
-
-/// **What it does:** Checks for out of bounds array indexing with a constant
-/// index.
-///
-/// **Why is this bad?** This will always panic at runtime.
-///
-/// **Known problems:** Hopefully none.
-///
-/// **Example:**
-/// ```rust
-/// let x = [1,2,3,4];
-///
-/// // Bad
-/// x[9];
-/// &x[2..9];
-///
-/// // Good
-/// x[0];
-/// x[3];
-/// ```
-declare_clippy_lint! {
-    pub OUT_OF_BOUNDS_INDEXING,
-    correctness,
-    "out of bounds constant indexing"
-}
-
-/// **What it does:** Checks for usage of indexing or slicing. Does not report
-/// if we can tell that the indexing or slicing operations on an array are in
-/// bounds.
-///
-/// **Why is this bad?** Indexing and slicing can panic at runtime and there are
-/// safe alternatives.
-///
-/// **Known problems:** Hopefully none.
-///
-/// **Example:**
-/// ```rust
-/// let x = vec![0; 5];
-/// // Bad
-/// x[2];
-/// &x[2..100];
-/// &x[2..];
-/// &x[..100];
-///
-/// // Good
-/// x.get(2)
-/// x.get(2..100)
-/// x.get(2..)
-/// x.get(..100)
-/// ```
-declare_clippy_lint! {
-    pub INDEXING_SLICING,
-    restriction,
-    "indexing/slicing usage"
-}
-
-#[derive(Copy, Clone)]
-pub struct IndexingSlicingPass;
-
-impl LintPass for IndexingSlicingPass {
-    fn get_lints(&self) -> LintArray {
-        lint_array!(INDEXING_SLICING, OUT_OF_BOUNDS_INDEXING)
-    }
-}
-
-impl<'a, 'tcx> LateLintPass<'a, 'tcx> for IndexingSlicingPass {
-    fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr) {
-        if let ExprIndex(ref a, ref b) = &expr.node {
-            match &b.node {
-                // Both ExprStruct and ExprPath require this approach's checks
-                // on the `range` returned by `higher::range(cx, b)`.
-                // ExprStruct handles &x[n..m], &x[n..] and &x[..n].
-                // ExprPath handles &x[..] and x[var]
-                ExprStruct(_, _, _) | ExprPath(_) => {
-                    if let Some(range) = higher::range(cx, b) {
-                        let ty = cx.tables.expr_ty(a);
-                        if let ty::TyArray(_, s) = ty.sty {
-                            let size: u128 = s.assert_usize(cx.tcx).unwrap().into();
-                            // Index is a constant range.
-                            if let Some((start, end)) = to_const_range(cx, range, size) {
-                                if start > size || end > size {
-                                    utils::span_lint(
-                                        cx,
-                                        OUT_OF_BOUNDS_INDEXING,
-                                        expr.span,
-                                        "range is out of bounds",
-                                    );
-                                } else {
-                                    // Range is in bounds, ok.
-                                    return;
-                                }
-                            }
-                        }
-                        match (range.start, range.end) {
-                            (None, Some(_)) => {
-                                cx.span_lint(
-                                    INDEXING_SLICING,
-                                    expr.span,
-                                    "slicing may panic. Consider using \
-                                     `.get(..n)`or `.get_mut(..n)` instead",
-                                );
-                            }
-                            (Some(_), None) => {
-                                cx.span_lint(
-                                    INDEXING_SLICING,
-                                    expr.span,
-                                    "slicing may panic. Consider using \
-                                     `.get(n..)` or .get_mut(n..)` instead",
-                                );
-                            }
-                            (Some(_), Some(_)) => {
-                                cx.span_lint(
-                                    INDEXING_SLICING,
-                                    expr.span,
-                                    "slicing may panic. Consider using \
-                                     `.get(n..m)` or `.get_mut(n..m)` instead",
-                                );
-                            }
-                            (None, None) => (),
-                        }
-                    } else {
-                        cx.span_lint(
-                            INDEXING_SLICING,
-                            expr.span,
-                            "indexing may panic. Consider using `.get(n)` or \
-                             `.get_mut(n)` instead",
-                        );
-                    }
-                }
-                ExprLit(_) => {
-                    // [n]
-                    let ty = cx.tables.expr_ty(a);
-                    if let ty::TyArray(_, s) = ty.sty {
-                        let size: u128 = s.assert_usize(cx.tcx).unwrap().into();
-                        // Index is a constant uint.
-                        if let Some((Constant::Int(const_index), _)) = constant(cx, cx.tables, b) {
-                            if size <= const_index {
-                                utils::span_lint(
-                                    cx,
-                                    OUT_OF_BOUNDS_INDEXING,
-                                    expr.span,
-                                    "const index is out of bounds",
-                                );
-                            }
-                            // Else index is in bounds, ok.
-                        }
-                    } else {
-                        cx.span_lint(
-                            INDEXING_SLICING,
-                            expr.span,
-                            "indexing may panic. Consider using `.get(n)` or \
-                             `.get_mut(n)` instead",
-                        );
-                    }
-                }
-                _ => (),
-            }
-        }
-    }
-}
-
-/// Returns an option containing a tuple with the start and end (exclusive) of
-/// the range.
-fn to_const_range<'a, 'tcx>(
-    cx: &LateContext<'a, 'tcx>,
-    range: Range,
-    array_size: u128,
-) -> Option<(u128, u128)> {
-    let s = range
-        .start
-        .map(|expr| constant(cx, cx.tables, expr).map(|(c, _)| c));
-    let start = match s {
-        Some(Some(Constant::Int(x))) => x,
-        Some(_) => return None,
-        None => 0,
-    };
-
-    let e = range
-        .end
-        .map(|expr| constant(cx, cx.tables, expr).map(|(c, _)| c));
-    let end = match e {
-        Some(Some(Constant::Int(x))) => if range.limits == RangeLimits::Closed {
-            x + 1
-        } else {
-            x
-        },
-        Some(_) => return None,
-        None => array_size,
-    };
-
-    Some((start, end))
-}
diff --git a/clippy_lints/src/indexing_slicing.rs b/clippy_lints/src/indexing_slicing.rs
new file mode 100644 (file)
index 0000000..d7f2a37
--- /dev/null
@@ -0,0 +1,201 @@
+//! lint on indexing and slicing operations
+
+use crate::consts::{constant, Constant};
+use crate::utils::higher::Range;
+use crate::utils::{self, higher};
+use rustc::hir::*;
+use rustc::lint::*;
+use rustc::ty;
+use syntax::ast::RangeLimits;
+
+/// **What it does:** Checks for out of bounds array indexing with a constant
+/// index.
+///
+/// **Why is this bad?** This will always panic at runtime.
+///
+/// **Known problems:** Hopefully none.
+///
+/// **Example:**
+/// ```rust
+/// let x = [1,2,3,4];
+///
+/// // Bad
+/// x[9];
+/// &x[2..9];
+///
+/// // Good
+/// x[0];
+/// x[3];
+/// ```
+declare_clippy_lint! {
+    pub OUT_OF_BOUNDS_INDEXING,
+    correctness,
+    "out of bounds constant indexing"
+}
+
+/// **What it does:** Checks for usage of indexing or slicing. Does not report
+/// if we can tell that the indexing or slicing operations on an array are in
+/// bounds.
+///
+/// **Why is this bad?** Indexing and slicing can panic at runtime and there are
+/// safe alternatives.
+///
+/// **Known problems:** Hopefully none.
+///
+/// **Example:**
+/// ```rust
+/// let x = vec![0; 5];
+/// // Bad
+/// x[2];
+/// &x[2..100];
+/// &x[2..];
+/// &x[..100];
+///
+/// // Good
+/// x.get(2)
+/// x.get(2..100)
+/// x.get(2..)
+/// x.get(..100)
+/// ```
+declare_clippy_lint! {
+    pub INDEXING_SLICING,
+    restriction,
+    "indexing/slicing usage"
+}
+
+#[derive(Copy, Clone)]
+pub struct IndexingSlicingPass;
+
+impl LintPass for IndexingSlicingPass {
+    fn get_lints(&self) -> LintArray {
+        lint_array!(INDEXING_SLICING, OUT_OF_BOUNDS_INDEXING)
+    }
+}
+
+impl<'a, 'tcx> LateLintPass<'a, 'tcx> for IndexingSlicingPass {
+    fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr) {
+        if let ExprIndex(ref a, ref b) = &expr.node {
+            match &b.node {
+                // Both ExprStruct and ExprPath require this approach's checks
+                // on the `range` returned by `higher::range(cx, b)`.
+                // ExprStruct handles &x[n..m], &x[n..] and &x[..n].
+                // ExprPath handles &x[..] and x[var]
+                ExprStruct(_, _, _) | ExprPath(_) => {
+                    if let Some(range) = higher::range(cx, b) {
+                        let ty = cx.tables.expr_ty(a);
+                        if let ty::TyArray(_, s) = ty.sty {
+                            let size: u128 = s.assert_usize(cx.tcx).unwrap().into();
+                            // Index is a constant range.
+                            if let Some((start, end)) = to_const_range(cx, range, size) {
+                                if start > size || end > size {
+                                    utils::span_lint(
+                                        cx,
+                                        OUT_OF_BOUNDS_INDEXING,
+                                        expr.span,
+                                        "range is out of bounds",
+                                    );
+                                } else {
+                                    // Range is in bounds, ok.
+                                    return;
+                                }
+                            }
+                        }
+                        match (range.start, range.end) {
+                            (None, Some(_)) => {
+                                cx.span_lint(
+                                    INDEXING_SLICING,
+                                    expr.span,
+                                    "slicing may panic. Consider using \
+                                     `.get(..n)`or `.get_mut(..n)` instead",
+                                );
+                            }
+                            (Some(_), None) => {
+                                cx.span_lint(
+                                    INDEXING_SLICING,
+                                    expr.span,
+                                    "slicing may panic. Consider using \
+                                     `.get(n..)` or .get_mut(n..)` instead",
+                                );
+                            }
+                            (Some(_), Some(_)) => {
+                                cx.span_lint(
+                                    INDEXING_SLICING,
+                                    expr.span,
+                                    "slicing may panic. Consider using \
+                                     `.get(n..m)` or `.get_mut(n..m)` instead",
+                                );
+                            }
+                            (None, None) => (),
+                        }
+                    } else {
+                        cx.span_lint(
+                            INDEXING_SLICING,
+                            expr.span,
+                            "indexing may panic. Consider using `.get(n)` or \
+                             `.get_mut(n)` instead",
+                        );
+                    }
+                }
+                ExprLit(_) => {
+                    // [n]
+                    let ty = cx.tables.expr_ty(a);
+                    if let ty::TyArray(_, s) = ty.sty {
+                        let size: u128 = s.assert_usize(cx.tcx).unwrap().into();
+                        // Index is a constant uint.
+                        if let Some((Constant::Int(const_index), _)) = constant(cx, cx.tables, b) {
+                            if size <= const_index {
+                                utils::span_lint(
+                                    cx,
+                                    OUT_OF_BOUNDS_INDEXING,
+                                    expr.span,
+                                    "const index is out of bounds",
+                                );
+                            }
+                            // Else index is in bounds, ok.
+                        }
+                    } else {
+                        cx.span_lint(
+                            INDEXING_SLICING,
+                            expr.span,
+                            "indexing may panic. Consider using `.get(n)` or \
+                             `.get_mut(n)` instead",
+                        );
+                    }
+                }
+                _ => (),
+            }
+        }
+    }
+}
+
+/// Returns an option containing a tuple with the start and end (exclusive) of
+/// the range.
+fn to_const_range<'a, 'tcx>(
+    cx: &LateContext<'a, 'tcx>,
+    range: Range,
+    array_size: u128,
+) -> Option<(u128, u128)> {
+    let s = range
+        .start
+        .map(|expr| constant(cx, cx.tables, expr).map(|(c, _)| c));
+    let start = match s {
+        Some(Some(Constant::Int(x))) => x,
+        Some(_) => return None,
+        None => 0,
+    };
+
+    let e = range
+        .end
+        .map(|expr| constant(cx, cx.tables, expr).map(|(c, _)| c));
+    let end = match e {
+        Some(Some(Constant::Int(x))) => if range.limits == RangeLimits::Closed {
+            x + 1
+        } else {
+            x
+        },
+        Some(_) => return None,
+        None => array_size,
+    };
+
+    Some((start, end))
+}
index bd89b37dc3ae4a5a841f190646b058183a1540ba..e261fe417f7e95add41dd8ce59ebd35d15768b57 100644 (file)
@@ -6,7 +6,7 @@
 #![feature(stmt_expr_attributes)]
 #![feature(range_contains)]
 #![feature(macro_vis_matcher)]
-#![allow(unknown_lints, indexing_slicing, shadow_reuse, missing_docs_in_private_items)]
+#![allow(unknown_lints, shadow_reuse, missing_docs_in_private_items)]
 #![recursion_limit = "256"]
 #![allow(stable_features)]
 #![feature(iterator_find_map)]
@@ -99,7 +99,6 @@ macro_rules! declare_clippy_lint {
 // begin lints modules, do not remove this comment, it’s used in `update_lints`
 pub mod approx_const;
 pub mod arithmetic;
-pub mod array_indexing;
 pub mod assign_ops;
 pub mod attrs;
 pub mod bit_mask;
@@ -139,6 +138,7 @@ macro_rules! declare_clippy_lint {
 pub mod identity_op;
 pub mod if_let_redundant_pattern_matching;
 pub mod if_not_else;
+pub mod indexing_slicing;
 pub mod infallible_destructuring_match;
 pub mod infinite_iter;
 pub mod inherent_impl;
@@ -355,8 +355,7 @@ pub fn register_plugins(reg: &mut rustc_plugin::Registry) {
     );
     reg.register_late_lint_pass(box escape::Pass{too_large_for_stack: conf.too_large_for_stack});
     reg.register_early_lint_pass(box misc_early::MiscEarly);
-    reg.register_late_lint_pass(box array_indexing::IndexingSlicingPass);
-    reg.register_late_lint_pass(box panic::Pass);
+    reg.register_late_lint_pass(box panic_unimplemented::Pass);
     reg.register_late_lint_pass(box strings::StringLitAsBytes);
     reg.register_late_lint_pass(box derive::Derive);
     reg.register_late_lint_pass(box types::CharLitAsU8);
@@ -432,12 +431,11 @@ pub fn register_plugins(reg: &mut rustc_plugin::Registry) {
     reg.register_late_lint_pass(box unwrap::Pass);
     reg.register_late_lint_pass(box duration_subsec::DurationSubsec);
     reg.register_late_lint_pass(box default_trait_access::DefaultTraitAccess);
-
+    reg.register_late_lint_pass(box indexing_slicing::IndexingSlicingPass);
 
     reg.register_lint_group("clippy_restriction", vec![
         arithmetic::FLOAT_ARITHMETIC,
         arithmetic::INTEGER_ARITHMETIC,
-        array_indexing::INDEXING_SLICING,
         assign_ops::ASSIGN_OPS,
         else_if_without_else::ELSE_IF_WITHOUT_ELSE,
         inherent_impl::MULTIPLE_INHERENT_IMPL,
@@ -468,6 +466,7 @@ pub fn register_plugins(reg: &mut rustc_plugin::Registry) {
         enum_variants::PUB_ENUM_VARIANT_NAMES,
         enum_variants::STUTTER,
         if_not_else::IF_NOT_ELSE,
+        indexing_slicing::INDEXING_SLICING,
         infinite_iter::MAYBE_INFINITE_ITER,
         items_after_statements::ITEMS_AFTER_STATEMENTS,
         matches::SINGLE_MATCH_ELSE,
@@ -500,7 +499,7 @@ pub fn register_plugins(reg: &mut rustc_plugin::Registry) {
 
     reg.register_lint_group("clippy", vec![
         approx_const::APPROX_CONSTANT,
-        array_indexing::OUT_OF_BOUNDS_INDEXING,
+        indexing_slicing::OUT_OF_BOUNDS_INDEXING,
         assign_ops::ASSIGN_OP_PATTERN,
         assign_ops::MISREFACTORED_ASSIGN_OP,
         attrs::DEPRECATED_SEMVER,
@@ -863,7 +862,7 @@ pub fn register_plugins(reg: &mut rustc_plugin::Registry) {
 
     reg.register_lint_group("clippy_correctness", vec![
         approx_const::APPROX_CONSTANT,
-        array_indexing::OUT_OF_BOUNDS_INDEXING,
+        indexing_slicing::OUT_OF_BOUNDS_INDEXING,
         attrs::DEPRECATED_SEMVER,
         attrs::USELESS_ATTRIBUTE,
         bit_mask::BAD_BIT_MASK,
diff --git a/tests/ui/array_indexing.rs b/tests/ui/array_indexing.rs
deleted file mode 100644 (file)
index 2437df9..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-#![feature(plugin)]
-#![warn(indexing_slicing)]
-#![warn(out_of_bounds_indexing)]
-#![allow(no_effect, unnecessary_operation)]
-
-fn main() {
-    let x = [1, 2, 3, 4];
-    let index: usize = 1;
-    let index_from: usize = 2;
-    let index_to: usize = 3;
-    x[index];
-    &x[index_from..index_to];
-    &x[index_from..][..index_to];
-    &x[index..];
-    &x[..index];
-    x[0];
-    x[3];
-    x[4];
-    x[1 << 3];
-    &x[1..5];
-    &x[1..][..5];
-    &x[0..3];
-    &x[0..][..3];
-    &x[0..=4];
-    &x[..=4];
-    &x[..];
-    &x[1..];
-    &x[4..];
-    &x[5..];
-    &x[..4];
-    &x[..5];
-
-    let y = &x;
-    y[0];
-    &y[1..2];
-    &y[..];
-    &y[0..=4];
-    &y[..=4];
-
-    let empty: [i8; 0] = [];
-    empty[0];
-    &empty[1..5];
-    &empty[0..=4];
-    &empty[..=4];
-    &empty[..];
-    &empty[0..];
-    &empty[0..0];
-    &empty[0..=0];
-    &empty[..=0];
-    &empty[..0];
-    &empty[1..];
-    &empty[..4];
-
-    let v = vec![0; 5];
-    v[0];
-    v[10];
-    &v[10..100];
-    &v[10..];
-    &v[..100];
-}
diff --git a/tests/ui/array_indexing.stderr b/tests/ui/array_indexing.stderr
deleted file mode 100644 (file)
index 14ef731..0000000
+++ /dev/null
@@ -1,222 +0,0 @@
-error: indexing may panic. Consider using `.get(n)` or `.get_mut(n)` instead
-  --> $DIR/array_indexing.rs:11:5
-   |
-11 |     x[index];
-   |     ^^^^^^^^
-   |
-   = note: `-D indexing-slicing` implied by `-D warnings`
-
-error: slicing may panic. Consider using `.get(n..m)` or `.get_mut(n..m)` instead
-  --> $DIR/array_indexing.rs:12:6
-   |
-12 |     &x[index_from..index_to];
-   |      ^^^^^^^^^^^^^^^^^^^^^^^
-
-error: slicing may panic. Consider using `.get(..n)`or `.get_mut(..n)` instead
-  --> $DIR/array_indexing.rs:13:6
-   |
-13 |     &x[index_from..][..index_to];
-   |      ^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error: slicing may panic. Consider using `.get(n..)` or .get_mut(n..)` instead
-  --> $DIR/array_indexing.rs:13:6
-   |
-13 |     &x[index_from..][..index_to];
-   |      ^^^^^^^^^^^^^^^
-
-error: slicing may panic. Consider using `.get(n..)` or .get_mut(n..)` instead
-  --> $DIR/array_indexing.rs:14:6
-   |
-14 |     &x[index..];
-   |      ^^^^^^^^^^
-
-error: slicing may panic. Consider using `.get(..n)`or `.get_mut(..n)` instead
-  --> $DIR/array_indexing.rs:15:6
-   |
-15 |     &x[..index];
-   |      ^^^^^^^^^^
-
-error: const index is out of bounds
-  --> $DIR/array_indexing.rs:18:5
-   |
-18 |     x[4];
-   |     ^^^^
-   |
-   = note: `-D out-of-bounds-indexing` implied by `-D warnings`
-
-error: range is out of bounds
-  --> $DIR/array_indexing.rs:20:6
-   |
-20 |     &x[1..5];
-   |      ^^^^^^^
-
-error: slicing may panic. Consider using `.get(n..m)` or `.get_mut(n..m)` instead
-  --> $DIR/array_indexing.rs:20:6
-   |
-20 |     &x[1..5];
-   |      ^^^^^^^
-
-error: slicing may panic. Consider using `.get(..n)`or `.get_mut(..n)` instead
-  --> $DIR/array_indexing.rs:21:6
-   |
-21 |     &x[1..][..5];
-   |      ^^^^^^^^^^^
-
-error: slicing may panic. Consider using `.get(..n)`or `.get_mut(..n)` instead
-  --> $DIR/array_indexing.rs:23:6
-   |
-23 |     &x[0..][..3];
-   |      ^^^^^^^^^^^
-
-error: range is out of bounds
-  --> $DIR/array_indexing.rs:25:6
-   |
-25 |     &x[..=4];
-   |      ^^^^^^^
-
-error: slicing may panic. Consider using `.get(..n)`or `.get_mut(..n)` instead
-  --> $DIR/array_indexing.rs:25:6
-   |
-25 |     &x[..=4];
-   |      ^^^^^^^
-
-error: range is out of bounds
-  --> $DIR/array_indexing.rs:29:6
-   |
-29 |     &x[5..];
-   |      ^^^^^^
-
-error: slicing may panic. Consider using `.get(n..)` or .get_mut(n..)` instead
-  --> $DIR/array_indexing.rs:29:6
-   |
-29 |     &x[5..];
-   |      ^^^^^^
-
-error: range is out of bounds
-  --> $DIR/array_indexing.rs:31:6
-   |
-31 |     &x[..5];
-   |      ^^^^^^
-
-error: slicing may panic. Consider using `.get(..n)`or `.get_mut(..n)` instead
-  --> $DIR/array_indexing.rs:31:6
-   |
-31 |     &x[..5];
-   |      ^^^^^^
-
-error: indexing may panic. Consider using `.get(n)` or `.get_mut(n)` instead
-  --> $DIR/array_indexing.rs:34:5
-   |
-34 |     y[0];
-   |     ^^^^
-
-error: slicing may panic. Consider using `.get(n..m)` or `.get_mut(n..m)` instead
-  --> $DIR/array_indexing.rs:35:6
-   |
-35 |     &y[1..2];
-   |      ^^^^^^^
-
-error: slicing may panic. Consider using `.get(..n)`or `.get_mut(..n)` instead
-  --> $DIR/array_indexing.rs:38:6
-   |
-38 |     &y[..=4];
-   |      ^^^^^^^
-
-error: const index is out of bounds
-  --> $DIR/array_indexing.rs:41:5
-   |
-41 |     empty[0];
-   |     ^^^^^^^^
-
-error: range is out of bounds
-  --> $DIR/array_indexing.rs:42:6
-   |
-42 |     &empty[1..5];
-   |      ^^^^^^^^^^^
-
-error: slicing may panic. Consider using `.get(n..m)` or `.get_mut(n..m)` instead
-  --> $DIR/array_indexing.rs:42:6
-   |
-42 |     &empty[1..5];
-   |      ^^^^^^^^^^^
-
-error: range is out of bounds
-  --> $DIR/array_indexing.rs:44:6
-   |
-44 |     &empty[..=4];
-   |      ^^^^^^^^^^^
-
-error: slicing may panic. Consider using `.get(..n)`or `.get_mut(..n)` instead
-  --> $DIR/array_indexing.rs:44:6
-   |
-44 |     &empty[..=4];
-   |      ^^^^^^^^^^^
-
-error: range is out of bounds
-  --> $DIR/array_indexing.rs:49:6
-   |
-49 |     &empty[..=0];
-   |      ^^^^^^^^^^^
-
-error: slicing may panic. Consider using `.get(..n)`or `.get_mut(..n)` instead
-  --> $DIR/array_indexing.rs:49:6
-   |
-49 |     &empty[..=0];
-   |      ^^^^^^^^^^^
-
-error: range is out of bounds
-  --> $DIR/array_indexing.rs:51:6
-   |
-51 |     &empty[1..];
-   |      ^^^^^^^^^^
-
-error: slicing may panic. Consider using `.get(n..)` or .get_mut(n..)` instead
-  --> $DIR/array_indexing.rs:51:6
-   |
-51 |     &empty[1..];
-   |      ^^^^^^^^^^
-
-error: range is out of bounds
-  --> $DIR/array_indexing.rs:52:6
-   |
-52 |     &empty[..4];
-   |      ^^^^^^^^^^
-
-error: slicing may panic. Consider using `.get(..n)`or `.get_mut(..n)` instead
-  --> $DIR/array_indexing.rs:52:6
-   |
-52 |     &empty[..4];
-   |      ^^^^^^^^^^
-
-error: indexing may panic. Consider using `.get(n)` or `.get_mut(n)` instead
-  --> $DIR/array_indexing.rs:55:5
-   |
-55 |     v[0];
-   |     ^^^^
-
-error: indexing may panic. Consider using `.get(n)` or `.get_mut(n)` instead
-  --> $DIR/array_indexing.rs:56:5
-   |
-56 |     v[10];
-   |     ^^^^^
-
-error: slicing may panic. Consider using `.get(n..m)` or `.get_mut(n..m)` instead
-  --> $DIR/array_indexing.rs:57:6
-   |
-57 |     &v[10..100];
-   |      ^^^^^^^^^^
-
-error: slicing may panic. Consider using `.get(n..)` or .get_mut(n..)` instead
-  --> $DIR/array_indexing.rs:58:6
-   |
-58 |     &v[10..];
-   |      ^^^^^^^
-
-error: slicing may panic. Consider using `.get(..n)`or `.get_mut(..n)` instead
-  --> $DIR/array_indexing.rs:59:6
-   |
-59 |     &v[..100];
-   |      ^^^^^^^^
-
-error: aborting due to 36 previous errors
-
diff --git a/tests/ui/indexing_slicing.rs b/tests/ui/indexing_slicing.rs
new file mode 100644 (file)
index 0000000..2437df9
--- /dev/null
@@ -0,0 +1,60 @@
+#![feature(plugin)]
+#![warn(indexing_slicing)]
+#![warn(out_of_bounds_indexing)]
+#![allow(no_effect, unnecessary_operation)]
+
+fn main() {
+    let x = [1, 2, 3, 4];
+    let index: usize = 1;
+    let index_from: usize = 2;
+    let index_to: usize = 3;
+    x[index];
+    &x[index_from..index_to];
+    &x[index_from..][..index_to];
+    &x[index..];
+    &x[..index];
+    x[0];
+    x[3];
+    x[4];
+    x[1 << 3];
+    &x[1..5];
+    &x[1..][..5];
+    &x[0..3];
+    &x[0..][..3];
+    &x[0..=4];
+    &x[..=4];
+    &x[..];
+    &x[1..];
+    &x[4..];
+    &x[5..];
+    &x[..4];
+    &x[..5];
+
+    let y = &x;
+    y[0];
+    &y[1..2];
+    &y[..];
+    &y[0..=4];
+    &y[..=4];
+
+    let empty: [i8; 0] = [];
+    empty[0];
+    &empty[1..5];
+    &empty[0..=4];
+    &empty[..=4];
+    &empty[..];
+    &empty[0..];
+    &empty[0..0];
+    &empty[0..=0];
+    &empty[..=0];
+    &empty[..0];
+    &empty[1..];
+    &empty[..4];
+
+    let v = vec![0; 5];
+    v[0];
+    v[10];
+    &v[10..100];
+    &v[10..];
+    &v[..100];
+}
diff --git a/tests/ui/indexing_slicing.stderr b/tests/ui/indexing_slicing.stderr
new file mode 100644 (file)
index 0000000..30231a3
--- /dev/null
@@ -0,0 +1,222 @@
+error: indexing may panic. Consider using `.get(n)` or `.get_mut(n)` instead
+  --> $DIR/indexing_slicing.rs:11:5
+   |
+11 |     x[index];
+   |     ^^^^^^^^
+   |
+   = note: `-D indexing-slicing` implied by `-D warnings`
+
+error: slicing may panic. Consider using `.get(n..m)` or `.get_mut(n..m)` instead
+  --> $DIR/indexing_slicing.rs:12:6
+   |
+12 |     &x[index_from..index_to];
+   |      ^^^^^^^^^^^^^^^^^^^^^^^
+
+error: slicing may panic. Consider using `.get(..n)`or `.get_mut(..n)` instead
+  --> $DIR/indexing_slicing.rs:13:6
+   |
+13 |     &x[index_from..][..index_to];
+   |      ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: slicing may panic. Consider using `.get(n..)` or .get_mut(n..)` instead
+  --> $DIR/indexing_slicing.rs:13:6
+   |
+13 |     &x[index_from..][..index_to];
+   |      ^^^^^^^^^^^^^^^
+
+error: slicing may panic. Consider using `.get(n..)` or .get_mut(n..)` instead
+  --> $DIR/indexing_slicing.rs:14:6
+   |
+14 |     &x[index..];
+   |      ^^^^^^^^^^
+
+error: slicing may panic. Consider using `.get(..n)`or `.get_mut(..n)` instead
+  --> $DIR/indexing_slicing.rs:15:6
+   |
+15 |     &x[..index];
+   |      ^^^^^^^^^^
+
+error: const index is out of bounds
+  --> $DIR/indexing_slicing.rs:18:5
+   |
+18 |     x[4];
+   |     ^^^^
+   |
+   = note: `-D out-of-bounds-indexing` implied by `-D warnings`
+
+error: range is out of bounds
+  --> $DIR/indexing_slicing.rs:20:6
+   |
+20 |     &x[1..5];
+   |      ^^^^^^^
+
+error: slicing may panic. Consider using `.get(n..m)` or `.get_mut(n..m)` instead
+  --> $DIR/indexing_slicing.rs:20:6
+   |
+20 |     &x[1..5];
+   |      ^^^^^^^
+
+error: slicing may panic. Consider using `.get(..n)`or `.get_mut(..n)` instead
+  --> $DIR/indexing_slicing.rs:21:6
+   |
+21 |     &x[1..][..5];
+   |      ^^^^^^^^^^^
+
+error: slicing may panic. Consider using `.get(..n)`or `.get_mut(..n)` instead
+  --> $DIR/indexing_slicing.rs:23:6
+   |
+23 |     &x[0..][..3];
+   |      ^^^^^^^^^^^
+
+error: range is out of bounds
+  --> $DIR/indexing_slicing.rs:25:6
+   |
+25 |     &x[..=4];
+   |      ^^^^^^^
+
+error: slicing may panic. Consider using `.get(..n)`or `.get_mut(..n)` instead
+  --> $DIR/indexing_slicing.rs:25:6
+   |
+25 |     &x[..=4];
+   |      ^^^^^^^
+
+error: range is out of bounds
+  --> $DIR/indexing_slicing.rs:29:6
+   |
+29 |     &x[5..];
+   |      ^^^^^^
+
+error: slicing may panic. Consider using `.get(n..)` or .get_mut(n..)` instead
+  --> $DIR/indexing_slicing.rs:29:6
+   |
+29 |     &x[5..];
+   |      ^^^^^^
+
+error: range is out of bounds
+  --> $DIR/indexing_slicing.rs:31:6
+   |
+31 |     &x[..5];
+   |      ^^^^^^
+
+error: slicing may panic. Consider using `.get(..n)`or `.get_mut(..n)` instead
+  --> $DIR/indexing_slicing.rs:31:6
+   |
+31 |     &x[..5];
+   |      ^^^^^^
+
+error: indexing may panic. Consider using `.get(n)` or `.get_mut(n)` instead
+  --> $DIR/indexing_slicing.rs:34:5
+   |
+34 |     y[0];
+   |     ^^^^
+
+error: slicing may panic. Consider using `.get(n..m)` or `.get_mut(n..m)` instead
+  --> $DIR/indexing_slicing.rs:35:6
+   |
+35 |     &y[1..2];
+   |      ^^^^^^^
+
+error: slicing may panic. Consider using `.get(..n)`or `.get_mut(..n)` instead
+  --> $DIR/indexing_slicing.rs:38:6
+   |
+38 |     &y[..=4];
+   |      ^^^^^^^
+
+error: const index is out of bounds
+  --> $DIR/indexing_slicing.rs:41:5
+   |
+41 |     empty[0];
+   |     ^^^^^^^^
+
+error: range is out of bounds
+  --> $DIR/indexing_slicing.rs:42:6
+   |
+42 |     &empty[1..5];
+   |      ^^^^^^^^^^^
+
+error: slicing may panic. Consider using `.get(n..m)` or `.get_mut(n..m)` instead
+  --> $DIR/indexing_slicing.rs:42:6
+   |
+42 |     &empty[1..5];
+   |      ^^^^^^^^^^^
+
+error: range is out of bounds
+  --> $DIR/indexing_slicing.rs:44:6
+   |
+44 |     &empty[..=4];
+   |      ^^^^^^^^^^^
+
+error: slicing may panic. Consider using `.get(..n)`or `.get_mut(..n)` instead
+  --> $DIR/indexing_slicing.rs:44:6
+   |
+44 |     &empty[..=4];
+   |      ^^^^^^^^^^^
+
+error: range is out of bounds
+  --> $DIR/indexing_slicing.rs:49:6
+   |
+49 |     &empty[..=0];
+   |      ^^^^^^^^^^^
+
+error: slicing may panic. Consider using `.get(..n)`or `.get_mut(..n)` instead
+  --> $DIR/indexing_slicing.rs:49:6
+   |
+49 |     &empty[..=0];
+   |      ^^^^^^^^^^^
+
+error: range is out of bounds
+  --> $DIR/indexing_slicing.rs:51:6
+   |
+51 |     &empty[1..];
+   |      ^^^^^^^^^^
+
+error: slicing may panic. Consider using `.get(n..)` or .get_mut(n..)` instead
+  --> $DIR/indexing_slicing.rs:51:6
+   |
+51 |     &empty[1..];
+   |      ^^^^^^^^^^
+
+error: range is out of bounds
+  --> $DIR/indexing_slicing.rs:52:6
+   |
+52 |     &empty[..4];
+   |      ^^^^^^^^^^
+
+error: slicing may panic. Consider using `.get(..n)`or `.get_mut(..n)` instead
+  --> $DIR/indexing_slicing.rs:52:6
+   |
+52 |     &empty[..4];
+   |      ^^^^^^^^^^
+
+error: indexing may panic. Consider using `.get(n)` or `.get_mut(n)` instead
+  --> $DIR/indexing_slicing.rs:55:5
+   |
+55 |     v[0];
+   |     ^^^^
+
+error: indexing may panic. Consider using `.get(n)` or `.get_mut(n)` instead
+  --> $DIR/indexing_slicing.rs:56:5
+   |
+56 |     v[10];
+   |     ^^^^^
+
+error: slicing may panic. Consider using `.get(n..m)` or `.get_mut(n..m)` instead
+  --> $DIR/indexing_slicing.rs:57:6
+   |
+57 |     &v[10..100];
+   |      ^^^^^^^^^^
+
+error: slicing may panic. Consider using `.get(n..)` or .get_mut(n..)` instead
+  --> $DIR/indexing_slicing.rs:58:6
+   |
+58 |     &v[10..];
+   |      ^^^^^^^
+
+error: slicing may panic. Consider using `.get(..n)`or `.get_mut(..n)` instead
+  --> $DIR/indexing_slicing.rs:59:6
+   |
+59 |     &v[..100];
+   |      ^^^^^^^^
+
+error: aborting due to 36 previous errors
+