From 0ad57d8502435aeed18f489f6a40fe36bc7fa73f Mon Sep 17 00:00:00 2001 From: Michael Goulet Date: Fri, 29 Jul 2022 06:48:39 +0000 Subject: [PATCH 1/2] Delay formatting trimmed path until lint/error is emitted --- compiler/rustc_privacy/src/errors.rs | 21 ++++++++++++++++----- compiler/rustc_privacy/src/lib.rs | 20 +++++++++++--------- src/test/ui/lint/issue-99387.rs | 24 ++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 14 deletions(-) create mode 100644 src/test/ui/lint/issue-99387.rs diff --git a/compiler/rustc_privacy/src/errors.rs b/compiler/rustc_privacy/src/errors.rs index b0fac91f6ebc3..f3d0c759e21c6 100644 --- a/compiler/rustc_privacy/src/errors.rs +++ b/compiler/rustc_privacy/src/errors.rs @@ -1,3 +1,6 @@ +use std::fmt::Display; + +use rustc_errors::IntoDiagnosticArg; use rustc_macros::{LintDiagnostic, SessionDiagnostic, SessionSubdiagnostic}; use rustc_span::{Span, Symbol}; @@ -35,7 +38,7 @@ pub struct ItemIsPrivate<'a> { #[label] pub span: Span, pub kind: &'a str, - pub descr: String, + pub descr: FromDisplay<'a>, } #[derive(SessionDiagnostic)] @@ -55,7 +58,7 @@ pub struct InPublicInterfaceTraits<'a> { pub span: Span, pub vis_descr: &'static str, pub kind: &'a str, - pub descr: String, + pub descr: FromDisplay<'a>, #[label(privacy::visibility_label)] pub vis_span: Span, } @@ -69,7 +72,7 @@ pub struct InPublicInterface<'a> { pub span: Span, pub vis_descr: &'static str, pub kind: &'a str, - pub descr: String, + pub descr: FromDisplay<'a>, #[label(privacy::visibility_label)] pub vis_span: Span, } @@ -78,7 +81,7 @@ pub struct InPublicInterface<'a> { #[lint(privacy::from_private_dep_in_public_interface)] pub struct FromPrivateDependencyInPublicInterface<'a> { pub kind: &'a str, - pub descr: String, + pub descr: FromDisplay<'a>, pub krate: Symbol, } @@ -87,5 +90,13 @@ pub struct FromPrivateDependencyInPublicInterface<'a> { pub struct PrivateInPublicLint<'a> { pub vis_descr: &'static str, pub kind: &'a str, - pub descr: String, + pub descr: FromDisplay<'a>, +} + +pub struct FromDisplay<'a>(pub &'a dyn Display); + +impl IntoDiagnosticArg for FromDisplay<'_> { + fn into_diagnostic_arg(self) -> rustc_errors::DiagnosticArgValue<'static> { + self.0.to_string().into_diagnostic_arg() + } } diff --git a/compiler/rustc_privacy/src/lib.rs b/compiler/rustc_privacy/src/lib.rs index 7d4ee832974dc..018ac8b1d9979 100644 --- a/compiler/rustc_privacy/src/lib.rs +++ b/compiler/rustc_privacy/src/lib.rs @@ -38,8 +38,9 @@ use std::ops::ControlFlow; use std::{cmp, fmt, mem}; use errors::{ - FieldIsPrivate, FieldIsPrivateLabel, FromPrivateDependencyInPublicInterface, InPublicInterface, - InPublicInterfaceTraits, ItemIsPrivate, PrivateInPublicLint, UnnamedItemIsPrivate, + FieldIsPrivate, FieldIsPrivateLabel, FromDisplay, FromPrivateDependencyInPublicInterface, + InPublicInterface, InPublicInterfaceTraits, ItemIsPrivate, PrivateInPublicLint, + UnnamedItemIsPrivate, }; //////////////////////////////////////////////////////////////////////////////// @@ -1082,7 +1083,7 @@ impl<'tcx> TypePrivacyVisitor<'tcx> { self.tcx.sess.emit_err(ItemIsPrivate { span: self.span, kind, - descr: descr.to_string(), + descr: FromDisplay(descr), }); } is_error @@ -1255,7 +1256,9 @@ impl<'tcx> Visitor<'tcx> for TypePrivacyVisitor<'tcx> { }; let kind = kind.descr(def_id); let _ = match name { - Some(name) => sess.emit_err(ItemIsPrivate { span, kind, descr: name }), + Some(name) => { + sess.emit_err(ItemIsPrivate { span, kind, descr: FromDisplay(&name) }) + } None => sess.emit_err(UnnamedItemIsPrivate { span, kind }), }; return; @@ -1723,7 +1726,7 @@ impl SearchInterfaceForPrivateItemsVisitor<'_> { self.tcx.def_span(self.item_def_id.to_def_id()), FromPrivateDependencyInPublicInterface { kind, - descr: descr.to_string(), + descr: FromDisplay(descr), krate: self.tcx.crate_name(def_id.krate), }, ); @@ -1750,7 +1753,6 @@ impl SearchInterfaceForPrivateItemsVisitor<'_> { } }; let span = self.tcx.def_span(self.item_def_id.to_def_id()); - let descr = descr.to_string(); if self.has_old_errors || self.in_assoc_ty || self.tcx.resolutions(()).has_pub_restricted @@ -1761,7 +1763,7 @@ impl SearchInterfaceForPrivateItemsVisitor<'_> { span, vis_descr, kind, - descr, + descr: FromDisplay(descr), vis_span, }); } else { @@ -1769,7 +1771,7 @@ impl SearchInterfaceForPrivateItemsVisitor<'_> { span, vis_descr, kind, - descr, + descr: FromDisplay(descr), vis_span, }); } @@ -1778,7 +1780,7 @@ impl SearchInterfaceForPrivateItemsVisitor<'_> { lint::builtin::PRIVATE_IN_PUBLIC, hir_id, span, - PrivateInPublicLint { vis_descr, kind, descr }, + PrivateInPublicLint { vis_descr, kind, descr: FromDisplay(descr) }, ); } } diff --git a/src/test/ui/lint/issue-99387.rs b/src/test/ui/lint/issue-99387.rs new file mode 100644 index 0000000000000..616eb935e93d4 --- /dev/null +++ b/src/test/ui/lint/issue-99387.rs @@ -0,0 +1,24 @@ +// check-pass + +#![feature(type_alias_impl_trait)] +#![allow(private_in_public)] + +pub type Successors<'a> = impl Iterator; + +pub fn f<'a>() -> Successors<'a> { + None.into_iter() +} + +trait Tr { + type Item; +} + +impl<'a> Tr for &'a () { + type Item = Successors<'a>; +} + +pub fn ohno<'a>() -> <&'a () as Tr>::Item { + None.into_iter() +} + +fn main() {} From 694a010a5c5c77f8aef822d5a7b2f3abece1ad36 Mon Sep 17 00:00:00 2001 From: Michael Goulet Date: Fri, 5 Aug 2022 16:43:52 +0000 Subject: [PATCH 2/2] move DiagnosticArgFromDisplay into rustc_errors --- compiler/rustc_errors/src/diagnostic.rs | 20 ++++++++++++++++++++ compiler/rustc_errors/src/lib.rs | 4 ++-- compiler/rustc_privacy/src/errors.rs | 22 ++++++---------------- compiler/rustc_privacy/src/lib.rs | 21 ++++++++------------- 4 files changed, 36 insertions(+), 31 deletions(-) diff --git a/compiler/rustc_errors/src/diagnostic.rs b/compiler/rustc_errors/src/diagnostic.rs index 2a4f609a2d8a4..17e6c9e9575fd 100644 --- a/compiler/rustc_errors/src/diagnostic.rs +++ b/compiler/rustc_errors/src/diagnostic.rs @@ -40,6 +40,26 @@ pub trait IntoDiagnosticArg { fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static>; } +pub struct DiagnosticArgFromDisplay<'a>(pub &'a dyn fmt::Display); + +impl IntoDiagnosticArg for DiagnosticArgFromDisplay<'_> { + fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> { + self.0.to_string().into_diagnostic_arg() + } +} + +impl<'a> From<&'a dyn fmt::Display> for DiagnosticArgFromDisplay<'a> { + fn from(t: &'a dyn fmt::Display) -> Self { + DiagnosticArgFromDisplay(t) + } +} + +impl<'a, T: fmt::Display> From<&'a T> for DiagnosticArgFromDisplay<'a> { + fn from(t: &'a T) -> Self { + DiagnosticArgFromDisplay(t) + } +} + macro_rules! into_diagnostic_arg_using_display { ($( $ty:ty ),+ $(,)?) => { $( diff --git a/compiler/rustc_errors/src/lib.rs b/compiler/rustc_errors/src/lib.rs index b173ac0e916b8..2d3155a70edb3 100644 --- a/compiler/rustc_errors/src/lib.rs +++ b/compiler/rustc_errors/src/lib.rs @@ -371,8 +371,8 @@ impl fmt::Display for ExplicitBug { impl error::Error for ExplicitBug {} pub use diagnostic::{ - AddSubdiagnostic, DecorateLint, Diagnostic, DiagnosticArg, DiagnosticArgValue, DiagnosticId, - DiagnosticStyledString, IntoDiagnosticArg, SubDiagnostic, + AddSubdiagnostic, DecorateLint, Diagnostic, DiagnosticArg, DiagnosticArgFromDisplay, + DiagnosticArgValue, DiagnosticId, DiagnosticStyledString, IntoDiagnosticArg, SubDiagnostic, }; pub use diagnostic_builder::{DiagnosticBuilder, EmissionGuarantee, LintDiagnosticBuilder}; use std::backtrace::Backtrace; diff --git a/compiler/rustc_privacy/src/errors.rs b/compiler/rustc_privacy/src/errors.rs index f3d0c759e21c6..aca7d770f3495 100644 --- a/compiler/rustc_privacy/src/errors.rs +++ b/compiler/rustc_privacy/src/errors.rs @@ -1,6 +1,4 @@ -use std::fmt::Display; - -use rustc_errors::IntoDiagnosticArg; +use rustc_errors::DiagnosticArgFromDisplay; use rustc_macros::{LintDiagnostic, SessionDiagnostic, SessionSubdiagnostic}; use rustc_span::{Span, Symbol}; @@ -38,7 +36,7 @@ pub struct ItemIsPrivate<'a> { #[label] pub span: Span, pub kind: &'a str, - pub descr: FromDisplay<'a>, + pub descr: DiagnosticArgFromDisplay<'a>, } #[derive(SessionDiagnostic)] @@ -58,7 +56,7 @@ pub struct InPublicInterfaceTraits<'a> { pub span: Span, pub vis_descr: &'static str, pub kind: &'a str, - pub descr: FromDisplay<'a>, + pub descr: DiagnosticArgFromDisplay<'a>, #[label(privacy::visibility_label)] pub vis_span: Span, } @@ -72,7 +70,7 @@ pub struct InPublicInterface<'a> { pub span: Span, pub vis_descr: &'static str, pub kind: &'a str, - pub descr: FromDisplay<'a>, + pub descr: DiagnosticArgFromDisplay<'a>, #[label(privacy::visibility_label)] pub vis_span: Span, } @@ -81,7 +79,7 @@ pub struct InPublicInterface<'a> { #[lint(privacy::from_private_dep_in_public_interface)] pub struct FromPrivateDependencyInPublicInterface<'a> { pub kind: &'a str, - pub descr: FromDisplay<'a>, + pub descr: DiagnosticArgFromDisplay<'a>, pub krate: Symbol, } @@ -90,13 +88,5 @@ pub struct FromPrivateDependencyInPublicInterface<'a> { pub struct PrivateInPublicLint<'a> { pub vis_descr: &'static str, pub kind: &'a str, - pub descr: FromDisplay<'a>, -} - -pub struct FromDisplay<'a>(pub &'a dyn Display); - -impl IntoDiagnosticArg for FromDisplay<'_> { - fn into_diagnostic_arg(self) -> rustc_errors::DiagnosticArgValue<'static> { - self.0.to_string().into_diagnostic_arg() - } + pub descr: DiagnosticArgFromDisplay<'a>, } diff --git a/compiler/rustc_privacy/src/lib.rs b/compiler/rustc_privacy/src/lib.rs index 018ac8b1d9979..c28d0569d4ce9 100644 --- a/compiler/rustc_privacy/src/lib.rs +++ b/compiler/rustc_privacy/src/lib.rs @@ -38,9 +38,8 @@ use std::ops::ControlFlow; use std::{cmp, fmt, mem}; use errors::{ - FieldIsPrivate, FieldIsPrivateLabel, FromDisplay, FromPrivateDependencyInPublicInterface, - InPublicInterface, InPublicInterfaceTraits, ItemIsPrivate, PrivateInPublicLint, - UnnamedItemIsPrivate, + FieldIsPrivate, FieldIsPrivateLabel, FromPrivateDependencyInPublicInterface, InPublicInterface, + InPublicInterfaceTraits, ItemIsPrivate, PrivateInPublicLint, UnnamedItemIsPrivate, }; //////////////////////////////////////////////////////////////////////////////// @@ -1080,11 +1079,7 @@ impl<'tcx> TypePrivacyVisitor<'tcx> { fn check_def_id(&mut self, def_id: DefId, kind: &str, descr: &dyn fmt::Display) -> bool { let is_error = !self.item_is_accessible(def_id); if is_error { - self.tcx.sess.emit_err(ItemIsPrivate { - span: self.span, - kind, - descr: FromDisplay(descr), - }); + self.tcx.sess.emit_err(ItemIsPrivate { span: self.span, kind, descr: descr.into() }); } is_error } @@ -1257,7 +1252,7 @@ impl<'tcx> Visitor<'tcx> for TypePrivacyVisitor<'tcx> { let kind = kind.descr(def_id); let _ = match name { Some(name) => { - sess.emit_err(ItemIsPrivate { span, kind, descr: FromDisplay(&name) }) + sess.emit_err(ItemIsPrivate { span, kind, descr: (&name).into() }) } None => sess.emit_err(UnnamedItemIsPrivate { span, kind }), }; @@ -1726,7 +1721,7 @@ impl SearchInterfaceForPrivateItemsVisitor<'_> { self.tcx.def_span(self.item_def_id.to_def_id()), FromPrivateDependencyInPublicInterface { kind, - descr: FromDisplay(descr), + descr: descr.into(), krate: self.tcx.crate_name(def_id.krate), }, ); @@ -1763,7 +1758,7 @@ impl SearchInterfaceForPrivateItemsVisitor<'_> { span, vis_descr, kind, - descr: FromDisplay(descr), + descr: descr.into(), vis_span, }); } else { @@ -1771,7 +1766,7 @@ impl SearchInterfaceForPrivateItemsVisitor<'_> { span, vis_descr, kind, - descr: FromDisplay(descr), + descr: descr.into(), vis_span, }); } @@ -1780,7 +1775,7 @@ impl SearchInterfaceForPrivateItemsVisitor<'_> { lint::builtin::PRIVATE_IN_PUBLIC, hir_id, span, - PrivateInPublicLint { vis_descr, kind, descr: FromDisplay(descr) }, + PrivateInPublicLint { vis_descr, kind, descr: descr.into() }, ); } }