diff options
author | Owen Avery <powerboat9.gamer@gmail.com> | 2023-05-28 23:44:57 -0400 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2024-01-16 18:37:22 +0100 |
commit | 253c7343bbb7dcae208ed9342e76b8a5715ad829 (patch) | |
tree | f068fa2d6bee4a0bf8e7707ce474ae91e2505c91 /gcc/rust | |
parent | 74db136a7cf7505691d409e01f757a5b86f119c9 (diff) | |
download | gcc-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>
Diffstat (limited to 'gcc/rust')
-rw-r--r-- | gcc/rust/expand/rust-macro-substitute-ctx.cc | 36 |
1 files changed, 19 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>> |