From e3c89943ace61a5ca99e8e0910e86f0ca4887507 Mon Sep 17 00:00:00 2001 From: Michael Woerister Date: Thu, 31 Dec 2015 08:06:23 -0500 Subject: [PATCH] Forward attributes of translated function/closure to trans_fn/trans_closure. --- src/librustc_trans/trans/closure.rs | 6 ++++-- src/librustc_trans/trans/consts.rs | 9 +++++++-- src/librustc_trans/trans/expr.rs | 8 +++++++- src/librustc_trans/trans/foreign.rs | 2 +- src/librustc_trans/trans/inline.rs | 2 +- src/librustc_trans/trans/meth.rs | 9 +++++++-- src/librustc_trans/trans/monomorphize.rs | 19 +++++++++++++++---- 7 files changed, 42 insertions(+), 13 deletions(-) diff --git a/src/librustc_trans/trans/closure.rs b/src/librustc_trans/trans/closure.rs index e089a6e059cc..ea9ca8f37b17 100644 --- a/src/librustc_trans/trans/closure.rs +++ b/src/librustc_trans/trans/closure.rs @@ -31,6 +31,7 @@ use session::config::FullDebugInfo; use syntax::abi::RustCall; use syntax::ast; +use syntax::attr::{ThinAttributes, ThinAttributesExt}; use rustc_front::hir; @@ -176,7 +177,8 @@ pub fn trans_closure_expr<'a, 'tcx>(dest: Dest<'a, 'tcx>, body: &hir::Block, id: ast::NodeId, closure_def_id: DefId, // (*) - closure_substs: &'tcx ty::ClosureSubsts<'tcx>) + closure_substs: &'tcx ty::ClosureSubsts<'tcx>, + closure_expr_attrs: &ThinAttributes) -> Option> { // (*) Note that in the case of inlined functions, the `closure_def_id` will be the @@ -218,7 +220,7 @@ pub fn trans_closure_expr<'a, 'tcx>(dest: Dest<'a, 'tcx>, llfn, param_substs, id, - &[], + closure_expr_attrs.as_attr_slice(), sig.output, function_type.abi, ClosureEnv::Closure(closure_def_id, &freevars)); diff --git a/src/librustc_trans/trans/consts.rs b/src/librustc_trans/trans/consts.rs index 0fafe08178a2..e25819f77a17 100644 --- a/src/librustc_trans/trans/consts.rs +++ b/src/librustc_trans/trans/consts.rs @@ -1019,8 +1019,13 @@ fn const_expr_unadjusted<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>, hir::ExprClosure(_, ref decl, ref body) => { match ety.sty { ty::TyClosure(def_id, ref substs) => { - closure::trans_closure_expr(closure::Dest::Ignore(cx), decl, - body, e.id, def_id, substs); + closure::trans_closure_expr(closure::Dest::Ignore(cx), + decl, + body, + e.id, + def_id, + substs, + &e.attrs); } _ => cx.sess().span_bug( diff --git a/src/librustc_trans/trans/expr.rs b/src/librustc_trans/trans/expr.rs index 85d4876d160b..fb6f2190207e 100644 --- a/src/librustc_trans/trans/expr.rs +++ b/src/librustc_trans/trans/expr.rs @@ -1196,7 +1196,13 @@ fn trans_rvalue_dps_unadjusted<'blk, 'tcx>(bcx: Block<'blk, 'tcx>, &format!("closure expr without closure type: {:?}", t)), }; - closure::trans_closure_expr(dest, decl, body, expr.id, def_id, substs).unwrap_or(bcx) + closure::trans_closure_expr(dest, + decl, + body, + expr.id, + def_id, + substs, + &expr.attrs).unwrap_or(bcx) } hir::ExprCall(ref f, ref args) => { if bcx.tcx().is_method_call(expr.id) { diff --git a/src/librustc_trans/trans/foreign.rs b/src/librustc_trans/trans/foreign.rs index 9012ecaa2134..9673daf0b791 100644 --- a/src/librustc_trans/trans/foreign.rs +++ b/src/librustc_trans/trans/foreign.rs @@ -639,7 +639,7 @@ pub fn trans_rust_fn_with_foreign_abi<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>, let llfn = declare::define_internal_rust_fn(ccx, &ps, t); attributes::from_fn_attrs(ccx, attrs, llfn); - base::trans_fn(ccx, decl, body, llfn, param_substs, id, &[]); + base::trans_fn(ccx, decl, body, llfn, param_substs, id, attrs); llfn } diff --git a/src/librustc_trans/trans/inline.rs b/src/librustc_trans/trans/inline.rs index 29965755eac7..5968daf349f0 100644 --- a/src/librustc_trans/trans/inline.rs +++ b/src/librustc_trans/trans/inline.rs @@ -165,7 +165,7 @@ fn instantiate_inline(ccx: &CrateContext, fn_id: DefId) llfn, empty_substs, impl_item.id, - &[]); + &impl_item.attrs); // See linkage comments on items. if ccx.sess().opts.cg.codegen_units == 1 { SetLinkage(llfn, InternalLinkage); diff --git a/src/librustc_trans/trans/meth.rs b/src/librustc_trans/trans/meth.rs index d29ab2ee6fbf..7a1cbf206074 100644 --- a/src/librustc_trans/trans/meth.rs +++ b/src/librustc_trans/trans/meth.rs @@ -74,8 +74,13 @@ pub fn trans_impl(ccx: &CrateContext, for (ref ccx, is_origin) in ccx.maybe_iter(trans_everywhere) { let llfn = get_item_val(ccx, impl_item.id); let empty_substs = tcx.mk_substs(Substs::trans_empty()); - trans_fn(ccx, &sig.decl, body, llfn, - empty_substs, impl_item.id, &[]); + trans_fn(ccx, + &sig.decl, + body, + llfn, + empty_substs, + impl_item.id, + &impl_item.attrs); update_linkage(ccx, llfn, Some(impl_item.id), diff --git a/src/librustc_trans/trans/monomorphize.rs b/src/librustc_trans/trans/monomorphize.rs index 4b6a0d1a5096..80a86bac26b9 100644 --- a/src/librustc_trans/trans/monomorphize.rs +++ b/src/librustc_trans/trans/monomorphize.rs @@ -185,7 +185,13 @@ pub fn monomorphic_fn<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>, ccx, &**decl, &**body, &[], d, psubsts, fn_node_id, Some(&hash[..])); } else { - trans_fn(ccx, &**decl, &**body, d, psubsts, fn_node_id, &[]); + trans_fn(ccx, + &**decl, + &**body, + d, + psubsts, + fn_node_id, + &i.attrs); } } @@ -216,7 +222,7 @@ pub fn monomorphic_fn<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>, d, psubsts, impl_item.id, - &[]); + &impl_item.attrs); } d } @@ -232,8 +238,13 @@ pub fn monomorphic_fn<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>, let d = mk_lldecl(abi::Rust); let needs_body = setup_lldecl(d, &trait_item.attrs); if needs_body { - trans_fn(ccx, &sig.decl, body, d, - psubsts, trait_item.id, &[]); + trans_fn(ccx, + &sig.decl, + body, + d, + psubsts, + trait_item.id, + &trait_item.attrs); } d }