Change:
the following generates a compiler error on all current versions: RUST_BACKTRACE hangs for me, but emits: error: internal compiler error: Unexpected type in full type resolver: FreshTy(0) This is greatly cut down from a real world example, and a blocking issue for me
This is a regression of the release (over ) of rust.
triage: P-medium Pretty old regression, barely qualifies. =) However, says he has a fix.
Oh sorry, disregary my comment above, the issue is reproducible on 1.3.0 as well as on stable 1.0.0. Its not a regression, at least not one from a stable rust release.

Discussion:
{ let mut violations = vec![]; <del> if self.supertraits_reference_self(trait_def_id) { violations.push(ObjectSafetyViolation::SupertraitSelf); </del> <ins> for def_id in traits::supertrait_def_ids(self, trait_def_id) { if self.predicates_reference_self(def_id, true) { violations.push(ObjectSafetyViolation::SupertraitSelf); } </ins> } debug!("astconv_object_safety_violations(trait_def_id={:?}) = {:?}",

if self.trait_has_sized_self(trait_def_id) { violations.push(ObjectSafetyViolation::SizedSelf); } <del> if self.supertraits_reference_self(trait_def_id) { </del> <ins> if self.predicates_reference_self(trait_def_id, false) { </ins> violations.push(ObjectSafetyViolation::SupertraitSelf); }

violations } <del> fn supertraits_reference_self(self, trait_def_id: DefId) -> bool { </del> <ins> fn predicates_reference_self( self, trait_def_id: DefId, supertraits_only: bool) -> bool { </ins> let trait_ref = ty::Binder(ty::TraitRef { def_id: trait_def_id, substs: Substs::identity_for_item(self, trait_def_id) }); <del> let predicates = self.item_super_predicates(trait_def_id); </del> <ins> let predicates = if supertraits_only { self.item_super_predicates(trait_def_id) } else { self.item_predicates(trait_def_id) }; </ins> predicates .predicates .into_iter()

<ins> // Copyright 2016 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 A<T>: std::ops::Add<Self> + Sized {} trait B<T>: A<T> {} trait C<T>: A<B<T, Output=usize>> {} //~^ ERROR the trait `B` cannot be made into an object fn main() {} </ins>

<ins> // Copyright 2016 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 Q<T:?Sized> {} trait Foo where u32: Q<Self> { fn foo(&self); } impl Q<()> for u32 {} impl Foo for () { fn foo(&self) { println!("foo!"); } } fn main() { let _f: Box<Foo> = //~ ERROR `Foo` cannot be made into an object Box::new(()); //~ ERROR `Foo` cannot be made into an object } </ins>