]> git.lizzy.rs Git - rust.git/commitdiff
Fix panic with fake `Range` type
authorsinkuu <sinkuu@sinkuu.xyz>
Thu, 12 Oct 2017 14:24:21 +0000 (23:24 +0900)
committersinkuu <sinkuu@sinkuu.xyz>
Fri, 13 Oct 2017 12:51:57 +0000 (21:51 +0900)
clippy_lints/src/utils/higher.rs
tests/ui/range.rs

index 550ecedeae435fc5060285c0a7e814ed04b19ea2..d162dea7f1104b260211875a2e338e687f1d570e 100644 (file)
@@ -50,8 +50,7 @@ pub fn range(expr: &hir::Expr) -> Option<Range> {
     fn get_field<'a>(name: &str, fields: &'a [hir::Field]) -> Option<&'a hir::Expr> {
         let expr = &fields
             .iter()
-            .find(|field| field.name.node == name)
-            .unwrap_or_else(|| panic!("missing {} field for range", name))
+            .find(|field| field.name.node == name)?
             .expr;
 
         Some(expr)
@@ -77,32 +76,32 @@ fn get_field<'a>(name: &str, fields: &'a [hir::Field]) -> Option<&'a hir::Expr>
             match_qpath(path, &paths::RANGE_FROM)
         {
             Some(Range {
-                start: get_field("start", fields),
+                start: Some(get_field("start", fields)?),
                 end: None,
                 limits: ast::RangeLimits::HalfOpen,
             })
         } else if match_qpath(path, &paths::RANGE_INCLUSIVE_STD) || match_qpath(path, &paths::RANGE_INCLUSIVE) {
             Some(Range {
-                start: get_field("start", fields),
-                end: get_field("end", fields),
+                start: Some(get_field("start", fields)?),
+                end: Some(get_field("end", fields)?),
                 limits: ast::RangeLimits::Closed,
             })
         } else if match_qpath(path, &paths::RANGE_STD) || match_qpath(path, &paths::RANGE) {
             Some(Range {
-                start: get_field("start", fields),
-                end: get_field("end", fields),
+                start: Some(get_field("start", fields)?),
+                end: Some(get_field("end", fields)?),
                 limits: ast::RangeLimits::HalfOpen,
             })
         } else if match_qpath(path, &paths::RANGE_TO_INCLUSIVE_STD) || match_qpath(path, &paths::RANGE_TO_INCLUSIVE) {
             Some(Range {
                 start: None,
-                end: get_field("end", fields),
+                end: Some(get_field("end", fields)?),
                 limits: ast::RangeLimits::Closed,
             })
         } else if match_qpath(path, &paths::RANGE_TO_STD) || match_qpath(path, &paths::RANGE_TO) {
             Some(Range {
                 start: None,
-                end: get_field("end", fields),
+                end: Some(get_field("end", fields)?),
                 limits: ast::RangeLimits::HalfOpen,
             })
         } else {
index 71f2f2b219bd79ebfef7bd3dbfa1aa3107a1f009..d9db28c8513f4a9077bcdd710e498b500ab7b0db 100644 (file)
@@ -32,3 +32,12 @@ fn main() {
     // check const eval
     let _ = v1.iter().step_by(2/3);
 }
+
+#[allow(unused)]
+fn no_panic_with_fake_range_types() {
+    struct Range {
+        foo: i32,
+    }
+
+    let _ = Range { foo: 0 };
+}