Skip to content

Improve output of E0271 #40186

Closed
Closed
@seanmonstar

Description

@seanmonstar

This error is encountered often with futures and tokio, where a returned future has an associated type that doesn't match the expected return type.

An example of current behavior:

error[E0271]: type mismatch resolving `<futures::AndThen<futures::stream::Fold<futures::stream::MapErr<hyper::Body, [closure@src/consumer/pinger.rs:100:41: 107:18 uri:_, request_type:_, correlation_id:_, tx:_, event:_]>, [closure@src/consumer/pinger.rs:107:35: 110:18], futures::FutureResult<std::vec::Vec<u8>, futures::sink::Send<futures::sync::mpsc::Sender<(events::http_request_event::HttpRequestEvent, std::result::Result<consumer::pinger::HttpResult, consumer::pinger::HttpResult>)>>>, std::vec::Vec<u8>>, futures::sink::Send<futures::sync::mpsc::Sender<(events::http_request_event::HttpRequestEvent, std::result::Result<consumer::pinger::HttpResult, consumer::pinger::HttpResult>)>>, [closure@src/consumer/pinger.rs:110:29: 127:18 timer:_, status_code:_, response_status:_, uri:_, tx:_, event:_, headers:_, request_type:_, correlation_id:_]> as futures::IntoFuture>::Error == futures::sink::Send<futures::sync::mpsc::Sender<(events::http_request_event::HttpRequestEvent, std::result::Result<consumer::pinger::HttpResult, consumer::pinger::HttpResult>)>>`
   |
16 |     Box::new(
   |     ^ expected futures::sink::Send<futures::sync::mpsc::Sender<(events::http_request_event::HttpRequestEvent, std::result::Result<consumer::pinger::HttpResult, consumer::pinger::HttpResult>)>>, found struct `io::Error`
   |
   = note: expected type `futures::sink::Send<futures::sync::mpsc::Sender<(events::http_request_event::HttpRequestEvent, std::result::Result<consumer::pinger::HttpResult, consumer::pinger::HttpResult>)>>`
   = note:    found type `io::Error`
   = note: required for the cast to the object type `Future<Error=futures::sink::Send<futures::sync::mpsc::Sender<(events::http_request_event::HttpRequestEvent, std::result::Result<consumer::pinger::HttpResult, consumer::pinger::HttpResult>)>>> + 'static`

And a playpen of a the current behavior (though the error is much smaller): https://is.gd/iigJ2p

A message like this pushes the actionable information down several lines. It may help to instead, output something like this:

error[E0271]: type mismatch resolving `<futures::AndThen<...>::Error`
   |
16 |     Box::new(
   |     ^ expected futures::sink::Send<futures::sync::mpsc::Sender<(events::http_request_event::HttpRequestEvent, std::result::Result<consumer::pinger::HttpResult, consumer::pinger::HttpResult>)>>, found struct `io::Error`
   |
   = note: expected type `futures::sink::Send<futures::sync::mpsc::Sender<(events::http_request_event::HttpRequestEvent, std::result::Result<consumer::pinger::HttpResult, consumer::pinger::HttpResult>)>>`
   = note:    found type `io::Error`
   = note: required for the cast to the object type `Future<Error=futures::sink::Send<futures::sync::mpsc::Sender<(events::http_request_event::HttpRequestEvent, std::result::Result<consumer::pinger::HttpResult, consumer::pinger::HttpResult>)>>> + 'static`
   = note: full type is `<futures::AndThen<futures::stream::Fold<futures::stream::MapErr<hyper::Body, [closure@src/consumer/pinger.rs:100:41: 107:18 uri:_, request_type:_, correlation_id:_, tx:_, event:_]>, [closure@src/consumer/pinger.rs:107:35: 110:18], futures::FutureResult<std::vec::Vec<u8>, futures::sink::Send<futures::sync::mpsc::Sender<(events::http_request_event::HttpRequestEvent, std::result::Result<consumer::pinger::HttpResult, consumer::pinger::HttpResult>)>>>, std::vec::Vec<u8>>, futures::sink::Send<futures::sync::mpsc::Sender<(events::http_request_event::HttpRequestEvent, std::result::Result<consumer::pinger::HttpResult, consumer::pinger::HttpResult>)>>, [closure@src/consumer/pinger.rs:110:29: 127:18 timer:_, status_code:_, response_status:_, uri:_, tx:_, event:_, headers:_, request_type:_, correlation_id:_]> as futures::IntoFuture>::Error == futures::sink::Send<futures::sync::mpsc::Sender<(events::http_request_event::HttpRequestEvent, std::result::Result<consumer::pinger::HttpResult, consumer::pinger::HttpResult>)>>`

Additionally, it might be even clearer to omit some of the type parameters (leaving enough to differentiate) in the 'expected' and 'found' notes, leaving the full type for the bottom note.

error[E0271]: type mismatch resolving `<futures::AndThen<...>::Error`
   |
16 |     Box::new(
   |     ^ expected futures::sink::Send<...>, found struct `io::Error`
   |
   = note: expected type `futures::sink::Send<...>`
   = note:    found type `io::Error`

cc @eddyb

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-diagnosticsArea: Messages for errors, warnings, and lintsC-enhancementCategory: An issue proposing an enhancement or a PR with one.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.WG-diagnosticsWorking group: Diagnostics

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions