diff options
author | Owen Avery <powerboat9.gamer@gmail.com> | 2023-09-01 22:07:30 -0400 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2023-09-02 22:35:03 +0000 |
commit | cc42db3e7f03aed583ad5dc456ade978ceeaa87d (patch) | |
tree | c46c4e47f66fd3bc6bec99d7d8ddabb6dc2a1bf1 /gcc/rust | |
parent | abf727d29eb7d70e238fd837921f2e5fb4e3fec0 (diff) | |
download | gcc-cc42db3e7f03aed583ad5dc456ade978ceeaa87d.zip gcc-cc42db3e7f03aed583ad5dc456ade978ceeaa87d.tar.gz gcc-cc42db3e7f03aed583ad5dc456ade978ceeaa87d.tar.bz2 |
Improve type checking for if expressions
gcc/rust/ChangeLog:
* typecheck/rust-hir-type-check-expr.cc
(TypeCheckExpr::visit): Expect if conditions to have type bool.
gcc/testsuite/ChangeLog:
* rust/compile/type-if.rs: New test.
Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
Diffstat (limited to 'gcc/rust')
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-expr.cc | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/gcc/rust/typecheck/rust-hir-type-check-expr.cc b/gcc/rust/typecheck/rust-hir-type-check-expr.cc index 8df1fdf..7d86abb 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-expr.cc +++ b/gcc/rust/typecheck/rust-hir-type-check-expr.cc @@ -444,7 +444,18 @@ TypeCheckExpr::visit (HIR::NegationExpr &expr) void TypeCheckExpr::visit (HIR::IfExpr &expr) { - TypeCheckExpr::Resolve (expr.get_if_condition ().get ()); + TyTy::BaseType *bool_ty = nullptr; + bool ok = context->lookup_builtin ("bool", &bool_ty); + rust_assert (ok); + + TyTy::BaseType *cond_type + = TypeCheckExpr::Resolve (expr.get_if_condition ().get ()); + + unify_site (expr.get_mappings ().get_hirid (), TyTy::TyWithLocation (bool_ty), + TyTy::TyWithLocation (cond_type, + expr.get_if_condition ()->get_locus ()), + expr.get_locus ()); + TypeCheckExpr::Resolve (expr.get_if_block ().get ()); infered = TyTy::TupleType::get_unit_type (expr.get_mappings ().get_hirid ()); @@ -453,7 +464,18 @@ TypeCheckExpr::visit (HIR::IfExpr &expr) void TypeCheckExpr::visit (HIR::IfExprConseqElse &expr) { - TypeCheckExpr::Resolve (expr.get_if_condition ().get ()); + TyTy::BaseType *bool_ty = nullptr; + bool ok = context->lookup_builtin ("bool", &bool_ty); + rust_assert (ok); + + TyTy::BaseType *cond_type + = TypeCheckExpr::Resolve (expr.get_if_condition ().get ()); + + unify_site (expr.get_mappings ().get_hirid (), TyTy::TyWithLocation (bool_ty), + TyTy::TyWithLocation (cond_type, + expr.get_if_condition ()->get_locus ()), + expr.get_locus ()); + auto if_blk_resolved = TypeCheckExpr::Resolve (expr.get_if_block ().get ()); auto else_blk_resolved = TypeCheckExpr::Resolve (expr.get_else_block ().get ()); |