diff options
| author | Michael Sullivan <sully@msully.net> | 2013-07-11 15:08:43 -0700 |
|---|---|---|
| committer | Michael Sullivan <sully@msully.net> | 2013-07-11 15:51:10 -0700 |
| commit | 186f6faf1e6f4b507d97fefcb02fd8a7cf8d716f (patch) | |
| tree | b5b0c24a133e581034649a3498699e5d68d61a2b /src/librustc | |
| parent | 1bbb4348806dab6d9b4c280d4cfd324645969eca (diff) | |
| download | rust-186f6faf1e6f4b507d97fefcb02fd8a7cf8d716f.tar.gz rust-186f6faf1e6f4b507d97fefcb02fd8a7cf8d716f.zip | |
Get cross crate static default methods working. Closes #7569.
Diffstat (limited to 'src/librustc')
| -rw-r--r-- | src/librustc/metadata/encoder.rs | 19 | ||||
| -rw-r--r-- | src/librustc/middle/astencode.rs | 6 | ||||
| -rw-r--r-- | src/librustc/middle/trans/inline.rs | 2 |
3 files changed, 12 insertions, 15 deletions
diff --git a/src/librustc/metadata/encoder.rs b/src/librustc/metadata/encoder.rs index a9f3200af12..b2fefdd97b8 100644 --- a/src/librustc/metadata/encoder.rs +++ b/src/librustc/metadata/encoder.rs @@ -791,7 +791,7 @@ fn encode_info_for_method(ecx: &EncodeContext, if len > 0u || should_inline { (ecx.encode_inlined_item)( ecx, ebml_w, impl_path, - ii_method(local_def(parent_id), m)); + ii_method(local_def(parent_id), false, m)); } else { encode_symbol(ecx, ebml_w, m.id); } @@ -1123,21 +1123,16 @@ fn encode_info_for_item(ecx: &EncodeContext, } provided(m) => { - // This is obviously a bogus assert but I don't think this - // ever worked before anyhow...near as I can tell, before - // we would emit two items. - if method_ty.explicit_self == sty_static { - tcx.sess.span_unimpl( - item.span, - fmt!("Method %s is both provided and static", - token::ident_to_str(&method_ty.ident))); + // If this is a static method, we've already encoded + // this. + if method_ty.explicit_self != sty_static { + encode_type_param_bounds(ebml_w, ecx, + &m.generics.ty_params); } - encode_type_param_bounds(ebml_w, ecx, - &m.generics.ty_params); encode_method_sort(ebml_w, 'p'); (ecx.encode_inlined_item)( ecx, ebml_w, path, - ii_method(local_def(item.id), m)); + ii_method(local_def(item.id), true, m)); } } diff --git a/src/librustc/middle/astencode.rs b/src/librustc/middle/astencode.rs index 7412eba1156..2e0090f7dda 100644 --- a/src/librustc/middle/astencode.rs +++ b/src/librustc/middle/astencode.rs @@ -319,7 +319,8 @@ fn simplify_ast(ii: &ast::inlined_item) -> ast::inlined_item { match *ii { //hack: we're not dropping items ast::ii_item(i) => ast::ii_item(fld.fold_item(i).get()), - ast::ii_method(d, m) => ast::ii_method(d, fld.fold_method(m)), + ast::ii_method(d, is_provided, m) => + ast::ii_method(d, is_provided, fld.fold_method(m)), ast::ii_foreign(i) => ast::ii_foreign(fld.fold_foreign_item(i)) } } @@ -340,7 +341,8 @@ fn renumber_ast(xcx: @ExtendedDecodeContext, ii: ast::inlined_item) match ii { ast::ii_item(i) => ast::ii_item(fld.fold_item(i).get()), - ast::ii_method(d, m) => ast::ii_method(xcx.tr_def_id(d), fld.fold_method(m)), + ast::ii_method(d, is_provided, m) => + ast::ii_method(xcx.tr_def_id(d), is_provided, fld.fold_method(m)), ast::ii_foreign(i) => ast::ii_foreign(fld.fold_foreign_item(i)), } } diff --git a/src/librustc/middle/trans/inline.rs b/src/librustc/middle/trans/inline.rs index 893ef3feb56..1f7b2bd4663 100644 --- a/src/librustc/middle/trans/inline.rs +++ b/src/librustc/middle/trans/inline.rs @@ -88,7 +88,7 @@ pub fn maybe_instantiate_inline(ccx: @mut CrateContext, fn_id: ast::def_id, ccx.sess.bug("maybe_get_item_ast returned a found_parent \ with a non-item parent"); } - csearch::found(ast::ii_method(impl_did, mth)) => { + csearch::found(ast::ii_method(impl_did, _is_provided, mth)) => { ccx.stats.n_inlines += 1; ccx.external.insert(fn_id, Some(mth.id)); // If this is a default method, we can't look up the |
