diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2022-03-23 09:00:05 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-03-23 09:00:05 +0000 |
commit | b9720caa100efa6758a5f0d54d3764072d83be41 (patch) | |
tree | 5b1cf22e2ed1065889d29ef358bf55968beebf3c /gcc/rust/parse/rust-parse-impl.h | |
parent | 1d34c120c4754b921ac0520585cfef0e7a0bbb29 (diff) | |
parent | 35ca685200830626e5abd623f65a850649beace2 (diff) | |
download | gcc-b9720caa100efa6758a5f0d54d3764072d83be41.zip gcc-b9720caa100efa6758a5f0d54d3764072d83be41.tar.gz gcc-b9720caa100efa6758a5f0d54d3764072d83be41.tar.bz2 |
Merge #1044
1044: Restrict follow-up tokens on `expr` and `stmt` r=CohenArthur a=CohenArthur
This adds a base for respecting the [Macro Follow-Set Ambiguity specification](https://doc.rust-lang.org/reference/macro-ambiguity.html).
If the design is validated, adding more restrictions on other fragment specifiers should not be difficult
Addresses #947
Co-authored-by: Arthur Cohen <arthur.cohen@embecosm.com>
Diffstat (limited to 'gcc/rust/parse/rust-parse-impl.h')
-rw-r--r-- | gcc/rust/parse/rust-parse-impl.h | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h index 644e789..1d1b624 100644 --- a/gcc/rust/parse/rust-parse-impl.h +++ b/gcc/rust/parse/rust-parse-impl.h @@ -22,6 +22,7 @@ along with GCC; see the file COPYING3. If not see #include "rust-diagnostics.h" #include "util/rust-make-unique.h" +#include <algorithm> namespace Rust { // Left binding powers of operations. @@ -1767,6 +1768,13 @@ Parser<ManagedTokenSource>::parse_macro_matcher () return AST::MacroMatcher::create_error (t->get_locus ()); } + if (matches.size () > 0) + { + auto &last_match = matches.back (); + if (!is_match_compatible (*last_match, *match)) + return AST::MacroMatcher::create_error (match->get_match_locus ()); + } + matches.push_back (std::move (match)); // DEBUG @@ -1955,8 +1963,9 @@ Parser<ManagedTokenSource>::parse_macro_match_fragment () if (t == nullptr) return nullptr; - AST::MacroFragSpec frag = AST::get_frag_spec_from_str (t->get_str ()); - if (frag == AST::INVALID) + AST::MacroFragSpec frag + = AST::MacroFragSpec::get_frag_spec_from_str (t->get_str ()); + if (frag.is_error ()) { Error error (t->get_locus (), "invalid fragment specifier %qs in fragment macro match", |