From 7ddb63a444eedeec3268143dc8f9ef3b6f2bf360 Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Tue, 20 Dec 2022 21:34:03 +0100 Subject: [PATCH] impl new way to generate the compiler suggestion Signed-off-by: Vincenzo Palazzo --- compiler/rustc_expand/messages.ftl | 4 +++ compiler/rustc_expand/src/errors.rs | 11 ++++++++ compiler/rustc_expand/src/expand.rs | 31 +++++++--------------- compiler/rustc_middle/src/middle/limits.rs | 2 +- compiler/rustc_session/src/session.rs | 2 -- tests/ui/limits/issue-95698.rs | 2 +- tests/ui/limits/issue-95698.stderr | 2 +- tests/ui/mir/issue-29227.rs | 1 - 8 files changed, 28 insertions(+), 27 deletions(-) diff --git a/compiler/rustc_expand/messages.ftl b/compiler/rustc_expand/messages.ftl index 6c7e68246ea5f..ab5434f7945e1 100644 --- a/compiler/rustc_expand/messages.ftl +++ b/compiler/rustc_expand/messages.ftl @@ -23,6 +23,10 @@ expand_duplicate_matcher_binding = duplicate matcher binding .label = duplicate binding .label2 = previous binding +expand_expansion_growth_limit_reached = + expansion grow limit reached while expanding `{$descr}` + .help = consider increasing the expansion grow limit by adding a `#![expansion_growth_limit = "{$suggested_limit}"]` attribute to your crate (`{$crate_name}`) + expand_expected_comma_in_list = expected token: `,` diff --git a/compiler/rustc_expand/src/errors.rs b/compiler/rustc_expand/src/errors.rs index e3a0ae3570eb0..0db9b539ae43d 100644 --- a/compiler/rustc_expand/src/errors.rs +++ b/compiler/rustc_expand/src/errors.rs @@ -212,6 +212,17 @@ pub(crate) struct RecursionLimitReached<'a> { pub crate_name: &'a str, } +#[derive(Diagnostic)] +#[diag(expand_expansion_growth_limit_reached)] +#[help] +pub(crate) struct ExpansionGrowthLimitReached<'a> { + #[primary_span] + pub span: Span, + pub descr: String, + pub suggested_limit: Limit, + pub crate_name: &'a str, +} + #[derive(Diagnostic)] #[diag(expand_malformed_feature_attribute, code = "E0556")] pub(crate) struct MalformedFeatureAttribute { diff --git a/compiler/rustc_expand/src/expand.rs b/compiler/rustc_expand/src/expand.rs index 4e57c32554aff..cb901db8ee30c 100644 --- a/compiler/rustc_expand/src/expand.rs +++ b/compiler/rustc_expand/src/expand.rs @@ -1,8 +1,8 @@ use crate::base::*; use crate::config::StripUnconfigured; use crate::errors::{ - IncompleteParse, RecursionLimitReached, RemoveExprNotSupported, RemoveNodeNotSupported, - UnsupportedKeyValue, WrongFragmentKind, + ExpansionGrowthLimitReached, IncompleteParse, RecursionLimitReached, RemoveExprNotSupported, + RemoveNodeNotSupported, UnsupportedKeyValue, WrongFragmentKind, }; use crate::hygiene::SyntaxContext; use crate::mbe::diagnostics::annotate_err_with_kind; @@ -628,20 +628,12 @@ impl<'a, 'b> MacroExpander<'a, 'b> { limit => limit * 2, }; - self.cx - .struct_span_err( - expn_data.call_site, - &format!( - "expansion grow limit reached while expanding `{}`", - expn_data.kind.descr() - ), - ) - .help(&format!( - "consider increasing the expansion grow limit by adding a \ - `#![expansion_growth_limit = \"{}\"]` attribute to your crate (`{}`)", - suggested_limit, self.cx.ecfg.crate_name, - )) - .emit(); + self.cx.emit_err(ExpansionGrowthLimitReached { + span: expn_data.call_site, + descr: expn_data.kind.descr(), + suggested_limit, + crate_name: &self.cx.ecfg.crate_name, + }); self.cx.trace_macros_diag(); } @@ -663,7 +655,6 @@ impl<'a, 'b> MacroExpander<'a, 'b> { // Reduce the recursion limit by half each time it triggers. self.cx.reduced_recursion_limit = Some(expansion_limit / 2); - return Err(()); } Ok(()) @@ -697,11 +688,9 @@ impl<'a, 'b> MacroExpander<'a, 'b> { self.parse_ast_fragment(tok_result, fragment_kind, &mac.path, span) } SyntaxExtensionKind::LegacyBang(expander) => { - if self.reduce_expansion_growth_limit(mac.args.inner_tokens().len()).is_err() { + if self.reduce_expansion_growth_limit(mac.args.tokens.len()).is_err() { return ExpandResult::Ready(fragment_kind.dummy(span)); } - let prev = self.cx.current_expansion.prior_type_ascription; - self.cx.current_expansion.prior_type_ascription = mac.prior_type_ascription; let tok_result = expander.expand(self.cx, span, mac.args.tokens.clone()); let result = if let Some(result) = fragment_kind.make_from(tok_result) { result @@ -2027,7 +2016,7 @@ impl<'feat> ExpansionConfig<'feat> { crate_name, features: None, recursion_limit: Limit::new(1024), - expansion_growth_limit: Limit::new(6000), + expansion_growth_limit: Limit::new(1000000), trace_mac: false, should_test: false, span_debug: false, diff --git a/compiler/rustc_middle/src/middle/limits.rs b/compiler/rustc_middle/src/middle/limits.rs index 9e8f3ff347889..dd640f4c314bb 100644 --- a/compiler/rustc_middle/src/middle/limits.rs +++ b/compiler/rustc_middle/src/middle/limits.rs @@ -42,7 +42,7 @@ pub fn get_recursion_limit(krate_attrs: &[Attribute], sess: &Session) -> Limit { } pub fn get_expansion_growth_limit(krate_attrs: &[Attribute], sess: &Session) -> Limit { - get_limit(krate_attrs, sess, sym::expansion_growth_limit, 6000) + get_limit(krate_attrs, sess, sym::expansion_growth_limit, 1000000) } fn get_limit(krate_attrs: &[Attribute], sess: &Session, name: Symbol, default: usize) -> Limit { diff --git a/compiler/rustc_session/src/session.rs b/compiler/rustc_session/src/session.rs index 9aeca7bdaff7b..6a72204553fb1 100644 --- a/compiler/rustc_session/src/session.rs +++ b/compiler/rustc_session/src/session.rs @@ -128,8 +128,6 @@ pub struct Limits { pub move_size_limit: Limit, /// The maximum length of types during monomorphization. pub type_length_limit: Limit, - /// The maximum blocks a const expression can evaluate. - pub const_eval_limit: Limit, /// The maximum tokens limit for potentially infinitely resolving /// a macros that add infinite tokens inside the buffer. pub expansion_growth_limit: Limit, diff --git a/tests/ui/limits/issue-95698.rs b/tests/ui/limits/issue-95698.rs index 20c86a48434db..8aef8f1ea9f6b 100644 --- a/tests/ui/limits/issue-95698.rs +++ b/tests/ui/limits/issue-95698.rs @@ -1,6 +1,6 @@ // check-fail -/// issue #95698 +// issue #95698 macro_rules! from_cow_impls { ($( $from: ty ),+ $(,)? ) => { // recursion call diff --git a/tests/ui/limits/issue-95698.stderr b/tests/ui/limits/issue-95698.stderr index a1ea8562cef98..2391780284ed6 100644 --- a/tests/ui/limits/issue-95698.stderr +++ b/tests/ui/limits/issue-95698.stderr @@ -12,7 +12,7 @@ LL | | Vec, /*callback,*/ LL | | ); | |_- in this macro invocation | - = help: consider increasing the expansion grow limit by adding a `#![expansion_growth_limit = "12000"]` attribute to your crate (`issue_95698`) + = help: consider increasing the expansion grow limit by adding a `#![expansion_growth_limit = "2000000"]` attribute to your crate (`issue_95698`) = note: this error originates in the macro `from_cow_impls` (in Nightly builds, run with -Z macro-backtrace for more info) error: aborting due to previous error diff --git a/tests/ui/mir/issue-29227.rs b/tests/ui/mir/issue-29227.rs index cc30c4b5d9cb9..e9dfc2840e599 100644 --- a/tests/ui/mir/issue-29227.rs +++ b/tests/ui/mir/issue-29227.rs @@ -1,4 +1,3 @@ -#![expansion_growth_limit = "16000"] // run-pass // ignore-tidy-linelength