Rollup merge of #63717 - petrochenkov:eager, r=matthewjasper
Fix nested eager expansions in arguments of `format_args` Fixes https://github.com/rust-lang/rust/issues/63460 Fixes https://github.com/rust-lang/rust/issues/63685 (regression from making `format_args` opaque - https://github.com/rust-lang/rust/pull/63114) r? @matthewjasper
This commit is contained in:
commit
70436969e0
6 changed files with 75 additions and 21 deletions
|
|
@ -682,8 +682,9 @@ pub trait Resolver {
|
|||
|
||||
fn resolve_imports(&mut self);
|
||||
|
||||
fn resolve_macro_invocation(&mut self, invoc: &Invocation, invoc_id: ExpnId, force: bool)
|
||||
-> Result<Option<Lrc<SyntaxExtension>>, Indeterminate>;
|
||||
fn resolve_macro_invocation(
|
||||
&mut self, invoc: &Invocation, eager_expansion_root: ExpnId, force: bool
|
||||
) -> Result<Option<Lrc<SyntaxExtension>>, Indeterminate>;
|
||||
|
||||
fn check_unused_macros(&self);
|
||||
|
||||
|
|
@ -908,12 +909,9 @@ impl<'a> ExtCtxt<'a> {
|
|||
/// compilation on error, merely emits a non-fatal error and returns `None`.
|
||||
pub fn expr_to_spanned_string<'a>(
|
||||
cx: &'a mut ExtCtxt<'_>,
|
||||
mut expr: P<ast::Expr>,
|
||||
expr: P<ast::Expr>,
|
||||
err_msg: &str,
|
||||
) -> Result<(Symbol, ast::StrStyle, Span), Option<DiagnosticBuilder<'a>>> {
|
||||
// Update `expr.span`'s ctxt now in case expr is an `include!` macro invocation.
|
||||
expr.span = expr.span.apply_mark(cx.current_expansion.id);
|
||||
|
||||
// Perform eager expansion on the expression.
|
||||
// We want to be able to handle e.g., `concat!("foo", "bar")`.
|
||||
let expr = cx.expander().fully_expand_fragment(AstFragment::Expr(expr)).make_expr();
|
||||
|
|
|
|||
|
|
@ -305,9 +305,11 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
|
|||
continue
|
||||
};
|
||||
|
||||
let scope =
|
||||
let eager_expansion_root =
|
||||
if self.monotonic { invoc.expansion_data.id } else { orig_expansion_data.id };
|
||||
let ext = match self.cx.resolver.resolve_macro_invocation(&invoc, scope, force) {
|
||||
let ext = match self.cx.resolver.resolve_macro_invocation(
|
||||
&invoc, eager_expansion_root, force
|
||||
) {
|
||||
Ok(ext) => ext,
|
||||
Err(Indeterminate) => {
|
||||
undetermined_invocations.push(invoc);
|
||||
|
|
@ -318,7 +320,6 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
|
|||
progress = true;
|
||||
let ExpansionData { depth, id: expn_id, .. } = invoc.expansion_data;
|
||||
self.cx.current_expansion = invoc.expansion_data.clone();
|
||||
self.cx.current_expansion.id = scope;
|
||||
|
||||
// FIXME(jseyfried): Refactor out the following logic
|
||||
let (expanded_fragment, new_invocations) = if let Some(ext) = ext {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue