Implement readonly checker on HIR#3881
Conversation
|
your probably missing the using statement in the visitor |
| @@ -0,0 +1,150 @@ | |||
| // Copyright (C) 2020-2025 Free Software Foundation, Inc. | |||
There was a problem hiding this comment.
| // Copyright (C) 2020-2025 Free Software Foundation, Inc. | |
| // Copyright (C) 2025 Free Software Foundation, Inc. |
we can just use 2025 here since it is a new file :)
| @@ -0,0 +1,51 @@ | |||
| // Copyright (C) 2020-2025 Free Software Foundation, Inc. | |||
There was a problem hiding this comment.
| // Copyright (C) 2020-2025 Free Software Foundation, Inc. | |
| // Copyright (C) 2025 Free Software Foundation, Inc. |
| { | ||
| auto ident_pattern | ||
| = static_cast<HIR::IdentifierPattern *> (*maybe_pattern); | ||
| if (!ident_pattern->is_mut () && assignment_map[*hir_id] > 1) |
There was a problem hiding this comment.
do we want to check if it is greater than 0 here?
There was a problem hiding this comment.
I would like to check if the value is greater than 1.
In this context, assignment_map[hir_id] == 1 means the variable has been initialized, while assignment_map[hir_id] == 0 means it has only been declared.
If the assignment count is greater than 1, the variable has been assigned more than once, so I want to emit an error if the variable is not mutable.
| == HIR::Item::ItemKind::Static) | ||
| { | ||
| auto static_item = static_cast<HIR::StaticItem *> (*maybe_static_item); | ||
| if (!static_item->is_mut () && assignment_map[*hir_id] > 1) |
| namespace Rust { | ||
| namespace HIR { | ||
|
|
||
| static std::map<HirId, int> assignment_map = {}; |
There was a problem hiding this comment.
if we are only interested in whether we've seen the HirId or not, we can use a set here
| static std::map<HirId, int> assignment_map = {}; | |
| static std::set<HirId> assignment_map = {}; |
I agree that if you need the count/number of times we've seen the HirId, then a map is better 👍
5681f7f to
ec0556a
Compare
|
You can skip the |
ec0556a to
bcf2748
Compare
| DefaultHIRVisitor::walk (IfExprConseqElse &expr) | ||
| { | ||
| reinterpret_cast<IfExpr &> (expr).accept_vis (*this); | ||
| reinterpret_cast<IfExpr &> (expr).IfExpr::accept_vis (*this); |
There was a problem hiding this comment.
you don't need the reinterpret_cast here:
| reinterpret_cast<IfExpr &> (expr).IfExpr::accept_vis (*this); | |
| expr.IfExpr::accept_vis (*this); |
| DefaultHIRVisitor::walk (EnumItemTuple &item_tuple) | ||
| { | ||
| reinterpret_cast<EnumItem &> (item_tuple).accept_vis (*this); | ||
| reinterpret_cast<EnumItem &> (item_tuple).EnumItem::accept_vis (*this); |
There was a problem hiding this comment.
likewise and other uses in this file
| enum lvalue_use | ||
| { | ||
| lv_assign, | ||
| lv_increment, | ||
| lv_decrement, | ||
| }; |
There was a problem hiding this comment.
| enum lvalue_use | |
| { | |
| lv_assign, | |
| lv_increment, | |
| lv_decrement, | |
| }; | |
| enum class lvalue_use | |
| { | |
| assign, | |
| increment, | |
| decrement, | |
| }; |
this way we get a bit stronger namespacing
gcc/rust/ChangeLog: * hir/tree/rust-hir-visitor.cc (DefaultHIRVisitor::walk): Add check before calling `get_trait_ref()` Signed-off-by: Ryutaro Okada <1015ryu88@gmail.com>
gcc/rust/ChangeLog: * hir/tree/rust-hir-visitor.cc (DefaultHIRVisitor::walk): Call base class's accept_vis method Signed-off-by: Ryutaro Okada <1015ryu88@gmail.com>
gcc/rust/ChangeLog: * Make-lang.in (rust-readonly-check2.cc): Add read-only check on HIR * checks/errors/rust-readonly-check2.cc (ReadonlyChecker): Add read-only check on HIR * checks/errors/rust-readonly-check2.h (ReadonlyChecker): Add read-only check on HIR Signed-off-by: Ryutaro Okada <1015ryu88@gmail.com>
bcf2748 to
8b90cca
Compare
After this PR is closed, I will delete the old read-only check and switch to the new one.