diff options
author | antego <antego@users.noreply.github.com> | 2022-05-12 21:32:53 +1000 |
---|---|---|
committer | antego <antego@users.noreply.github.com> | 2022-05-24 21:32:31 +1000 |
commit | ec9a03a03b512e268dd31571df18e2c37e1ee372 (patch) | |
tree | 86563ae98127dda67871c0af9c0bd7ceb05f6fc8 | |
parent | bf6d540b1043bb944450dfe9da4c91124cdf31d3 (diff) | |
download | gcc-ec9a03a03b512e268dd31571df18e2c37e1ee372.zip gcc-ec9a03a03b512e268dd31571df18e2c37e1ee372.tar.gz gcc-ec9a03a03b512e268dd31571df18e2c37e1ee372.tar.bz2 |
type check
-rw-r--r-- | gcc/rust/hir/tree/rust-hir-expr.h | 13 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-expr.h | 23 |
2 files changed, 36 insertions, 0 deletions
diff --git a/gcc/rust/hir/tree/rust-hir-expr.h b/gcc/rust/hir/tree/rust-hir-expr.h index f6f035e..789ad78 100644 --- a/gcc/rust/hir/tree/rust-hir-expr.h +++ b/gcc/rust/hir/tree/rust-hir-expr.h @@ -3477,6 +3477,19 @@ public: void accept_vis (HIRFullVisitor &vis) override; void accept_vis (HIRExpressionVisitor &vis) override; + std::unique_ptr<Expr> &get_scrutinee_expr () + { + rust_assert (value != nullptr); + return value; + } + + std::vector<std::unique_ptr<Pattern> > &get_patterns () + { + return match_arm_patterns; + } + + BlockExpr *get_if_block () { return if_block.get (); } + ExprType get_expression_type () const final override { return ExprType::IfLet; diff --git a/gcc/rust/typecheck/rust-hir-type-check-expr.h b/gcc/rust/typecheck/rust-hir-type-check-expr.h index b20a048..411d45d 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-expr.h +++ b/gcc/rust/typecheck/rust-hir-type-check-expr.h @@ -703,6 +703,29 @@ public: infered = if_blk_resolved->unify (else_blk_resolved); } + void visit (HIR::IfLetExpr &expr) override + { + // this needs to perform a least upper bound coercion on the blocks and then + // unify the scruintee and arms + TyTy::BaseType *scrutinee_tyty + = TypeCheckExpr::Resolve (expr.get_scrutinee_expr ().get (), false); + + for (auto &pattern : expr.get_patterns ()) + { + TyTy::BaseType *kase_arm_ty + = TypeCheckPattern::Resolve (pattern.get (), scrutinee_tyty); + + TyTy::BaseType *checked_kase = scrutinee_tyty->unify (kase_arm_ty); + if (checked_kase->get_kind () == TyTy::TypeKind::ERROR) + return; + } + + TypeCheckExpr::Resolve (expr.get_if_block (), inside_loop); + + infered + = TyTy::TupleType::get_unit_type (expr.get_mappings ().get_hirid ()); + } + void visit (HIR::BlockExpr &expr) override; void visit (HIR::UnsafeBlockExpr &expr) override |