diff --git a/compiler/rustc_middle/src/query/mod.rs b/compiler/rustc_middle/src/query/mod.rs index 0e645a3aae45b..46492bad35850 100644 --- a/compiler/rustc_middle/src/query/mod.rs +++ b/compiler/rustc_middle/src/query/mod.rs @@ -2709,6 +2709,11 @@ rustc_queries! { cache_on_disk_if { true } } + query has_normalization_error_in_mono(key: ty::Instance<'tcx>) -> bool { + desc { "checking whether {}'s body has post-analysis normalization error", key } + cache_on_disk_if { true } + } + query size_estimate(key: ty::Instance<'tcx>) -> usize { desc { "estimating codegen size of `{}`", key } cache_on_disk_if { true } diff --git a/compiler/rustc_monomorphize/src/collector.rs b/compiler/rustc_monomorphize/src/collector.rs index 378d71cb1fcd3..ca7657a02684a 100644 --- a/compiler/rustc_monomorphize/src/collector.rs +++ b/compiler/rustc_monomorphize/src/collector.rs @@ -208,6 +208,7 @@ mod autodiff; use std::cell::OnceCell; +use std::ops::ControlFlow; use rustc_data_structures::fx::FxIndexMap; use rustc_data_structures::sync::{MTLock, par_for_each_in}; @@ -228,7 +229,7 @@ use rustc_middle::ty::adjustment::{CustomCoerceUnsized, PointerCoercion}; use rustc_middle::ty::layout::ValidityRequirement; use rustc_middle::ty::{ self, GenericArgs, GenericParamDefKind, Instance, InstanceKind, Ty, TyCtxt, TypeFoldable, - TypeVisitableExt, VtblEntry, + TypeVisitable, TypeVisitableExt, TypeVisitor, VtblEntry, }; use rustc_middle::util::Providers; use rustc_middle::{bug, span_bug}; @@ -473,6 +474,23 @@ fn collect_items_rec<'tcx>( recursion_limit, )); + // Plenty of code paths later assume that everything can be normalized. + // Check normalization here to provide better diagnostics. + // Normalization errors here are usually due to trait solving overflow. + // FIXME: I assume that there are few type errors at post-analysis stage, but not + // entirely sure. + if tcx.has_normalization_error_in_mono(instance) { + let def_id = instance.def_id(); + let def_span = tcx.def_span(def_id); + let def_path_str = tcx.def_path_str(def_id); + tcx.dcx().emit_fatal(RecursionLimit { + span: starting_item.span, + instance, + def_span, + def_path_str, + }); + } + rustc_data_structures::stack::ensure_sufficient_stack(|| { let (used, mentioned) = tcx.items_of_instance((instance, mode)); used_items.extend(used.into_iter().copied()); @@ -603,6 +621,33 @@ fn collect_items_rec<'tcx>( } } +// Check whether we can normalize the MIR body. Make it a query since decoding MIR from disk cache +// may be expensive. +fn has_normalization_error_in_mono<'tcx>(tcx: TyCtxt<'tcx>, instance: Instance<'tcx>) -> bool { + struct NormalizationChecker<'tcx> { + tcx: TyCtxt<'tcx>, + instance: Instance<'tcx>, + } + impl<'tcx> TypeVisitor> for NormalizationChecker<'tcx> { + type Result = ControlFlow<()>; + + fn visit_ty(&mut self, t: Ty<'tcx>) -> Self::Result { + match self.instance.try_instantiate_mir_and_normalize_erasing_regions( + self.tcx, + ty::TypingEnv::fully_monomorphized(), + ty::EarlyBinder::bind(t), + ) { + Ok(_) => ControlFlow::Continue(()), + Err(_) => ControlFlow::Break(()), + } + } + } + + let body = tcx.instance_mir(instance.def); + let mut checker = NormalizationChecker { tcx, instance }; + body.visit_with(&mut checker).is_break() +} + fn check_recursion_limit<'tcx>( tcx: TyCtxt<'tcx>, instance: Instance<'tcx>, @@ -1770,4 +1815,5 @@ pub(crate) fn collect_crate_mono_items<'tcx>( pub(crate) fn provide(providers: &mut Providers) { providers.hooks.should_codegen_locally = should_codegen_locally; providers.items_of_instance = items_of_instance; + providers.has_normalization_error_in_mono = has_normalization_error_in_mono; } diff --git a/compiler/rustc_traits/src/normalize_erasing_regions.rs b/compiler/rustc_traits/src/normalize_erasing_regions.rs index c98b56abe9c1d..d3a2c4d20f95d 100644 --- a/compiler/rustc_traits/src/normalize_erasing_regions.rs +++ b/compiler/rustc_traits/src/normalize_erasing_regions.rs @@ -42,7 +42,18 @@ fn try_normalize_after_erasing_regions<'tcx, T: TypeFoldable> + Par // us a test case. debug_assert_eq!(normalized_value, resolved_value); let erased = infcx.tcx.erase_and_anonymize_regions(resolved_value); - debug_assert!(!erased.has_infer(), "{erased:?}"); + if infcx.next_trait_solver() { + debug_assert!(!erased.has_infer(), "{erased:?}"); + } else { + // The old solver returns an ty var with the failed obligation in case of + // selection error. And when the obligation is re-tried, the error should be + // reported. However in case of overflow error, the obligation may be fulfilled + // due to the original depth being dropped. + // In conclusion, overflow results in an unconstrained ty var. + if erased.has_infer() { + return Err(NoSolution); + } + } Ok(erased) } Err(NoSolution) => Err(NoSolution), diff --git a/tests/crashes/105275.rs b/tests/ui/codegen/normalization-overflow/recursion-issue-105275.rs similarity index 84% rename from tests/crashes/105275.rs rename to tests/ui/codegen/normalization-overflow/recursion-issue-105275.rs index a97f36d19872c..98bbfd4420dc6 100644 --- a/tests/crashes/105275.rs +++ b/tests/ui/codegen/normalization-overflow/recursion-issue-105275.rs @@ -1,9 +1,10 @@ -//@ known-bug: #105275 +//@ build-fail //@ compile-flags: -Copt-level=0 pub fn encode_num(n: u32, mut writer: Writer) -> Result<(), Writer::Error> { if n > 15 { encode_num(n / 16, &mut writer)?; + //~^ ERROR: reached the recursion limit while instantiating } Ok(()) } diff --git a/tests/ui/codegen/normalization-overflow/recursion-issue-105275.stderr b/tests/ui/codegen/normalization-overflow/recursion-issue-105275.stderr new file mode 100644 index 0000000000000..94fba4621d0a0 --- /dev/null +++ b/tests/ui/codegen/normalization-overflow/recursion-issue-105275.stderr @@ -0,0 +1,14 @@ +error: reached the recursion limit while instantiating `encode_num::<&mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut Error>` + --> $DIR/recursion-issue-105275.rs:6:9 + | +LL | encode_num(n / 16, &mut writer)?; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | +note: `encode_num` defined here + --> $DIR/recursion-issue-105275.rs:4:1 + | +LL | pub fn encode_num(n: u32, mut writer: Writer) -> Result<(), Writer::Error> { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 1 previous error + diff --git a/tests/crashes/105937.rs b/tests/ui/codegen/normalization-overflow/recursion-issue-105937.rs similarity index 84% rename from tests/crashes/105937.rs rename to tests/ui/codegen/normalization-overflow/recursion-issue-105937.rs index ffd1a493e46d5..98bbfd4420dc6 100644 --- a/tests/crashes/105937.rs +++ b/tests/ui/codegen/normalization-overflow/recursion-issue-105937.rs @@ -1,9 +1,10 @@ -//@ known-bug: #105937 +//@ build-fail //@ compile-flags: -Copt-level=0 pub fn encode_num(n: u32, mut writer: Writer) -> Result<(), Writer::Error> { if n > 15 { encode_num(n / 16, &mut writer)?; + //~^ ERROR: reached the recursion limit while instantiating } Ok(()) } diff --git a/tests/ui/codegen/normalization-overflow/recursion-issue-105937.stderr b/tests/ui/codegen/normalization-overflow/recursion-issue-105937.stderr new file mode 100644 index 0000000000000..64f33d251d5f0 --- /dev/null +++ b/tests/ui/codegen/normalization-overflow/recursion-issue-105937.stderr @@ -0,0 +1,14 @@ +error: reached the recursion limit while instantiating `encode_num::<&mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut Error>` + --> $DIR/recursion-issue-105937.rs:6:9 + | +LL | encode_num(n / 16, &mut writer)?; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | +note: `encode_num` defined here + --> $DIR/recursion-issue-105937.rs:4:1 + | +LL | pub fn encode_num(n: u32, mut writer: Writer) -> Result<(), Writer::Error> { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 1 previous error + diff --git a/tests/crashes/117696-1.rs b/tests/ui/codegen/normalization-overflow/recursion-issue-117696-1.rs similarity index 81% rename from tests/crashes/117696-1.rs rename to tests/ui/codegen/normalization-overflow/recursion-issue-117696-1.rs index dfca39177855d..2109afbd84237 100644 --- a/tests/crashes/117696-1.rs +++ b/tests/ui/codegen/normalization-overflow/recursion-issue-117696-1.rs @@ -1,4 +1,4 @@ -//@ known-bug: #117696 +//@ build-fail fn main() { let mut it = (Empty); rec(&mut it); @@ -23,6 +23,7 @@ where { if () == () { T::count(it); + //~^ ERROR: reached the recursion limit while instantiating } else { rec(identity(&mut it)) } diff --git a/tests/ui/codegen/normalization-overflow/recursion-issue-117696-1.stderr b/tests/ui/codegen/normalization-overflow/recursion-issue-117696-1.stderr new file mode 100644 index 0000000000000..b261530c010d5 --- /dev/null +++ b/tests/ui/codegen/normalization-overflow/recursion-issue-117696-1.stderr @@ -0,0 +1,11 @@ +error: reached the recursion limit while instantiating `<&mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut Empty as Iterator>::count` + --> $DIR/recursion-issue-117696-1.rs:25:9 + | +LL | T::count(it); + | ^^^^^^^^^^^^ + | +note: `count` defined here + --> $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL + +error: aborting due to 1 previous error + diff --git a/tests/crashes/117696-2.rs b/tests/ui/codegen/normalization-overflow/recursion-issue-117696-2.rs similarity index 70% rename from tests/crashes/117696-2.rs rename to tests/ui/codegen/normalization-overflow/recursion-issue-117696-2.rs index 9c2a68d3a915c..0236e799bcb8b 100644 --- a/tests/crashes/117696-2.rs +++ b/tests/ui/codegen/normalization-overflow/recursion-issue-117696-2.rs @@ -1,4 +1,4 @@ -//@ known-bug: #117696 +//@ build-fail //@ compile-flags: -Copt-level=0 fn main() { rec(&mut None::<()>.into_iter()); @@ -9,5 +9,6 @@ fn rec(mut it: T) { it.next(); } else { rec(&mut it); + //~^ ERROR: reached the recursion limit while instantiating } } diff --git a/tests/ui/codegen/normalization-overflow/recursion-issue-117696-2.stderr b/tests/ui/codegen/normalization-overflow/recursion-issue-117696-2.stderr new file mode 100644 index 0000000000000..88cfb8904d2c7 --- /dev/null +++ b/tests/ui/codegen/normalization-overflow/recursion-issue-117696-2.stderr @@ -0,0 +1,14 @@ +error: reached the recursion limit while instantiating `rec::<&mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut std::option::IntoIter<()>>` + --> $DIR/recursion-issue-117696-2.rs:11:9 + | +LL | rec(&mut it); + | ^^^^^^^^^^^^ + | +note: `rec` defined here + --> $DIR/recursion-issue-117696-2.rs:7:1 + | +LL | fn rec(mut it: T) { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 1 previous error + diff --git a/tests/crashes/118590.rs b/tests/ui/codegen/normalization-overflow/recursion-issue-118590.rs similarity index 65% rename from tests/crashes/118590.rs rename to tests/ui/codegen/normalization-overflow/recursion-issue-118590.rs index 829c16582dc92..dba23d9d0bdd9 100644 --- a/tests/crashes/118590.rs +++ b/tests/ui/codegen/normalization-overflow/recursion-issue-118590.rs @@ -1,4 +1,4 @@ -//@ known-bug: #118590 +//@ build-fail fn main() { recurse(std::iter::empty::<()>()) @@ -8,4 +8,5 @@ fn recurse(nums: impl Iterator) { if true { return } recurse(nums.skip(42).peekable()) + //~^ ERROR: reached the recursion limit while instantiating } diff --git a/tests/ui/codegen/normalization-overflow/recursion-issue-118590.stderr b/tests/ui/codegen/normalization-overflow/recursion-issue-118590.stderr new file mode 100644 index 0000000000000..bf07c19f70479 --- /dev/null +++ b/tests/ui/codegen/normalization-overflow/recursion-issue-118590.stderr @@ -0,0 +1,11 @@ +error: reached the recursion limit while instantiating `>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> as Iterator>::peekable` + --> $DIR/recursion-issue-118590.rs:10:13 + | +LL | recurse(nums.skip(42).peekable()) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | +note: `peekable` defined here + --> $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL + +error: aborting due to 1 previous error + diff --git a/tests/crashes/122823.rs b/tests/ui/codegen/normalization-overflow/recursion-issue-122823.rs similarity index 95% rename from tests/crashes/122823.rs rename to tests/ui/codegen/normalization-overflow/recursion-issue-122823.rs index ec22b331ad929..9df8e7f28386f 100644 --- a/tests/crashes/122823.rs +++ b/tests/ui/codegen/normalization-overflow/recursion-issue-122823.rs @@ -1,4 +1,4 @@ -//@ known-bug: #122823 +//@ build-fail //@ compile-flags: -Copt-level=0 // ignore-tidy-linelength @@ -41,6 +41,7 @@ pub fn operator_packet>(version: u64, type_id: u64, itr: version: version, type_id: type_id, packets: decode_packets(&mut itr.take(0).peekable()), + //~^ ERROR: reached the recursion limit while instantiating }; return Some(Packet::Operator(p)); diff --git a/tests/ui/codegen/normalization-overflow/recursion-issue-122823.stderr b/tests/ui/codegen/normalization-overflow/recursion-issue-122823.stderr new file mode 100644 index 0000000000000..7102298bcc6fc --- /dev/null +++ b/tests/ui/codegen/normalization-overflow/recursion-issue-122823.stderr @@ -0,0 +1,11 @@ +error: reached the recursion limit while instantiating `>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> as Iterator>::peekable` + --> $DIR/recursion-issue-122823.rs:43:38 + | +LL | packets: decode_packets(&mut itr.take(0).peekable()), + | ^^^^^^^^^^^^^^^^^^^^^^ + | +note: `peekable` defined here + --> $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL + +error: aborting due to 1 previous error + diff --git a/tests/crashes/131342.rs b/tests/ui/codegen/normalization-overflow/recursion-issue-131342.rs similarity index 79% rename from tests/crashes/131342.rs rename to tests/ui/codegen/normalization-overflow/recursion-issue-131342.rs index f4404092917a4..55a2c0647c2f4 100644 --- a/tests/crashes/131342.rs +++ b/tests/ui/codegen/normalization-overflow/recursion-issue-131342.rs @@ -1,4 +1,4 @@ -//@ known-bug: #131342 +//@ build-fail fn main() { let mut items = vec![1, 2, 3, 4, 5].into_iter(); @@ -7,6 +7,7 @@ fn main() { fn problem_thingy(items: &mut impl Iterator) { let mut peeker = items.peekable(); + //~^ ERROR: reached the recursion limit while instantiating match peeker.peek() { Some(_) => (), None => return (), diff --git a/tests/ui/codegen/normalization-overflow/recursion-issue-131342.stderr b/tests/ui/codegen/normalization-overflow/recursion-issue-131342.stderr new file mode 100644 index 0000000000000..fa313be0b8142 --- /dev/null +++ b/tests/ui/codegen/normalization-overflow/recursion-issue-131342.stderr @@ -0,0 +1,11 @@ +error: reached the recursion limit while instantiating `<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut Peekable<&mut std::vec::IntoIter>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> as Iterator>::peekable` + --> $DIR/recursion-issue-131342.rs:9:22 + | +LL | let mut peeker = items.peekable(); + | ^^^^^^^^^^^^^^^^ + | +note: `peekable` defined here + --> $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL + +error: aborting due to 1 previous error + diff --git a/tests/crashes/139659.rs b/tests/ui/codegen/normalization-overflow/recursion-issue-139659.rs similarity index 86% rename from tests/crashes/139659.rs rename to tests/ui/codegen/normalization-overflow/recursion-issue-139659.rs index 7fc33f7e6a7cf..30f97dba6ee58 100644 --- a/tests/crashes/139659.rs +++ b/tests/ui/codegen/normalization-overflow/recursion-issue-139659.rs @@ -1,5 +1,6 @@ -//@ known-bug: #139659 +//@ build-fail //@compile-flags: -Cdebuginfo=2 -Copt-level=0 --crate-type lib +//~^^ ERROR: reached the recursion limit while instantiating trait Trait { type Output; } diff --git a/tests/ui/codegen/normalization-overflow/recursion-issue-139659.stderr b/tests/ui/codegen/normalization-overflow/recursion-issue-139659.stderr new file mode 100644 index 0000000000000..5e1e4fe18f842 --- /dev/null +++ b/tests/ui/codegen/normalization-overflow/recursion-issue-139659.stderr @@ -0,0 +1,10 @@ +error: reached the recursion limit while instantiating `recurse` + | +note: `recurse` defined here + --> $DIR/recursion-issue-139659.rs:27:1 + | +LL | pub fn recurse() -> impl Sized { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 1 previous error + diff --git a/tests/crashes/92004.rs b/tests/ui/codegen/normalization-overflow/recursion-issue-92004.rs similarity index 95% rename from tests/crashes/92004.rs rename to tests/ui/codegen/normalization-overflow/recursion-issue-92004.rs index bc2ca2a7ba389..949359cfa4238 100644 --- a/tests/crashes/92004.rs +++ b/tests/ui/codegen/normalization-overflow/recursion-issue-92004.rs @@ -1,4 +1,4 @@ -//@ known-bug: #102310 +//@ build-fail //@ compile-flags: -Copt-level=0 //@ edition:2021 // ignore-tidy-linelength @@ -42,6 +42,7 @@ pub fn operator_packet>(version: u64, type_id: u64, itr: version: version, type_id: type_id, packets: decode_packets(&mut itr.take(0).peekable()), + //~^ ERROR: reached the recursion limit while instantiating }; return Some(Packet::Operator(p)); diff --git a/tests/ui/codegen/normalization-overflow/recursion-issue-92004.stderr b/tests/ui/codegen/normalization-overflow/recursion-issue-92004.stderr new file mode 100644 index 0000000000000..e6f14b995a82e --- /dev/null +++ b/tests/ui/codegen/normalization-overflow/recursion-issue-92004.stderr @@ -0,0 +1,11 @@ +error: reached the recursion limit while instantiating `>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> as Iterator>::peekable` + --> $DIR/recursion-issue-92004.rs:44:38 + | +LL | packets: decode_packets(&mut itr.take(0).peekable()), + | ^^^^^^^^^^^^^^^^^^^^^^ + | +note: `peekable` defined here + --> $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL + +error: aborting due to 1 previous error + diff --git a/tests/crashes/92470.rs b/tests/ui/codegen/normalization-overflow/recursion-issue-92470.rs similarity index 76% rename from tests/crashes/92470.rs rename to tests/ui/codegen/normalization-overflow/recursion-issue-92470.rs index a3c518f5ec62f..cd024d75897e1 100644 --- a/tests/crashes/92470.rs +++ b/tests/ui/codegen/normalization-overflow/recursion-issue-92470.rs @@ -1,4 +1,4 @@ -//@ known-bug: #92470 +//@ build-fail fn main() { encode(&mut EncoderImpl); } @@ -10,8 +10,10 @@ pub trait Encoder { } fn encode(mut encoder: E) { +//~^ WARN: function cannot return without recursing encoder.writer(); encode(&mut encoder); + //~^ ERROR: reached the recursion limit while instantiating } struct EncoderImpl; diff --git a/tests/ui/codegen/normalization-overflow/recursion-issue-92470.stderr b/tests/ui/codegen/normalization-overflow/recursion-issue-92470.stderr new file mode 100644 index 0000000000000..1775a99928853 --- /dev/null +++ b/tests/ui/codegen/normalization-overflow/recursion-issue-92470.stderr @@ -0,0 +1,26 @@ +warning: function cannot return without recursing + --> $DIR/recursion-issue-92470.rs:12:1 + | +LL | fn encode(mut encoder: E) { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot return without recursing +... +LL | encode(&mut encoder); + | -------------------- recursive call site + | + = 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 `encode::<&mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut EncoderImpl>` + --> $DIR/recursion-issue-92470.rs:15:5 + | +LL | encode(&mut encoder); + | ^^^^^^^^^^^^^^^^^^^^ + | +note: `encode` defined here + --> $DIR/recursion-issue-92470.rs:12:1 + | +LL | fn encode(mut encoder: E) { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 1 previous error; 1 warning emitted + diff --git a/tests/crashes/95134.rs b/tests/ui/codegen/normalization-overflow/recursion-issue-95134.rs similarity index 85% rename from tests/crashes/95134.rs rename to tests/ui/codegen/normalization-overflow/recursion-issue-95134.rs index bcd88b1076fd9..bbeeeeda6090a 100644 --- a/tests/crashes/95134.rs +++ b/tests/ui/codegen/normalization-overflow/recursion-issue-95134.rs @@ -1,9 +1,10 @@ -//@ known-bug: #95134 +//@ build-fail //@ compile-flags: -Copt-level=0 pub fn encode_num(n: u32, mut writer: Writer) -> Result<(), Writer::Error> { if n > 15 { encode_num(n / 16, &mut writer)?; + //~^ ERROR: reached the recursion limit while instantiating } Ok(()) } diff --git a/tests/ui/codegen/normalization-overflow/recursion-issue-95134.stderr b/tests/ui/codegen/normalization-overflow/recursion-issue-95134.stderr new file mode 100644 index 0000000000000..0c49e0010f54c --- /dev/null +++ b/tests/ui/codegen/normalization-overflow/recursion-issue-95134.stderr @@ -0,0 +1,14 @@ +error: reached the recursion limit while instantiating `encode_num::<&mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut &mut EmptyWriter>` + --> $DIR/recursion-issue-95134.rs:6:9 + | +LL | encode_num(n / 16, &mut writer)?; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | +note: `encode_num` defined here + --> $DIR/recursion-issue-95134.rs:4:1 + | +LL | pub fn encode_num(n: u32, mut writer: Writer) -> Result<(), Writer::Error> { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 1 previous error +