Rollup merge of #127417 - chenyukang:yukang-method-output-diff, r=oli-obk
Show fnsig's unit output explicitly when there is output diff in diagnostics Fixes #127263
This commit is contained in:
commit
413345c61d
12 changed files with 48 additions and 13 deletions
|
@ -1168,14 +1168,16 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
|
||||||
let output1 = sig1.output();
|
let output1 = sig1.output();
|
||||||
let output2 = sig2.output();
|
let output2 = sig2.output();
|
||||||
let (x1, x2) = self.cmp(output1, output2);
|
let (x1, x2) = self.cmp(output1, output2);
|
||||||
if !output1.is_unit() {
|
let output_diff = x1 != x2;
|
||||||
|
if !output1.is_unit() || output_diff {
|
||||||
values.0.push_normal(" -> ");
|
values.0.push_normal(" -> ");
|
||||||
(values.0).0.extend(x1.0);
|
(values.0).0.extend(x1.0);
|
||||||
}
|
}
|
||||||
if !output2.is_unit() {
|
if !output2.is_unit() || output_diff {
|
||||||
values.1.push_normal(" -> ");
|
values.1.push_normal(" -> ");
|
||||||
(values.1).0.extend(x2.0);
|
(values.1).0.extend(x2.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
values
|
values
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,7 @@ note: type in trait
|
||||||
LL | fn bar(self) -> Option<()>;
|
LL | fn bar(self) -> Option<()>;
|
||||||
| ^^^^^^^^^^
|
| ^^^^^^^^^^
|
||||||
= note: expected signature `fn(MyFuture) -> Option<()>`
|
= note: expected signature `fn(MyFuture) -> Option<()>`
|
||||||
found signature `fn(MyFuture)`
|
found signature `fn(MyFuture) -> ()`
|
||||||
help: change the output type to match the trait
|
help: change the output type to match the trait
|
||||||
|
|
|
|
||||||
LL | fn bar(self) -> Option<()> {}
|
LL | fn bar(self) -> Option<()> {}
|
||||||
|
|
|
@ -5,7 +5,7 @@ LL | fn size_of<T>();
|
||||||
| ^ expected `usize`, found `()`
|
| ^ expected `usize`, found `()`
|
||||||
|
|
|
|
||||||
= note: expected signature `extern "rust-intrinsic" fn() -> usize`
|
= note: expected signature `extern "rust-intrinsic" fn() -> usize`
|
||||||
found signature `extern "rust-intrinsic" fn()`
|
found signature `extern "rust-intrinsic" fn() -> ()`
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|
|
@ -92,7 +92,7 @@ LL | extern "rust-call" fn call(self, args: ()) -> () {}
|
||||||
| ^^^^ expected `&Foo`, found `Foo`
|
| ^^^^ expected `&Foo`, found `Foo`
|
||||||
|
|
|
|
||||||
= note: expected signature `extern "rust-call" fn(&Foo, ()) -> _`
|
= note: expected signature `extern "rust-call" fn(&Foo, ()) -> _`
|
||||||
found signature `extern "rust-call" fn(Foo, ())`
|
found signature `extern "rust-call" fn(Foo, ()) -> ()`
|
||||||
help: change the self-receiver type to match the trait
|
help: change the self-receiver type to match the trait
|
||||||
|
|
|
|
||||||
LL | extern "rust-call" fn call(&self, args: ()) -> () {}
|
LL | extern "rust-call" fn call(&self, args: ()) -> () {}
|
||||||
|
@ -162,7 +162,7 @@ LL | extern "rust-call" fn call_mut(&self, args: ()) -> () {}
|
||||||
| ^^^^^ types differ in mutability
|
| ^^^^^ types differ in mutability
|
||||||
|
|
|
|
||||||
= note: expected signature `extern "rust-call" fn(&mut Bar, ()) -> _`
|
= note: expected signature `extern "rust-call" fn(&mut Bar, ()) -> _`
|
||||||
found signature `extern "rust-call" fn(&Bar, ())`
|
found signature `extern "rust-call" fn(&Bar, ()) -> ()`
|
||||||
help: change the self-receiver type to match the trait
|
help: change the self-receiver type to match the trait
|
||||||
|
|
|
|
||||||
LL | extern "rust-call" fn call_mut(&mut self, args: ()) -> () {}
|
LL | extern "rust-call" fn call_mut(&mut self, args: ()) -> () {}
|
||||||
|
|
|
@ -10,7 +10,7 @@ LL | x = foo::<()>;
|
||||||
| ^^^^^^^^^ expected fn item, found a different fn item
|
| ^^^^^^^^^ expected fn item, found a different fn item
|
||||||
|
|
|
|
||||||
= note: expected fn item `fn(F) -> F {bar::<F>}`
|
= note: expected fn item `fn(F) -> F {bar::<F>}`
|
||||||
found fn item `fn(()) {foo::<()>}`
|
found fn item `fn(()) -> () {foo::<()>}`
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
error[E0308]: mismatched types
|
||||||
--> $DIR/fn_def_opaque_coercion_to_fn_ptr.rs:27:9
|
--> $DIR/fn_def_opaque_coercion_to_fn_ptr.rs:27:9
|
||||||
|
@ -26,7 +26,7 @@ LL | let mut x = bar::<()>;
|
||||||
LL | x = foo::<I>;
|
LL | x = foo::<I>;
|
||||||
| ^^^^^^^^ expected fn item, found a different fn item
|
| ^^^^^^^^ expected fn item, found a different fn item
|
||||||
|
|
|
|
||||||
= note: expected fn item `fn(()) {bar::<()>}`
|
= note: expected fn item `fn(()) -> () {bar::<()>}`
|
||||||
found fn item `fn(I) -> I {foo::<I>}`
|
found fn item `fn(I) -> I {foo::<I>}`
|
||||||
help: use parentheses to call this function
|
help: use parentheses to call this function
|
||||||
|
|
|
|
||||||
|
|
|
@ -35,7 +35,7 @@ note: type in trait
|
||||||
LL | fn method() -> Self::Ty;
|
LL | fn method() -> Self::Ty;
|
||||||
| ^^^^^^^^
|
| ^^^^^^^^
|
||||||
= note: expected signature `fn() -> <() as compare_method::Trait>::Ty`
|
= note: expected signature `fn() -> <() as compare_method::Trait>::Ty`
|
||||||
found signature `fn()`
|
found signature `fn() -> ()`
|
||||||
note: this item must have the opaque type in its signature in order to be able to register hidden types
|
note: this item must have the opaque type in its signature in order to be able to register hidden types
|
||||||
--> $DIR/in-assoc-type-unconstrained.rs:22:12
|
--> $DIR/in-assoc-type-unconstrained.rs:22:12
|
||||||
|
|
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ LL | fn fmt(&self, x: &str) -> () { }
|
||||||
| ^^^^ types differ in mutability
|
| ^^^^ types differ in mutability
|
||||||
|
|
|
|
||||||
= note: expected signature `fn(&MyType, &mut Formatter<'_>) -> Result<(), std::fmt::Error>`
|
= note: expected signature `fn(&MyType, &mut Formatter<'_>) -> Result<(), std::fmt::Error>`
|
||||||
found signature `fn(&MyType, &str)`
|
found signature `fn(&MyType, &str) -> ()`
|
||||||
help: change the parameter type to match the trait
|
help: change the parameter type to match the trait
|
||||||
|
|
|
|
||||||
LL | fn fmt(&self, x: &mut Formatter<'_>) -> () { }
|
LL | fn fmt(&self, x: &mut Formatter<'_>) -> () { }
|
||||||
|
|
|
@ -5,7 +5,7 @@ LL | fn start<T>(_main: fn() -> T, _argc: isize, _argv: *const *const u8, _sigpi
|
||||||
| ^ expected `isize`, found `()`
|
| ^ expected `isize`, found `()`
|
||||||
|
|
|
|
||||||
= note: expected signature `fn(fn() -> _, _, _, _) -> isize`
|
= note: expected signature `fn(fn() -> _, _, _, _) -> isize`
|
||||||
found signature `fn(fn() -> _, _, _, _)`
|
found signature `fn(fn() -> _, _, _, _) -> ()`
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|
8
tests/ui/method-output-diff-issue-127263.rs
Normal file
8
tests/ui/method-output-diff-issue-127263.rs
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
fn bar() {}
|
||||||
|
fn foo(x: i32) -> u32 {
|
||||||
|
0
|
||||||
|
}
|
||||||
|
fn main() {
|
||||||
|
let b: fn() -> u32 = bar; //~ ERROR mismatched types [E0308]
|
||||||
|
let f: fn(i32) = foo; //~ ERROR mismatched types [E0308]
|
||||||
|
}
|
25
tests/ui/method-output-diff-issue-127263.stderr
Normal file
25
tests/ui/method-output-diff-issue-127263.stderr
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/method-output-diff-issue-127263.rs:6:26
|
||||||
|
|
|
||||||
|
LL | let b: fn() -> u32 = bar;
|
||||||
|
| ----------- ^^^ expected fn pointer, found fn item
|
||||||
|
| |
|
||||||
|
| expected due to this
|
||||||
|
|
|
||||||
|
= note: expected fn pointer `fn() -> u32`
|
||||||
|
found fn item `fn() -> () {bar}`
|
||||||
|
|
||||||
|
error[E0308]: mismatched types
|
||||||
|
--> $DIR/method-output-diff-issue-127263.rs:7:22
|
||||||
|
|
|
||||||
|
LL | let f: fn(i32) = foo;
|
||||||
|
| ------- ^^^ expected fn pointer, found fn item
|
||||||
|
| |
|
||||||
|
| expected due to this
|
||||||
|
|
|
||||||
|
= note: expected fn pointer `fn(_) -> ()`
|
||||||
|
found fn item `fn(_) -> u32 {foo}`
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0308`.
|
|
@ -5,7 +5,7 @@ LL | fn panic(info: PanicInfo) -> () {}
|
||||||
| ^^^^^^^^^ expected `&PanicInfo<'_>`, found `PanicInfo<'_>`
|
| ^^^^^^^^^ expected `&PanicInfo<'_>`, found `PanicInfo<'_>`
|
||||||
|
|
|
|
||||||
= note: expected signature `for<'a, 'b> fn(&'a PanicInfo<'b>) -> !`
|
= note: expected signature `for<'a, 'b> fn(&'a PanicInfo<'b>) -> !`
|
||||||
found signature `for<'a> fn(PanicInfo<'a>)`
|
found signature `for<'a> fn(PanicInfo<'a>) -> ()`
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ note: type in trait
|
||||||
LL | fn jumbo(&self, x: &usize) -> usize;
|
LL | fn jumbo(&self, x: &usize) -> usize;
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
= note: expected signature `fn(&_, &_) -> usize`
|
= note: expected signature `fn(&_, &_) -> usize`
|
||||||
found signature `unsafe fn(&_, &_)`
|
found signature `unsafe fn(&_, &_) -> ()`
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue