aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorbadumbatish <tanghocle456@gmail.com>2024-08-01 16:18:38 -0700
committerArthur Cohen <arthur.cohen@embecosm.com>2025-03-19 15:32:07 +0100
commit29c6aba1d8dc925a0f43b68928004344ea212987 (patch)
treea977d026f38951b3ede5718b8227bbeaf4a55859 /gcc
parente91b55fb3b48d219ac50d9744778fc91cb1f7d37 (diff)
downloadgcc-29c6aba1d8dc925a0f43b68928004344ea212987.zip
gcc-29c6aba1d8dc925a0f43b68928004344ea212987.tar.gz
gcc-29c6aba1d8dc925a0f43b68928004344ea212987.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-expr.cc65
1 files 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 1197916..a9255fc 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
{
@@ -776,8 +777,62 @@ TypeCheckExpr::visit (HIR::RangeToExpr &expr)
}
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