Skip to content

Commit 6305448

Browse files
recognise data contructor calls
1 parent a37cf51 commit 6305448

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

compiler/rustc_hir_analysis/src/check/scope_map.rs

+24-1
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,21 @@ impl<'tcx> ScopeCollector<'tcx> {
164164
cx: Context { temp_lifetime: TemporaryLifetimeScopes::new_static(), var_parent: None },
165165
}
166166
}
167+
168+
fn is_data_constructor(&self, callee: &hir::Expr<'_>) -> bool {
169+
match callee.kind {
170+
hir::ExprKind::Path(hir::QPath::Resolved(
171+
_,
172+
hir::Path {
173+
res:
174+
hir::def::Res::Def(hir::def::DefKind::Ctor(_, _), _)
175+
| hir::def::Res::SelfCtor(_),
176+
..
177+
},
178+
)) => true,
179+
_ => false,
180+
}
181+
}
167182
}
168183

169184
impl<'tcx> ScopeCollector<'tcx> {
@@ -336,7 +351,7 @@ impl<'tcx> Visitor<'tcx> for ScopeCollector<'tcx> {
336351
}
337352

338353
hir::ExprKind::Struct(_path, fields, struct_base) => {
339-
for hir::ExprField { expr, .. } in fields {
354+
for &hir::ExprField { expr, .. } in fields {
340355
self.cx.temp_lifetime = prev_temp_lifetime;
341356
self.cx.temp_lifetime.is_result = true;
342357
self.visit_expr(expr);
@@ -349,6 +364,14 @@ impl<'tcx> Visitor<'tcx> for ScopeCollector<'tcx> {
349364
}
350365
}
351366

367+
hir::ExprKind::Call(callee, args) if self.is_data_constructor(callee) => {
368+
for expr in args {
369+
self.cx.temp_lifetime = prev_temp_lifetime;
370+
self.cx.temp_lifetime.is_result = true;
371+
self.visit_expr(expr);
372+
}
373+
}
374+
352375
hir::ExprKind::Tup(subexprs) => {
353376
for subexpr in subexprs {
354377
self.cx.temp_lifetime = prev_temp_lifetime;

tests/ui/binding/super-let-positive.rs

+8
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,14 @@ fn example2() -> usize {
2121
*x.lock().unwrap()
2222
}
2323

24+
fn example3() {
25+
enum Enum<'a> {
26+
A(&'a u8),
27+
}
28+
fn compute() -> u8 { 1 }
29+
let x = Enum::A(&compute());
30+
}
31+
2432
struct A;
2533
impl A {
2634
#[inline(never)]

0 commit comments

Comments
 (0)