aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorbadumbatish <tanghocle456@gmail.com>2024-08-01 16:18:38 -0700
committerCohenArthur <arthur.cohen@embecosm.com>2024-09-02 09:44:55 +0000
commit43d38bbb18846e8993860bfac951f655266e150f (patch)
tree84ebcf710bf3cfd677daeafe8b6204a1f6eedb8f /gcc
parentc00fd2aeaaedbf90c0f7d828a19ffb8a89e93657 (diff)
downloadgcc-43d38bbb18846e8993860bfac951f655266e150f.zip
gcc-43d38bbb18846e8993860bfac951f655266e150f.tar.gz
gcc-43d38bbb18846e8993860bfac951f655266e150f.tar.bz2
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 0ce5c78..bb1f32e 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