about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMichael Goulet <michael@errs.io>2023-01-01 23:48:10 +0000
committerMichael Goulet <michael@errs.io>2023-01-11 20:03:29 +0000
commit83fbc71d021d2aa741ad18890e7a51a28830d45e (patch)
treea9f6607dd964c3fe568258f7c733a46af65a2c45
parent4e30ad8d60e920f486fd1462939dbdaf3bd4c544 (diff)
downloadrust-83fbc71d021d2aa741ad18890e7a51a28830d45e.tar.gz
rust-83fbc71d021d2aa741ad18890e7a51a28830d45e.zip
Filter impl and where-clause candidates that reference errors
-rw-r--r--compiler/rustc_trait_selection/src/traits/select/candidate_assembly.rs3
-rw-r--r--compiler/rustc_trait_selection/src/traits/select/mod.rs3
-rw-r--r--tests/ui/c-variadic/issue-86053-1.rs2
-rw-r--r--tests/ui/c-variadic/issue-86053-1.stderr22
-rw-r--r--tests/ui/const-generics/generic_const_exprs/issue-72787.min.stderr43
-rw-r--r--tests/ui/const-generics/generic_const_exprs/issue-72787.rs2
-rw-r--r--tests/ui/traits/ignore-err-impls.rs9
-rw-r--r--tests/ui/traits/ignore-err-impls.stderr11
-rw-r--r--tests/ui/where-clauses/ignore-err-clauses.rs14
-rw-r--r--tests/ui/where-clauses/ignore-err-clauses.stderr9
10 files changed, 54 insertions, 64 deletions
diff --git a/compiler/rustc_trait_selection/src/traits/select/candidate_assembly.rs b/compiler/rustc_trait_selection/src/traits/select/candidate_assembly.rs
index c54d901e9b1..170c1673dbd 100644
--- a/compiler/rustc_trait_selection/src/traits/select/candidate_assembly.rs
+++ b/compiler/rustc_trait_selection/src/traits/select/candidate_assembly.rs
@@ -174,7 +174,8 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
             .param_env
             .caller_bounds()
             .iter()
-            .filter_map(|o| o.to_opt_poly_trait_pred());
+            .filter_map(|p| p.to_opt_poly_trait_pred())
+            .filter(|p| !p.references_error());
 
         // Micro-optimization: filter out predicates relating to different traits.
         let matching_bounds =
diff --git a/compiler/rustc_trait_selection/src/traits/select/mod.rs b/compiler/rustc_trait_selection/src/traits/select/mod.rs
index 3f14491f803..2615e262282 100644
--- a/compiler/rustc_trait_selection/src/traits/select/mod.rs
+++ b/compiler/rustc_trait_selection/src/traits/select/mod.rs
@@ -2377,6 +2377,9 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
         let impl_substs = self.infcx.fresh_substs_for_item(obligation.cause.span, impl_def_id);
 
         let impl_trait_ref = impl_trait_ref.subst(self.tcx(), impl_substs);
+        if impl_trait_ref.references_error() {
+            return Err(());
+        }
 
         debug!(?impl_trait_ref);
 
diff --git a/tests/ui/c-variadic/issue-86053-1.rs b/tests/ui/c-variadic/issue-86053-1.rs
index b30548e19f9..49d5c0390bc 100644
--- a/tests/ui/c-variadic/issue-86053-1.rs
+++ b/tests/ui/c-variadic/issue-86053-1.rs
@@ -2,7 +2,7 @@
 // error-pattern:unexpected `self` parameter in function
 // error-pattern:`...` must be the last argument of a C-variadic function
 // error-pattern:cannot find type `F` in this scope
-// error-pattern:in type `&'a &'b usize`, reference has a longer lifetime than the data it references
+
 
 #![feature(c_variadic)]
 #![crate_type="lib"]
diff --git a/tests/ui/c-variadic/issue-86053-1.stderr b/tests/ui/c-variadic/issue-86053-1.stderr
index d1f13d52362..5a02f4aa93a 100644
--- a/tests/ui/c-variadic/issue-86053-1.stderr
+++ b/tests/ui/c-variadic/issue-86053-1.stderr
@@ -76,24 +76,6 @@ help: you might be missing a type parameter
 LL | fn ordering4 < 'a , 'b, F     > ( a :            ,   self , self ,   self ,
    |                       +++
 
-error[E0491]: in type `&'a &'b usize`, reference has a longer lifetime than the data it references
-  --> $DIR/issue-86053-1.rs:11:52
-   |
-LL |     self , ... ,   self ,   self , ... ) where F : FnOnce ( & 'a & 'b usize ) {
-   |                                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^
-   |
-note: the pointer is valid for the lifetime `'a` as defined here
-  --> $DIR/issue-86053-1.rs:10:16
-   |
-LL | fn ordering4 < 'a , 'b     > ( a :            ,   self , self ,   self ,
-   |                ^^
-note: but the referenced data is only valid for the lifetime `'b` as defined here
-  --> $DIR/issue-86053-1.rs:10:21
-   |
-LL | fn ordering4 < 'a , 'b     > ( a :            ,   self , self ,   self ,
-   |                     ^^
-
-error: aborting due to 12 previous errors
+error: aborting due to 11 previous errors
 
-Some errors have detailed explanations: E0412, E0491.
-For more information about an error, try `rustc --explain E0412`.
+For more information about this error, try `rustc --explain E0412`.
diff --git a/tests/ui/const-generics/generic_const_exprs/issue-72787.min.stderr b/tests/ui/const-generics/generic_const_exprs/issue-72787.min.stderr
index 0af5493f816..ea6f5f69276 100644
--- a/tests/ui/const-generics/generic_const_exprs/issue-72787.min.stderr
+++ b/tests/ui/const-generics/generic_const_exprs/issue-72787.min.stderr
@@ -17,7 +17,7 @@ LL |     Condition<{ LHS <= RHS }>: True
    = help: use `#![feature(generic_const_exprs)]` to allow generic const expressions
 
 error: generic parameters may not be used in const operations
-  --> $DIR/issue-72787.rs:25:25
+  --> $DIR/issue-72787.rs:23:25
    |
 LL |     IsLessOrEqual<{ 8 - I }, { 8 - J }>: True,
    |                         ^ cannot perform const operation using `I`
@@ -26,7 +26,7 @@ LL |     IsLessOrEqual<{ 8 - I }, { 8 - J }>: True,
    = help: use `#![feature(generic_const_exprs)]` to allow generic const expressions
 
 error: generic parameters may not be used in const operations
-  --> $DIR/issue-72787.rs:25:36
+  --> $DIR/issue-72787.rs:23:36
    |
 LL |     IsLessOrEqual<{ 8 - I }, { 8 - J }>: True,
    |                                    ^ cannot perform const operation using `J`
@@ -34,42 +34,5 @@ LL |     IsLessOrEqual<{ 8 - I }, { 8 - J }>: True,
    = help: const parameters may only be used as standalone arguments, i.e. `J`
    = help: use `#![feature(generic_const_exprs)]` to allow generic const expressions
 
-error[E0283]: type annotations needed: cannot satisfy `IsLessOrEqual<I, 8>: True`
-  --> $DIR/issue-72787.rs:21:26
-   |
-LL |     IsLessOrEqual<I, 8>: True,
-   |                          ^^^^
-   |
-note: multiple `impl`s or `where` clauses satisfying `IsLessOrEqual<I, 8>: True` found
-  --> $DIR/issue-72787.rs:10:1
-   |
-LL | impl<const LHS: u32, const RHS: u32> True for IsLessOrEqual<LHS, RHS> where
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-...
-LL |     IsLessOrEqual<I, 8>: True,
-   |                          ^^^^
-...
-LL |     IsLessOrEqual<{ 8 - I }, { 8 - J }>: True,
-   |                                          ^^^^
-
-error[E0283]: type annotations needed: cannot satisfy `IsLessOrEqual<I, 8>: True`
-  --> $DIR/issue-72787.rs:21:26
-   |
-LL |     IsLessOrEqual<I, 8>: True,
-   |                          ^^^^
-   |
-note: multiple `impl`s or `where` clauses satisfying `IsLessOrEqual<I, 8>: True` found
-  --> $DIR/issue-72787.rs:10:1
-   |
-LL | impl<const LHS: u32, const RHS: u32> True for IsLessOrEqual<LHS, RHS> where
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-...
-LL |     IsLessOrEqual<I, 8>: True,
-   |                          ^^^^
-...
-LL |     IsLessOrEqual<{ 8 - I }, { 8 - J }>: True,
-   |                                          ^^^^
-
-error: aborting due to 6 previous errors
+error: aborting due to 4 previous errors
 
-For more information about this error, try `rustc --explain E0283`.
diff --git a/tests/ui/const-generics/generic_const_exprs/issue-72787.rs b/tests/ui/const-generics/generic_const_exprs/issue-72787.rs
index c651bf1c8de..657fec2e9cb 100644
--- a/tests/ui/const-generics/generic_const_exprs/issue-72787.rs
+++ b/tests/ui/const-generics/generic_const_exprs/issue-72787.rs
@@ -19,8 +19,6 @@ struct S<const I: u32, const J: u32>;
 impl<const I: u32, const J: u32> S<I, J>
 where
     IsLessOrEqual<I, 8>: True,
-//[min]~^ Error type annotations needed
-//[min]~| Error type annotations needed
     IsLessOrEqual<J, 8>: True,
     IsLessOrEqual<{ 8 - I }, { 8 - J }>: True,
 //[min]~^ Error generic parameters may not be used in const operations
diff --git a/tests/ui/traits/ignore-err-impls.rs b/tests/ui/traits/ignore-err-impls.rs
new file mode 100644
index 00000000000..67e880b006a
--- /dev/null
+++ b/tests/ui/traits/ignore-err-impls.rs
@@ -0,0 +1,9 @@
+pub struct S;
+
+trait Generic<T> {}
+
+impl<'a, T> Generic<&'a T> for S {}
+impl Generic<Type> for S {}
+//~^ ERROR cannot find type `Type` in this scope
+
+fn main() {}
diff --git a/tests/ui/traits/ignore-err-impls.stderr b/tests/ui/traits/ignore-err-impls.stderr
new file mode 100644
index 00000000000..1390106a291
--- /dev/null
+++ b/tests/ui/traits/ignore-err-impls.stderr
@@ -0,0 +1,11 @@
+error[E0412]: cannot find type `Type` in this scope
+  --> $DIR/ignore-err-impls.rs:6:14
+   |
+LL | impl Generic<Type> for S {}
+   |     -        ^^^^ not found in this scope
+   |     |
+   |     help: you might be missing a type parameter: `<Type>`
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0412`.
diff --git a/tests/ui/where-clauses/ignore-err-clauses.rs b/tests/ui/where-clauses/ignore-err-clauses.rs
new file mode 100644
index 00000000000..c76f0e1a8b2
--- /dev/null
+++ b/tests/ui/where-clauses/ignore-err-clauses.rs
@@ -0,0 +1,14 @@
+use std::ops::Add;
+
+fn dbl<T>(x: T) -> <T as Add>::Output
+where
+    T: Copy + Add,
+    UUU: Copy,
+    //~^ ERROR cannot find type `UUU` in this scope
+{
+    x + x
+}
+
+fn main() {
+    println!("{}", dbl(3));
+}
diff --git a/tests/ui/where-clauses/ignore-err-clauses.stderr b/tests/ui/where-clauses/ignore-err-clauses.stderr
new file mode 100644
index 00000000000..cfddc3e10b6
--- /dev/null
+++ b/tests/ui/where-clauses/ignore-err-clauses.stderr
@@ -0,0 +1,9 @@
+error[E0412]: cannot find type `UUU` in this scope
+  --> $DIR/ignore-err-clauses.rs:6:5
+   |
+LL |     UUU: Copy,
+   |     ^^^ not found in this scope
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0412`.