https://gcc.gnu.org/g:75db9aed8d9103f180acb9630603be0858ac87d2
commit r15-8805-g75db9aed8d9103f180acb9630603be0858ac87d2 Author: Benjamin Thos <benjamin.t...@epita.fr> Date: Mon Dec 16 14:11:38 2024 +0100 gccrs: 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.t...@epita.fr> Diff: --- gcc/rust/typecheck/rust-hir-type-check-expr.cc | 13 +++++++++++-- gcc/testsuite/rust/compile/if-without-else.rs | 9 +++++++++ gcc/testsuite/rust/compile/implicit_returns_err3.rs | 2 +- gcc/testsuite/rust/compile/torture/if.rs | 8 ++++++-- 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 85d717535ed7..4e57d6a8ffbc 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 000000000000..1a0f6449d703 --- /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 ac9821377989..f0330aca9c09 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 bcd520f66a93..3b753a71eb2f 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 +}