mirror of
https://github.com/rust-lang/rust.git
synced 2025-10-02 10:18:25 +00:00
Add support for shortening Instance
and use it
Replace ad-hoc type path shortening logic for recursive mono instantiation errors to use `tcx.short_string()` instead.
This commit is contained in:
parent
29cdc6a109
commit
025fbe8f69
@ -122,8 +122,6 @@ middle_strict_coherence_needs_negative_coherence =
|
||||
to use `strict_coherence` on this trait, the `with_negative_coherence` feature must be enabled
|
||||
.label = due to this attribute
|
||||
|
||||
middle_type_length_limit = reached the type-length limit while instantiating `{$shrunk}`
|
||||
middle_type_length_limit = reached the type-length limit while instantiating `{$instance}`
|
||||
|
||||
middle_unsupported_union = we don't support unions yet: '{$ty_name}'
|
||||
|
||||
middle_written_to_path = the full type name has been written to '{$path}'
|
||||
|
@ -1,4 +1,4 @@
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::path::Path;
|
||||
use std::{fmt, io};
|
||||
|
||||
use rustc_errors::codes::*;
|
||||
@ -6,7 +6,7 @@ use rustc_errors::{DiagArgName, DiagArgValue, DiagMessage};
|
||||
use rustc_macros::{Diagnostic, Subdiagnostic};
|
||||
use rustc_span::{Span, Symbol};
|
||||
|
||||
use crate::ty::Ty;
|
||||
use crate::ty::{Instance, Ty};
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(middle_drop_check_overflow, code = E0320)]
|
||||
@ -161,13 +161,10 @@ pub(crate) struct ErroneousConstant {
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(middle_type_length_limit)]
|
||||
#[help(middle_consider_type_length_limit)]
|
||||
pub(crate) struct TypeLengthLimit {
|
||||
pub(crate) struct TypeLengthLimit<'tcx> {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
pub shrunk: String,
|
||||
#[note(middle_written_to_path)]
|
||||
pub was_written: bool,
|
||||
pub path: PathBuf,
|
||||
pub instance: Instance<'tcx>,
|
||||
pub type_length: usize,
|
||||
}
|
||||
|
||||
|
@ -7,14 +7,14 @@ use rustc_data_structures::fx::FxIndexMap;
|
||||
use rustc_errors::{
|
||||
Applicability, Diag, DiagArgValue, IntoDiagArg, into_diag_arg_using_display, listify, pluralize,
|
||||
};
|
||||
use rustc_hir::def::DefKind;
|
||||
use rustc_hir::def::{DefKind, Namespace};
|
||||
use rustc_hir::def_id::DefId;
|
||||
use rustc_hir::{self as hir, AmbigArg, LangItem, PredicateOrigin, WherePredicateKind};
|
||||
use rustc_span::{BytePos, Span};
|
||||
use rustc_type_ir::TyKind::*;
|
||||
|
||||
use crate::ty::{
|
||||
self, AliasTy, Const, ConstKind, FallibleTypeFolder, InferConst, InferTy, Opaque,
|
||||
self, AliasTy, Const, ConstKind, FallibleTypeFolder, InferConst, InferTy, Instance, Opaque,
|
||||
PolyTraitPredicate, Projection, Ty, TyCtxt, TypeFoldable, TypeSuperFoldable,
|
||||
TypeSuperVisitable, TypeVisitable, TypeVisitor,
|
||||
};
|
||||
@ -28,6 +28,15 @@ impl IntoDiagArg for Ty<'_> {
|
||||
}
|
||||
}
|
||||
|
||||
impl IntoDiagArg for Instance<'_> {
|
||||
fn into_diag_arg(self, path: &mut Option<std::path::PathBuf>) -> rustc_errors::DiagArgValue {
|
||||
ty::tls::with(|tcx| {
|
||||
let instance = tcx.short_string_namespace(self, path, Namespace::ValueNS);
|
||||
rustc_errors::DiagArgValue::Str(std::borrow::Cow::Owned(instance))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
into_diag_arg_using_display! {
|
||||
ty::Region<'_>,
|
||||
}
|
||||
|
@ -160,7 +160,11 @@ impl<'tcx> Ty<'tcx> {
|
||||
_ => {
|
||||
let width = tcx.sess.diagnostic_width();
|
||||
let length_limit = std::cmp::max(width / 4, 40);
|
||||
format!("`{}`", tcx.string_with_limit(self, length_limit)).into()
|
||||
format!(
|
||||
"`{}`",
|
||||
tcx.string_with_limit(self, length_limit, hir::def::Namespace::TypeNS)
|
||||
)
|
||||
.into()
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -213,12 +217,12 @@ impl<'tcx> Ty<'tcx> {
|
||||
}
|
||||
|
||||
impl<'tcx> TyCtxt<'tcx> {
|
||||
pub fn string_with_limit<T>(self, t: T, length_limit: usize) -> String
|
||||
pub fn string_with_limit<T>(self, t: T, length_limit: usize, ns: hir::def::Namespace) -> String
|
||||
where
|
||||
T: Copy + for<'a, 'b> Lift<TyCtxt<'b>, Lifted: Print<'b, FmtPrinter<'a, 'b>>>,
|
||||
{
|
||||
let mut type_limit = 50;
|
||||
let regular = FmtPrinter::print_string(self, hir::def::Namespace::TypeNS, |p| {
|
||||
let regular = FmtPrinter::print_string(self, ns, |p| {
|
||||
self.lift(t).expect("could not lift for printing").print(p)
|
||||
})
|
||||
.expect("could not write to `String`");
|
||||
@ -229,11 +233,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||
loop {
|
||||
// Look for the longest properly trimmed path that still fits in length_limit.
|
||||
short = with_forced_trimmed_paths!({
|
||||
let mut p = FmtPrinter::new_with_limit(
|
||||
self,
|
||||
hir::def::Namespace::TypeNS,
|
||||
rustc_session::Limit(type_limit),
|
||||
);
|
||||
let mut p = FmtPrinter::new_with_limit(self, ns, rustc_session::Limit(type_limit));
|
||||
self.lift(t)
|
||||
.expect("could not lift for printing")
|
||||
.print(&mut p)
|
||||
@ -251,12 +251,28 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||
/// When calling this after a `Diag` is constructed, the preferred way of doing so is
|
||||
/// `tcx.short_string(ty, diag.long_ty_path())`. The diagnostic itself is the one that keeps
|
||||
/// the existence of a "long type" anywhere in the diagnostic, so the note telling the user
|
||||
/// where we wrote the file to is only printed once.
|
||||
/// where we wrote the file to is only printed once. The path will use the type namespace.
|
||||
pub fn short_string<T>(self, t: T, path: &mut Option<PathBuf>) -> String
|
||||
where
|
||||
T: Copy + Hash + for<'a, 'b> Lift<TyCtxt<'b>, Lifted: Print<'b, FmtPrinter<'a, 'b>>>,
|
||||
{
|
||||
let regular = FmtPrinter::print_string(self, hir::def::Namespace::TypeNS, |p| {
|
||||
self.short_string_namespace(t, path, hir::def::Namespace::TypeNS)
|
||||
}
|
||||
|
||||
/// When calling this after a `Diag` is constructed, the preferred way of doing so is
|
||||
/// `tcx.short_string(ty, diag.long_ty_path())`. The diagnostic itself is the one that keeps
|
||||
/// the existence of a "long type" anywhere in the diagnostic, so the note telling the user
|
||||
/// where we wrote the file to is only printed once.
|
||||
pub fn short_string_namespace<T>(
|
||||
self,
|
||||
t: T,
|
||||
path: &mut Option<PathBuf>,
|
||||
namespace: hir::def::Namespace,
|
||||
) -> String
|
||||
where
|
||||
T: Copy + Hash + for<'a, 'b> Lift<TyCtxt<'b>, Lifted: Print<'b, FmtPrinter<'a, 'b>>>,
|
||||
{
|
||||
let regular = FmtPrinter::print_string(self, namespace, |p| {
|
||||
self.lift(t).expect("could not lift for printing").print(p)
|
||||
})
|
||||
.expect("could not write to `String`");
|
||||
@ -270,7 +286,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||
if regular.len() <= width * 2 / 3 {
|
||||
return regular;
|
||||
}
|
||||
let short = self.string_with_limit(t, length_limit);
|
||||
let short = self.string_with_limit(t, length_limit, namespace);
|
||||
if regular == short {
|
||||
return regular;
|
||||
}
|
||||
|
@ -1,6 +1,5 @@
|
||||
use std::assert_matches::assert_matches;
|
||||
use std::fmt;
|
||||
use std::path::PathBuf;
|
||||
|
||||
use rustc_data_structures::fx::FxHashMap;
|
||||
use rustc_errors::ErrorGuaranteed;
|
||||
@ -17,7 +16,7 @@ use tracing::{debug, instrument};
|
||||
use crate::error;
|
||||
use crate::middle::codegen_fn_attrs::CodegenFnAttrFlags;
|
||||
use crate::ty::normalize_erasing_regions::NormalizationError;
|
||||
use crate::ty::print::{FmtPrinter, Printer, shrunk_instance_name};
|
||||
use crate::ty::print::{FmtPrinter, Print};
|
||||
use crate::ty::{
|
||||
self, EarlyBinder, GenericArgs, GenericArgsRef, Ty, TyCtxt, TypeFoldable, TypeSuperVisitable,
|
||||
TypeVisitable, TypeVisitableExt, TypeVisitor,
|
||||
@ -389,59 +388,15 @@ fn type_length<'tcx>(item: impl TypeVisitable<TyCtxt<'tcx>>) -> usize {
|
||||
visitor.type_length
|
||||
}
|
||||
|
||||
pub fn fmt_instance(
|
||||
f: &mut fmt::Formatter<'_>,
|
||||
instance: Instance<'_>,
|
||||
type_length: Option<rustc_session::Limit>,
|
||||
) -> fmt::Result {
|
||||
ty::tls::with(|tcx| {
|
||||
let args = tcx.lift(instance.args).expect("could not lift for printing");
|
||||
|
||||
let mut p = if let Some(type_length) = type_length {
|
||||
FmtPrinter::new_with_limit(tcx, Namespace::ValueNS, type_length)
|
||||
} else {
|
||||
FmtPrinter::new(tcx, Namespace::ValueNS)
|
||||
};
|
||||
p.print_def_path(instance.def_id(), args)?;
|
||||
let s = p.into_buffer();
|
||||
f.write_str(&s)
|
||||
})?;
|
||||
|
||||
match instance.def {
|
||||
InstanceKind::Item(_) => Ok(()),
|
||||
InstanceKind::VTableShim(_) => write!(f, " - shim(vtable)"),
|
||||
InstanceKind::ReifyShim(_, None) => write!(f, " - shim(reify)"),
|
||||
InstanceKind::ReifyShim(_, Some(ReifyReason::FnPtr)) => write!(f, " - shim(reify-fnptr)"),
|
||||
InstanceKind::ReifyShim(_, Some(ReifyReason::Vtable)) => write!(f, " - shim(reify-vtable)"),
|
||||
InstanceKind::ThreadLocalShim(_) => write!(f, " - shim(tls)"),
|
||||
InstanceKind::Intrinsic(_) => write!(f, " - intrinsic"),
|
||||
InstanceKind::Virtual(_, num) => write!(f, " - virtual#{num}"),
|
||||
InstanceKind::FnPtrShim(_, ty) => write!(f, " - shim({ty})"),
|
||||
InstanceKind::ClosureOnceShim { .. } => write!(f, " - shim"),
|
||||
InstanceKind::ConstructCoroutineInClosureShim { .. } => write!(f, " - shim"),
|
||||
InstanceKind::DropGlue(_, None) => write!(f, " - shim(None)"),
|
||||
InstanceKind::DropGlue(_, Some(ty)) => write!(f, " - shim(Some({ty}))"),
|
||||
InstanceKind::CloneShim(_, ty) => write!(f, " - shim({ty})"),
|
||||
InstanceKind::FnPtrAddrShim(_, ty) => write!(f, " - shim({ty})"),
|
||||
InstanceKind::FutureDropPollShim(_, proxy_ty, impl_ty) => {
|
||||
write!(f, " - dropshim({proxy_ty}-{impl_ty})")
|
||||
}
|
||||
InstanceKind::AsyncDropGlue(_, ty) => write!(f, " - shim({ty})"),
|
||||
InstanceKind::AsyncDropGlueCtorShim(_, ty) => write!(f, " - shim(Some({ty}))"),
|
||||
}
|
||||
}
|
||||
|
||||
pub struct ShortInstance<'tcx>(pub Instance<'tcx>, pub usize);
|
||||
|
||||
impl<'tcx> fmt::Display for ShortInstance<'tcx> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
fmt_instance(f, self.0, Some(rustc_session::Limit(self.1)))
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> fmt::Display for Instance<'tcx> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
fmt_instance(f, *self, None)
|
||||
ty::tls::with(|tcx| {
|
||||
let mut p = FmtPrinter::new(tcx, Namespace::ValueNS);
|
||||
let instance = tcx.lift(*self).expect("could not lift for printing");
|
||||
instance.print(&mut p)?;
|
||||
let s = p.into_buffer();
|
||||
f.write_str(&s)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@ -610,23 +565,12 @@ impl<'tcx> Instance<'tcx> {
|
||||
Ok(None) => {
|
||||
let type_length = type_length(args);
|
||||
if !tcx.type_length_limit().value_within_limit(type_length) {
|
||||
let (shrunk, written_to_path) =
|
||||
shrunk_instance_name(tcx, Instance::new_raw(def_id, args));
|
||||
let mut path = PathBuf::new();
|
||||
let was_written = if let Some(path2) = written_to_path {
|
||||
path = path2;
|
||||
true
|
||||
} else {
|
||||
false
|
||||
};
|
||||
tcx.dcx().emit_fatal(error::TypeLengthLimit {
|
||||
// We don't use `def_span(def_id)` so that diagnostics point
|
||||
// to the crate root during mono instead of to foreign items.
|
||||
// This is arguably better.
|
||||
span: span_or_local_def_span(),
|
||||
shrunk,
|
||||
was_written,
|
||||
path,
|
||||
instance: Instance::new_raw(def_id, args),
|
||||
type_length,
|
||||
});
|
||||
} else {
|
||||
|
@ -82,7 +82,7 @@ pub use self::context::{
|
||||
TyCtxtFeed, tls,
|
||||
};
|
||||
pub use self::fold::*;
|
||||
pub use self::instance::{Instance, InstanceKind, ReifyReason, ShortInstance, UnusedGenericParams};
|
||||
pub use self::instance::{Instance, InstanceKind, ReifyReason, UnusedGenericParams};
|
||||
pub use self::list::{List, ListWithCachedTypeInfo};
|
||||
pub use self::opaque_types::OpaqueTypeKey;
|
||||
pub use self::pattern::{Pattern, PatternKind};
|
||||
|
@ -1,5 +1,3 @@
|
||||
use std::path::PathBuf;
|
||||
|
||||
use hir::def::Namespace;
|
||||
use rustc_data_structures::fx::FxHashSet;
|
||||
use rustc_data_structures::sso::SsoHashSet;
|
||||
@ -8,7 +6,7 @@ use rustc_hir::def_id::{CrateNum, DefId, LocalDefId};
|
||||
use rustc_hir::definitions::{DefPathData, DisambiguatedDefPathData};
|
||||
use tracing::{debug, instrument, trace};
|
||||
|
||||
use crate::ty::{self, GenericArg, ShortInstance, Ty, TyCtxt};
|
||||
use crate::ty::{self, GenericArg, Ty, TyCtxt};
|
||||
|
||||
// `pretty` is a separate module only for organization.
|
||||
mod pretty;
|
||||
@ -317,6 +315,43 @@ impl<'tcx, P: Printer<'tcx>> Print<'tcx, P> for Ty<'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx, P: Printer<'tcx> + std::fmt::Write> Print<'tcx, P> for ty::Instance<'tcx> {
|
||||
fn print(&self, cx: &mut P) -> Result<(), PrintError> {
|
||||
cx.print_def_path(self.def_id(), self.args)?;
|
||||
match self.def {
|
||||
ty::InstanceKind::Item(_) => {}
|
||||
ty::InstanceKind::VTableShim(_) => cx.write_str(" - shim(vtable)")?,
|
||||
ty::InstanceKind::ReifyShim(_, None) => cx.write_str(" - shim(reify)")?,
|
||||
ty::InstanceKind::ReifyShim(_, Some(ty::ReifyReason::FnPtr)) => {
|
||||
cx.write_str(" - shim(reify-fnptr)")?
|
||||
}
|
||||
ty::InstanceKind::ReifyShim(_, Some(ty::ReifyReason::Vtable)) => {
|
||||
cx.write_str(" - shim(reify-vtable)")?
|
||||
}
|
||||
ty::InstanceKind::ThreadLocalShim(_) => cx.write_str(" - shim(tls)")?,
|
||||
ty::InstanceKind::Intrinsic(_) => cx.write_str(" - intrinsic")?,
|
||||
ty::InstanceKind::Virtual(_, num) => cx.write_str(&format!(" - virtual#{num}"))?,
|
||||
ty::InstanceKind::FnPtrShim(_, ty) => cx.write_str(&format!(" - shim({ty})"))?,
|
||||
ty::InstanceKind::ClosureOnceShim { .. } => cx.write_str(" - shim")?,
|
||||
ty::InstanceKind::ConstructCoroutineInClosureShim { .. } => cx.write_str(" - shim")?,
|
||||
ty::InstanceKind::DropGlue(_, None) => cx.write_str(" - shim(None)")?,
|
||||
ty::InstanceKind::DropGlue(_, Some(ty)) => {
|
||||
cx.write_str(&format!(" - shim(Some({ty}))"))?
|
||||
}
|
||||
ty::InstanceKind::CloneShim(_, ty) => cx.write_str(&format!(" - shim({ty})"))?,
|
||||
ty::InstanceKind::FnPtrAddrShim(_, ty) => cx.write_str(&format!(" - shim({ty})"))?,
|
||||
ty::InstanceKind::FutureDropPollShim(_, proxy_ty, impl_ty) => {
|
||||
cx.write_str(&format!(" - dropshim({proxy_ty}-{impl_ty})"))?
|
||||
}
|
||||
ty::InstanceKind::AsyncDropGlue(_, ty) => cx.write_str(&format!(" - shim({ty})"))?,
|
||||
ty::InstanceKind::AsyncDropGlueCtorShim(_, ty) => {
|
||||
cx.write_str(&format!(" - shim(Some({ty}))"))?
|
||||
}
|
||||
};
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx, P: Printer<'tcx>> Print<'tcx, P> for &'tcx ty::List<ty::PolyExistentialPredicate<'tcx>> {
|
||||
fn print(&self, p: &mut P) -> Result<(), PrintError> {
|
||||
p.print_dyn_existential(self)
|
||||
@ -356,31 +391,3 @@ where
|
||||
with_no_trimmed_paths!(Self::print(t, fmt))
|
||||
}
|
||||
}
|
||||
|
||||
/// Format instance name that is already known to be too long for rustc.
|
||||
/// Show only the first 2 types if it is longer than 32 characters to avoid blasting
|
||||
/// the user's terminal with thousands of lines of type-name.
|
||||
///
|
||||
/// If the type name is longer than before+after, it will be written to a file.
|
||||
pub fn shrunk_instance_name<'tcx>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
instance: ty::Instance<'tcx>,
|
||||
) -> (String, Option<PathBuf>) {
|
||||
let s = instance.to_string();
|
||||
|
||||
// Only use the shrunk version if it's really shorter.
|
||||
// This also avoids the case where before and after slices overlap.
|
||||
if s.chars().nth(33).is_some() {
|
||||
let shrunk = format!("{}", ShortInstance(instance, 4));
|
||||
if shrunk == s {
|
||||
return (s, None);
|
||||
}
|
||||
|
||||
let path = tcx.output_filenames(()).temp_path_for_diagnostic("long-type.txt");
|
||||
let written_to_path = std::fs::write(&path, s).ok().map(|_| path);
|
||||
|
||||
(shrunk, written_to_path)
|
||||
} else {
|
||||
(s, None)
|
||||
}
|
||||
}
|
||||
|
@ -40,7 +40,10 @@ monomorphize_couldnt_dump_mono_stats =
|
||||
unexpected error occurred while dumping monomorphization stats: {$error}
|
||||
|
||||
monomorphize_encountered_error_while_instantiating =
|
||||
the above error was encountered while instantiating `{$formatted_item}`
|
||||
the above error was encountered while instantiating `{$kind} {$instance}`
|
||||
|
||||
monomorphize_encountered_error_while_instantiating_global_asm =
|
||||
the above error was encountered while instantiating `global_asm`
|
||||
|
||||
monomorphize_large_assignments =
|
||||
moving {$size} bytes
|
||||
@ -52,12 +55,10 @@ monomorphize_no_optimized_mir =
|
||||
.note = missing optimized MIR for this item (was the crate `{$crate_name}` compiled with `--emit=metadata`?)
|
||||
|
||||
monomorphize_recursion_limit =
|
||||
reached the recursion limit while instantiating `{$shrunk}`
|
||||
reached the recursion limit while instantiating `{$instance}`
|
||||
.note = `{$def_path_str}` defined here
|
||||
|
||||
monomorphize_start_not_found = using `fn main` requires the standard library
|
||||
.help = use `#![no_main]` to bypass the Rust generated entrypoint and declare a platform specific entrypoint yourself, usually with `#[no_mangle]`
|
||||
|
||||
monomorphize_symbol_already_defined = symbol `{$symbol}` is already defined
|
||||
|
||||
monomorphize_written_to_path = the full type name has been written to '{$path}'
|
||||
|
@ -206,7 +206,6 @@
|
||||
//! regardless of whether it is actually needed or not.
|
||||
|
||||
use std::cell::OnceCell;
|
||||
use std::path::PathBuf;
|
||||
|
||||
use rustc_data_structures::fx::FxIndexMap;
|
||||
use rustc_data_structures::sync::{MTLock, par_for_each_in};
|
||||
@ -224,7 +223,6 @@ use rustc_middle::mir::{self, Location, MentionedItem, traversal};
|
||||
use rustc_middle::query::TyCtxtAt;
|
||||
use rustc_middle::ty::adjustment::{CustomCoerceUnsized, PointerCoercion};
|
||||
use rustc_middle::ty::layout::ValidityRequirement;
|
||||
use rustc_middle::ty::print::{shrunk_instance_name, with_no_trimmed_paths};
|
||||
use rustc_middle::ty::{
|
||||
self, GenericArgs, GenericParamDefKind, Instance, InstanceKind, Ty, TyCtxt, TypeFoldable,
|
||||
TypeVisitableExt, VtblEntry,
|
||||
@ -237,7 +235,10 @@ use rustc_span::source_map::{Spanned, dummy_spanned, respan};
|
||||
use rustc_span::{DUMMY_SP, Span};
|
||||
use tracing::{debug, instrument, trace};
|
||||
|
||||
use crate::errors::{self, EncounteredErrorWhileInstantiating, NoOptimizedMir, RecursionLimit};
|
||||
use crate::errors::{
|
||||
self, EncounteredErrorWhileInstantiating, EncounteredErrorWhileInstantiatingGlobalAsm,
|
||||
NoOptimizedMir, RecursionLimit,
|
||||
};
|
||||
|
||||
#[derive(PartialEq)]
|
||||
pub(crate) enum MonoItemCollectionStrategy {
|
||||
@ -525,11 +526,23 @@ fn collect_items_rec<'tcx>(
|
||||
&& starting_item.node.is_generic_fn()
|
||||
&& starting_item.node.is_user_defined()
|
||||
{
|
||||
let formatted_item = with_no_trimmed_paths!(starting_item.node.to_string());
|
||||
tcx.dcx().emit_note(EncounteredErrorWhileInstantiating {
|
||||
span: starting_item.span,
|
||||
formatted_item,
|
||||
});
|
||||
match starting_item.node {
|
||||
MonoItem::Fn(instance) => tcx.dcx().emit_note(EncounteredErrorWhileInstantiating {
|
||||
span: starting_item.span,
|
||||
kind: "fn",
|
||||
instance,
|
||||
}),
|
||||
MonoItem::Static(def_id) => tcx.dcx().emit_note(EncounteredErrorWhileInstantiating {
|
||||
span: starting_item.span,
|
||||
kind: "static",
|
||||
instance: Instance::new_raw(def_id, GenericArgs::empty()),
|
||||
}),
|
||||
MonoItem::GlobalAsm(_) => {
|
||||
tcx.dcx().emit_note(EncounteredErrorWhileInstantiatingGlobalAsm {
|
||||
span: starting_item.span,
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
// Only updating `usage_map` for used items as otherwise we may be inserting the same item
|
||||
// multiple times (if it is first 'mentioned' and then later actually used), and the usage map
|
||||
@ -612,22 +625,7 @@ fn check_recursion_limit<'tcx>(
|
||||
if !recursion_limit.value_within_limit(adjusted_recursion_depth) {
|
||||
let def_span = tcx.def_span(def_id);
|
||||
let def_path_str = tcx.def_path_str(def_id);
|
||||
let (shrunk, written_to_path) = shrunk_instance_name(tcx, instance);
|
||||
let mut path = PathBuf::new();
|
||||
let was_written = if let Some(written_to_path) = written_to_path {
|
||||
path = written_to_path;
|
||||
true
|
||||
} else {
|
||||
false
|
||||
};
|
||||
tcx.dcx().emit_fatal(RecursionLimit {
|
||||
span,
|
||||
shrunk,
|
||||
def_span,
|
||||
def_path_str,
|
||||
was_written,
|
||||
path,
|
||||
});
|
||||
tcx.dcx().emit_fatal(RecursionLimit { span, instance, def_span, def_path_str });
|
||||
}
|
||||
|
||||
recursion_depths.insert(def_id, recursion_depth + 1);
|
||||
|
@ -1,21 +1,16 @@
|
||||
use std::path::PathBuf;
|
||||
|
||||
use rustc_macros::{Diagnostic, LintDiagnostic};
|
||||
use rustc_middle::ty::Ty;
|
||||
use rustc_middle::ty::{Instance, Ty};
|
||||
use rustc_span::{Span, Symbol};
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(monomorphize_recursion_limit)]
|
||||
pub(crate) struct RecursionLimit {
|
||||
pub(crate) struct RecursionLimit<'tcx> {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
pub shrunk: String,
|
||||
pub instance: Instance<'tcx>,
|
||||
#[note]
|
||||
pub def_span: Span,
|
||||
pub def_path_str: String,
|
||||
#[note(monomorphize_written_to_path)]
|
||||
pub was_written: bool,
|
||||
pub path: PathBuf,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
@ -53,10 +48,18 @@ pub(crate) struct CouldntDumpMonoStats {
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(monomorphize_encountered_error_while_instantiating)]
|
||||
pub(crate) struct EncounteredErrorWhileInstantiating {
|
||||
pub(crate) struct EncounteredErrorWhileInstantiating<'tcx> {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
pub kind: &'static str,
|
||||
pub instance: Instance<'tcx>,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(monomorphize_encountered_error_while_instantiating_global_asm)]
|
||||
pub(crate) struct EncounteredErrorWhileInstantiatingGlobalAsm {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
pub formatted_item: String,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
|
@ -12,7 +12,7 @@ LL | static_assert_imm1!(IMM1);
|
||||
|
|
||||
= note: this note originates in the macro `static_assert_imm1` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
note: the above error was encountered while instantiating `fn post_monomorphization_error::stdarch_intrinsic::<2>`
|
||||
note: the above error was encountered while instantiating `fn stdarch_intrinsic::<2>`
|
||||
--> $DIR/issue-85155.rs:19:5
|
||||
|
|
||||
LL | post_monomorphization_error::stdarch_intrinsic::<2>();
|
||||
|
@ -10,7 +10,7 @@ note: erroneous constant encountered
|
||||
LL | let _ = Fail::<T>::C;
|
||||
| ^^^^^^^^^^^^
|
||||
|
||||
note: the above error was encountered while instantiating `fn <Fail<i32> as std::ops::Drop>::drop`
|
||||
note: the above error was encountered while instantiating `fn <Fail<i32> as Drop>::drop`
|
||||
--> $SRC_DIR/core/src/ptr/mod.rs:LL:COL
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
@ -10,7 +10,7 @@ note: erroneous constant encountered
|
||||
LL | let _ = Fail::<T>::C;
|
||||
| ^^^^^^^^^^^^
|
||||
|
||||
note: the above error was encountered while instantiating `fn <Fail<i32> as std::ops::Drop>::drop`
|
||||
note: the above error was encountered while instantiating `fn <Fail<i32> as Drop>::drop`
|
||||
--> $SRC_DIR/core/src/ptr/mod.rs:LL:COL
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
@ -10,7 +10,7 @@ note: erroneous constant encountered
|
||||
LL | let _ = Fail::<T>::C;
|
||||
| ^^^^^^^^^^^^
|
||||
|
||||
note: the above error was encountered while instantiating `fn m::not_called::<i32>`
|
||||
note: the above error was encountered while instantiating `fn not_called::<i32>`
|
||||
--> $SRC_DIR/core/src/ops/function.rs:LL:COL
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
@ -10,7 +10,7 @@ note: erroneous constant encountered
|
||||
LL | let _ = Fail::<T>::C;
|
||||
| ^^^^^^^^^^^^
|
||||
|
||||
note: the above error was encountered while instantiating `fn m::not_called::<i32>`
|
||||
note: the above error was encountered while instantiating `fn not_called::<i32>`
|
||||
--> $SRC_DIR/core/src/ops/function.rs:LL:COL
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
@ -10,7 +10,7 @@ note: erroneous constant encountered
|
||||
LL | let _ = Fail::<T>::C;
|
||||
| ^^^^^^^^^^^^
|
||||
|
||||
note: the above error was encountered while instantiating `fn <Fail<i32> as std::ops::Drop>::drop`
|
||||
note: the above error was encountered while instantiating `fn <Fail<i32> as Drop>::drop`
|
||||
--> $SRC_DIR/core/src/ptr/mod.rs:LL:COL
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
@ -10,7 +10,7 @@ note: erroneous constant encountered
|
||||
LL | let _ = Fail::<T>::C;
|
||||
| ^^^^^^^^^^^^
|
||||
|
||||
note: the above error was encountered while instantiating `fn <Fail<i32> as std::ops::Drop>::drop`
|
||||
note: the above error was encountered while instantiating `fn <Fail<i32> as Drop>::drop`
|
||||
--> $SRC_DIR/core/src/ptr/mod.rs:LL:COL
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
@ -10,7 +10,7 @@ note: erroneous constant encountered
|
||||
LL | let _ = Fail::<T>::C;
|
||||
| ^^^^^^^^^^^^
|
||||
|
||||
note: the above error was encountered while instantiating `fn <std::vec::Vec<i32> as MyTrait>::not_called`
|
||||
note: the above error was encountered while instantiating `fn <Vec<i32> as MyTrait>::not_called`
|
||||
--> $DIR/collect-in-dead-vtable.rs:31:40
|
||||
|
|
||||
LL | let gen_vtable: &dyn MyTrait = &v; // vtable is "mentioned" here
|
||||
|
@ -10,7 +10,7 @@ note: erroneous constant encountered
|
||||
LL | let _ = Fail::<T>::C;
|
||||
| ^^^^^^^^^^^^
|
||||
|
||||
note: the above error was encountered while instantiating `fn <std::vec::Vec<i32> as MyTrait>::not_called`
|
||||
note: the above error was encountered while instantiating `fn <Vec<i32> as MyTrait>::not_called`
|
||||
--> $DIR/collect-in-dead-vtable.rs:31:40
|
||||
|
|
||||
LL | let gen_vtable: &dyn MyTrait = &v; // vtable is "mentioned" here
|
||||
|
@ -1,5 +1,6 @@
|
||||
//~ ERROR reached the recursion limit while instantiating `<VirtualWrapper<VirtualWrapper<VirtualWrapper
|
||||
//~ ERROR reached the recursion limit while instantiating `<VirtualWrapper<
|
||||
//@ build-fail
|
||||
//@ compile-flags: --diagnostic-width=100 -Zwrite-long-types-to-disk=yes
|
||||
|
||||
// Regression test for #114484: This used to ICE during monomorphization, because we treated
|
||||
// `<VirtualWrapper<...> as Pointee>::Metadata` as a rigid projection after reaching the recursion
|
||||
|
@ -17,11 +17,14 @@ error: reached the recursion limit finding the struct tail for `[u8; 256]`
|
||||
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]`
|
||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||
|
||||
note: the above error was encountered while instantiating `fn virtualize_my_trait::<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<SomeData<256>, 0>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>>`
|
||||
--> $DIR/infinite-instantiation-struct-tail-ice-114484.rs:24:18
|
||||
note: the above error was encountered while instantiating `fn virtualize_my_trait::<VirtualWrapper<..., 1>>`
|
||||
--> $DIR/infinite-instantiation-struct-tail-ice-114484.rs:25:18
|
||||
|
|
||||
LL | unsafe { virtualize_my_trait(L, self) }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: the full name for the type has been written to '$TEST_BUILD_DIR/infinite-instantiation-struct-tail-ice-114484.long-type-$LONG_TYPE_HASH.txt'
|
||||
= note: consider using `--verbose` to print the full type name to the console
|
||||
|
||||
error: reached the recursion limit finding the struct tail for `SomeData<256>`
|
||||
|
|
||||
@ -42,11 +45,14 @@ error: reached the recursion limit finding the struct tail for `SomeData<256>`
|
||||
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]`
|
||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||
|
||||
note: the above error was encountered while instantiating `fn virtualize_my_trait::<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<SomeData<256>, 0>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>>`
|
||||
--> $DIR/infinite-instantiation-struct-tail-ice-114484.rs:24:18
|
||||
note: the above error was encountered while instantiating `fn virtualize_my_trait::<VirtualWrapper<..., 1>>`
|
||||
--> $DIR/infinite-instantiation-struct-tail-ice-114484.rs:25:18
|
||||
|
|
||||
LL | unsafe { virtualize_my_trait(L, self) }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: the full name for the type has been written to '$TEST_BUILD_DIR/infinite-instantiation-struct-tail-ice-114484.long-type-$LONG_TYPE_HASH.txt'
|
||||
= note: consider using `--verbose` to print the full type name to the console
|
||||
|
||||
error: reached the recursion limit finding the struct tail for `VirtualWrapper<SomeData<256>, 0>`
|
||||
|
|
||||
@ -67,20 +73,24 @@ error: reached the recursion limit finding the struct tail for `VirtualWrapper<S
|
||||
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]`
|
||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||
|
||||
note: the above error was encountered while instantiating `fn virtualize_my_trait::<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<SomeData<256>, 0>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>, 1>>`
|
||||
--> $DIR/infinite-instantiation-struct-tail-ice-114484.rs:24:18
|
||||
note: the above error was encountered while instantiating `fn virtualize_my_trait::<VirtualWrapper<..., 1>>`
|
||||
--> $DIR/infinite-instantiation-struct-tail-ice-114484.rs:25:18
|
||||
|
|
||||
LL | unsafe { virtualize_my_trait(L, self) }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: the full name for the type has been written to '$TEST_BUILD_DIR/infinite-instantiation-struct-tail-ice-114484.long-type-$LONG_TYPE_HASH.txt'
|
||||
= note: consider using `--verbose` to print the full type name to the console
|
||||
|
||||
error: reached the recursion limit while instantiating `<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<VirtualWrapper<..., 1>, 1>, 1>, 1>, 1> as MyTrait>::virtualize`
|
||||
error: reached the recursion limit while instantiating `<VirtualWrapper<..., 1> as MyTrait>::virtualize`
|
||||
|
|
||||
note: `<VirtualWrapper<T, L> as MyTrait>::virtualize` defined here
|
||||
--> $DIR/infinite-instantiation-struct-tail-ice-114484.rs:23:5
|
||||
--> $DIR/infinite-instantiation-struct-tail-ice-114484.rs:24:5
|
||||
|
|
||||
LL | fn virtualize(&self) -> &dyn MyTrait {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
= note: the full type name has been written to '$TEST_BUILD_DIR/infinite-instantiation-struct-tail-ice-114484.long-type.txt'
|
||||
= note: the full name for the type has been written to '$TEST_BUILD_DIR/infinite-instantiation-struct-tail-ice-114484.long-type-$LONG_TYPE_HASH.txt'
|
||||
= note: consider using `--verbose` to print the full type name to the console
|
||||
|
||||
error: aborting due to 13 previous errors
|
||||
|
||||
|
@ -1,4 +1,5 @@
|
||||
//@ build-fail
|
||||
//@ compile-flags: --diagnostic-width=100 -Zwrite-long-types-to-disk=yes
|
||||
|
||||
trait ToOpt: Sized {
|
||||
fn to_option(&self) -> Option<Self>;
|
||||
|
@ -1,15 +1,16 @@
|
||||
error: reached the recursion limit while instantiating `function::<Option<Option<Option<Option<Option<...>>>>>>`
|
||||
--> $DIR/infinite-instantiation.rs:21:9
|
||||
error: reached the recursion limit while instantiating `function::<Option<Option<Option<Option<...>>>>>`
|
||||
--> $DIR/infinite-instantiation.rs:22:9
|
||||
|
|
||||
LL | function(counter - 1, t.to_option());
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: `function` defined here
|
||||
--> $DIR/infinite-instantiation.rs:19:1
|
||||
--> $DIR/infinite-instantiation.rs:20:1
|
||||
|
|
||||
LL | fn function<T:ToOpt + Clone>(counter: usize, t: T) {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
= note: the full type name has been written to '$TEST_BUILD_DIR/infinite-instantiation.long-type.txt'
|
||||
= note: the full name for the type has been written to '$TEST_BUILD_DIR/infinite-instantiation.long-type-$LONG_TYPE_HASH.txt'
|
||||
= note: consider using `--verbose` to print the full type name to the console
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
|
@ -1,4 +1,5 @@
|
||||
//@ build-fail
|
||||
//@ compile-flags: --diagnostic-width=100 -Zwrite-long-types-to-disk=yes
|
||||
|
||||
trait Mirror {
|
||||
type Image;
|
||||
|
@ -1,15 +1,16 @@
|
||||
error: reached the recursion limit while instantiating `<(&(&(..., ...), ...), ...) as Foo>::recurse`
|
||||
--> $DIR/issue-37311.rs:16:9
|
||||
error: reached the recursion limit while instantiating `<(&(&(&..., ...), ...), ...) as Foo>::recurse`
|
||||
--> $DIR/issue-37311.rs:17:9
|
||||
|
|
||||
LL | (self, self).recurse();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: `<T as Foo>::recurse` defined here
|
||||
--> $DIR/issue-37311.rs:15:5
|
||||
--> $DIR/issue-37311.rs:16:5
|
||||
|
|
||||
LL | fn recurse(&self) {
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
= note: the full type name has been written to '$TEST_BUILD_DIR/issue-37311.long-type.txt'
|
||||
= note: the full name for the type has been written to '$TEST_BUILD_DIR/issue-37311.long-type-$LONG_TYPE_HASH.txt'
|
||||
= note: consider using `--verbose` to print the full type name to the console
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
|
@ -2,6 +2,7 @@
|
||||
// recursions.
|
||||
|
||||
//@ build-fail
|
||||
//@ compile-flags: --diagnostic-width=100 -Zwrite-long-types-to-disk=yes
|
||||
|
||||
fn generic<T>() { //~ WARN function cannot return without recursing
|
||||
generic::<Option<T>>();
|
||||
|
@ -1,5 +1,5 @@
|
||||
warning: function cannot return without recursing
|
||||
--> $DIR/issue-8727.rs:6:1
|
||||
--> $DIR/issue-8727.rs:7:1
|
||||
|
|
||||
LL | fn generic<T>() {
|
||||
| ^^^^^^^^^^^^^^^ cannot return without recursing
|
||||
@ -9,18 +9,19 @@ LL | generic::<Option<T>>();
|
||||
= help: a `loop` may express intention better if this is on purpose
|
||||
= note: `#[warn(unconditional_recursion)]` on by default
|
||||
|
||||
error: reached the recursion limit while instantiating `generic::<Option<Option<Option<Option<Option<...>>>>>>`
|
||||
--> $DIR/issue-8727.rs:7:5
|
||||
error: reached the recursion limit while instantiating `generic::<Option<Option<Option<Option<...>>>>>`
|
||||
--> $DIR/issue-8727.rs:8:5
|
||||
|
|
||||
LL | generic::<Option<T>>();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: `generic` defined here
|
||||
--> $DIR/issue-8727.rs:6:1
|
||||
--> $DIR/issue-8727.rs:7:1
|
||||
|
|
||||
LL | fn generic<T>() {
|
||||
| ^^^^^^^^^^^^^^^
|
||||
= note: the full type name has been written to '$TEST_BUILD_DIR/issue-8727.long-type.txt'
|
||||
= note: the full name for the type has been written to '$TEST_BUILD_DIR/issue-8727.long-type-$LONG_TYPE_HASH.txt'
|
||||
= note: consider using `--verbose` to print the full type name to the console
|
||||
|
||||
error: aborting due to 1 previous error; 1 warning emitted
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
//! Checks the enforcement of the type-length limit
|
||||
//! and its configurability via `#![type_length_limit]`.
|
||||
|
||||
//@ compile-flags: -Copt-level=0 -Zenforce-type-length-limit
|
||||
//@ compile-flags: -Copt-level=0 -Zenforce-type-length-limit --diagnostic-width=100 -Zwrite-long-types-to-disk=yes
|
||||
|
||||
//@ build-fail
|
||||
|
||||
|
@ -1,11 +1,12 @@
|
||||
error: reached the type-length limit while instantiating `std::mem::drop::<Option<((((..., ..., ...), ..., ...), ..., ...), ..., ...)>>`
|
||||
error: reached the type-length limit while instantiating `drop::<Option<((..., ..., ...), ..., ...)>>`
|
||||
--> $DIR/type-length-limit-enforcement.rs:34:5
|
||||
|
|
||||
LL | drop::<Option<A>>(None);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: consider adding a `#![type_length_limit="4010"]` attribute to your crate
|
||||
= note: the full type name has been written to '$TEST_BUILD_DIR/type-length-limit-enforcement.long-type.txt'
|
||||
= note: the full name for the type has been written to '$TEST_BUILD_DIR/type-length-limit-enforcement.long-type-$LONG_TYPE_HASH.txt'
|
||||
= note: consider using `--verbose` to print the full type name to the console
|
||||
|
||||
error: reached the type-length limit while instantiating `<{closure@rt::lang_start<()>::{closure#0}} as FnMut<()>>::call_mut`
|
||||
|
|
||||
|
@ -1,5 +1,5 @@
|
||||
//@ build-fail
|
||||
//@ compile-flags:-C overflow-checks=off
|
||||
//@ compile-flags:-C overflow-checks=off --diagnostic-width=100 -Zwrite-long-types-to-disk=yes
|
||||
|
||||
enum Nil {NilValue}
|
||||
struct Cons<T> {head:isize, tail:T}
|
||||
|
@ -1,4 +1,4 @@
|
||||
error: reached the recursion limit while instantiating `test::<Cons<Cons<Cons<Cons<Cons<...>>>>>>`
|
||||
error: reached the recursion limit while instantiating `test::<Cons<Cons<Cons<Cons<Cons<Cons<...>>>>>>>`
|
||||
--> $DIR/recursion.rs:17:11
|
||||
|
|
||||
LL | _ => {test (n-1, i+1, Cons {head:2*i+1, tail:first}, Cons{head:i*i, tail:second})}
|
||||
@ -9,7 +9,8 @@ note: `test` defined here
|
||||
|
|
||||
LL | fn test<T:Dot> (n:isize, i:isize, first:T, second:T) ->isize {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
= note: the full type name has been written to '$TEST_BUILD_DIR/recursion.long-type.txt'
|
||||
= note: the full name for the type has been written to '$TEST_BUILD_DIR/recursion.long-type-$LONG_TYPE_HASH.txt'
|
||||
= note: consider using `--verbose` to print the full type name to the console
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
//@ build-fail
|
||||
//@ compile-flags: -Copt-level=0
|
||||
//@ compile-flags: -Copt-level=0 --diagnostic-width=100 -Zwrite-long-types-to-disk=yes
|
||||
|
||||
fn main() {
|
||||
rec(Empty);
|
||||
|
@ -1,4 +1,4 @@
|
||||
error: reached the recursion limit while instantiating `rec::<&mut &mut &mut &mut &mut ...>`
|
||||
error: reached the recursion limit while instantiating `rec::<&mut &mut &mut &mut &mut &mut &mut &mut ...>`
|
||||
--> $DIR/recursive-impl-trait-iterator-by-ref-67552.rs:28:9
|
||||
|
|
||||
LL | rec(identity(&mut it))
|
||||
@ -11,7 +11,8 @@ LL | / fn rec<T>(mut it: T)
|
||||
LL | | where
|
||||
LL | | T: Iterator,
|
||||
| |________________^
|
||||
= note: the full type name has been written to '$TEST_BUILD_DIR/recursive-impl-trait-iterator-by-ref-67552.long-type.txt'
|
||||
= note: the full name for the type has been written to '$TEST_BUILD_DIR/recursive-impl-trait-iterator-by-ref-67552.long-type-$LONG_TYPE_HASH.txt'
|
||||
= note: consider using `--verbose` to print the full type name to the console
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user