From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1643) id D79F1380E18B; Wed, 8 Jun 2022 12:49:28 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org D79F1380E18B Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Thomas Schwinge To: gcc-cvs@gcc.gnu.org Subject: [gcc/devel/rust/master] type check X-Act-Checkin: gcc X-Git-Author: antego X-Git-Refname: refs/heads/devel/rust/master X-Git-Oldrev: bf6d540b1043bb944450dfe9da4c91124cdf31d3 X-Git-Newrev: ec9a03a03b512e268dd31571df18e2c37e1ee372 Message-Id: <20220608124928.D79F1380E18B@sourceware.org> Date: Wed, 8 Jun 2022 12:49:28 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 08 Jun 2022 12:49:28 -0000 https://gcc.gnu.org/g:ec9a03a03b512e268dd31571df18e2c37e1ee372 commit ec9a03a03b512e268dd31571df18e2c37e1ee372 Author: antego Date: Thu May 12 21:32:53 2022 +1000 type check Diff: --- gcc/rust/hir/tree/rust-hir-expr.h | 13 +++++++++++++ gcc/rust/typecheck/rust-hir-type-check-expr.h | 23 +++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/gcc/rust/hir/tree/rust-hir-expr.h b/gcc/rust/hir/tree/rust-hir-expr.h index f6f035e2134..789ad78ffa2 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 &get_scrutinee_expr () + { + rust_assert (value != nullptr); + return value; + } + + std::vector > &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 b20a048865d..411d45de41f 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