]> git.lizzy.rs Git - rust.git/commitdiff
Avoid ICE in Self::Assoc in impl headers
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>
Sat, 18 Feb 2017 21:15:30 +0000 (00:15 +0300)
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>
Sat, 18 Feb 2017 21:34:08 +0000 (00:34 +0300)
src/librustc_typeck/astconv.rs
src/test/compile-fail/resolve-self-in-impl.rs

index fb6d28448a0c5524cbaf6e78c0a1d0d1656c46fd..ab1897101eb6ffe683c7b1d69f4be3a956d8b147 100644 (file)
@@ -918,7 +918,19 @@ pub fn associated_path_def_to_ty(&self,
             (_, Def::SelfTy(Some(_), Some(impl_def_id))) => {
                 // `Self` in an impl of a trait - we have a concrete self type and a
                 // trait reference.
-                let trait_ref = tcx.impl_trait_ref(impl_def_id).unwrap();
+                // FIXME: Self type is not always computed when we are here because type parameter
+                // bounds may affect Self type and have to be converted before it.
+                let trait_ref = if impl_def_id.is_local() {
+                    tcx.impl_trait_refs.borrow().get(&impl_def_id).cloned().and_then(|x| x)
+                } else {
+                    tcx.impl_trait_ref(impl_def_id)
+                };
+                let trait_ref = if let Some(trait_ref) = trait_ref {
+                    trait_ref
+                } else {
+                    tcx.sess.span_err(span, "`Self` type is used before it's determined");
+                    return (tcx.types.err, Def::Err);
+                };
                 let trait_ref = if let Some(free_substs) = self.get_free_substs() {
                     trait_ref.subst(tcx, free_substs)
                 } else {
index 82037b6c9ed02646ac201915a642eedd2b1f4732..04f98c7ab329faa751bddadfe4598d3ac6974b39 100644 (file)
@@ -18,9 +18,12 @@ impl<T: Tr<Self>> Tr<T> for S {} //~ ERROR `Self` type is used before it's deter
 impl<T = Self> Tr<T> for S {} //~ ERROR `Self` type is used before it's determined
 impl Tr for S where Self: Copy {} //~ ERROR `Self` type is used before it's determined
 impl Tr for S where S<Self>: Copy {} //~ ERROR `Self` type is used before it's determined
+impl Tr for S where Self::Assoc: Copy {} //~ ERROR `Self` type is used before it's determined
+                                         //~^ ERROR `Self` type is used before it's determined
 impl Tr for Self {} //~ ERROR `Self` type is used before it's determined
 impl Tr for S<Self> {} //~ ERROR `Self` type is used before it's determined
 impl Self {} //~ ERROR `Self` type is used before it's determined
 impl S<Self> {} //~ ERROR `Self` type is used before it's determined
+impl Tr<Self::Assoc> for S {} //~ ERROR `Self` type is used before it's determined
 
 fn main() {}