Skip to content

Commit

Permalink
Fix #109152, fix the scenario that we may can not get span of func
Browse files Browse the repository at this point in the history
  • Loading branch information
chenyukang committed Mar 15, 2023
1 parent 669e751 commit b3af5e2
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 2 deletions.
11 changes: 9 additions & 2 deletions compiler/rustc_lint/src/map_unit_fn.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ impl<'tcx> LateLintPass<'tcx> for MapUnitFn {
return;
}
let arg_ty = cx.typeck_results().expr_ty(&args[0]);
let default_span = args[0].span;
if let ty::FnDef(id, _) = arg_ty.kind() {
let fn_ty = cx.tcx.fn_sig(id).skip_binder();
let ret_ty = fn_ty.output().skip_binder();
Expand All @@ -64,7 +65,10 @@ impl<'tcx> LateLintPass<'tcx> for MapUnitFn {
MAP_UNIT_FN,
span,
MappingToUnit {
function_label: cx.tcx.span_of_impl(*id).unwrap(),
function_label: cx
.tcx
.span_of_impl(*id)
.unwrap_or(default_span),
argument_label: args[0].span,
map_label: arg_ty.default_span(cx.tcx),
suggestion: path.ident.span,
Expand All @@ -80,7 +84,10 @@ impl<'tcx> LateLintPass<'tcx> for MapUnitFn {
MAP_UNIT_FN,
span,
MappingToUnit {
function_label: cx.tcx.span_of_impl(*id).unwrap(),
function_label: cx
.tcx
.span_of_impl(*id)
.unwrap_or(default_span),
argument_label: args[0].span,
map_label: arg_ty.default_span(cx.tcx),
suggestion: path.ident.span,
Expand Down
7 changes: 7 additions & 0 deletions tests/ui/lint/issue-109152.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#![deny(map_unit_fn)]

#![crate_type = "lib"]
fn _y() {
vec![42].iter().map(drop);
//~^ ERROR `Iterator::map` call that discard the iterator's values
}
23 changes: 23 additions & 0 deletions tests/ui/lint/issue-109152.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
error: `Iterator::map` call that discard the iterator's values
--> $DIR/issue-109152.rs:5:21
|
LL | vec![42].iter().map(drop);
| ^^^^----^
| | |
| | this function returns `()`, which is likely not what you wanted
| | called `Iterator::map` with callable that returns `()`
| after this call to map, the resulting iterator is `impl Iterator<Item = ()>`, which means the only information carried by the iterator is the number of items
|
= note: `Iterator::map`, like many of the methods on `Iterator`, gets executed lazily, meaning that its effects won't be visible until it is iterated
note: the lint level is defined here
--> $DIR/issue-109152.rs:1:9
|
LL | #![deny(map_unit_fn)]
| ^^^^^^^^^^^
help: you might have meant to use `Iterator::for_each`
|
LL | vec![42].iter().for_each(drop);
| ~~~~~~~~

error: aborting due to previous error

0 comments on commit b3af5e2

Please sign in to comment.