aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOwen Avery <powerboat9.gamer@gmail.com>2023-05-28 23:44:57 -0400
committerArthur Cohen <arthur.cohen@embecosm.com>2024-01-16 18:37:22 +0100
commit253c7343bbb7dcae208ed9342e76b8a5715ad829 (patch)
treef068fa2d6bee4a0bf8e7707ce474ae91e2505c91
parent74db136a7cf7505691d409e01f757a5b86f119c9 (diff)
downloadgcc-253c7343bbb7dcae208ed9342e76b8a5715ad829.zip
gcc-253c7343bbb7dcae208ed9342e76b8a5715ad829.tar.gz
gcc-253c7343bbb7dcae208ed9342e76b8a5715ad829.tar.bz2
gccrs: Fix handling of single fragments in repetitions
gcc/rust/ChangeLog: * expand/rust-macro-substitute-ctx.cc (SubstituteCtx::check_repetition_amount): Ignore single fragments while checking repetition amount. gcc/testsuite/ChangeLog: * rust/compile/issue-2207.rs: New test. Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
-rw-r--r--gcc/rust/expand/rust-macro-substitute-ctx.cc36
-rw-r--r--gcc/testsuite/rust/compile/issue-2207.rs12
2 files changed, 31 insertions, 17 deletions
diff --git a/gcc/rust/expand/rust-macro-substitute-ctx.cc b/gcc/rust/expand/rust-macro-substitute-ctx.cc
index 0a38578..85c9d7e 100644
--- a/gcc/rust/expand/rust-macro-substitute-ctx.cc
+++ b/gcc/rust/expand/rust-macro-substitute-ctx.cc
@@ -77,31 +77,33 @@ SubstituteCtx::check_repetition_amount (size_t pattern_start,
auto &fragment = it->second;
- size_t repeat_amount = fragment.get_match_amount ();
- if (!first_fragment_found)
+ if (!fragment.is_single_fragment ())
{
- first_fragment_found = true;
- expected_repetition_amount = repeat_amount;
- }
- else
- {
- if (repeat_amount != expected_repetition_amount
- && !fragment.is_single_fragment ())
+ size_t repeat_amount = fragment.get_match_amount ();
+ if (!first_fragment_found)
+ {
+ first_fragment_found = true;
+ expected_repetition_amount = repeat_amount;
+ }
+ else
{
- rust_error_at (
- frag_token->get_locus (),
- "different amount of matches used in merged "
- "repetitions: expected %lu, got %lu",
- (unsigned long) expected_repetition_amount,
- (unsigned long) repeat_amount);
- is_valid = false;
+ if (repeat_amount != expected_repetition_amount)
+ {
+ rust_error_at (
+ frag_token->get_locus (),
+ "different amount of matches used in merged "
+ "repetitions: expected %lu, got %lu",
+ (unsigned long) expected_repetition_amount,
+ (unsigned long) repeat_amount);
+ is_valid = false;
+ }
}
}
}
}
}
- return is_valid;
+ return is_valid && first_fragment_found;
}
std::vector<std::unique_ptr<AST::Token>>
diff --git a/gcc/testsuite/rust/compile/issue-2207.rs b/gcc/testsuite/rust/compile/issue-2207.rs
new file mode 100644
index 0000000..cdc64fa
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-2207.rs
@@ -0,0 +1,12 @@
+macro_rules! finish {
+ (+ - + * + /) => {}
+}
+
+macro_rules! foo {
+ () => { foo!(+ - * /); };
+ ($a:tt $($b:tt)*) => { finish!($($a $b)*); }
+}
+
+pub fn bar() {
+ foo!();
+}