aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOwen Avery <powerboat9.gamer@gmail.com>2023-09-01 22:07:30 -0400
committerPhilip Herron <philip.herron@embecosm.com>2023-09-02 22:35:03 +0000
commitcc42db3e7f03aed583ad5dc456ade978ceeaa87d (patch)
treec46c4e47f66fd3bc6bec99d7d8ddabb6dc2a1bf1
parentabf727d29eb7d70e238fd837921f2e5fb4e3fec0 (diff)
downloadgcc-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>
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-expr.cc26
-rw-r--r--gcc/testsuite/rust/compile/type-if.rs5
2 files changed, 29 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 ());
diff --git a/gcc/testsuite/rust/compile/type-if.rs b/gcc/testsuite/rust/compile/type-if.rs
new file mode 100644
index 0000000..f3d0eb6
--- /dev/null
+++ b/gcc/testsuite/rust/compile/type-if.rs
@@ -0,0 +1,5 @@
+pub fn main() -> i32 {
+ if 12 {} // { dg-error "mismatched types" }
+ if 12 {} else {} // { dg-error "mismatched types" }
+ 0
+}