PatKind::Path: avoid calling resolve_ty_and_res_ufcs twice.
This commit is contained in:
parent
cdd743755a
commit
d3024138f8
1 changed files with 8 additions and 5 deletions
|
@ -50,6 +50,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
|
||||||
|
|
||||||
debug!("check_pat_walk(pat={:?},expected={:?},def_bm={:?})", pat, expected, def_bm);
|
debug!("check_pat_walk(pat={:?},expected={:?},def_bm={:?})", pat, expected, def_bm);
|
||||||
|
|
||||||
|
let mut path_resolution = None;
|
||||||
let is_non_ref_pat = match pat.node {
|
let is_non_ref_pat = match pat.node {
|
||||||
PatKind::Struct(..) |
|
PatKind::Struct(..) |
|
||||||
PatKind::TupleStruct(..) |
|
PatKind::TupleStruct(..) |
|
||||||
|
@ -65,8 +66,9 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
PatKind::Path(ref qpath) => {
|
PatKind::Path(ref qpath) => {
|
||||||
let (def, _, _) = self.resolve_ty_and_res_ufcs(qpath, pat.hir_id, pat.span);
|
let resolution = self.resolve_ty_and_res_ufcs(qpath, pat.hir_id, pat.span);
|
||||||
match def {
|
path_resolution = Some(resolution);
|
||||||
|
match resolution.0 {
|
||||||
Res::Def(DefKind::Const, _) | Res::Def(DefKind::AssocConst, _) => false,
|
Res::Def(DefKind::Const, _) | Res::Def(DefKind::AssocConst, _) => false,
|
||||||
_ => true,
|
_ => true,
|
||||||
}
|
}
|
||||||
|
@ -294,7 +296,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
PatKind::Path(ref qpath) => {
|
PatKind::Path(ref qpath) => {
|
||||||
self.check_pat_path(pat, qpath, expected)
|
self.check_pat_path(pat, path_resolution.unwrap(), qpath, expected)
|
||||||
}
|
}
|
||||||
PatKind::Struct(ref qpath, ref fields, etc) => {
|
PatKind::Struct(ref qpath, ref fields, etc) => {
|
||||||
self.check_pat_struct(pat, qpath, fields, etc, expected, def_bm, discrim_span)
|
self.check_pat_struct(pat, qpath, fields, etc, expected, def_bm, discrim_span)
|
||||||
|
@ -1055,13 +1057,14 @@ https://doc.rust-lang.org/reference/types.html#trait-objects");
|
||||||
fn check_pat_path(
|
fn check_pat_path(
|
||||||
&self,
|
&self,
|
||||||
pat: &hir::Pat,
|
pat: &hir::Pat,
|
||||||
|
path_resolution: (Res, Option<Ty<'tcx>>, &'b [hir::PathSegment]),
|
||||||
qpath: &hir::QPath,
|
qpath: &hir::QPath,
|
||||||
expected: Ty<'tcx>,
|
expected: Ty<'tcx>,
|
||||||
) -> Ty<'tcx> {
|
) -> Ty<'tcx> {
|
||||||
let tcx = self.tcx;
|
let tcx = self.tcx;
|
||||||
|
|
||||||
// Resolve the path and check the definition for errors.
|
// We have already resolved the path.
|
||||||
let (res, opt_ty, segments) = self.resolve_ty_and_res_ufcs(qpath, pat.hir_id, pat.span);
|
let (res, opt_ty, segments) = path_resolution;
|
||||||
match res {
|
match res {
|
||||||
Res::Err => {
|
Res::Err => {
|
||||||
self.set_tainted_by_errors();
|
self.set_tainted_by_errors();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue