diff options
author | Jakub Dupak <dev@jakubdupak.com> | 2023-10-16 15:28:03 +0200 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2024-01-16 19:09:21 +0100 |
commit | 1f40ed03c56a3801ee7c8be463d25d175505b713 (patch) | |
tree | 69041aaa4f36a3e7dd76036c7e1b6ce8faf5aba1 /gcc | |
parent | b195d61877e2d0370e616ebef1fb4378cd47b828 (diff) | |
download | gcc-1f40ed03c56a3801ee7c8be463d25d175505b713.zip gcc-1f40ed03c56a3801ee7c8be463d25d175505b713.tar.gz gcc-1f40ed03c56a3801ee7c8be463d25d175505b713.tar.bz2 |
gccrs: typecheck: add loop ctx for labelled block
gcc/rust/ChangeLog:
* typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit): Add loop ctx.
Signed-off-by: Jakub Dupak <dev@jakubdupak.com>
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-expr.cc | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/gcc/rust/typecheck/rust-hir-type-check-expr.cc b/gcc/rust/typecheck/rust-hir-type-check-expr.cc index 4ed8484..7bcd87e 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-expr.cc +++ b/gcc/rust/typecheck/rust-hir-type-check-expr.cc @@ -566,6 +566,10 @@ TypeCheckExpr::visit (HIR::UnsafeBlockExpr &expr) void TypeCheckExpr::visit (HIR::BlockExpr &expr) { + if (expr.has_label ()) + context->push_new_loop_context (expr.get_mappings ().get_hirid (), + expr.get_locus ()); + for (auto &s : expr.get_statements ()) { if (!s->is_item ()) @@ -602,6 +606,20 @@ TypeCheckExpr::visit (HIR::BlockExpr &expr) else if (expr.is_tail_reachable ()) infered = TyTy::TupleType::get_unit_type (expr.get_mappings ().get_hirid ()); + else if (expr.has_label ()) + { + TyTy::BaseType *loop_context_type = context->pop_loop_context (); + + bool loop_context_type_infered + = (loop_context_type->get_kind () != TyTy::TypeKind::INFER) + || ((loop_context_type->get_kind () == TyTy::TypeKind::INFER) + && (((TyTy::InferType *) loop_context_type)->get_infer_kind () + != TyTy::InferType::GENERAL)); + + infered = loop_context_type_infered ? loop_context_type + : TyTy::TupleType::get_unit_type ( + expr.get_mappings ().get_hirid ()); + } else { // FIXME this seems wrong |