From 253c7343bbb7dcae208ed9342e76b8a5715ad829 Mon Sep 17 00:00:00 2001 From: Owen Avery Date: Sun, 28 May 2023 23:44:57 -0400 Subject: [PATCH] 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 --- gcc/rust/expand/rust-macro-substitute-ctx.cc | 36 +++++++++++--------- gcc/testsuite/rust/compile/issue-2207.rs | 12 +++++++ 2 files changed, 31 insertions(+), 17 deletions(-) create mode 100644 gcc/testsuite/rust/compile/issue-2207.rs diff --git a/gcc/rust/expand/rust-macro-substitute-ctx.cc b/gcc/rust/expand/rust-macro-substitute-ctx.cc index 0a38578bd74a..85c9d7e01764 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> diff --git a/gcc/testsuite/rust/compile/issue-2207.rs b/gcc/testsuite/rust/compile/issue-2207.rs new file mode 100644 index 000000000000..cdc64fac9d38 --- /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!(); +} -- 2.47.2