]> git.lizzy.rs Git - rust.git/commitdiff
save-analysis: Process bounds in impl trait only in argument position
authorIgor Matuszewski <Xanewok@gmail.com>
Sat, 14 Sep 2019 22:42:18 +0000 (00:42 +0200)
committerIgor Matuszewski <Xanewok@gmail.com>
Sat, 14 Sep 2019 22:42:33 +0000 (00:42 +0200)
src/librustc_save_analysis/dump_visitor.rs
src/test/ui/save-analysis/issue-63663.rs

index c43e07a8c7480d1bc05b7cb8372adcb1d62ee0e3..55f6b91e7143106e336086ffb4ef0142f6969222 100644 (file)
@@ -385,7 +385,12 @@ fn process_fn(
             }
 
             if let ast::FunctionRetTy::Ty(ref ret_ty) = decl.output {
-                v.visit_ty(&ret_ty);
+                if let ast::TyKind::ImplTrait(..) = ret_ty.node {
+                    // FIXME: Opaque type desugaring prevents us from easily
+                    // processing trait bounds. See `visit_ty` for more details.
+                } else {
+                    v.visit_ty(&ret_ty);
+                }
             }
 
             v.visit_block(&body);
@@ -1439,6 +1444,18 @@ fn visit_ty(&mut self, t: &'l ast::Ty) {
                 self.visit_ty(element);
                 self.nest_tables(length.id, |v| v.visit_expr(&length.value));
             }
+            ast::TyKind::ImplTrait(id, ref bounds) => {
+                // FIXME: As of writing, the opaque type lowering introduces
+                // another DefPath scope/segment (used to declare the resulting
+                // opaque type item).
+                // However, the synthetic scope does *not* have associated
+                // typeck tables, which means we can't nest it and we fire an
+                // assertion when resolving the qualified type paths in trait
+                // bounds...
+                // This will panic if called on return type `impl Trait`, which
+                // we guard against in `process_fn`.
+                self.nest_tables(id, |v| v.process_bounds(bounds));
+            }
             _ => visit::walk_ty(self, t),
         }
     }
index ccbe13f1a1b719e35816aee0358f51ac42adda20..92e85884f664dbcc43f88023f439d802f08e6009 100644 (file)
@@ -1,15 +1,20 @@
 // check-pass
 // compile-flags: -Zsave-analysis
 
-// Check that this doesn't ICE when processing associated const in formal
-// argument and return type of functions defined inside function/method scope.
-
 pub trait Trait {
     type Assoc;
 }
 
 pub struct A;
 
+trait Generic<T> {}
+impl<T> Generic<T> for () {}
+
+// Don't ICE when resolving type paths in return type `impl Trait`
+fn assoc_in_opaque_type_bounds<U: Trait>() -> impl Generic<U::Assoc> {}
+
+// Check that this doesn't ICE when processing associated const in formal
+// argument and return type of functions defined inside function/method scope.
 pub fn func() {
     fn _inner1<U: Trait>(_: U::Assoc) {}
     fn _inner2<U: Trait>() -> U::Assoc { unimplemented!() }