Skip to content

Commit 6e4779b

Browse files
authored
Merge pull request rust-lang#2133 from sinkuu/fix_panic
Fix panic with fake `Range` type
2 parents bcc4675 + c3332ca commit 6e4779b

File tree

2 files changed

+17
-9
lines changed

2 files changed

+17
-9
lines changed

clippy_lints/src/utils/higher.rs

+8-9
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,7 @@ pub fn range(expr: &hir::Expr) -> Option<Range> {
5050
fn get_field<'a>(name: &str, fields: &'a [hir::Field]) -> Option<&'a hir::Expr> {
5151
let expr = &fields
5252
.iter()
53-
.find(|field| field.name.node == name)
54-
.unwrap_or_else(|| panic!("missing {} field for range", name))
53+
.find(|field| field.name.node == name)?
5554
.expr;
5655

5756
Some(expr)
@@ -77,32 +76,32 @@ pub fn range(expr: &hir::Expr) -> Option<Range> {
7776
match_qpath(path, &paths::RANGE_FROM)
7877
{
7978
Some(Range {
80-
start: get_field("start", fields),
79+
start: Some(get_field("start", fields)?),
8180
end: None,
8281
limits: ast::RangeLimits::HalfOpen,
8382
})
8483
} else if match_qpath(path, &paths::RANGE_INCLUSIVE_STD) || match_qpath(path, &paths::RANGE_INCLUSIVE) {
8584
Some(Range {
86-
start: get_field("start", fields),
87-
end: get_field("end", fields),
85+
start: Some(get_field("start", fields)?),
86+
end: Some(get_field("end", fields)?),
8887
limits: ast::RangeLimits::Closed,
8988
})
9089
} else if match_qpath(path, &paths::RANGE_STD) || match_qpath(path, &paths::RANGE) {
9190
Some(Range {
92-
start: get_field("start", fields),
93-
end: get_field("end", fields),
91+
start: Some(get_field("start", fields)?),
92+
end: Some(get_field("end", fields)?),
9493
limits: ast::RangeLimits::HalfOpen,
9594
})
9695
} else if match_qpath(path, &paths::RANGE_TO_INCLUSIVE_STD) || match_qpath(path, &paths::RANGE_TO_INCLUSIVE) {
9796
Some(Range {
9897
start: None,
99-
end: get_field("end", fields),
98+
end: Some(get_field("end", fields)?),
10099
limits: ast::RangeLimits::Closed,
101100
})
102101
} else if match_qpath(path, &paths::RANGE_TO_STD) || match_qpath(path, &paths::RANGE_TO) {
103102
Some(Range {
104103
start: None,
105-
end: get_field("end", fields),
104+
end: Some(get_field("end", fields)?),
106105
limits: ast::RangeLimits::HalfOpen,
107106
})
108107
} else {

tests/ui/range.rs

+9
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,12 @@ fn main() {
3232
// check const eval
3333
let _ = v1.iter().step_by(2/3);
3434
}
35+
36+
#[allow(unused)]
37+
fn no_panic_with_fake_range_types() {
38+
struct Range {
39+
foo: i32,
40+
}
41+
42+
let _ = Range { foo: 0 };
43+
}

0 commit comments

Comments
 (0)