aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/parse/rust-parse-impl.h
diff options
context:
space:
mode:
authorArthur Cohen <arthur.cohen@embecosm.com>2022-03-18 16:20:47 +0100
committerArthur Cohen <arthur.cohen@embecosm.com>2022-03-23 09:56:23 +0100
commit35ca685200830626e5abd623f65a850649beace2 (patch)
treeaed3eeb63995c6cced4bdeed0f327ceaf3d618e8 /gcc/rust/parse/rust-parse-impl.h
parentcc6e405912c83aee41efd3015d9157cdbe9134fe (diff)
downloadgcc-35ca685200830626e5abd623f65a850649beace2.zip
gcc-35ca685200830626e5abd623f65a850649beace2.tar.gz
gcc-35ca685200830626e5abd623f65a850649beace2.tar.bz2
macros: Add base functions to check for follow-set ambiguities
Rust does not allow for all macro fragments to be followed by any kind of tokens: We must check tokens following those fragments that might contain restrictions and make sure that they are allowed, conforming to the Macro Follow-Set Ambiguity specification Co-authored-by: philberty <philip.herron@embecosm.com> macro-frag-spec: Transform enum into a class This allows us to add methods on the fragment specifier, which are needed to make sure that follow-set ambiguities are respected tests: Add tests for forbidden follow-up tokens This also fix a test that was previously accepted but invalid: rustc also rejected it
Diffstat (limited to 'gcc/rust/parse/rust-parse-impl.h')
-rw-r--r--gcc/rust/parse/rust-parse-impl.h13
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",