Skip to content

Commit

Permalink
Rebasing fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
nrc committed Oct 30, 2014
1 parent 5dd1bc3 commit 3adb755
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 17 deletions.
14 changes: 6 additions & 8 deletions src/librustc/middle/typeck/check/method.rs
Original file line number Diff line number Diff line change
Expand Up @@ -619,14 +619,11 @@ impl<'a, 'tcx> LookupContext<'a, 'tcx> {

let tcx = self.tcx();

// It is illegal to create a trait object with methods which includes
// the Self type. An error will be reported when we coerce to a trait
// object if the method refers to the `Self` type. Substituting ty_err
// here allows compiler to soldier on.
//
// `confirm_candidate()` also relies upon this substitution
// for Self. (fix)
let rcvr_substs = substs.with_self_ty(ty::mk_err());
// It is illegal to invoke a method on a trait instance that refers to
// the `Self` type. Here, we use a substitution that replaces `Self`
// with the object type itself. Hence, a `&self` method will wind up
// with an argument type like `&Trait`.
let rcvr_substs = substs.with_self_ty(self_ty);

let trait_ref = Rc::new(TraitRef {
def_id: did,
Expand Down Expand Up @@ -1337,6 +1334,7 @@ impl<'a, 'tcx> LookupContext<'a, 'tcx> {
self.ty_to_string(rcvr_ty),
candidate.repr(self.tcx()));

let rcvr_substs = candidate.rcvr_substs.clone();
self.enforce_drop_trait_limitations(candidate);

// Determine the values for the generic parameters of the method.
Expand Down
2 changes: 1 addition & 1 deletion src/librustc/middle/typeck/check/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1687,7 +1687,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
self.register_unsize_obligations(span, &**u)
}
ty::UnsizeVtable(ref ty_trait, self_ty) => {
vtable2::check_object_safety(self.tcx(), ty_trait, span);
vtable::check_object_safety(self.tcx(), ty_trait, span);
// If the type is `Foo+'a`, ensures that the type
// being cast to `Foo+'a` implements `Foo`:
vtable::register_object_cast_obligations(self,
Expand Down
10 changes: 8 additions & 2 deletions src/librustc/middle/typeck/check/vtable.rs
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ pub fn check_object_safety(tcx: &ty::ctxt, object_trait: &ty::TyTrait, span: Spa
*/
let mut msgs = Vec::new();

let method_name = method.ident.repr(tcx);
let method_name = method.name.repr(tcx);

match method.explicit_self {
ty::ByValueExplicitSelfCategory => { // reason (a) above
Expand All @@ -204,12 +204,18 @@ pub fn check_object_safety(tcx: &ty::ctxt, object_trait: &ty::TyTrait, span: Spa
}
};
let ref sig = method.fty.sig;
for &input_ty in sig.inputs.tail().iter().chain([sig.output].iter()) {
for &input_ty in sig.inputs[1..].iter() {
match check_for_self_ty(input_ty) {
Some(msg) => msgs.push(msg),
_ => {}
}
}
if let ty::FnConverging(result_type) = sig.output {
match check_for_self_ty(result_type) {
Some(msg) => msgs.push(msg),
_ => {}
}
}

if method.generics.has_type_params(FnSpace) {
// reason (b) above
Expand Down
15 changes: 9 additions & 6 deletions src/test/compile-fail/region-object-lifetime-in-coercion.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,24 +11,27 @@
// Test that attempts to implicitly coerce a value into an
// object respect the lifetime bound on the object type.

fn a(v: &[u8]) -> Box<Clone + 'static> {
let x: Box<Clone + 'static> = box v; //~ ERROR does not outlive
trait Foo {}
impl<'a> Foo for &'a [u8] {}

fn a(v: &[u8]) -> Box<Foo + 'static> {
let x: Box<Foo + 'static> = box v; //~ ERROR does not outlive
x
}

fn b(v: &[u8]) -> Box<Clone + 'static> {
fn b(v: &[u8]) -> Box<Foo + 'static> {
box v //~ ERROR does not outlive
}

fn c(v: &[u8]) -> Box<Clone> {
fn c(v: &[u8]) -> Box<Foo> {
box v // OK thanks to lifetime elision
}

fn d<'a,'b>(v: &'a [u8]) -> Box<Clone+'b> {
fn d<'a,'b>(v: &'a [u8]) -> Box<Foo+'b> {
box v //~ ERROR does not outlive
}

fn e<'a:'b,'b>(v: &'a [u8]) -> Box<Clone+'b> {
fn e<'a:'b,'b>(v: &'a [u8]) -> Box<Foo+'b> {
box v // OK, thanks to 'a:'b
}

Expand Down

0 comments on commit 3adb755

Please sign in to comment.