aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorBenjamin Thos <benjamin.thos@epita.fr>2024-12-16 14:11:38 +0100
committerCohenArthur <arthur.cohen@embecosm.com>2025-02-17 09:40:03 +0000
commit7afc39068eb803ae2937ab6d22f93ab68d627173 (patch)
treef85195a04945e7fa0ad5f9caac37238be26f864c /gcc
parent681805f7eeaf0ff15045892d289f7e4fe0ea589c (diff)
downloadgcc-7afc39068eb803ae2937ab6d22f93ab68d627173.zip
gcc-7afc39068eb803ae2937ab6d22f93ab68d627173.tar.gz
gcc-7afc39068eb803ae2937ab6d22f93ab68d627173.tar.bz2
Add type check on if-expr
Check if an if-expr returns void type or a coercible type like an early return. gcc/rust/ChangeLog: * typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit): Add check on if-expr. gcc/testsuite/ChangeLog: * rust/compile/implicit_returns_err3.rs: Change test to be valid. * rust/compile/torture/if.rs: Likewise. * rust/compile/if-without-else.rs: New test. Signed-off-by: Benjamin Thos <benjamin.thos@epita.fr>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-expr.cc13
-rw-r--r--gcc/testsuite/rust/compile/if-without-else.rs9
-rw-r--r--gcc/testsuite/rust/compile/implicit_returns_err3.rs2
-rw-r--r--gcc/testsuite/rust/compile/torture/if.rs8
4 files changed, 27 insertions, 5 deletions
diff --git a/gcc/rust/typecheck/rust-hir-type-check-expr.cc b/gcc/rust/typecheck/rust-hir-type-check-expr.cc
index 99edcc3..8d00011 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-expr.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-expr.cc
@@ -526,9 +526,18 @@ TypeCheckExpr::visit (HIR::IfExpr &expr)
expr.get_if_condition ().get_locus ()),
expr.get_locus ());
- TypeCheckExpr::Resolve (expr.get_if_block ());
+ TyTy::BaseType *block_type = TypeCheckExpr::Resolve (expr.get_if_block ());
- infered = TyTy::TupleType::get_unit_type ();
+ TyTy::BaseType *unit_ty = nullptr;
+ ok = context->lookup_builtin ("()", &unit_ty);
+ rust_assert (ok);
+
+ infered
+ = coercion_site (expr.get_mappings ().get_hirid (),
+ TyTy::TyWithLocation (unit_ty),
+ TyTy::TyWithLocation (block_type,
+ expr.get_if_block ().get_locus ()),
+ expr.get_locus ());
}
void
diff --git a/gcc/testsuite/rust/compile/if-without-else.rs b/gcc/testsuite/rust/compile/if-without-else.rs
new file mode 100644
index 0000000..1a0f644
--- /dev/null
+++ b/gcc/testsuite/rust/compile/if-without-else.rs
@@ -0,0 +1,9 @@
+fn foo(pred: bool) -> u8 {
+ if pred { // { dg-error "mismatched types" }
+ 1
+ }
+ 3
+}
+
+fn main(){
+}
diff --git a/gcc/testsuite/rust/compile/implicit_returns_err3.rs b/gcc/testsuite/rust/compile/implicit_returns_err3.rs
index ac98213..f0330ac 100644
--- a/gcc/testsuite/rust/compile/implicit_returns_err3.rs
+++ b/gcc/testsuite/rust/compile/implicit_returns_err3.rs
@@ -1,6 +1,6 @@
fn test(x: i32) -> i32 { // { dg-error "mismatched types, expected .i32. but got ...." }
if x > 1 {
- 1
+ return 1;
}
}
diff --git a/gcc/testsuite/rust/compile/torture/if.rs b/gcc/testsuite/rust/compile/torture/if.rs
index bcd520f..3b753a7 100644
--- a/gcc/testsuite/rust/compile/torture/if.rs
+++ b/gcc/testsuite/rust/compile/torture/if.rs
@@ -4,6 +4,10 @@ fn foo() -> bool {
fn bar() {}
+fn baz(a: i32) {
+ a;
+}
+
struct Foo1 {
one: i32
}
@@ -13,7 +17,7 @@ fn main() {
if foo() {
bar();
let a = Foo1{one: 1};
- a.one
+ baz (a.one);
}
-} \ No newline at end of file
+}