aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPhilip Herron <philip.herron@embecosm.com>2021-11-16 13:33:33 +0000
committerPhilip Herron <philip.herron@embecosm.com>2021-11-16 14:06:11 +0000
commitdf3e0ec232b878fb1f2228e5f6ef6ec0874d1665 (patch)
treecef7cd4c5d43e2f61a314287c8182434fde47ace /gcc
parent0f3fc1983d6e322b2f85b0c81b77fbfc0a1c280a (diff)
downloadgcc-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.cc2
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-implitem.h23
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-item.h8
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-stmt.h3
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check.h69
-rw-r--r--gcc/rust/typecheck/rust-tyctx.cc13
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