From d0b2cd241cb04f33f6f15f05cb3c90a44eeff6cd Mon Sep 17 00:00:00 2001 From: Philip Herron Date: Thu, 22 Jul 2021 12:35:28 +0100 Subject: Support dereference of pointers Dereference expressions can also be pointer types not just references. Fixes #588 --- gcc/rust/typecheck/rust-hir-type-check-expr.h | 20 +++++++++++++++++--- gcc/testsuite/rust/compile/torture/pointer1.rs | 9 +++++++++ 2 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/rust/compile/torture/pointer1.rs (limited to 'gcc') diff --git a/gcc/rust/typecheck/rust-hir-type-check-expr.h b/gcc/rust/typecheck/rust-hir-type-check-expr.h index 8197119..166535a 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-expr.h +++ b/gcc/rust/typecheck/rust-hir-type-check-expr.h @@ -1103,15 +1103,29 @@ public: { TyTy::BaseType *resolved_base = TypeCheckExpr::Resolve (expr.get_expr ().get (), false); - if (resolved_base->get_kind () != TyTy::TypeKind::REF) + + bool is_valid_type + = resolved_base->get_kind () == TyTy::TypeKind::REF + || resolved_base->get_kind () == TyTy::TypeKind::POINTER; + if (!is_valid_type) { rust_error_at (expr.get_locus (), "expected reference type got %s", resolved_base->as_string ().c_str ()); return; } - TyTy::ReferenceType *ref_base = (TyTy::ReferenceType *) resolved_base; - infered = ref_base->get_base ()->clone (); + if (resolved_base->get_kind () == TyTy::TypeKind::REF) + { + TyTy::ReferenceType *ref_base + = static_cast (resolved_base); + infered = ref_base->get_base ()->clone (); + } + else + { + TyTy::PointerType *ref_base + = static_cast (resolved_base); + infered = ref_base->get_base ()->clone (); + } } private: diff --git a/gcc/testsuite/rust/compile/torture/pointer1.rs b/gcc/testsuite/rust/compile/torture/pointer1.rs new file mode 100644 index 0000000..f283411 --- /dev/null +++ b/gcc/testsuite/rust/compile/torture/pointer1.rs @@ -0,0 +1,9 @@ +pub fn main() { + let mut num = 2; + let r1: *const i32 = # + let r2 = unsafe { *r1 } + unsafe { *r1 }; + let r3 = num; + num = 4; + let r4 = num + unsafe { *r1 } * r3; + let _eightteen = r2 + r3 + r4; +} -- cgit v1.1