diff options
| author | Cameron Steffen <cam.steffen94@gmail.com> | 2021-08-02 09:36:52 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-08-02 09:36:52 -0500 |
| commit | 1b48f4d1ea42799f8022bf27a15d9338f0ab05d7 (patch) | |
| tree | ad71edb583391f425ab7a21daf228f9117a98f57 /compiler | |
| parent | 43800563975dcd69720f1ff34af66d85933a3573 (diff) | |
| parent | 052084af13cc2b6b80a2db25ec8ed22812a0269b (diff) | |
| download | rust-1b48f4d1ea42799f8022bf27a15d9338f0ab05d7.tar.gz rust-1b48f4d1ea42799f8022bf27a15d9338f0ab05d7.zip | |
Rollup merge of #87673 - estebank:opaque-ty-mismatch, r=davidtwco
Tweak opaque type mismatch error
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/rustc_infer/src/infer/error_reporting/mod.rs | 68 |
1 files changed, 43 insertions, 25 deletions
diff --git a/compiler/rustc_infer/src/infer/error_reporting/mod.rs b/compiler/rustc_infer/src/infer/error_reporting/mod.rs index f885c0a4b87..cdc9a212531 100644 --- a/compiler/rustc_infer/src/infer/error_reporting/mod.rs +++ b/compiler/rustc_infer/src/infer/error_reporting/mod.rs @@ -71,7 +71,7 @@ use rustc_middle::ty::{ subst::{GenericArgKind, Subst, SubstsRef}, Region, Ty, TyCtxt, TypeFoldable, }; -use rustc_span::{sym, BytePos, DesugaringKind, Pos, Span}; +use rustc_span::{sym, BytePos, DesugaringKind, MultiSpan, Pos, Span}; use rustc_target::spec::abi; use std::ops::ControlFlow; use std::{cmp, fmt, iter}; @@ -1485,31 +1485,49 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { let count = values.len(); let kind = key.descr(); let mut returned_async_output_error = false; - for sp in values { - err.span_label( - *sp, - format!( - "{}{}{} {}{}", - if sp.is_desugaring(DesugaringKind::Async) - && !returned_async_output_error - { - "checked the `Output` of this `async fn`, " - } else if count == 1 { - "the " - } else { - "" - }, - if count > 1 { "one of the " } else { "" }, - target, - kind, - pluralize!(count), - ), - ); - if sp.is_desugaring(DesugaringKind::Async) - && returned_async_output_error == false - { - err.note("while checking the return type of the `async fn`"); + for &sp in values { + if sp.is_desugaring(DesugaringKind::Async) && !returned_async_output_error { + if &[sp] != err.span.primary_spans() { + let mut span: MultiSpan = sp.into(); + span.push_span_label( + sp, + format!( + "checked the `Output` of this `async fn`, {}{} {}{}", + if count > 1 { "one of the " } else { "" }, + target, + kind, + pluralize!(count), + ), + ); + err.span_note( + span, + "while checking the return type of the `async fn`", + ); + } else { + err.span_label( + sp, + format!( + "checked the `Output` of this `async fn`, {}{} {}{}", + if count > 1 { "one of the " } else { "" }, + target, + kind, + pluralize!(count), + ), + ); + err.note("while checking the return type of the `async fn`"); + } returned_async_output_error = true; + } else { + err.span_label( + sp, + format!( + "{}{} {}{}", + if count == 1 { "the " } else { "one of the " }, + target, + kind, + pluralize!(count), + ), + ); } } } |
