From: Yap Zhi Heng <[email protected]>
gcc/rust/ChangeLog:
* checks/errors/rust-readonly-check.cc (collect_assignment_tuple):
Implement
read-only checker for tuple patterns with rest pattern.
Signed-off-by: Yap Zhi Heng <[email protected]>
---
gcc/rust/checks/errors/rust-readonly-check.cc | 14 ++++++++++++--
.../rust/compile/tuplepattern-rest-readonly.rs | 5 +++++
2 files changed, 17 insertions(+), 2 deletions(-)
create mode 100644 gcc/testsuite/rust/compile/tuplepattern-rest-readonly.rs
diff --git a/gcc/rust/checks/errors/rust-readonly-check.cc
b/gcc/rust/checks/errors/rust-readonly-check.cc
index ed4145e5648..f484047e60b 100644
--- a/gcc/rust/checks/errors/rust-readonly-check.cc
+++ b/gcc/rust/checks/errors/rust-readonly-check.cc
@@ -144,14 +144,24 @@ ReadonlyChecker::collect_assignment_tuple (TuplePattern
&tuple_pattern,
{
case HIR::TuplePatternItems::ItemType::NO_REST:
{
- auto &items = static_cast<HIR::TuplePatternItemsNoRest &> (
+ auto &items_no_rest = static_cast<HIR::TuplePatternItemsNoRest &> (
tuple_pattern.get_items ());
- for (auto &sub : items.get_patterns ())
+ for (auto &sub : items_no_rest.get_patterns ())
{
collect_assignment (*sub, has_init_expr);
}
}
break;
+ case HIR::TuplePatternItems::ItemType::HAS_REST:
+ {
+ auto &items_has_rest = static_cast<HIR::TuplePatternItemsHasRest &> (
+ tuple_pattern.get_items ());
+ for (auto &sub : items_has_rest.get_lower_patterns ())
+ collect_assignment (*sub, has_init_expr);
+ for (auto &sub : items_has_rest.get_upper_patterns ())
+ collect_assignment (*sub, has_init_expr);
+ }
+ break;
default:
break;
}
diff --git a/gcc/testsuite/rust/compile/tuplepattern-rest-readonly.rs
b/gcc/testsuite/rust/compile/tuplepattern-rest-readonly.rs
new file mode 100644
index 00000000000..db165ef4f26
--- /dev/null
+++ b/gcc/testsuite/rust/compile/tuplepattern-rest-readonly.rs
@@ -0,0 +1,5 @@
+fn main() {
+ let (a, .., b) = (1, 1);
+ a = 2; // { dg-error "assignment of read-only variable .a." }
+ b = 2; // { dg-error "assignment of read-only variable .b." }
+}
\ No newline at end of file
--
2.50.1