diff options
author | Philip Herron <philip.herron@embecosm.com> | 2021-07-19 18:06:08 +0100 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2021-07-19 19:38:19 +0100 |
commit | 4a966c3b7f22c2d31306de6f93f1cc5aebe81b8b (patch) | |
tree | 2e2fc992eeb462b0bdc26a8c3736d5b93d9d8dfd /gcc | |
parent | 2f7b803bcca98df8cba21c7107d777e8749a88cd (diff) | |
download | gcc-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.h | 8 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-type.h | 3 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-tyty-rules.h | 9 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-tyty.cc | 5 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-tyty.h | 11 |
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 |