| // Check that when there are vacuous predicates in the environment |
| // (which make a fn uncallable) we don't erroneously cache those and |
| // then consider them satisfied elsewhere. The current technique for |
| // doing this is to not use global caches when there is a chance that |
| // the environment contains such a predicate. |
| // We still error for `i32: Bar<u32>` pending #48214 |
| |
| trait Foo<X,Y>: Bar<X> { |
| } |
| |
| trait Bar<X> { } |
| |
| // We don't always check where clauses for sanity, but in this case |
| // wfcheck does report an error here: |
| fn vacuous<A>() |
| where i32: Foo<u32, A> //~ ERROR the trait bound `i32: Bar<u32>` is not satisfied |
| { |
| // ... the original intention was to check that we don't use that |
| // vacuous where clause (which could never be satisfied) to accept |
| // the following line and then mess up calls elsewhere. |
| require::<i32, u32>(); |
| } |
| |
| fn require<A,B>() |
| where A: Bar<B> |
| { |
| } |
| |
| fn main() { |
| require::<i32, u32>(); |
| //~^ ERROR `i32: Bar<u32>` is not satisfied |
| } |