Auto merge of #99893 - compiler-errors:issue-99387, r=davidtwco
Delay formatting trimmed path until lint/error is emitted Fixes #99387 r? `@davidtwco`
This commit is contained in:
commit
76b0484740
5 changed files with 60 additions and 18 deletions
|
|
@ -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 ),+ $(,)?) => {
|
||||
$(
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
use rustc_errors::DiagnosticArgFromDisplay;
|
||||
use rustc_macros::{LintDiagnostic, SessionDiagnostic, SessionSubdiagnostic};
|
||||
use rustc_span::{Span, Symbol};
|
||||
|
||||
|
|
@ -35,7 +36,7 @@ pub struct ItemIsPrivate<'a> {
|
|||
#[label]
|
||||
pub span: Span,
|
||||
pub kind: &'a str,
|
||||
pub descr: String,
|
||||
pub descr: DiagnosticArgFromDisplay<'a>,
|
||||
}
|
||||
|
||||
#[derive(SessionDiagnostic)]
|
||||
|
|
@ -55,7 +56,7 @@ pub struct InPublicInterfaceTraits<'a> {
|
|||
pub span: Span,
|
||||
pub vis_descr: &'static str,
|
||||
pub kind: &'a str,
|
||||
pub descr: String,
|
||||
pub descr: DiagnosticArgFromDisplay<'a>,
|
||||
#[label(privacy::visibility_label)]
|
||||
pub vis_span: Span,
|
||||
}
|
||||
|
|
@ -69,7 +70,7 @@ pub struct InPublicInterface<'a> {
|
|||
pub span: Span,
|
||||
pub vis_descr: &'static str,
|
||||
pub kind: &'a str,
|
||||
pub descr: String,
|
||||
pub descr: DiagnosticArgFromDisplay<'a>,
|
||||
#[label(privacy::visibility_label)]
|
||||
pub vis_span: Span,
|
||||
}
|
||||
|
|
@ -78,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: String,
|
||||
pub descr: DiagnosticArgFromDisplay<'a>,
|
||||
pub krate: Symbol,
|
||||
}
|
||||
|
||||
|
|
@ -87,5 +88,5 @@ pub struct FromPrivateDependencyInPublicInterface<'a> {
|
|||
pub struct PrivateInPublicLint<'a> {
|
||||
pub vis_descr: &'static str,
|
||||
pub kind: &'a str,
|
||||
pub descr: String,
|
||||
pub descr: DiagnosticArgFromDisplay<'a>,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1079,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: descr.to_string(),
|
||||
});
|
||||
self.tcx.sess.emit_err(ItemIsPrivate { span: self.span, kind, descr: descr.into() });
|
||||
}
|
||||
is_error
|
||||
}
|
||||
|
|
@ -1255,7 +1251,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: (&name).into() })
|
||||
}
|
||||
None => sess.emit_err(UnnamedItemIsPrivate { span, kind }),
|
||||
};
|
||||
return;
|
||||
|
|
@ -1723,7 +1721,7 @@ impl SearchInterfaceForPrivateItemsVisitor<'_> {
|
|||
self.tcx.def_span(self.item_def_id.to_def_id()),
|
||||
FromPrivateDependencyInPublicInterface {
|
||||
kind,
|
||||
descr: descr.to_string(),
|
||||
descr: descr.into(),
|
||||
krate: self.tcx.crate_name(def_id.krate),
|
||||
},
|
||||
);
|
||||
|
|
@ -1750,7 +1748,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 +1758,7 @@ impl SearchInterfaceForPrivateItemsVisitor<'_> {
|
|||
span,
|
||||
vis_descr,
|
||||
kind,
|
||||
descr,
|
||||
descr: descr.into(),
|
||||
vis_span,
|
||||
});
|
||||
} else {
|
||||
|
|
@ -1769,7 +1766,7 @@ impl SearchInterfaceForPrivateItemsVisitor<'_> {
|
|||
span,
|
||||
vis_descr,
|
||||
kind,
|
||||
descr,
|
||||
descr: descr.into(),
|
||||
vis_span,
|
||||
});
|
||||
}
|
||||
|
|
@ -1778,7 +1775,7 @@ impl SearchInterfaceForPrivateItemsVisitor<'_> {
|
|||
lint::builtin::PRIVATE_IN_PUBLIC,
|
||||
hir_id,
|
||||
span,
|
||||
PrivateInPublicLint { vis_descr, kind, descr },
|
||||
PrivateInPublicLint { vis_descr, kind, descr: descr.into() },
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
24
src/test/ui/lint/issue-99387.rs
Normal file
24
src/test/ui/lint/issue-99387.rs
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
// check-pass
|
||||
|
||||
#![feature(type_alias_impl_trait)]
|
||||
#![allow(private_in_public)]
|
||||
|
||||
pub type Successors<'a> = impl Iterator<Item = &'a ()>;
|
||||
|
||||
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() {}
|
||||
Loading…
Add table
Add a link
Reference in a new issue