fix cross-crate destructor inlining

Closes #7793
This commit is contained in:
Daniel Micay 2013-10-31 19:44:25 -04:00
parent b2f62acaeb
commit e58270219f
3 changed files with 48 additions and 5 deletions

View file

@ -521,16 +521,23 @@ pub fn get_res_dtor(ccx: @mut CrateContext,
substs: &[ty::t])
-> ValueRef {
let _icx = push_ctxt("trans_res_dtor");
let did = if did.crate != ast::LOCAL_CRATE {
inline::maybe_instantiate_inline(ccx, did)
} else {
did
};
if !substs.is_empty() {
let did = if did.crate != ast::LOCAL_CRATE {
inline::maybe_instantiate_inline(ccx, did)
} else {
did
};
assert_eq!(did.crate, ast::LOCAL_CRATE);
let tsubsts = ty::substs {regions: ty::ErasedRegions,
self_ty: None,
tps: /*bad*/ substs.to_owned() };
// FIXME: #4252: Generic destructors with type bounds are broken.
//
// Since the vtables aren't passed to `monomorphic_fn` here, generic destructors with type
// bounds are broken. Sadly, the `typeck` pass isn't outputting the necessary metadata
// because it does so based on method calls present in the AST. Destructor calls are not yet
// known about at that stage of compilation, since `trans` handles cleanups.
let (val, _) = monomorphize::monomorphic_fn(ccx,
did,
&tsubsts,

View file

@ -0,0 +1,18 @@
// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#[link(name="inline_dtor", vers="0.1")];
pub struct Foo;
impl Drop for Foo {
#[inline]
fn drop(&mut self) {}
}

View file

@ -0,0 +1,18 @@
// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// aux-build:inline_dtor.rs
// xfail-fast
extern mod inline_dtor;
fn main() {
let _x = inline_dtor::Foo;
}