aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorantego <antego@users.noreply.github.com>2022-05-12 21:32:53 +1000
committerantego <antego@users.noreply.github.com>2022-05-24 21:32:31 +1000
commitec9a03a03b512e268dd31571df18e2c37e1ee372 (patch)
tree86563ae98127dda67871c0af9c0bd7ceb05f6fc8 /gcc
parentbf6d540b1043bb944450dfe9da4c91124cdf31d3 (diff)
downloadgcc-ec9a03a03b512e268dd31571df18e2c37e1ee372.zip
gcc-ec9a03a03b512e268dd31571df18e2c37e1ee372.tar.gz
gcc-ec9a03a03b512e268dd31571df18e2c37e1ee372.tar.bz2
type check
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/hir/tree/rust-hir-expr.h13
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-expr.h23
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