Skip to content

Don't throw away item attributes before trans_fn() for generic functions and others. #30661

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jan 4, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions src/librustc_trans/trans/closure.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ use session::config::FullDebugInfo;

use syntax::abi::RustCall;
use syntax::ast;
use syntax::attr::{ThinAttributes, ThinAttributesExt};

use rustc_front::hir;

Expand Down Expand Up @@ -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<Block<'a, 'tcx>>
{
// (*) Note that in the case of inlined functions, the `closure_def_id` will be the
Expand Down Expand Up @@ -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));
Expand Down
9 changes: 7 additions & 2 deletions src/librustc_trans/trans/consts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
8 changes: 7 additions & 1 deletion src/librustc_trans/trans/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
2 changes: 1 addition & 1 deletion src/librustc_trans/trans/foreign.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand Down
2 changes: 1 addition & 1 deletion src/librustc_trans/trans/inline.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
9 changes: 7 additions & 2 deletions src/librustc_trans/trans/meth.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down
19 changes: 15 additions & 4 deletions src/librustc_trans/trans/monomorphize.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}

Expand Down Expand Up @@ -216,7 +222,7 @@ pub fn monomorphic_fn<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>,
d,
psubsts,
impl_item.id,
&[]);
&impl_item.attrs);
}
d
}
Expand All @@ -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
}
Expand Down
18 changes: 12 additions & 6 deletions src/test/run-pass/mir_trans_calls.rs
Original file line number Diff line number Diff line change
Expand Up @@ -58,11 +58,16 @@ fn test5(x: &Bar, a: isize) -> isize {
x.extension_method(a)
}

#[rustc_mir]
fn test6<T: Bar>(x: &T, a: isize) -> isize {
// Test calling extension method on generic callee
x.extension_method(a)
}
// FIXME #30661: Although this function has the #[rustc_mir] attribute it never
// was translated via the MIR implementation because attributes
// where not passed along to trans::base::trans_fn() for generic
// functions.
// Uncomment this test once the thing it tests is fixed.
// #[rustc_mir]
// fn test6<T: Bar>(x: &T, a: isize) -> isize {
// // Test calling extension method on generic callee
// x.extension_method(a)
// }

trait One<T = Self> {
fn one() -> T;
Expand Down Expand Up @@ -94,7 +99,8 @@ fn main() {
assert_eq!(test3(&Foo, 42), 42);
assert_eq!(test4(&Foo, 970), 970);
assert_eq!(test5(&Foo, 8576), 8576);
assert_eq!(test6(&Foo, 12367), 12367);
// see definition of test6() above
// assert_eq!(test6(&Foo, 12367), 12367);
assert_eq!(test7(), 1);
assert_eq!(test8(), 2);
}