Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Adjust self-type to require equality
  • Loading branch information
Mark-Simulacrum committed May 21, 2021
1 parent 35bab92 commit 4b4382d
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 20 deletions.
2 changes: 1 addition & 1 deletion compiler/rustc_typeck/src/check/fn_ctxt/_impl.rs
Expand Up @@ -1522,7 +1522,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
let ty = tcx.type_of(impl_def_id);

let impl_ty = self.instantiate_type_scheme(span, &substs, ty);
match self.at(&self.misc(span), self.param_env).sup(impl_ty, self_ty) {
match self.at(&self.misc(span), self.param_env).eq(impl_ty, self_ty) {
Ok(ok) => self.register_infer_ok_obligations(ok),
Err(_) => {
self.tcx.sess.delay_span_bug(
Expand Down
1 change: 0 additions & 1 deletion src/test/ui/suggestions/mut-borrow-needed-by-trait.rs
Expand Up @@ -17,7 +17,6 @@ fn main() {
let fp = BufWriter::new(fp);
//~^ ERROR the trait bound `&dyn std::io::Write: std::io::Write` is not satisfied
//~| ERROR the trait bound `&dyn std::io::Write: std::io::Write` is not satisfied
//~| ERROR the trait bound `&dyn std::io::Write: std::io::Write` is not satisfied

writeln!(fp, "hello world").unwrap(); //~ ERROR the method
}
17 changes: 2 additions & 15 deletions src/test/ui/suggestions/mut-borrow-needed-by-trait.stderr
Expand Up @@ -7,19 +7,6 @@ LL | let fp = BufWriter::new(fp);
= note: `std::io::Write` is implemented for `&mut dyn std::io::Write`, but not for `&dyn std::io::Write`
= note: required by `BufWriter::<W>::new`

error[E0277]: the trait bound `&dyn std::io::Write: std::io::Write` is not satisfied
--> $DIR/mut-borrow-needed-by-trait.rs:17:14
|
LL | let fp = BufWriter::new(fp);
| ^^^^^^^^^ the trait `std::io::Write` is not implemented for `&dyn std::io::Write`
|
::: $SRC_DIR/std/src/io/buffered/bufwriter.rs:LL:COL
|
LL | pub struct BufWriter<W: Write> {
| ----- required by this bound in `BufWriter`
|
= note: `std::io::Write` is implemented for `&mut dyn std::io::Write`, but not for `&dyn std::io::Write`

error[E0277]: the trait bound `&dyn std::io::Write: std::io::Write` is not satisfied
--> $DIR/mut-borrow-needed-by-trait.rs:17:14
|
Expand All @@ -34,7 +21,7 @@ LL | pub struct BufWriter<W: Write> {
= note: `std::io::Write` is implemented for `&mut dyn std::io::Write`, but not for `&dyn std::io::Write`

error[E0599]: the method `write_fmt` exists for struct `BufWriter<&dyn std::io::Write>`, but its trait bounds were not satisfied
--> $DIR/mut-borrow-needed-by-trait.rs:22:5
--> $DIR/mut-borrow-needed-by-trait.rs:21:5
|
LL | writeln!(fp, "hello world").unwrap();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ method cannot be called on `BufWriter<&dyn std::io::Write>` due to unsatisfied trait bounds
Expand All @@ -49,7 +36,7 @@ LL | pub struct BufWriter<W: Write> {
which is required by `BufWriter<&dyn std::io::Write>: std::io::Write`
= note: this error originates in the macro `writeln` (in Nightly builds, run with -Z macro-backtrace for more info)

error: aborting due to 4 previous errors
error: aborting due to 3 previous errors

Some errors have detailed explanations: E0277, E0599.
For more information about an error, try `rustc --explain E0277`.
2 changes: 1 addition & 1 deletion src/test/ui/wf/wf-static-method.nll.stderr
Expand Up @@ -68,7 +68,7 @@ LL | fn inherent_evil<'a, 'b>(b: &'b u32) -> &'a u32 {
| -- -- lifetime `'b` defined here
| |
| lifetime `'a` defined here
LL | <Evil>::inherent_evil(b) // bug? shouldn't this be an error
LL | <Evil>::inherent_evil(b)
| ^^^^^^^^^^^^^^^^^^^^^^^^ returning this value requires that `'b` must outlive `'a`
|
= help: consider adding the following bound: `'b: 'a`
Expand Down
3 changes: 2 additions & 1 deletion src/test/ui/wf/wf-static-method.rs
Expand Up @@ -47,7 +47,8 @@ fn indirect_evil<'a, 'b>(b: &'b u32) -> &'a u32 {
}

fn inherent_evil<'a, 'b>(b: &'b u32) -> &'a u32 {
<Evil>::inherent_evil(b) // bug? shouldn't this be an error
<Evil>::inherent_evil(b)
//~^ ERROR cannot infer an appropriate lifetime
}


Expand Down
29 changes: 28 additions & 1 deletion src/test/ui/wf/wf-static-method.stderr
Expand Up @@ -103,7 +103,34 @@ note: ...so that reference does not outlive borrowed content
LL | <IndirectEvil>::static_evil(b)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: aborting due to 5 previous errors
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'b` due to conflicting requirements
--> $DIR/wf-static-method.rs:50:5
|
LL | <Evil>::inherent_evil(b)
| ^^^^^^^^^^^^^^^^^^^^^
|
note: first, the lifetime cannot outlive the lifetime `'b` as defined on the function body at 49:22...
--> $DIR/wf-static-method.rs:49:22
|
LL | fn inherent_evil<'a, 'b>(b: &'b u32) -> &'a u32 {
| ^^
note: ...so that reference does not outlive borrowed content
--> $DIR/wf-static-method.rs:50:27
|
LL | <Evil>::inherent_evil(b)
| ^
note: but, the lifetime must be valid for the lifetime `'a` as defined on the function body at 49:18...
--> $DIR/wf-static-method.rs:49:18
|
LL | fn inherent_evil<'a, 'b>(b: &'b u32) -> &'a u32 {
| ^^
note: ...so that reference does not outlive borrowed content
--> $DIR/wf-static-method.rs:50:5
|
LL | <Evil>::inherent_evil(b)
| ^^^^^^^^^^^^^^^^^^^^^^^^

error: aborting due to 6 previous errors

Some errors have detailed explanations: E0312, E0478, E0495.
For more information about an error, try `rustc --explain E0312`.

0 comments on commit 4b4382d

Please sign in to comment.