about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2015-10-24 12:21:12 +0000
committerbors <bors@rust-lang.org>2015-10-24 12:21:12 +0000
commit04e497c0056aed899cd6edbc98e7a68a9b391c5c (patch)
treedf75997f84d97519c5dd8074dde04420ef2a19f0
parent43869e94ab9981883252b1f5661095cffa1cc44e (diff)
parent5d6d26c241b785daef873a0c6b9a0553c3a9451d (diff)
downloadrust-04e497c0056aed899cd6edbc98e7a68a9b391c5c.tar.gz
rust-04e497c0056aed899cd6edbc98e7a68a9b391c5c.zip
Auto merge of #29259 - arielb1:supertrait-self-2, r=eddyb
…being it

This is a [breaking-change]:lang, but the broken code does not make
much sense.

Fixes #26056

r? @eddyb 
-rw-r--r--src/librustc/middle/traits/object_safety.rs13
-rw-r--r--src/test/compile-fail/issue-26056.rs33
2 files changed, 36 insertions, 10 deletions
diff --git a/src/librustc/middle/traits/object_safety.rs b/src/librustc/middle/traits/object_safety.rs
index 5768e13c5bf..934c35fa20b 100644
--- a/src/librustc/middle/traits/object_safety.rs
+++ b/src/librustc/middle/traits/object_safety.rs
@@ -23,7 +23,7 @@ use super::elaborate_predicates;
 use middle::def_id::DefId;
 use middle::subst::{self, SelfSpace, TypeSpace};
 use middle::traits;
-use middle::ty::{self, ToPolyTraitRef, Ty};
+use middle::ty::{self, HasTypeFlags, ToPolyTraitRef, Ty};
 use std::rc::Rc;
 use syntax::ast;
 
@@ -158,7 +158,7 @@ pub fn supertraits_reference_self<'tcx>(tcx: &ty::ctxt<'tcx>,
                     data.0.trait_ref.substs.types.get_slice(TypeSpace)
                                                  .iter()
                                                  .cloned()
-                                                 .any(is_self)
+                                                 .any(|t| t.has_self_ty())
                 }
                 ty::Predicate::Projection(..) |
                 ty::Predicate::WellFormed(..) |
@@ -198,7 +198,7 @@ fn generics_require_sized_self<'tcx>(tcx: &ty::ctxt<'tcx>,
         .any(|predicate| {
             match predicate {
                 ty::Predicate::Trait(ref trait_pred) if trait_pred.def_id() == sized_def_id => {
-                    is_self(trait_pred.0.self_ty())
+                    trait_pred.0.self_ty().is_self()
                 }
                 ty::Predicate::Projection(..) |
                 ty::Predicate::Trait(..) |
@@ -376,10 +376,3 @@ fn contains_illegal_self_type_reference<'tcx>(tcx: &ty::ctxt<'tcx>,
 
     error
 }
-
-fn is_self<'tcx>(ty: Ty<'tcx>) -> bool {
-    match ty.sty {
-        ty::TyParam(ref data) => data.space == subst::SelfSpace,
-        _ => false,
-    }
-}
diff --git a/src/test/compile-fail/issue-26056.rs b/src/test/compile-fail/issue-26056.rs
new file mode 100644
index 00000000000..4e9cbc4f283
--- /dev/null
+++ b/src/test/compile-fail/issue-26056.rs
@@ -0,0 +1,33 @@
+// Copyright 2015 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.
+
+trait MapLookup<Q> {
+    type MapValue;
+}
+
+impl<K> MapLookup<K> for K {
+    type MapValue = K;
+}
+
+trait Map: MapLookup<<Self as Map>::Key> {
+    type Key;
+}
+
+impl<K> Map for K {
+    type Key = K;
+}
+
+
+fn main() {
+    let _ = &()
+        as &Map<Key=u32,MapValue=u32>;
+    //~^ ERROR the trait `Map` cannot be made into an object
+    //~| NOTE the trait cannot use `Self` as a type parameter
+}