aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorKushal Pal <kushalpal109@gmail.com>2024-08-07 08:44:03 +0000
committerArthur Cohen <arthur.cohen@embecosm.com>2025-03-19 15:32:08 +0100
commit9104447577afbbd3229d353cf48e46eb105cd130 (patch)
tree173247aab49df3dcf0fac451ebbacdd1d6c87a72 /gcc
parente7a76ba9176304fab0924e429ae7ca1fa0ee434e (diff)
downloadgcc-9104447577afbbd3229d353cf48e46eb105cd130.zip
gcc-9104447577afbbd3229d353cf48e46eb105cd130.tar.gz
gcc-9104447577afbbd3229d353cf48e46eb105cd130.tar.bz2
gccrs: Strong type LoanId
gcc/rust/ChangeLog: * checks/errors/borrowck/rust-bir-dump.cc (Dump::visit): Use new API, i.e get_loan_id() instead of get_loan(). * checks/errors/borrowck/rust-bir-fact-collector.h (points): Use value of LoanId in Polonius facts. * checks/errors/borrowck/rust-bir-place.h (struct LoanId): LoanId is a struct now. * checks/errors/borrowck/rust-bir.h (class AbstractExpr): Use new API, as we are getting a LoanId and not a loan itself. Signed-off-by: Kushal Pal <kushalpal109@gmail.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/checks/errors/borrowck/rust-bir-dump.cc2
-rw-r--r--gcc/rust/checks/errors/borrowck/rust-bir-fact-collector.h44
-rw-r--r--gcc/rust/checks/errors/borrowck/rust-bir-place.h20
-rw-r--r--gcc/rust/checks/errors/borrowck/rust-bir.h4
4 files changed, 42 insertions, 28 deletions
diff --git a/gcc/rust/checks/errors/borrowck/rust-bir-dump.cc b/gcc/rust/checks/errors/borrowck/rust-bir-dump.cc
index e69c000..85ba3ee 100644
--- a/gcc/rust/checks/errors/borrowck/rust-bir-dump.cc
+++ b/gcc/rust/checks/errors/borrowck/rust-bir-dump.cc
@@ -279,7 +279,7 @@ Dump::visit (const BorrowExpr &expr)
{
stream << "&"
<< "'?" << expr.get_origin () << " ";
- if (func.place_db.get_loans ()[expr.get_loan ()].mutability
+ if (func.place_db.get_loan (expr.get_loan_id ()).mutability
== Mutability::Mut)
stream << "mut ";
visit_place (expr.get_place ());
diff --git a/gcc/rust/checks/errors/borrowck/rust-bir-fact-collector.h b/gcc/rust/checks/errors/borrowck/rust-bir-fact-collector.h
index ebf8eec..774f2b9 100644
--- a/gcc/rust/checks/errors/borrowck/rust-bir-fact-collector.h
+++ b/gcc/rust/checks/errors/borrowck/rust-bir-fact-collector.h
@@ -305,7 +305,7 @@ protected: // Main collection entry points (for different categories).
rust_debug ("\t_%u = BorrowExpr(_%u)", lhs.value - 1,
expr.get_place ().value - 1);
- auto loan = place_db.get_loans ()[expr.get_loan ()];
+ auto loan = place_db.get_loan (expr.get_loan_id ());
auto &base_place = place_db[expr.get_place ()];
auto &ref_place = place_db[lhs];
@@ -324,14 +324,14 @@ protected: // Main collection entry points (for different categories).
->is_mutable ())
rust_error_at (location,
"Cannot reborrow immutable borrow as mutable");
- issue_loan (expr.get_origin (), expr.get_loan ());
+ issue_loan (expr.get_origin (), expr.get_loan_id ());
}
push_subset (main_loan_place.regions[0], {expr.get_origin ()});
}
else
{
- issue_loan (expr.get_origin (), expr.get_loan ());
+ issue_loan (expr.get_origin (), expr.get_loan_id ());
}
auto loan_regions = base_place.regions.prepend ({expr.get_origin ()});
@@ -511,24 +511,25 @@ protected: // Generic BIR operations.
void issue_loan (Polonius::Origin origin, LoanId loan_id)
{
- facts.loan_issued_at.emplace_back (origin, loan_id,
+ facts.loan_issued_at.emplace_back (origin, loan_id.value,
get_current_point_mid ());
- check_for_borrow_conficts (place_db.get_loans ()[loan_id].place, loan_id,
- place_db.get_loans ()[loan_id].mutability);
+ check_for_borrow_conficts (place_db.get_loan (loan_id).place, loan_id,
+ place_db.get_loan (loan_id).mutability);
}
void issue_locals_dealloc ()
{
- for (LoanId loan_id = 0; loan_id < place_db.get_loans ().size (); ++loan_id)
+ for (LoanId loan_id = {0}; loan_id.value < place_db.get_loans ().size ();
+ ++loan_id.value)
{
- auto &loan = place_db.get_loans ()[loan_id];
+ auto &loan = place_db.get_loan (loan_id);
auto loaned_var_id = place_db.get_var (loan.place);
if (place_db[loaned_var_id].tyty->is<TyTy::ReferenceType> ())
continue;
if (loaned_var_id >= first_local)
facts.loan_invalidated_at.emplace_back (get_current_point_start (),
- loan_id);
+ loan_id.value);
}
}
@@ -546,20 +547,20 @@ protected: // Generic BIR operations.
place_db.for_each_path_segment (place_id, [&] (PlaceId id) {
for (auto loan : place_db[id].borrowed_by)
{
- if (place_db.get_loans ()[loan].mutability == Mutability::Mut)
+ if (place_db.get_loan (loan).mutability == Mutability::Mut)
{
facts.loan_invalidated_at.emplace_back (
- get_current_point_start (), loan);
+ get_current_point_start (), loan.value);
}
}
});
place_db.for_each_path_from_root (place_id, [&] (PlaceId id) {
for (auto loan : place_db[id].borrowed_by)
{
- if (place_db.get_loans ()[loan].mutability == Mutability::Mut)
+ if (place_db.get_loan (loan).mutability == Mutability::Mut)
{
facts.loan_invalidated_at.emplace_back (
- get_current_point_start (), loan);
+ get_current_point_start (), loan.value);
}
}
});
@@ -570,12 +571,12 @@ protected: // Generic BIR operations.
place_db.for_each_path_segment (place_id, [&] (PlaceId id) {
for (auto loan : place_db[id].borrowed_by)
facts.loan_invalidated_at.emplace_back (get_current_point_start (),
- loan);
+ loan.value);
});
place_db.for_each_path_from_root (place_id, [&] (PlaceId id) {
for (auto loan : place_db[id].borrowed_by)
facts.loan_invalidated_at.emplace_back (get_current_point_start (),
- loan);
+ loan.value);
});
}
@@ -586,12 +587,11 @@ protected: // Generic BIR operations.
for (auto other_loan : place_db[id].borrowed_by)
{
if (mutability == Mutability::Imm
- && place_db.get_loans ()[other_loan].mutability
- == Mutability::Imm)
+ && place_db.get_loan (other_loan).mutability == Mutability::Imm)
continue;
else
facts.loan_invalidated_at.emplace_back (get_current_point_start (),
- other_loan);
+ other_loan.value);
}
});
@@ -599,12 +599,11 @@ protected: // Generic BIR operations.
for (auto other_loan : place_db[id].borrowed_by)
{
if (mutability == Mutability::Imm
- && place_db.get_loans ()[other_loan].mutability
- == Mutability::Imm)
+ && place_db.get_loan (other_loan).mutability == Mutability::Imm)
continue;
else
facts.loan_invalidated_at.emplace_back (get_current_point_start (),
- other_loan);
+ other_loan.value);
}
});
}
@@ -626,7 +625,8 @@ protected: // Generic BIR operations.
{
// TODO: this is more complicated, see
// compiler/rustc_borrowck/src/constraint_generation.rs:176
- facts.loan_killed_at.emplace_back (loan, get_current_point_mid ());
+ facts.loan_killed_at.emplace_back (loan.value,
+ get_current_point_mid ());
}
}
diff --git a/gcc/rust/checks/errors/borrowck/rust-bir-place.h b/gcc/rust/checks/errors/borrowck/rust-bir-place.h
index 6a5a5b4..c78492a 100644
--- a/gcc/rust/checks/errors/borrowck/rust-bir-place.h
+++ b/gcc/rust/checks/errors/borrowck/rust-bir-place.h
@@ -49,7 +49,19 @@ static constexpr PlaceId RETURN_VALUE_PLACE = {1};
static constexpr PlaceId FIRST_VARIABLE_PLACE = RETURN_VALUE_PLACE;
using Variance = TyTy::VarianceAnalysis::Variance;
-using LoanId = uint32_t;
+
+/** A unique identifier for a loan in the BIR. */
+struct LoanId
+{
+ uint32_t value;
+ // some overloads for comparision
+ bool operator== (const LoanId &rhs) const { return value == rhs.value; }
+ bool operator!= (const LoanId &rhs) const { return !(operator== (rhs)); }
+ bool operator< (const LoanId &rhs) const { return value < rhs.value; }
+ bool operator> (const LoanId &rhs) const { return value > rhs.value; }
+ bool operator<= (const LoanId &rhs) const { return !(operator> (rhs)); }
+ bool operator>= (const LoanId &rhs) const { return !(operator< (rhs)); }
+};
/**
* Representation of lvalues and constants in BIR.
@@ -207,6 +219,10 @@ public:
size_t size () const { return places.size (); }
const std::vector<Loan> &get_loans () const { return loans; }
+ const Loan &get_loan (LoanId loan_id) const
+ {
+ return loans.at (loan_id.value);
+ }
ScopeId get_current_scope_id () const { return current_scope; }
@@ -332,7 +348,7 @@ public:
LoanId add_loan (Loan &&loan)
{
- LoanId id = loans.size ();
+ LoanId id = {loans.size ()};
loans.push_back (std::forward<Loan &&> (loan));
PlaceId borrowed_place = loans.rbegin ()->place;
places[loans.rbegin ()->place.value].borrowed_by.push_back (id);
diff --git a/gcc/rust/checks/errors/borrowck/rust-bir.h b/gcc/rust/checks/errors/borrowck/rust-bir.h
index e8b7e39..192e445 100644
--- a/gcc/rust/checks/errors/borrowck/rust-bir.h
+++ b/gcc/rust/checks/errors/borrowck/rust-bir.h
@@ -33,8 +33,6 @@ struct BasicBlock;
class Statement;
class AbstractExpr;
-using LoanId = uint32_t;
-
/**
* Top-level entity of the Borrow-checker IR (BIR).
* It represents a single function (method, closure, etc.), which is the
@@ -225,7 +223,7 @@ public:
loan (loan_id), origin (lifetime)
{}
WARN_UNUSED_RESULT PlaceId get_place () const { return place; }
- WARN_UNUSED_RESULT LoanId get_loan () const { return loan; }
+ WARN_UNUSED_RESULT LoanId get_loan_id () const { return loan; }
WARN_UNUSED_RESULT Polonius::Origin get_origin () const { return origin; }
};