]> git.lizzy.rs Git - rust.git/commitdiff
Rebasing fixes
authorNick Cameron <ncameron@mozilla.com>
Wed, 22 Oct 2014 03:53:03 +0000 (16:53 +1300)
committerNick Cameron <ncameron@mozilla.com>
Thu, 30 Oct 2014 03:12:59 +0000 (16:12 +1300)
src/librustc/middle/typeck/check/method.rs
src/librustc/middle/typeck/check/mod.rs
src/librustc/middle/typeck/check/vtable.rs
src/test/compile-fail/region-object-lifetime-in-coercion.rs

index 064ceb1e1c18f5c185d713f82ddef710f16b20da..cd3cc43b8539d4e17ab2bdbb0bb8fe043fae7ecb 100644 (file)
@@ -619,14 +619,11 @@ fn push_inherent_candidates_from_object(&mut self,
 
         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,
@@ -1337,6 +1334,7 @@ fn confirm_candidate(&self, rcvr_ty: ty::t, candidate: &Candidate)
                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.
index 7a5ce9a528cda1f6b5a6a0ec2e7f24b777aaafc5..94c4d7c25e0a615fca13381c962a4a72401bef8a 100644 (file)
@@ -1687,7 +1687,7 @@ fn register_unsize_obligations(&self,
                 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,
index 115b224241b209febbfbad005ea4b335bebafe5f..b7195734e8b39ca9da1d22c340c4461873464c54 100644 (file)
@@ -179,7 +179,7 @@ fn check_object_safety_of_method(tcx: &ty::ctxt, method: &ty::Method) -> Vec<Str
          */
         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
@@ -204,12 +204,18 @@ fn check_object_safety_of_method(tcx: &ty::ctxt, method: &ty::Method) -> Vec<Str
             }
         };
         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
index 6791b7c5870e06b41c9ef80f0d6ede0494ad028c..dfeba04109281fdf594a2db5d22560a55eea08e8 100644 (file)
 // 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
 }