From de3e8ca2f3908dc48fddb0d5b4c14c776017b43e Mon Sep 17 00:00:00 2001 From: David Wood Date: Sat, 7 May 2022 07:26:03 +0100 Subject: [PATCH] errors: `set_arg` takes `IntoDiagnosticArg` Manual implementors of translatable diagnostics will need to call `set_arg`, not just the derive, so make this function a bit more ergonomic by taking `IntoDiagnosticArg` rather than `DiagnosticArgValue`. Signed-off-by: David Wood --- compiler/rustc_errors/src/diagnostic.rs | 4 ++-- .../rustc_errors/src/diagnostic_builder.rs | 4 ++-- .../src/diagnostics/diagnostic.rs | 2 +- .../src/diagnostics/subdiagnostic.rs | 2 +- .../session-diagnostic/diagnostic-derive.rs | 2 +- .../diagnostic-derive.stderr | 21 +++++++++++++------ 6 files changed, 22 insertions(+), 13 deletions(-) diff --git a/compiler/rustc_errors/src/diagnostic.rs b/compiler/rustc_errors/src/diagnostic.rs index 83e6a751394..909ed566f64 100644 --- a/compiler/rustc_errors/src/diagnostic.rs +++ b/compiler/rustc_errors/src/diagnostic.rs @@ -821,9 +821,9 @@ impl Diagnostic { pub fn set_arg( &mut self, name: impl Into>, - arg: DiagnosticArgValue<'static>, + arg: impl IntoDiagnosticArg, ) -> &mut Self { - self.args.push((name.into(), arg)); + self.args.push((name.into(), arg.into_diagnostic_arg())); self } diff --git a/compiler/rustc_errors/src/diagnostic_builder.rs b/compiler/rustc_errors/src/diagnostic_builder.rs index 96b730c2baa..53ad6e5a0ed 100644 --- a/compiler/rustc_errors/src/diagnostic_builder.rs +++ b/compiler/rustc_errors/src/diagnostic_builder.rs @@ -1,4 +1,4 @@ -use crate::diagnostic::DiagnosticArgValue; +use crate::diagnostic::IntoDiagnosticArg; use crate::{Diagnostic, DiagnosticId, DiagnosticMessage, DiagnosticStyledString, ErrorGuaranteed}; use crate::{Handler, Level, MultiSpan, StashKey}; use rustc_lint_defs::Applicability; @@ -528,7 +528,7 @@ impl<'a, G: EmissionGuarantee> DiagnosticBuilder<'a, G> { forward!(pub fn set_arg( &mut self, name: impl Into>, - arg: DiagnosticArgValue<'static>, + arg: impl IntoDiagnosticArg, ) -> &mut Self); forward!(pub fn subdiagnostic( diff --git a/compiler/rustc_macros/src/diagnostics/diagnostic.rs b/compiler/rustc_macros/src/diagnostics/diagnostic.rs index 6788ce37eae..dac3e986e7a 100644 --- a/compiler/rustc_macros/src/diagnostics/diagnostic.rs +++ b/compiler/rustc_macros/src/diagnostics/diagnostic.rs @@ -113,7 +113,7 @@ impl<'a> SessionDiagnosticDerive<'a> { quote! { #diag.set_arg( stringify!(#ident), - #field_binding.into_diagnostic_arg() + #field_binding ); } } else { diff --git a/compiler/rustc_macros/src/diagnostics/subdiagnostic.rs b/compiler/rustc_macros/src/diagnostics/subdiagnostic.rs index 65b1328682f..ae5b9dbd9ba 100644 --- a/compiler/rustc_macros/src/diagnostics/subdiagnostic.rs +++ b/compiler/rustc_macros/src/diagnostics/subdiagnostic.rs @@ -349,7 +349,7 @@ impl<'a> SessionSubdiagnosticDeriveBuilder<'a> { let generated = quote! { #diag.set_arg( stringify!(#ident), - #binding.into_diagnostic_arg() + #binding ); }; diff --git a/src/test/ui-fulldeps/session-diagnostic/diagnostic-derive.rs b/src/test/ui-fulldeps/session-diagnostic/diagnostic-derive.rs index 1bc7475eca7..1cdc5d18c28 100644 --- a/src/test/ui-fulldeps/session-diagnostic/diagnostic-derive.rs +++ b/src/test/ui-fulldeps/session-diagnostic/diagnostic-derive.rs @@ -327,7 +327,7 @@ struct ErrorWithDefaultLabelAttr<'a> { } #[derive(SessionDiagnostic)] -//~^ ERROR no method named `into_diagnostic_arg` found for struct `Hello` in the current scope +//~^ ERROR the trait bound `Hello: IntoDiagnosticArg` is not satisfied #[error(code = "E0123", slug = "foo")] struct ArgFieldWithoutSkip { #[primary_span] diff --git a/src/test/ui-fulldeps/session-diagnostic/diagnostic-derive.stderr b/src/test/ui-fulldeps/session-diagnostic/diagnostic-derive.stderr index b1738b60bc0..2583363120a 100644 --- a/src/test/ui-fulldeps/session-diagnostic/diagnostic-derive.stderr +++ b/src/test/ui-fulldeps/session-diagnostic/diagnostic-derive.stderr @@ -349,17 +349,26 @@ error: cannot find attribute `nonsense` in this scope LL | #[nonsense] | ^^^^^^^^ -error[E0599]: no method named `into_diagnostic_arg` found for struct `Hello` in the current scope +error[E0277]: the trait bound `Hello: IntoDiagnosticArg` is not satisfied --> $DIR/diagnostic-derive.rs:329:10 | -LL | struct Hello {} - | ------------ method `into_diagnostic_arg` not found for this -... LL | #[derive(SessionDiagnostic)] - | ^^^^^^^^^^^^^^^^^ method not found in `Hello` + | ^^^^^^^^^^^^^^^^^ the trait `IntoDiagnosticArg` is not implemented for `Hello` | + = help: the following other types implement trait `IntoDiagnosticArg`: + &'a str + Ident + String + Symbol + rustc_middle::ty::Ty<'tcx> + usize +note: required by a bound in `DiagnosticBuilder::<'a, G>::set_arg` + --> $COMPILER_DIR/rustc_errors/src/diagnostic_builder.rs:531:19 + | +LL | arg: impl IntoDiagnosticArg, + | ^^^^^^^^^^^^^^^^^ required by this bound in `DiagnosticBuilder::<'a, G>::set_arg` = note: this error originates in the derive macro `SessionDiagnostic` (in Nightly builds, run with -Z macro-backtrace for more info) error: aborting due to 43 previous errors -For more information about this error, try `rustc --explain E0599`. +For more information about this error, try `rustc --explain E0277`.