From e59e7d31f49c050ee6e5ef30125e592fde071c9f Mon Sep 17 00:00:00 2001 From: Gurinder Singh Date: Tue, 17 Oct 2023 13:46:22 +0530 Subject: [PATCH] Fix duplicate labels emitted in `render_multispan_macro_backtrace()` Using hash set instead of vec to weed out duplicates --- compiler/rustc_errors/src/emitter.rs | 9 +++--- .../ui/asm/x86_64/interpolated-idents.stderr | 7 +---- ...ition-lint-infer-outlives-multispan.stderr | 7 +---- ...-116473-ice-wrong-span-variant-args.stderr | 30 ++++--------------- 4 files changed, 13 insertions(+), 40 deletions(-) diff --git a/compiler/rustc_errors/src/emitter.rs b/compiler/rustc_errors/src/emitter.rs index 922846775f651..fba4651dfb7eb 100644 --- a/compiler/rustc_errors/src/emitter.rs +++ b/compiler/rustc_errors/src/emitter.rs @@ -23,7 +23,7 @@ use crate::{ use rustc_lint_defs::pluralize; use derive_setters::Setters; -use rustc_data_structures::fx::{FxHashMap, FxIndexMap}; +use rustc_data_structures::fx::{FxHashMap, FxHashSet, FxIndexMap}; use rustc_data_structures::sync::{DynSend, IntoDynSyncSend, Lrc}; use rustc_error_messages::{FluentArgs, SpanLabel}; use rustc_span::hygiene::{ExpnKind, MacroKind}; @@ -370,7 +370,7 @@ pub trait Emitter: Translate { } fn render_multispan_macro_backtrace(&self, span: &mut MultiSpan, always_backtrace: bool) { - let mut new_labels: Vec<(Span, String)> = vec![]; + let mut new_labels = FxHashSet::default(); for &sp in span.primary_spans() { if sp.is_dummy() { @@ -387,7 +387,7 @@ pub trait Emitter: Translate { } if always_backtrace { - new_labels.push(( + new_labels.insert(( trace.def_site, format!( "in this expansion of `{}`{}", @@ -431,7 +431,7 @@ pub trait Emitter: Translate { format!("this {} desugaring", kind.descr()).into() } }; - new_labels.push(( + new_labels.insert(( trace.call_site, format!( "in {}{}", @@ -452,6 +452,7 @@ pub trait Emitter: Translate { } } + #[allow(rustc::potential_query_instability)] for (label_span, label_text) in new_labels { span.push_span_label(label_span, label_text); } diff --git a/tests/ui/asm/x86_64/interpolated-idents.stderr b/tests/ui/asm/x86_64/interpolated-idents.stderr index 80a8c8c77cfec..a91bc768fc4d1 100644 --- a/tests/ui/asm/x86_64/interpolated-idents.stderr +++ b/tests/ui/asm/x86_64/interpolated-idents.stderr @@ -33,12 +33,7 @@ LL | asm!("", $in(x) x, $out(x) x, $lateout(x) x, $inout(x) x, $in LL | / m!(in out lateout inout inlateout const sym LL | | pure nomem readonly preserves_flags LL | | noreturn nostack att_syntax options); - | | - - | |___________________________________________| - | |___________________________________________in this macro invocation - | |___________________________________________in this macro invocation - | |___________________________________________in this macro invocation - | in this macro invocation + | |___________________________________________- in this macro invocation | = note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/tests/ui/rust-2018/edition-lint-infer-outlives-multispan.stderr b/tests/ui/rust-2018/edition-lint-infer-outlives-multispan.stderr index f5ec287d29132..1f4190665b9b0 100644 --- a/tests/ui/rust-2018/edition-lint-infer-outlives-multispan.stderr +++ b/tests/ui/rust-2018/edition-lint-infer-outlives-multispan.stderr @@ -861,12 +861,7 @@ LL | $($name: 'a, $name: 'a, )+; | ^^^^^^^^^ ^^^^^^^^^ ... LL | m!(T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 T12 T13 T14 T15); - | --------------------------------------------------------- - | | - | in this macro invocation - | in this macro invocation - | in this macro invocation - | in this macro invocation + | --------------------------------------------------------- in this macro invocation | = note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info) help: remove these bounds diff --git a/tests/ui/typeck/issue-116473-ice-wrong-span-variant-args.stderr b/tests/ui/typeck/issue-116473-ice-wrong-span-variant-args.stderr index 437800f1181b5..b17936ee3d351 100644 --- a/tests/ui/typeck/issue-116473-ice-wrong-span-variant-args.stderr +++ b/tests/ui/typeck/issue-116473-ice-wrong-span-variant-args.stderr @@ -7,10 +7,7 @@ LL | ($variant:tt) => (if let EnumUnit::$variant:: {} = 5 { true } | not allowed on this type ... LL | recursive_tt!(); - | --------------- - | | - | in this macro invocation - | in this macro invocation + | --------------- in this macro invocation | = note: enum variants can't have type parameters = note: this error originates in the macro `recursive_tt` (in Nightly builds, run with -Z macro-backtrace for more info) @@ -44,10 +41,7 @@ LL | ($variant:ident) => (if let EnumUnit::$variant:: {} = 5 { tru | ^^^ ^^^ type argument not allowed ... LL | recursive_ident!(); - | ------------------ - | | - | in this macro invocation - | in this macro invocation + | ------------------ in this macro invocation | = note: enum variants can't have type parameters = note: this error originates in the macro `recursive_ident` (in Nightly builds, run with -Z macro-backtrace for more info) @@ -81,10 +75,7 @@ LL | ($variant:tt) => (if let EnumUnit::$variant:: {} = 5 { true } | not allowed on this type ... LL | nested1_tt!(); - | ------------- - | | - | in this macro invocation - | in this macro invocation + | ------------- in this macro invocation | = note: enum variants can't have type parameters = note: this error originates in the macro `nested2_tt` which comes from the expansion of the macro `nested1_tt` (in Nightly builds, run with -Z macro-backtrace for more info) @@ -119,10 +110,7 @@ LL | ($variant:ident) => (if let EnumUnit::$variant:: {} = 5 { tru | ^^^ ^^^ type argument not allowed ... LL | nested1_ident!(); - | ---------------- - | | - | in this macro invocation - | in this macro invocation + | ---------------- in this macro invocation | = note: enum variants can't have type parameters = note: this error originates in the macro `nested2_ident` which comes from the expansion of the macro `nested1_ident` (in Nightly builds, run with -Z macro-backtrace for more info) @@ -156,10 +144,7 @@ LL | ($arg1:tt, $arg2:tt) => (if let EnumUnit::VariantB::<$arg1, $arg2> {} | not allowed on this type ... LL | nested1_tt_args_in_first_macro!(); - | --------------------------------- - | | - | in this macro invocation - | in this macro invocation + | --------------------------------- in this macro invocation | = note: enum variants can't have type parameters = note: this error originates in the macro `nested1_tt_args_in_first_macro` (in Nightly builds, run with -Z macro-backtrace for more info) @@ -194,10 +179,7 @@ LL | ($arg1:ident, $arg2:ident) => (if let EnumUnit::VariantB::<$arg1, $arg2 | not allowed on this type ... LL | nested1_ident_args_in_first_macro!(); - | ------------------------------------ - | | - | in this macro invocation - | in this macro invocation + | ------------------------------------ in this macro invocation | = note: enum variants can't have type parameters = note: this error originates in the macro `nested2_ident_args_in_first_macro` which comes from the expansion of the macro `nested1_ident_args_in_first_macro` (in Nightly builds, run with -Z macro-backtrace for more info)