]> git.ipfire.org Git - thirdparty/gcc.git/commit
Merge #1750
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>
Mon, 13 Feb 2023 11:15:24 +0000 (11:15 +0000)
committerGitHub <noreply@github.com>
Mon, 13 Feb 2023 11:15:24 +0000 (11:15 +0000)
commit59d4ee6cc1b14ddc01d062a41bec364e959793c7
treedc3137f8905d5ad3cebefb6b766859d49944a9eb
parent3a8c8d0d41b57fbb49ab39715b70495d5d1e8dd1
parentf67f5409d2fe4191ab24b5eb634c26306386fb25
Merge #1750

1750: Implement fixed point macro expansion r=CohenArthur a=CohenArthur

This is a cleanup of #1606's branch, which also contains the code necessary for performing eager macro expansion in builtin macros.

This commit changes our macro expansion system from an eager and recursive
macro expansion to a fixed-point like system. Instead of, when seeing
a macro invocation, expanding it and all of the macros within it, we
now perform multiple passes of expansion on the entire crate.

This, however, leads to a problem. Rust macros are expanded lazily, but
Rust builtin macros should be expanded eagerly. Due to this, we must
work around the lazy expansion in builtin macros and perform eager
expansion for each pass of the fixed-point, before finally expanding
the builtin when there are no longer any inner macro invocations.

To perform proper macro scoping, the ENR now keeps track of the current
scope (`current_scope` member) and resolves macros accordingly.

This is done through the use of the `scoped` method, which creates a new
scope, runs a specified lambda and then exits the scope. This prevents
pushing/popping errors that we've seen happen already in similar
contexts.

We might think about generalizing it to other classes, providing a
 `Scoped<EntryFn, ExitFn>` class or similar

Fixes #1795

Co-authored-by: Arthur Cohen <arthur.cohen@embecosm.com>
gcc/rust/Make-lang.in
gcc/rust/rust-session-manager.cc