diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2023-02-13 11:15:24 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-02-13 11:15:24 +0000 |
commit | 59d4ee6cc1b14ddc01d062a41bec364e959793c7 (patch) | |
tree | dc3137f8905d5ad3cebefb6b766859d49944a9eb /gcc/rust/ast/rust-macro.cc | |
parent | 3a8c8d0d41b57fbb49ab39715b70495d5d1e8dd1 (diff) | |
parent | f67f5409d2fe4191ab24b5eb634c26306386fb25 (diff) | |
download | gcc-59d4ee6cc1b14ddc01d062a41bec364e959793c7.zip gcc-59d4ee6cc1b14ddc01d062a41bec364e959793c7.tar.gz gcc-59d4ee6cc1b14ddc01d062a41bec364e959793c7.tar.bz2 |
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>
Diffstat (limited to 'gcc/rust/ast/rust-macro.cc')
-rw-r--r-- | gcc/rust/ast/rust-macro.cc | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/gcc/rust/ast/rust-macro.cc b/gcc/rust/ast/rust-macro.cc new file mode 100644 index 0000000..b90cc15 --- /dev/null +++ b/gcc/rust/ast/rust-macro.cc @@ -0,0 +1,64 @@ +// Copyright (C) 2020-2022 Free Software Foundation, Inc. + +// This file is part of GCC. + +// GCC is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 3, or (at your option) any later +// version. + +// GCC is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +// for more details. + +// You should have received a copy of the GNU General Public License +// along with GCC; see the file COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +#include "rust-macro.h" + +namespace Rust { +namespace AST { + +BuiltinMacro +builtin_macro_from_string (const std::string &identifier) +{ + if (identifier == "assert") + return BuiltinMacro::Assert; + + if (identifier == "file") + return BuiltinMacro::File; + + if (identifier == "line") + return BuiltinMacro::Line; + + if (identifier == "column") + return BuiltinMacro::Column; + + if (identifier == "include_bytes") + return BuiltinMacro::IncludeBytes; + + if (identifier == "include_str") + return BuiltinMacro::IncludeStr; + + if (identifier == "compile_error") + return BuiltinMacro::CompileError; + + if (identifier == "concat") + return BuiltinMacro::Concat; + + if (identifier == "env") + return BuiltinMacro::Env; + + if (identifier == "cfg") + return BuiltinMacro::Cfg; + + if (identifier == "include") + return BuiltinMacro::Include; + + gcc_unreachable (); +} + +} // namespace AST +} // namespace Rust |