https://gcc.gnu.org/g:29c6aba1d8dc925a0f43b68928004344ea212987
commit r15-8350-g29c6aba1d8dc925a0f43b68928004344ea212987 Author: badumbatish <tanghocle...@gmail.com> Date: Thu Aug 1 16:18:38 2024 -0700 gccrs: Perform type check on InlineAsm's operand gcc/rust/ChangeLog: * typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit): Perform type check on InlineAsm's operand (typecheck_inline_asm_operand): Likewise Diff: --- gcc/rust/typecheck/rust-hir-type-check-expr.cc | 65 ++++++++++++++++++++++++-- 1 file changed, 60 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 1197916d1f5d..a9255fc69f2a 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-expr.cc +++ b/gcc/rust/typecheck/rust-hir-type-check-expr.cc @@ -623,9 +623,10 @@ TypeCheckExpr::visit (HIR::BlockExpr &expr) && (((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 ()); + infered = loop_context_type_infered + ? loop_context_type + : TyTy::TupleType::get_unit_type ( + expr.get_mappings ().get_hirid ()); } else { @@ -775,9 +776,63 @@ TypeCheckExpr::visit (HIR::RangeToExpr &expr) infered = SubstMapperInternal::Resolve (adt, subst); } +void +typecheck_inline_asm_operand (HIR::InlineAsm &expr) +{ + const auto &operands = expr.get_operands (); + using RegisterType = AST::InlineAsmOperand::RegisterType; + for (auto &operand : operands) + { + switch (operand.get_register_type ()) + { + case RegisterType::In: { + auto in = operand.get_in (); + TypeCheckExpr::Resolve (in.expr.get ()); + break; + } + case RegisterType::Out: { + auto out = operand.get_out (); + TypeCheckExpr::Resolve (out.expr.get ()); + break; + } + case RegisterType::InOut: { + auto in_out = operand.get_in_out (); + TypeCheckExpr::Resolve (in_out.expr.get ()); + break; + } + case RegisterType::SplitInOut: { + auto split_in_out = operand.get_split_in_out (); + TypeCheckExpr::Resolve (split_in_out.in_expr.get ()); + TypeCheckExpr::Resolve (split_in_out.out_expr.get ()); + break; + } + case RegisterType::Const: { + auto anon_const = operand.get_const ().anon_const; + TypeCheckExpr::Resolve (anon_const.expr.get ()); + break; + } + case RegisterType::Sym: { + auto sym = operand.get_sym (); + TypeCheckExpr::Resolve (sym.expr.get ()); + break; + } + case RegisterType::Label: { + auto label = operand.get_label (); + TypeCheckExpr::Resolve (label.expr.get ()); + break; + } + } + } +} void TypeCheckExpr::visit (HIR::InlineAsm &expr) -{} +{ + typecheck_inline_asm_operand (expr); + + // TODO: Hoise out if we have noreturn as an option + // to return a never type + infered = TyTy::TupleType::get_unit_type (expr.get_mappings ().get_hirid ()); +} void TypeCheckExpr::visit (HIR::RangeFullExpr &expr) @@ -1570,7 +1625,7 @@ TypeCheckExpr::visit (HIR::ClosureExpr &expr) TyTy::TyVar result_type = expr.has_return_type () ? TyTy::TyVar ( - TypeCheckType::Resolve (expr.get_return_type ().get ())->get_ref ()) + TypeCheckType::Resolve (expr.get_return_type ().get ())->get_ref ()) : TyTy::TyVar::get_implicit_infer_var (expr.get_locus ()); // resolve the block