diff options
author | Philip Herron <philip.herron@embecosm.com> | 2021-11-16 13:33:33 +0000 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2021-11-16 14:06:11 +0000 |
commit | df3e0ec232b878fb1f2228e5f6ef6ec0874d1665 (patch) | |
tree | cef7cd4c5d43e2f61a314287c8182434fde47ace /gcc | |
parent | 0f3fc1983d6e322b2f85b0c81b77fbfc0a1c280a (diff) | |
download | gcc-df3e0ec232b878fb1f2228e5f6ef6ec0874d1665.zip gcc-df3e0ec232b878fb1f2228e5f6ef6ec0874d1665.tar.gz gcc-df3e0ec232b878fb1f2228e5f6ef6ec0874d1665.tar.bz2 |
Add new TypeCheckContextItem to track current context
FIXME
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/rust/typecheck/rust-hir-trait-resolve.cc | 2 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-implitem.h | 23 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-item.h | 8 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-stmt.h | 3 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check.h | 69 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-tyctx.cc | 13 |
6 files changed, 100 insertions, 18 deletions
diff --git a/gcc/rust/typecheck/rust-hir-trait-resolve.cc b/gcc/rust/typecheck/rust-hir-trait-resolve.cc index cee6999..b2deb91 100644 --- a/gcc/rust/typecheck/rust-hir-trait-resolve.cc +++ b/gcc/rust/typecheck/rust-hir-trait-resolve.cc @@ -116,7 +116,7 @@ TraitItemReference::resolve_item (HIR::TraitItemFunc &func) // need to get the return type from this TyTy::FnType *resolved_fn_type = static_cast<TyTy::FnType *> (item_tyty); auto expected_ret_tyty = resolved_fn_type->get_return_type (); - context->push_return_type (expected_ret_tyty); + context->push_return_type (TypeCheckContextItem (&func), expected_ret_tyty); auto block_expr_ty = TypeCheckExpr::Resolve (func.get_block_expr ().get (), false); diff --git a/gcc/rust/typecheck/rust-hir-type-check-implitem.h b/gcc/rust/typecheck/rust-hir-type-check-implitem.h index 062d60b..64853f5 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-implitem.h +++ b/gcc/rust/typecheck/rust-hir-type-check-implitem.h @@ -310,9 +310,10 @@ class TypeCheckImplItem : public TypeCheckBase public: using Rust::Resolver::TypeCheckBase::visit; - static void Resolve (HIR::ImplItem *item, TyTy::BaseType *self) + static void Resolve (HIR::ImplBlock *parent, HIR::ImplItem *item, + TyTy::BaseType *self) { - TypeCheckImplItem resolver (self); + TypeCheckImplItem resolver (parent, self); item->accept_vis (resolver); } @@ -336,7 +337,8 @@ public: // need to get the return type from this TyTy::FnType *resolve_fn_type = static_cast<TyTy::FnType *> (lookup); auto expected_ret_tyty = resolve_fn_type->get_return_type (); - context->push_return_type (expected_ret_tyty); + context->push_return_type (TypeCheckContextItem (parent, &function), + expected_ret_tyty); auto block_expr_ty = TypeCheckExpr::Resolve (function.get_definition ().get (), false); @@ -346,8 +348,11 @@ public: } protected: - TypeCheckImplItem (TyTy::BaseType *self) : TypeCheckBase (), self (self) {} + TypeCheckImplItem (HIR::ImplBlock *parent, TyTy::BaseType *self) + : TypeCheckBase (), parent (parent), self (self) + {} + HIR::ImplBlock *parent; TyTy::BaseType *self; }; @@ -357,11 +362,12 @@ class TypeCheckImplItemWithTrait : public TypeCheckImplItem public: static const TraitItemReference & - Resolve (HIR::ImplItem *item, TyTy::BaseType *self, + Resolve (HIR::ImplBlock *parent, HIR::ImplItem *item, TyTy::BaseType *self, TraitReference &trait_reference, std::vector<TyTy::SubstitutionParamMapping> substitutions) { - TypeCheckImplItemWithTrait resolver (self, trait_reference, substitutions); + TypeCheckImplItemWithTrait resolver (parent, self, trait_reference, + substitutions); item->accept_vis (resolver); return resolver.resolved_trait_item; } @@ -514,9 +520,10 @@ public: private: TypeCheckImplItemWithTrait ( - TyTy::BaseType *self, TraitReference &trait_reference, + HIR::ImplBlock *parent, TyTy::BaseType *self, + TraitReference &trait_reference, std::vector<TyTy::SubstitutionParamMapping> substitutions) - : TypeCheckImplItem (self), trait_reference (trait_reference), + : TypeCheckImplItem (parent, self), trait_reference (trait_reference), resolved_trait_item (TraitItemReference::error_node ()), substitutions (substitutions) { diff --git a/gcc/rust/typecheck/rust-hir-type-check-item.h b/gcc/rust/typecheck/rust-hir-type-check-item.h index 706f649..cc102df 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-item.h +++ b/gcc/rust/typecheck/rust-hir-type-check-item.h @@ -118,11 +118,12 @@ public: for (auto &impl_item : impl_block.get_impl_items ()) { if (!is_trait_impl_block) - TypeCheckImplItem::Resolve (impl_item.get (), self); + TypeCheckImplItem::Resolve (&impl_block, impl_item.get (), self); else { auto &trait_item_ref - = TypeCheckImplItemWithTrait::Resolve (impl_item.get (), self, + = TypeCheckImplItemWithTrait::Resolve (&impl_block, + impl_item.get (), self, *trait_reference, substitutions); trait_item_refs.push_back (trait_item_ref); @@ -210,7 +211,8 @@ public: // need to get the return type from this TyTy::FnType *resolved_fn_type = static_cast<TyTy::FnType *> (lookup); auto expected_ret_tyty = resolved_fn_type->get_return_type (); - context->push_return_type (expected_ret_tyty); + context->push_return_type (TypeCheckContextItem (&function), + expected_ret_tyty); auto block_expr_ty = TypeCheckExpr::Resolve (function.get_definition ().get (), false); diff --git a/gcc/rust/typecheck/rust-hir-type-check-stmt.h b/gcc/rust/typecheck/rust-hir-type-check-stmt.h index 8df43d9..fb0e047 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-stmt.h +++ b/gcc/rust/typecheck/rust-hir-type-check-stmt.h @@ -424,7 +424,8 @@ public: TyTy::FnType *resolved_fn_type = fnType; auto expected_ret_tyty = resolved_fn_type->get_return_type (); - context->push_return_type (expected_ret_tyty); + context->push_return_type (TypeCheckContextItem (&function), + expected_ret_tyty); auto block_expr_ty = TypeCheckExpr::Resolve (function.get_definition ().get (), false); diff --git a/gcc/rust/typecheck/rust-hir-type-check.h b/gcc/rust/typecheck/rust-hir-type-check.h index aa10f41..b165f9c 100644 --- a/gcc/rust/typecheck/rust-hir-type-check.h +++ b/gcc/rust/typecheck/rust-hir-type-check.h @@ -28,6 +28,68 @@ namespace Rust { namespace Resolver { +class TypeCheckContextItem +{ +public: + enum ItemType + { + ITEM, + IMPL_ITEM, + TRAIT_ITEM, + }; + + TypeCheckContextItem (HIR::Function *item) + : type (ItemType::ITEM), item (item) + {} + + TypeCheckContextItem (HIR::ImplBlock *impl_block, HIR::Function *item) + : type (ItemType::IMPL_ITEM), item (impl_block, item) + {} + + TypeCheckContextItem (HIR::TraitItemFunc *trait_item) + : type (ItemType::TRAIT_ITEM), item (trait_item) + {} + + ItemType get_type () const { return type; } + + HIR::Function *get_item () + { + rust_assert (get_type () == ItemType::ITEM); + return item.item; + } + + std::pair<HIR::ImplBlock *, HIR::Function *> &get_impl_item () + { + rust_assert (get_type () == ItemType::IMPL_ITEM); + return item.impl_item; + }; + + HIR::TraitItemFunc *get_trait_item () + { + rust_assert (get_type () == ItemType::TRAIT_ITEM); + return item.trait_item; + } + +private: + union Item + { + HIR::Function *item; + std::pair<HIR::ImplBlock *, HIR::Function *> impl_item; + HIR::TraitItemFunc *trait_item; + + Item (HIR::Function *item) : item (item) {} + + Item (HIR::ImplBlock *impl_block, HIR::Function *item) + : impl_item ({impl_block, item}) + {} + + Item (HIR::TraitItemFunc *trait_item) : trait_item (trait_item) {} + }; + + ItemType type; + Item item; +}; + class TypeCheckContext { public: @@ -49,7 +111,9 @@ public: bool lookup_type_by_node_id (NodeId ref, HirId *id); TyTy::BaseType *peek_return_type (); - void push_return_type (TyTy::BaseType *return_type); + TypeCheckContextItem &peek_context (); + void push_return_type (TypeCheckContextItem item, + TyTy::BaseType *return_type); void pop_return_type (); void iterate (std::function<bool (HirId, TyTy::BaseType *)> cb) @@ -238,7 +302,8 @@ private: std::map<NodeId, HirId> node_id_refs; std::map<HirId, TyTy::BaseType *> resolved; std::vector<std::unique_ptr<TyTy::BaseType>> builtins; - std::vector<TyTy::BaseType *> return_type_stack; + std::vector<std::pair<TypeCheckContextItem, TyTy::BaseType *>> + return_type_stack; std::vector<TyTy::BaseType *> loop_type_stack; std::map<DefId, TraitReference> trait_context; std::map<HirId, TyTy::BaseType *> receiver_context; diff --git a/gcc/rust/typecheck/rust-tyctx.cc b/gcc/rust/typecheck/rust-tyctx.cc index 02907d7..31f8ae5 100644 --- a/gcc/rust/typecheck/rust-tyctx.cc +++ b/gcc/rust/typecheck/rust-tyctx.cc @@ -122,13 +122,14 @@ TypeCheckContext::lookup_type_by_node_id (NodeId ref, HirId *id) TyTy::BaseType * TypeCheckContext::peek_return_type () { - return return_type_stack.back (); + return return_type_stack.back ().second; } void -TypeCheckContext::push_return_type (TyTy::BaseType *return_type) +TypeCheckContext::push_return_type (TypeCheckContextItem item, + TyTy::BaseType *return_type) { - return_type_stack.push_back (return_type); + return_type_stack.push_back ({std::move (item), return_type}); } void @@ -137,5 +138,11 @@ TypeCheckContext::pop_return_type () return_type_stack.pop_back (); } +TypeCheckContextItem & +TypeCheckContext::peek_context () +{ + return return_type_stack.back ().first; +} + } // namespace Resolver } // namespace Rust |