aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPhilip Herron <philip.herron@embecosm.com>2021-07-19 18:06:08 +0100
committerPhilip Herron <philip.herron@embecosm.com>2021-07-19 19:38:19 +0100
commit4a966c3b7f22c2d31306de6f93f1cc5aebe81b8b (patch)
tree2e2fc992eeb462b0bdc26a8c3736d5b93d9d8dfd /gcc
parent2f7b803bcca98df8cba21c7107d777e8749a88cd (diff)
downloadgcc-4a966c3b7f22c2d31306de6f93f1cc5aebe81b8b.zip
gcc-4a966c3b7f22c2d31306de6f93f1cc5aebe81b8b.tar.gz
gcc-4a966c3b7f22c2d31306de6f93f1cc5aebe81b8b.tar.bz2
Reference Types can be mutable
We need to track mutability on Reference Types and check wether they actually match up. Addresses #576
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-expr.h8
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-type.h3
-rw-r--r--gcc/rust/typecheck/rust-tyty-rules.h9
-rw-r--r--gcc/rust/typecheck/rust-tyty.cc5
-rw-r--r--gcc/rust/typecheck/rust-tyty.h11
5 files changed, 25 insertions, 11 deletions
diff --git a/gcc/rust/typecheck/rust-hir-type-check-expr.h b/gcc/rust/typecheck/rust-hir-type-check-expr.h
index dd10d42..0749839 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-expr.h
+++ b/gcc/rust/typecheck/rust-hir-type-check-expr.h
@@ -547,8 +547,9 @@ public:
auto ok = context->lookup_builtin ("str", &base);
rust_assert (ok);
- infered = new TyTy::ReferenceType (expr.get_mappings ().get_hirid (),
- TyTy::TyVar (base->get_ref ()));
+ infered
+ = new TyTy::ReferenceType (expr.get_mappings ().get_hirid (),
+ TyTy::TyVar (base->get_ref ()), false);
}
break;
@@ -1088,7 +1089,8 @@ public:
// FIXME double_reference
infered = new TyTy::ReferenceType (expr.get_mappings ().get_hirid (),
- TyTy::TyVar (resolved_base->get_ref ()));
+ TyTy::TyVar (resolved_base->get_ref ()),
+ expr.get_is_mut ());
}
void visit (HIR::DereferenceExpr &expr) override
diff --git a/gcc/rust/typecheck/rust-hir-type-check-type.h b/gcc/rust/typecheck/rust-hir-type-check-type.h
index e9a3bde..567d482 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-type.h
+++ b/gcc/rust/typecheck/rust-hir-type-check-type.h
@@ -190,7 +190,8 @@ public:
TyTy::BaseType *base
= TypeCheckType::Resolve (type.get_base_type ().get ());
translated = new TyTy::ReferenceType (type.get_mappings ().get_hirid (),
- TyTy::TyVar (base->get_ref ()));
+ TyTy::TyVar (base->get_ref ()),
+ type.get_has_mut ());
}
void visit (HIR::InferredType &type) override
diff --git a/gcc/rust/typecheck/rust-tyty-rules.h b/gcc/rust/typecheck/rust-tyty-rules.h
index 5db005b..31d7191 100644
--- a/gcc/rust/typecheck/rust-tyty-rules.h
+++ b/gcc/rust/typecheck/rust-tyty-rules.h
@@ -1081,8 +1081,15 @@ public:
return;
}
+ if (base->is_mutable () != type.is_mutable ())
+ {
+ BaseRules::visit (type);
+ return;
+ }
+
resolved = new ReferenceType (base->get_ref (), base->get_ty_ref (),
- TyVar (base_resolved->get_ref ()));
+ TyVar (base_resolved->get_ref ()),
+ base->is_mutable ());
}
private:
diff --git a/gcc/rust/typecheck/rust-tyty.cc b/gcc/rust/typecheck/rust-tyty.cc
index e2c5f71..0eceaef 100644
--- a/gcc/rust/typecheck/rust-tyty.cc
+++ b/gcc/rust/typecheck/rust-tyty.cc
@@ -1355,7 +1355,8 @@ ReferenceType::accept_vis (TyConstVisitor &vis) const
std::string
ReferenceType::as_string () const
{
- return "&" + get_base ()->as_string ();
+ return std::string ("&") + (is_mutable () ? "mut" : "") + " "
+ + get_base ()->as_string ();
}
BaseType *
@@ -1391,7 +1392,7 @@ ReferenceType::get_base () const
BaseType *
ReferenceType::clone ()
{
- return new ReferenceType (get_ref (), get_ty_ref (), base,
+ return new ReferenceType (get_ref (), get_ty_ref (), base, is_mutable (),
get_combined_refs ());
}
diff --git a/gcc/rust/typecheck/rust-tyty.h b/gcc/rust/typecheck/rust-tyty.h
index 7f0ad35..e8db032 100644
--- a/gcc/rust/typecheck/rust-tyty.h
+++ b/gcc/rust/typecheck/rust-tyty.h
@@ -1364,14 +1364,14 @@ public:
class ReferenceType : public BaseType
{
public:
- ReferenceType (HirId ref, TyVar base,
+ ReferenceType (HirId ref, TyVar base, bool is_mut,
std::set<HirId> refs = std::set<HirId> ())
- : BaseType (ref, ref, TypeKind::REF, refs), base (base)
+ : BaseType (ref, ref, TypeKind::REF, refs), base (base), is_mut (is_mut)
{}
- ReferenceType (HirId ref, HirId ty_ref, TyVar base,
+ ReferenceType (HirId ref, HirId ty_ref, TyVar base, bool is_mut,
std::set<HirId> refs = std::set<HirId> ())
- : BaseType (ref, ty_ref, TypeKind::REF, refs), base (base)
+ : BaseType (ref, ty_ref, TypeKind::REF, refs), base (base), is_mut (is_mut)
{}
BaseType *get_base () const;
@@ -1397,8 +1397,11 @@ public:
ReferenceType *handle_substitions (SubstitutionArgumentMappings mappings);
+ bool is_mutable () const { return is_mut; }
+
private:
TyVar base;
+ bool is_mut;
};
class StrType : public BaseType