Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
beb57f07
R
Rust
项目概览
int
/
Rust
11 个月 前同步成功
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
Rust
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
beb57f07
编写于
8月 10, 2023
作者:
C
Catherine Flores
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Don't ICE with late bound regions
上级
7c595b45
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
45 addition
and
11 deletion
+45
-11
clippy_lints/src/methods/filter_map_bool_then.rs
clippy_lints/src/methods/filter_map_bool_then.rs
+11
-3
tests/ui/filter_map_bool_then.fixed
tests/ui/filter_map_bool_then.fixed
+11
-1
tests/ui/filter_map_bool_then.rs
tests/ui/filter_map_bool_then.rs
+11
-1
tests/ui/filter_map_bool_then.stderr
tests/ui/filter_map_bool_then.stderr
+12
-6
未找到文件。
clippy_lints/src/methods/filter_map_bool_then.rs
浏览文件 @
beb57f07
use
super
::
FILTER_MAP_BOOL_THEN
;
use
clippy_utils
::
diagnostics
::
span_lint_and_sugg
;
use
clippy_utils
::
paths
::
BOOL_THEN
;
use
clippy_utils
::
source
::
snippet_opt
;
...
...
@@ -7,10 +8,9 @@
use
rustc_hir
::{
Expr
,
ExprKind
};
use
rustc_lint
::{
LateContext
,
LintContext
};
use
rustc_middle
::
lint
::
in_external_macro
;
use
rustc_middle
::
ty
::
Binder
;
use
rustc_span
::{
sym
,
Span
};
use
super
::
FILTER_MAP_BOOL_THEN
;
pub
(
super
)
fn
check
<
'tcx
>
(
cx
:
&
LateContext
<
'tcx
>
,
expr
:
&
'tcx
Expr
<
'tcx
>
,
arg
:
&
Expr
<
'_
>
,
call_span
:
Span
)
{
if
!
in_external_macro
(
cx
.sess
(),
expr
.span
)
&&
is_trait_method
(
cx
,
expr
,
sym
::
Iterator
)
...
...
@@ -21,7 +21,15 @@ pub(super) fn check<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'tcx>, arg: &
// `inputs` and `params` here as we need both the type and the span
&&
let
param_ty
=
closure
.fn_decl.inputs
[
0
]
&&
let
param
=
body
.params
[
0
]
&&
is_copy
(
cx
,
cx
.typeck_results
()
.node_type
(
param_ty
.hir_id
)
.peel_refs
())
// Issue #11309
&&
let
param_ty
=
cx
.tcx
.liberate_late_bound_regions
(
closure
.def_id
.to_def_id
(),
Binder
::
bind_with_vars
(
cx
.typeck_results
()
.node_type
(
param_ty
.hir_id
),
cx
.tcx
.late_bound_vars
(
cx
.tcx
.hir
()
.local_def_id_to_hir_id
(
closure
.def_id
)),
),
)
&&
is_copy
(
cx
,
param_ty
)
&&
let
ExprKind
::
MethodCall
(
_
,
recv
,
[
then_arg
],
_
)
=
value
.kind
&&
let
ExprKind
::
Closure
(
then_closure
)
=
then_arg
.kind
&&
let
then_body
=
peel_blocks
(
cx
.tcx
.hir
()
.body
(
then_closure
.body
)
.value
)
...
...
tests/ui/filter_map_bool_then.fixed
浏览文件 @
beb57f07
...
...
@@ -4,6 +4,7 @@
clippy::clone_on_copy,
clippy::map_identity,
clippy::unnecessary_lazy_evaluations,
clippy::unnecessary_filter_map,
unused
)]
#![warn(clippy::filter_map_bool_then)]
...
...
@@ -29,9 +30,14 @@ fn main() {
.copied()
.filter(|&i| i != 1000)
.filter(|&i| (i.clone() % 2 == 0)).map(|i| i + 1);
// Despite this is non-copy, `is_copy` still returns true (at least now) because it's `&NonCopy`,
// and any `&` is `Copy`. So since we can dereference it in `filter` (since it's then `&&NonCopy`),
// we can lint this and still get the same input type.
let v = vec![NonCopy, NonCopy];
v.clone().iter().filter(|&i| (i == &NonCopy)).map(|i| i);
// Do not lint
let v = vec![NonCopy, NonCopy];
v.clone().i
ter().filter_map(|i| (i == &
NonCopy).then(|| i));
v.clone().i
nto_iter().filter_map(|i| (i ==
NonCopy).then(|| i));
external! {
let v = vec![1, 2, 3, 4, 5, 6];
v.clone().into_iter().filter_map(|i| (i % 2 == 0).then(|| i + 1));
...
...
@@ -42,3 +48,7 @@ fn main() {
v.clone().into_iter().filter_map(|i| (i % 2 == 0).then(|| i + 1));
}
}
fn issue11309<'a>(iter: impl Iterator<Item = (&'a str, &'a str)>) -> Vec<&'a str> {
iter.filter_map(|(_, s): (&str, _)| Some(s)).collect()
}
tests/ui/filter_map_bool_then.rs
浏览文件 @
beb57f07
...
...
@@ -4,6 +4,7 @@
clippy::clone_on_copy,
clippy::map_identity,
clippy::unnecessary_lazy_evaluations,
clippy::unnecessary_filter_map,
unused
)]
#![warn(clippy::filter_map_bool_then)]
...
...
@@ -29,9 +30,14 @@ fn main() {
.copied
()
.filter
(|
&
i
|
i
!=
1000
)
.filter_map
(|
i
|
(
i
.clone
()
%
2
==
0
)
.then
(||
i
+
1
));
// Do not lint
// Despite this is non-copy, `is_copy` still returns true (at least now) because it's `&NonCopy`,
// and any `&` is `Copy`. So since we can dereference it in `filter` (since it's then `&&NonCopy`),
// we can lint this and still get the same input type.
let
v
=
vec!
[
NonCopy
,
NonCopy
];
v
.clone
()
.iter
()
.filter_map
(|
i
|
(
i
==
&
NonCopy
)
.then
(||
i
));
// Do not lint
let
v
=
vec!
[
NonCopy
,
NonCopy
];
v
.clone
()
.into_iter
()
.filter_map
(|
i
|
(
i
==
NonCopy
)
.then
(||
i
));
external!
{
let
v
=
vec!
[
1
,
2
,
3
,
4
,
5
,
6
];
v
.clone
()
.into_iter
()
.filter_map
(|
i
|
(
i
%
2
==
0
)
.then
(||
i
+
1
));
...
...
@@ -42,3 +48,7 @@ fn main() {
v
.clone
()
.into_iter
()
.filter_map
(|
i
|
(
i
%
2
==
0
)
.then
(||
i
+
1
));
}
}
fn
issue11309
<
'a
>
(
iter
:
impl
Iterator
<
Item
=
(
&
'a
str
,
&
'a
str
)
>
)
->
Vec
<&
'a
str
>
{
iter
.filter_map
(|(
_
,
s
):
(
&
str
,
_
)|
Some
(
s
))
.collect
()
}
tests/ui/filter_map_bool_then.stderr
浏览文件 @
beb57f07
error: usage of `bool::then` in `filter_map`
--> $DIR/filter_map_bool_then.rs:
19
:22
--> $DIR/filter_map_bool_then.rs:
20
:22
|
LL | v.clone().iter().filter_map(|i| (i % 2 == 0).then(|| i + 1));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `filter` then `map` instead: `filter(|&i| (i % 2 == 0)).map(|i| i + 1)`
...
...
@@ -7,28 +7,34 @@ LL | v.clone().iter().filter_map(|i| (i % 2 == 0).then(|| i + 1));
= note: `-D clippy::filter-map-bool-then` implied by `-D warnings`
error: usage of `bool::then` in `filter_map`
--> $DIR/filter_map_bool_then.rs:2
0
:27
--> $DIR/filter_map_bool_then.rs:2
1
:27
|
LL | v.clone().into_iter().filter_map(|i| (i % 2 == 0).then(|| i + 1));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `filter` then `map` instead: `filter(|&i| (i % 2 == 0)).map(|i| i + 1)`
error: usage of `bool::then` in `filter_map`
--> $DIR/filter_map_bool_then.rs:2
3
:10
--> $DIR/filter_map_bool_then.rs:2
4
:10
|
LL | .filter_map(|i| -> Option<_> { (i % 2 == 0).then(|| i + 1) });
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `filter` then `map` instead: `filter(|&i| (i % 2 == 0)).map(|i| i + 1)`
error: usage of `bool::then` in `filter_map`
--> $DIR/filter_map_bool_then.rs:2
7
:10
--> $DIR/filter_map_bool_then.rs:2
8
:10
|
LL | .filter_map(|i| (i % 2 == 0).then(|| i + 1));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `filter` then `map` instead: `filter(|&i| (i % 2 == 0)).map(|i| i + 1)`
error: usage of `bool::then` in `filter_map`
--> $DIR/filter_map_bool_then.rs:3
1
:10
--> $DIR/filter_map_bool_then.rs:3
2
:10
|
LL | .filter_map(|i| (i.clone() % 2 == 0).then(|| i + 1));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `filter` then `map` instead: `filter(|&i| (i.clone() % 2 == 0)).map(|i| i + 1)`
error: aborting due to 5 previous errors
error: usage of `bool::then` in `filter_map`
--> $DIR/filter_map_bool_then.rs:37:22
|
LL | v.clone().iter().filter_map(|i| (i == &NonCopy).then(|| i));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `filter` then `map` instead: `filter(|&i| (i == &NonCopy)).map(|i| i)`
error: aborting due to 6 previous errors
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录