Rollup merge of #139782 - xizheyin:issue-139627, r=wesleywiser
Consistent with treating Ctor Call as Struct in liveness analysis Fixes #139627 When `ExprKind::Call` is a `Ctor`, skips the checking of `expr` and only checks the arguments, thus being consistent with `ExprKind::Struct`. r? compiler
This commit is contained in:
commit
0757d24f71
2 changed files with 20 additions and 1 deletions
|
@ -1020,7 +1020,10 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
hir::ExprKind::Call(ref f, args) => {
|
hir::ExprKind::Call(ref f, args) => {
|
||||||
let succ = self.check_is_ty_uninhabited(expr, succ);
|
let is_ctor = |f: &Expr<'_>| matches!(f.kind, hir::ExprKind::Path(hir::QPath::Resolved(_, path)) if matches!(path.res, rustc_hir::def::Res::Def(rustc_hir::def::DefKind::Ctor(_, _), _)));
|
||||||
|
let succ =
|
||||||
|
if !is_ctor(f) { self.check_is_ty_uninhabited(expr, succ) } else { succ };
|
||||||
|
|
||||||
let succ = self.propagate_through_exprs(args, succ);
|
let succ = self.propagate_through_exprs(args, succ);
|
||||||
self.propagate_through_expr(f, succ)
|
self.propagate_through_expr(f, succ)
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
//@ check-pass
|
||||||
|
#![deny(unreachable_code)]
|
||||||
|
#![deny(unused)]
|
||||||
|
|
||||||
|
pub enum Void {}
|
||||||
|
|
||||||
|
pub struct S<T>(T);
|
||||||
|
|
||||||
|
pub fn foo(void: Void, void1: Void) {
|
||||||
|
let s = S(void);
|
||||||
|
drop(s);
|
||||||
|
let s1 = S { 0: void1 };
|
||||||
|
drop(s1);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
Loading…
Add table
Add a link
Reference in a new issue