]> git.lizzy.rs Git - rust.git/commitdiff
Small nits on INDEXING_SLICING
authormcarton <cartonmartin+git@gmail.com>
Fri, 11 Mar 2016 21:10:40 +0000 (22:10 +0100)
committermcarton <cartonmartin+git@gmail.com>
Fri, 11 Mar 2016 21:10:40 +0000 (22:10 +0100)
src/array_indexing.rs
src/lib.rs
tests/compile-fail/array_indexing.rs

index abce04f0b774cfa11db50e0ceab5512c55083601..274491b7c963bd7a6e940933da9b6fb611d0bcc6 100644 (file)
@@ -69,34 +69,26 @@ fn check_expr(&mut self, cx: &LateContext, e: &Expr) {
                 if let Ok(ConstVal::Uint(const_index)) = const_index {
                     if size <= const_index {
                         utils::span_lint(cx, OUT_OF_BOUNDS_INDEXING, e.span, "const index is out of bounds");
-                        utils::span_lint(cx, INDEXING_SLICING, e.span, "indexing may panic");
-                    } else {
-                        // Index is within bounds
-                        return;
                     }
+
+                    return;
                 }
 
                 // Index is a constant range
                 if let Some(range) = utils::unsugar_range(index) {
                     let start = range.start.map(|start|
-                        eval_const_expr_partial(cx.tcx, start, ExprTypeChecked, None));
+                        eval_const_expr_partial(cx.tcx, start, ExprTypeChecked, None)).map(|v| v.ok());
                     let end = range.end.map(|end|
-                        eval_const_expr_partial(cx.tcx, end, ExprTypeChecked, None));
+                        eval_const_expr_partial(cx.tcx, end, ExprTypeChecked, None)).map(|v| v.ok());
 
                     if let Some((start, end)) = to_const_range(start, end, range.limits, size) {
-                        if start >= size && end >= size {
+                        if start >= size || end >= size {
                             utils::span_lint(cx,
                                              OUT_OF_BOUNDS_INDEXING,
                                              e.span,
                                              "range is out of bounds");
-                            utils::span_lint(cx,
-                                             INDEXING_SLICING,
-                                             e.span,
-                                             "slicing may panic");
-                        } else {
-                            // Range is within bounds
-                            return;
                         }
+                        return;
                     }
                 }
             }
@@ -120,19 +112,19 @@ fn check_expr(&mut self, cx: &LateContext, e: &Expr) {
 ///
 /// Note: we assume the start and the end of the range are unsigned, since array slicing
 /// works only on usize
-fn to_const_range<T>(start: Option<Result<ConstVal, T>>,
-                    end: Option<Result<ConstVal, T>>,
+fn to_const_range(start: Option<Option<ConstVal>>,
+                    end: Option<Option<ConstVal>>,
                     limits: RangeLimits,
                     array_size: u64)
                     -> Option<(u64, u64)> {
     let start = match start {
-        Some(Ok(ConstVal::Uint(x))) => x,
+        Some(Some(ConstVal::Uint(x))) => x,
         Some(_) => return None,
         None => 0,
     };
 
     let end = match end {
-        Some(Ok(ConstVal::Uint(x))) => {
+        Some(Some(ConstVal::Uint(x))) => {
             if limits == RangeLimits::Closed {
                 x
             } else {
index 664819b97ecbe2e10e04b441a4f2e1c73277bfee..4b9d5d8c9c4a4832c9e20bb6e7f5e2dcf8fbdb82 100644 (file)
@@ -2,7 +2,7 @@
 #![feature(rustc_private, collections)]
 #![feature(iter_arith)]
 #![feature(custom_attribute)]
-#![allow(unknown_lints)]
+#![allow(indexing_slicing, shadow_reuse, unknown_lints)]
 
 // this only exists to allow the "dogfood" integration test to work
 #[allow(dead_code)]
index bcd25f5bf06dbc54358b576bc1ca0db96d2891ec..14f3448a9f671b24aebc10625adc3c4696ed612a 100644 (file)
@@ -9,20 +9,15 @@ fn main() {
     let x = [1,2,3,4];
     x[0];
     x[3];
-    x[4]; //~ERROR: indexing may panic
-          //~^ ERROR: const index is out of bounds
-    x[1 << 3]; //~ERROR: indexing may panic
-               //~^ ERROR: const index is out of bounds
-    &x[1..5]; //~ERROR: slicing may panic
-              //~^ ERROR: range is out of bounds
+    x[4]; //~ERROR: const index is out of bounds
+    x[1 << 3]; //~ERROR: const index is out of bounds
+    &x[1..5]; //~ERROR: range is out of bounds
     &x[0..3];
-    &x[0...4]; //~ERROR: slicing may panic
-               //~^ ERROR: range is out of bounds
+    &x[0...4]; //~ERROR: range is out of bounds
     &x[..];
     &x[1..];
     &x[..4];
-    &x[..5]; //~ERROR: slicing may panic
-             //~^ ERROR: range is out of bounds
+    &x[..5]; //~ERROR: range is out of bounds
 
     let y = &x;
     y[0]; //~ERROR: indexing may panic