]> git.lizzy.rs Git - rust.git/commitdiff
Rollup merge of #58931 - estebank:elide-receiver-tyerr, r=varkor
authorPietro Albini <pietro@pietroalbini.org>
Fri, 8 Mar 2019 08:42:03 +0000 (09:42 +0100)
committerGitHub <noreply@github.com>
Fri, 8 Mar 2019 08:42:03 +0000 (09:42 +0100)
Elide invalid method receiver error when it contains TyErr

Fix #58712.

src/librustc_typeck/check/wfcheck.rs
src/test/ui/issues/issue-58712.rs [new file with mode: 0644]
src/test/ui/issues/issue-58712.stderr [new file with mode: 0644]

index 16cf25f0d4916e183e05384571dcba7063adc075..388e8282ee3a3aaa5db328983e6f3697b7eab02b 100644 (file)
@@ -881,7 +881,9 @@ fn receiver_is_valid<'fcx, 'tcx, 'gcx>(
         } else {
             debug!("receiver_is_valid: type `{:?}` does not deref to `{:?}`",
                 receiver_ty, self_ty);
-            return false
+            // If he receiver already has errors reported due to it, consider it valid to avoid
+            // unecessary errors (#58712).
+            return receiver_ty.references_error();
         }
 
         // without the `arbitrary_self_types` feature, `receiver_ty` must directly deref to
diff --git a/src/test/ui/issues/issue-58712.rs b/src/test/ui/issues/issue-58712.rs
new file mode 100644 (file)
index 0000000..577709c
--- /dev/null
@@ -0,0 +1,15 @@
+struct AddrVec<H, A> {
+    h: H,
+    a: A,
+}
+
+impl<H> AddrVec<H, DeviceId> {
+    //~^ ERROR cannot find type `DeviceId` in this scope
+    pub fn device(&self) -> DeviceId {
+    //~^ ERROR cannot find type `DeviceId` in this scope
+        self.tail()
+    }
+}
+
+fn main() {}
+
diff --git a/src/test/ui/issues/issue-58712.stderr b/src/test/ui/issues/issue-58712.stderr
new file mode 100644 (file)
index 0000000..6164ad7
--- /dev/null
@@ -0,0 +1,15 @@
+error[E0412]: cannot find type `DeviceId` in this scope
+  --> $DIR/issue-58712.rs:6:20
+   |
+LL | impl<H> AddrVec<H, DeviceId> {
+   |                    ^^^^^^^^ not found in this scope
+
+error[E0412]: cannot find type `DeviceId` in this scope
+  --> $DIR/issue-58712.rs:8:29
+   |
+LL |     pub fn device(&self) -> DeviceId {
+   |                             ^^^^^^^^ not found in this scope
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0412`.