From e3abc3cfe746c0ab078f33bc4566f6fb9773f489 Mon Sep 17 00:00:00 2001 From: Jonas Schievink Date: Tue, 12 Jan 2016 18:04:21 +0100 Subject: [PATCH] Don't use dropflag hints when the type is dropless --- src/librustc_trans/trans/base.rs | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/librustc_trans/trans/base.rs b/src/librustc_trans/trans/base.rs index d694374acc927..daac6bae677c3 100644 --- a/src/librustc_trans/trans/base.rs +++ b/src/librustc_trans/trans/base.rs @@ -1565,6 +1565,7 @@ pub fn init_function<'a, 'tcx>(fcx: &'a FunctionContext<'a, 'tcx>, // Create the drop-flag hints for every unfragmented path in the function. let tcx = fcx.ccx.tcx(); let fn_did = tcx.map.local_def_id(fcx.id); + let tables = tcx.tables.borrow(); let mut hints = fcx.lldropflag_hints.borrow_mut(); let fragment_infos = tcx.fragment_infos.borrow(); @@ -1588,12 +1589,22 @@ pub fn init_function<'a, 'tcx>(fcx: &'a FunctionContext<'a, 'tcx>, let (var, datum) = match info { ty::FragmentInfo::Moved { var, .. } | ty::FragmentInfo::Assigned { var, .. } => { - let datum = seen.get(&var).cloned().unwrap_or_else(|| { - let datum = make_datum(var); - seen.insert(var, datum.clone()); - datum + let opt_datum = seen.get(&var).cloned().unwrap_or_else(|| { + let ty = tables.node_types[&var]; + if fcx.type_needs_drop(ty) { + let datum = make_datum(var); + seen.insert(var, Some(datum.clone())); + Some(datum) + } else { + // No drop call needed, so we don't need a dropflag hint + None + } }); - (var, datum) + if let Some(datum) = opt_datum { + (var, datum) + } else { + continue + } } }; match info {