2024-11-20 22:19:36 +00:00
|
|
|
error[E0038]: the trait `Trait` is not dyn compatible
|
Support HIR wf checking for function signatures
During function type-checking, we normalize any associated types in
the function signature (argument types + return type), and then
create WF obligations for each of the normalized types. The HIR wf code
does not currently support this case, so any errors that we get have
imprecise spans.
This commit extends `ObligationCauseCode::WellFormed` to support
recording a function parameter, allowing us to get the corresponding
HIR type if an error occurs. Function typechecking is modified to
pass this information during signature normalization and WF checking.
The resulting code is fairly verbose, due to the fact that we can
no longer normalize the entire signature with a single function call.
As part of the refactoring, we now perform HIR-based WF checking
for several other 'typed items' (statics, consts, and inherent impls).
As a result, WF and projection errors in a function signature now
have a precise span, which points directly at the responsible type.
If a function signature is constructed via a macro, this will allow
the error message to point at the code 'most responsible' for the error
(e.g. a user-supplied macro argument).
2021-07-18 16:33:49 +00:00
|
|
|
--> $DIR/E0038.rs:5:20
|
2018-02-08 03:35:35 +00:00
|
|
|
|
|
2019-05-28 18:46:13 +00:00
|
|
|
LL | fn call_foo(x: Box<dyn Trait>) {
|
2024-11-20 22:19:36 +00:00
|
|
|
| ^^^^^^^^^ `Trait` is not dyn compatible
|
2020-02-01 00:47:00 +00:00
|
|
|
|
|
2024-11-20 22:19:36 +00:00
|
|
|
note: for a trait to be dyn compatible it needs to allow building a vtable
|
2025-01-22 04:14:07 +00:00
|
|
|
for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
|
2020-10-16 00:23:45 +00:00
|
|
|
--> $DIR/E0038.rs:2:22
|
|
|
|
|
|
|
|
|
LL | trait Trait {
|
2024-11-20 22:19:36 +00:00
|
|
|
| ----- this trait is not dyn compatible...
|
2020-10-16 00:23:45 +00:00
|
|
|
LL | fn foo(&self) -> Self;
|
|
|
|
| ^^^^ ...because method `foo` references the `Self` type in its return type
|
2021-09-12 18:49:56 +00:00
|
|
|
= help: consider moving `foo` to another trait
|
2018-02-08 03:35:35 +00:00
|
|
|
|
2024-11-20 22:19:36 +00:00
|
|
|
error[E0038]: the trait `Trait` is not dyn compatible
|
2024-02-09 12:17:55 +00:00
|
|
|
--> $DIR/E0038.rs:7:13
|
|
|
|
|
|
|
|
|
LL | let y = x.foo();
|
2024-11-20 22:19:36 +00:00
|
|
|
| ^^^^^^^ `Trait` is not dyn compatible
|
2024-02-09 12:17:55 +00:00
|
|
|
|
|
2024-11-20 22:19:36 +00:00
|
|
|
note: for a trait to be dyn compatible it needs to allow building a vtable
|
2025-01-22 04:14:07 +00:00
|
|
|
for more information, visit <https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility>
|
2024-02-09 12:17:55 +00:00
|
|
|
--> $DIR/E0038.rs:2:22
|
|
|
|
|
|
|
|
|
LL | trait Trait {
|
2024-11-20 22:19:36 +00:00
|
|
|
| ----- this trait is not dyn compatible...
|
2024-02-09 12:17:55 +00:00
|
|
|
LL | fn foo(&self) -> Self;
|
|
|
|
| ^^^^ ...because method `foo` references the `Self` type in its return type
|
|
|
|
= help: consider moving `foo` to another trait
|
|
|
|
|
|
|
|
error[E0277]: the size for values of type `dyn Trait` cannot be known at compilation time
|
|
|
|
--> $DIR/E0038.rs:7:9
|
|
|
|
|
|
|
|
|
LL | let y = x.foo();
|
|
|
|
| ^ doesn't have a size known at compile-time
|
|
|
|
|
|
|
|
|
= help: the trait `Sized` is not implemented for `dyn Trait`
|
|
|
|
= note: all local variables must have a statically known size
|
|
|
|
= help: unsized locals are gated as an unstable feature
|
|
|
|
|
|
|
|
error: aborting due to 3 previous errors
|
2018-02-08 03:35:35 +00:00
|
|
|
|
2024-02-09 12:17:55 +00:00
|
|
|
Some errors have detailed explanations: E0038, E0277.
|
|
|
|
For more information about an error, try `rustc --explain E0038`.
|