Skip to content

Commit 8c7d007

Browse files
committed
Avoid ICE in Self::Assoc in impl headers
1 parent bf95c29 commit 8c7d007

File tree

2 files changed

+16
-1
lines changed

2 files changed

+16
-1
lines changed

src/librustc_typeck/astconv.rs

+13-1
Original file line numberDiff line numberDiff line change
@@ -918,7 +918,19 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o {
918918
(_, Def::SelfTy(Some(_), Some(impl_def_id))) => {
919919
// `Self` in an impl of a trait - we have a concrete self type and a
920920
// trait reference.
921-
let trait_ref = tcx.impl_trait_ref(impl_def_id).unwrap();
921+
// FIXME: Self type is not always computed when we are here because type parameter
922+
// bounds may affect Self type and have to be converted before it.
923+
let trait_ref = if impl_def_id.is_local() {
924+
tcx.impl_trait_refs.borrow().get(&impl_def_id).cloned().and_then(|x| x)
925+
} else {
926+
tcx.impl_trait_ref(impl_def_id)
927+
};
928+
let trait_ref = if let Some(trait_ref) = trait_ref {
929+
trait_ref
930+
} else {
931+
tcx.sess.span_err(span, "`Self` type is used before it's determined");
932+
return (tcx.types.err, Def::Err);
933+
};
922934
let trait_ref = if let Some(free_substs) = self.get_free_substs() {
923935
trait_ref.subst(tcx, free_substs)
924936
} else {

src/test/compile-fail/resolve-self-in-impl.rs

+3
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,12 @@ impl<T: Tr<Self>> Tr<T> for S {} //~ ERROR `Self` type is used before it's deter
1818
impl<T = Self> Tr<T> for S {} //~ ERROR `Self` type is used before it's determined
1919
impl Tr for S where Self: Copy {} //~ ERROR `Self` type is used before it's determined
2020
impl Tr for S where S<Self>: Copy {} //~ ERROR `Self` type is used before it's determined
21+
impl Tr for S where Self::Assoc: Copy {} //~ ERROR `Self` type is used before it's determined
22+
//~^ ERROR `Self` type is used before it's determined
2123
impl Tr for Self {} //~ ERROR `Self` type is used before it's determined
2224
impl Tr for S<Self> {} //~ ERROR `Self` type is used before it's determined
2325
impl Self {} //~ ERROR `Self` type is used before it's determined
2426
impl S<Self> {} //~ ERROR `Self` type is used before it's determined
27+
impl Tr<Self::Assoc> for S {} //~ ERROR `Self` type is used before it's determined
2528

2629
fn main() {}

0 commit comments

Comments
 (0)