From dd7a93d7f76d4008370246cf029b2e54751a6ee0 Mon Sep 17 00:00:00 2001 From: Oli Scherer Date: Wed, 9 Feb 2022 17:39:28 +0000 Subject: [PATCH] Special case the situation where the previous span is the same as the new one --- compiler/rustc_typeck/src/collect/type_of.rs | 6 +++++- src/test/ui/impl-trait/issue-86465.stderr | 9 +++------ .../multiple-def-uses-in-one-fn-infer.stderr | 9 +++------ .../multiple-def-uses-in-one-fn-lifetimes.stderr | 9 +++------ .../multiple-def-uses-in-one-fn2.stderr | 9 +++------ 5 files changed, 17 insertions(+), 25 deletions(-) diff --git a/compiler/rustc_typeck/src/collect/type_of.rs b/compiler/rustc_typeck/src/collect/type_of.rs index 5cc9413066038..aee202e242400 100644 --- a/compiler/rustc_typeck/src/collect/type_of.rs +++ b/compiler/rustc_typeck/src/collect/type_of.rs @@ -639,7 +639,11 @@ fn find_opaque_ty_constraints(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Ty<'_> { concrete_type.span, format!("expected `{}`, got `{}`", prev.ty, concrete_type.ty), ); - err.span_note(prev.span, "previous use here"); + if prev.span == concrete_type.span { + err.span_label(prev.span, "this expression supplies two conflicting concrete types for the same opaque type"); + } else { + err.span_note(prev.span, "previous use here"); + } err.emit(); } } else { diff --git a/src/test/ui/impl-trait/issue-86465.stderr b/src/test/ui/impl-trait/issue-86465.stderr index fc7bad601835b..90d6904ed6164 100644 --- a/src/test/ui/impl-trait/issue-86465.stderr +++ b/src/test/ui/impl-trait/issue-86465.stderr @@ -1,14 +1,11 @@ error: concrete type differs from previous defining opaque type use --> $DIR/issue-86465.rs:6:5 | -LL | (a, a) - | ^^^^^^ expected `&'a u32`, got `&'b u32` - | -note: previous use here - --> $DIR/issue-86465.rs:6:5 - | LL | (a, a) | ^^^^^^ + | | + | expected `&'a u32`, got `&'b u32` + | this expression supplies two conflicting concrete types for the same opaque type error: aborting due to previous error diff --git a/src/test/ui/type-alias-impl-trait/multiple-def-uses-in-one-fn-infer.stderr b/src/test/ui/type-alias-impl-trait/multiple-def-uses-in-one-fn-infer.stderr index e3709d822ff0e..2781170091245 100644 --- a/src/test/ui/type-alias-impl-trait/multiple-def-uses-in-one-fn-infer.stderr +++ b/src/test/ui/type-alias-impl-trait/multiple-def-uses-in-one-fn-infer.stderr @@ -1,14 +1,11 @@ error: concrete type differs from previous defining opaque type use --> $DIR/multiple-def-uses-in-one-fn-infer.rs:10:5 | -LL | (42_i64, 60) - | ^^^^^^^^^^^^ expected `i64`, got `i32` - | -note: previous use here - --> $DIR/multiple-def-uses-in-one-fn-infer.rs:10:5 - | LL | (42_i64, 60) | ^^^^^^^^^^^^ + | | + | expected `i64`, got `i32` + | this expression supplies two conflicting concrete types for the same opaque type error: aborting due to previous error diff --git a/src/test/ui/type-alias-impl-trait/multiple-def-uses-in-one-fn-lifetimes.stderr b/src/test/ui/type-alias-impl-trait/multiple-def-uses-in-one-fn-lifetimes.stderr index ed2e48e4aff54..81e603e2355df 100644 --- a/src/test/ui/type-alias-impl-trait/multiple-def-uses-in-one-fn-lifetimes.stderr +++ b/src/test/ui/type-alias-impl-trait/multiple-def-uses-in-one-fn-lifetimes.stderr @@ -1,14 +1,11 @@ error: concrete type differs from previous defining opaque type use --> $DIR/multiple-def-uses-in-one-fn-lifetimes.rs:6:5 | -LL | (i, i) - | ^^^^^^ expected `&'a i32`, got `&'b i32` - | -note: previous use here - --> $DIR/multiple-def-uses-in-one-fn-lifetimes.rs:6:5 - | LL | (i, i) | ^^^^^^ + | | + | expected `&'a i32`, got `&'b i32` + | this expression supplies two conflicting concrete types for the same opaque type error: aborting due to previous error diff --git a/src/test/ui/type-alias-impl-trait/multiple-def-uses-in-one-fn2.stderr b/src/test/ui/type-alias-impl-trait/multiple-def-uses-in-one-fn2.stderr index de3f87007081a..0f752212ac9c6 100644 --- a/src/test/ui/type-alias-impl-trait/multiple-def-uses-in-one-fn2.stderr +++ b/src/test/ui/type-alias-impl-trait/multiple-def-uses-in-one-fn2.stderr @@ -1,14 +1,11 @@ error: concrete type differs from previous defining opaque type use --> $DIR/multiple-def-uses-in-one-fn2.rs:10:5 | -LL | (a.clone(), a) - | ^^^^^^^^^^^^^^ expected `A`, got `B` - | -note: previous use here - --> $DIR/multiple-def-uses-in-one-fn2.rs:10:5 - | LL | (a.clone(), a) | ^^^^^^^^^^^^^^ + | | + | expected `A`, got `B` + | this expression supplies two conflicting concrete types for the same opaque type error: aborting due to previous error