Skip to content

Commit cac143f

Browse files
committed
Extend and use hir::Node::body_id
1 parent 102c0af commit cac143f

20 files changed

+102
-89
lines changed

compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs

+1-20
Original file line numberDiff line numberDiff line change
@@ -1306,26 +1306,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
13061306
let local_ty = self.body.local_decls[local].ty;
13071307

13081308
// Get the body the error happens in
1309-
let &body_id =
1310-
if let hir::Node::Item(hir::Item { kind, .. }) = hir.get(self.mir_hir_id())
1311-
&& let hir::ItemKind::Static(_, _, body_id)
1312-
| hir::ItemKind::Const(_, body_id)
1313-
| hir::ItemKind::Fn(_, _, body_id) = kind
1314-
{
1315-
body_id
1316-
} else if let hir::Node::TraitItem(hir::TraitItem { kind, .. }) = hir.get(self.mir_hir_id())
1317-
&& let hir::TraitItemKind::Const(_, Some(body_id))
1318-
| hir::TraitItemKind::Fn(_, hir::TraitFn::Provided(body_id)) = kind
1319-
{
1320-
body_id
1321-
}else if let hir::Node::ImplItem(hir::ImplItem { kind, .. }) = hir.get(self.mir_hir_id())
1322-
&& let hir::ImplItemKind::Const(_, body_id)
1323-
| hir::ImplItemKind::Fn(_, body_id) = kind
1324-
{
1325-
body_id
1326-
} else {
1327-
return
1328-
};
1309+
let Some(body_id) = hir.get(self.mir_hir_id()).body_id() else { return };
13291310

13301311
let body_expr = hir.body(body_id).value;
13311312

compiler/rustc_hir/src/hir.rs

+31-8
Original file line numberDiff line numberDiff line change
@@ -3529,12 +3529,20 @@ impl<'hir> OwnerNode<'hir> {
35293529

35303530
pub fn body_id(&self) -> Option<BodyId> {
35313531
match self {
3532-
OwnerNode::TraitItem(TraitItem {
3533-
kind: TraitItemKind::Fn(_, TraitFn::Provided(body_id)),
3532+
OwnerNode::Item(Item {
3533+
kind:
3534+
ItemKind::Static(_, _, body) | ItemKind::Const(_, body) | ItemKind::Fn(_, _, body),
35343535
..
35353536
})
3536-
| OwnerNode::ImplItem(ImplItem { kind: ImplItemKind::Fn(_, body_id), .. })
3537-
| OwnerNode::Item(Item { kind: ItemKind::Fn(.., body_id), .. }) => Some(*body_id),
3537+
| OwnerNode::TraitItem(TraitItem {
3538+
kind:
3539+
TraitItemKind::Fn(_, TraitFn::Provided(body)) | TraitItemKind::Const(_, Some(body)),
3540+
..
3541+
})
3542+
| OwnerNode::ImplItem(ImplItem {
3543+
kind: ImplItemKind::Fn(_, body) | ImplItemKind::Const(_, body),
3544+
..
3545+
}) => Some(*body),
35383546
_ => None,
35393547
}
35403548
}
@@ -3729,12 +3737,27 @@ impl<'hir> Node<'hir> {
37293737

37303738
pub fn body_id(&self) -> Option<BodyId> {
37313739
match self {
3732-
Node::TraitItem(TraitItem {
3733-
kind: TraitItemKind::Fn(_, TraitFn::Provided(body_id)),
3740+
Node::Item(Item {
3741+
kind:
3742+
ItemKind::Static(_, _, body) | ItemKind::Const(_, body) | ItemKind::Fn(_, _, body),
3743+
..
3744+
})
3745+
| Node::TraitItem(TraitItem {
3746+
kind:
3747+
TraitItemKind::Fn(_, TraitFn::Provided(body)) | TraitItemKind::Const(_, Some(body)),
3748+
..
3749+
})
3750+
| Node::ImplItem(ImplItem {
3751+
kind: ImplItemKind::Fn(_, body) | ImplItemKind::Const(_, body),
37343752
..
37353753
})
3736-
| Node::ImplItem(ImplItem { kind: ImplItemKind::Fn(_, body_id), .. })
3737-
| Node::Item(Item { kind: ItemKind::Fn(.., body_id), .. }) => Some(*body_id),
3754+
| Node::Expr(Expr {
3755+
kind:
3756+
ExprKind::ConstBlock(AnonConst { body, .. })
3757+
| ExprKind::Closure(Closure { body, .. })
3758+
| ExprKind::Repeat(_, ArrayLen::Body(AnonConst { body, .. })),
3759+
..
3760+
}) => Some(*body),
37383761
_ => None,
37393762
}
37403763
}

tests/ui/async-await/feature-self-return-type.stderr

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ error[E0597]: `bar` does not live long enough
44
LL | let x = {
55
| - borrow later stored here
66
LL | let bar = 22;
7+
| --- binding `bar` declared here
78
LL | Foo::new(&bar).await
89
| ^^^^ borrowed value does not live long enough
910
LL |

tests/ui/async-await/issue-61949-self-return-type.stderr

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ error[E0597]: `bar` does not live long enough
1313
LL | let x = {
1414
| - borrow later stored here
1515
LL | let bar = 22;
16+
| --- binding `bar` declared here
1617
LL | Foo::new(&bar).await
1718
| ^^^^ borrowed value does not live long enough
1819
LL |

tests/ui/consts/const-eval/generic-slice.stderr

+4
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ error[E0597]: `x` does not live long enough
44
LL | impl<'a, T: 'static> Generic<'a, T> {
55
| -- lifetime `'a` defined here
66
...
7+
LL | let x: &'static [T] = &[];
8+
| - binding `x` declared here
79
LL | &x
810
| ^^
911
| |
@@ -16,6 +18,8 @@ LL | };
1618
error[E0597]: `x` does not live long enough
1719
--> $DIR/generic-slice.rs:27:5
1820
|
21+
LL | let x: &[_] = &[];
22+
| - binding `x` declared here
1923
LL | &x
2024
| ^^
2125
| |

tests/ui/generator/auto-trait-regions.drop_tracking.stderr

+10-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@ LL | let a = A(&mut true, &mut true, No);
99
LL | assert_foo(a);
1010
| - borrow later used here
1111
|
12-
= note: consider using a `let` binding to create a longer lived value
12+
help: consider using a `let` binding to create a longer lived value
13+
|
14+
LL ~ let binding = true;
15+
LL ~ let a = A(&mut binding, &mut true, No);
16+
|
1317

1418
error[E0716]: temporary value dropped while borrowed
1519
--> $DIR/auto-trait-regions.rs:48:35
@@ -22,7 +26,11 @@ LL | let a = A(&mut true, &mut true, No);
2226
LL | assert_foo(a);
2327
| - borrow later used here
2428
|
25-
= note: consider using a `let` binding to create a longer lived value
29+
help: consider using a `let` binding to create a longer lived value
30+
|
31+
LL ~ let binding = true;
32+
LL ~ let a = A(&mut true, &mut binding, No);
33+
|
2634

2735
error: implementation of `Foo` is not general enough
2836
--> $DIR/auto-trait-regions.rs:34:5

tests/ui/generator/auto-trait-regions.drop_tracking_mir.stderr

+10-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@ LL | let a = A(&mut true, &mut true, No);
99
LL | assert_foo(a);
1010
| - borrow later used here
1111
|
12-
= note: consider using a `let` binding to create a longer lived value
12+
help: consider using a `let` binding to create a longer lived value
13+
|
14+
LL ~ let binding = true;
15+
LL ~ let a = A(&mut binding, &mut true, No);
16+
|
1317

1418
error[E0716]: temporary value dropped while borrowed
1519
--> $DIR/auto-trait-regions.rs:48:35
@@ -22,7 +26,11 @@ LL | let a = A(&mut true, &mut true, No);
2226
LL | assert_foo(a);
2327
| - borrow later used here
2428
|
25-
= note: consider using a `let` binding to create a longer lived value
29+
help: consider using a `let` binding to create a longer lived value
30+
|
31+
LL ~ let binding = true;
32+
LL ~ let a = A(&mut true, &mut binding, No);
33+
|
2634

2735
error: implementation of `Foo` is not general enough
2836
--> $DIR/auto-trait-regions.rs:34:5

tests/ui/generator/auto-trait-regions.no_drop_tracking.stderr

+10-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@ LL | let a = A(&mut true, &mut true, No);
99
LL | assert_foo(a);
1010
| - borrow later used here
1111
|
12-
= note: consider using a `let` binding to create a longer lived value
12+
help: consider using a `let` binding to create a longer lived value
13+
|
14+
LL ~ let binding = true;
15+
LL ~ let a = A(&mut binding, &mut true, No);
16+
|
1317

1418
error[E0716]: temporary value dropped while borrowed
1519
--> $DIR/auto-trait-regions.rs:48:35
@@ -22,7 +26,11 @@ LL | let a = A(&mut true, &mut true, No);
2226
LL | assert_foo(a);
2327
| - borrow later used here
2428
|
25-
= note: consider using a `let` binding to create a longer lived value
29+
help: consider using a `let` binding to create a longer lived value
30+
|
31+
LL ~ let binding = true;
32+
LL ~ let a = A(&mut true, &mut binding, No);
33+
|
2634

2735
error: implementation of `Foo` is not general enough
2836
--> $DIR/auto-trait-regions.rs:34:5

tests/ui/generator/auto-trait-regions.stderr

-47
This file was deleted.

tests/ui/lifetimes/issue-69314.stderr

+2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ LL | async fn f2(m: Msg<'_>) {}
1212
error[E0597]: `buf` does not live long enough
1313
--> $DIR/issue-69314.rs:14:19
1414
|
15+
LL | let mut buf = [0; 512];
16+
| ------- binding `buf` declared here
1517
LL | let m2 = &buf[..];
1618
| ^^^ borrowed value does not live long enough
1719
LL | let m = Self::g(m2).await;

tests/ui/nll/user-annotations/adt-brace-enums.stderr

+3-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@ error[E0597]: `c` does not live long enough
3131
|
3232
LL | fn annot_reference_named_lifetime_in_closure<'a>(_: &'a u32) {
3333
| -- lifetime `'a` defined here
34-
...
34+
LL | let _closure = || {
35+
LL | let c = 66;
36+
| - binding `c` declared here
3537
LL | SomeEnum::SomeVariant::<&'a u32> { t: &c };
3638
| ^^
3739
| |

tests/ui/nll/user-annotations/adt-brace-structs.stderr

+3-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@ error[E0597]: `c` does not live long enough
3131
|
3232
LL | fn annot_reference_named_lifetime_in_closure<'a>(_: &'a u32) {
3333
| -- lifetime `'a` defined here
34-
...
34+
LL | let _closure = || {
35+
LL | let c = 66;
36+
| - binding `c` declared here
3537
LL | SomeStruct::<&'a u32> { t: &c };
3638
| ^^
3739
| |

tests/ui/nll/user-annotations/adt-nullary-enums.stderr

+4-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,10 @@ error[E0597]: `c` does not live long enough
3434
|
3535
LL | fn annot_reference_named_lifetime_in_closure<'a>(_: &'a u32) {
3636
| -- lifetime `'a` defined here
37-
...
37+
LL | let _closure = || {
38+
LL | let c = 66;
39+
| - binding `c` declared here
40+
LL | combine(
3841
LL | SomeEnum::SomeVariant(Cell::new(&c)),
3942
| ----------^^-
4043
| | |

tests/ui/nll/user-annotations/adt-tuple-enums.stderr

+3-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@ error[E0597]: `c` does not live long enough
3131
|
3232
LL | fn annot_reference_named_lifetime_in_closure<'a>(_: &'a u32) {
3333
| -- lifetime `'a` defined here
34-
...
34+
LL | let _closure = || {
35+
LL | let c = 66;
36+
| - binding `c` declared here
3537
LL | SomeEnum::SomeVariant::<&'a u32>(&c);
3638
| ^^
3739
| |

tests/ui/nll/user-annotations/adt-tuple-struct-calls.stderr

+7-2
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,10 @@ error[E0597]: `c` does not live long enough
3333
|
3434
LL | fn annot_reference_named_lifetime_in_closure<'a>(_: &'a u32) {
3535
| -- lifetime `'a` defined here
36-
...
36+
LL | let _closure = || {
37+
LL | let c = 66;
38+
| - binding `c` declared here
39+
LL | let f = SomeStruct::<&'a u32>;
3740
LL | f(&c);
3841
| --^^-
3942
| | |
@@ -47,7 +50,9 @@ error[E0597]: `c` does not live long enough
4750
|
4851
LL | let f = SomeStruct::<&'a u32>;
4952
| - lifetime `'1` appears in the type of `f`
50-
...
53+
LL | let _closure = || {
54+
LL | let c = 66;
55+
| - binding `c` declared here
5156
LL | f(&c);
5257
| --^^-
5358
| | |

tests/ui/nll/user-annotations/adt-tuple-struct.stderr

+3-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@ error[E0597]: `c` does not live long enough
3131
|
3232
LL | fn annot_reference_named_lifetime_in_closure<'a>(_: &'a u32) {
3333
| -- lifetime `'a` defined here
34-
...
34+
LL | let _closure = || {
35+
LL | let c = 66;
36+
| - binding `c` declared here
3537
LL | SomeStruct::<&'a u32>(&c);
3638
| ^^
3739
| |

tests/ui/nll/user-annotations/fns.stderr

+3-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@ error[E0597]: `c` does not live long enough
3131
|
3232
LL | fn annot_reference_named_lifetime_in_closure<'a>(_: &'a u32) {
3333
| -- lifetime `'a` defined here
34-
...
34+
LL | let _closure = || {
35+
LL | let c = 66;
36+
| - binding `c` declared here
3537
LL | some_fn::<&'a u32>(&c);
3638
| -------------------^^-
3739
| | |

tests/ui/nll/user-annotations/method-call.stderr

+2
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ error[E0597]: `c` does not live long enough
3333
LL | fn annot_reference_named_lifetime_in_closure<'a>(_: &'a u32) {
3434
| -- lifetime `'a` defined here
3535
...
36+
LL | let c = 66;
37+
| - binding `c` declared here
3638
LL | a.method::<&'a u32>(b, &c);
3739
| ------------------------^^-
3840
| | |

tests/ui/nll/user-annotations/method-ufcs-3.stderr

+2
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ error[E0597]: `c` does not live long enough
3333
LL | fn annot_reference_named_lifetime_in_closure<'a>(_: &'a u32) {
3434
| -- lifetime `'a` defined here
3535
...
36+
LL | let c = 66;
37+
| - binding `c` declared here
3638
LL | <_ as Bazoom<_>>::method::<&'a u32>(&a, b, &c);
3739
| -------------------------------------------^^-
3840
| | |

tests/ui/static/issue-18118.stderr

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
error[E0597]: `p` does not live long enough
22
--> $DIR/issue-18118.rs:4:9
33
|
4+
LL | let p = 3;
5+
| - binding `p` declared here
46
LL | &p
57
| ^^
68
| |

0 commit comments

Comments
 (0)