From a175463acce7dde5c65d6919d4d2e3ebc9edded0 Mon Sep 17 00:00:00 2001 From: Joshua Yanovski Date: Wed, 6 May 2015 21:41:54 -0700 Subject: [PATCH] Fix panic during constant lookup. --- src/bit_mask.rs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/bit_mask.rs b/src/bit_mask.rs index d4cdc952661..6aece62420e 100644 --- a/src/bit_mask.rs +++ b/src/bit_mask.rs @@ -142,14 +142,16 @@ fn fetch_int_literal(cx: &Context, lit : &Expr) -> Option { } else { Option::None } }, &ExprPath(_, _) => { - let def_map = cx.tcx.def_map.borrow(); - let path_res_op = def_map.get(&lit.id); - path_res_op.as_ref().and_then(|x| { - if let &DefConst(def_id) = &x.base_def { - lookup_const_by_id(cx.tcx, def_id, Option::None).and_then(|l| fetch_int_literal(cx, l)) - } else { Option::None } - }) - }, + // Important to let the borrow expire before the const lookup to avoid double + // borrowing. + let def_map = cx.tcx.def_map.borrow(); + match def_map.get(&lit.id) { + Some(&PathResolution { base_def: DefConst(def_id), ..}) => Some(def_id), + _ => None + } + } + .and_then(|def_id| lookup_const_by_id(cx.tcx, def_id, Option::None)) + .and_then(|l| fetch_int_literal(cx, l)), _ => Option::None } }