Skip to content

Commit a62630f

Browse files
snprajwalCohenArthur
authored andcommitted
gccrs: use StackedContexts for block context
Replaces the DIY vector stack with a StackedContexts object for block scopes in the type checker context. Fixes #3284. gcc/rust/ChangeLog: * typecheck/rust-hir-type-check.h (class TypeCheckContext): add header file and use StackedContexts for blocks * typecheck/rust-typecheck-context.cc: update methods * typecheck/rust-hir-trait-resolve.cc: refactor function calls * typecheck/rust-hir-type-check-implitem.cc: refactor function calls * typecheck/rust-hir-type-check-type.cc: refactor function calls Signed-off-by: Prajwal S N <[email protected]>
1 parent 26d3103 commit a62630f

5 files changed

+15
-35
lines changed

gcc/rust/typecheck/rust-hir-trait-resolve.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ TraitResolver::resolve_trait (HIR::Trait *trait_reference)
278278
}
279279
self->inherit_bounds (specified_bounds);
280280

281-
context->push_block_context (TypeCheckBlockContextItem (trait_reference));
281+
context->block_context ().enter (TypeCheckBlockContextItem (trait_reference));
282282
std::vector<TraitItemReference> item_refs;
283283
for (auto &item : trait_reference->get_trait_items ())
284284
{
@@ -308,7 +308,7 @@ TraitResolver::resolve_trait (HIR::Trait *trait_reference)
308308
// resolve the blocks of functions etc because it can end up in a recursive
309309
// loop of trying to resolve traits as required by the types
310310
tref->on_resolved ();
311-
context->pop_block_context ();
311+
context->block_context ().exit ();
312312

313313
return tref;
314314
}

gcc/rust/typecheck/rust-hir-type-check-implitem.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -335,9 +335,10 @@ TypeCheckImplItem::Resolve (
335335

336336
// resolve
337337
TypeCheckImplItem resolver (parent, self, substitutions);
338-
resolver.context->push_block_context (TypeCheckBlockContextItem (&parent));
338+
resolver.context->block_context ().enter (
339+
TypeCheckBlockContextItem (&parent));
339340
item.accept_vis (resolver);
340-
resolver.context->pop_block_context ();
341+
resolver.context->block_context ().exit ();
341342

342343
return resolver.result;
343344
}

gcc/rust/typecheck/rust-hir-type-check-type.cc

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -591,10 +591,11 @@ TypeCheckType::resolve_segments (
591591
bool first_segment = i == offset;
592592
bool selfResolveOk = false;
593593

594-
if (first_segment && tySegIsBigSelf && context->have_block_context ()
595-
&& context->peek_block_context ().is_impl_block ())
594+
if (first_segment && tySegIsBigSelf
595+
&& context->block_context ().is_in_context ()
596+
&& context->block_context ().peek ().is_impl_block ())
596597
{
597-
TypeCheckBlockContextItem ctx = context->peek_block_context ();
598+
TypeCheckBlockContextItem ctx = context->block_context ().peek ();
598599
TyTy::BaseType *lookup = nullptr;
599600
selfResolveOk
600601
= resolve_associated_type (seg->as_string (), ctx, &lookup);

gcc/rust/typecheck/rust-hir-type-check.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "rust-hir-map.h"
2323
#include "rust-tyty.h"
2424
#include "rust-hir-trait-reference.h"
25+
#include "rust-stacked-contexts.h"
2526
#include "rust-autoderef.h"
2627
#include "rust-tyty-region.h"
2728
#include "rust-tyty-variance-analysis.h"
@@ -186,10 +187,7 @@ class TypeCheckContext
186187
TyTy::BaseType *return_type);
187188
void pop_return_type ();
188189

189-
bool have_block_context () const;
190-
TypeCheckBlockContextItem peek_block_context ();
191-
void push_block_context (TypeCheckBlockContextItem item);
192-
void pop_block_context ();
190+
StackedContexts<TypeCheckBlockContextItem> &block_context ();
193191

194192
void iterate (std::function<bool (HirId, TyTy::BaseType *)> cb);
195193

@@ -282,7 +280,7 @@ class TypeCheckContext
282280
std::vector<std::pair<TypeCheckContextItem, TyTy::BaseType *>>
283281
return_type_stack;
284282
std::vector<TyTy::BaseType *> loop_type_stack;
285-
std::vector<TypeCheckBlockContextItem> block_stack;
283+
StackedContexts<TypeCheckBlockContextItem> block_stack;
286284
std::map<DefId, TraitReference> trait_context;
287285
std::map<HirId, TyTy::BaseType *> receiver_context;
288286
std::map<HirId, AssociatedImplTrait> associated_impl_traits;

gcc/rust/typecheck/rust-typecheck-context.cc

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -177,30 +177,10 @@ TypeCheckContext::peek_context ()
177177
return return_type_stack.back ().first;
178178
}
179179

180-
bool
181-
TypeCheckContext::have_block_context () const
182-
{
183-
return !block_stack.empty ();
184-
}
185-
186-
TypeCheckBlockContextItem
187-
TypeCheckContext::peek_block_context ()
188-
{
189-
rust_assert (!block_stack.empty ());
190-
return block_stack.back ();
191-
}
192-
193-
void
194-
TypeCheckContext::push_block_context (TypeCheckBlockContextItem block)
195-
{
196-
block_stack.push_back (block);
197-
}
198-
199-
void
200-
TypeCheckContext::pop_block_context ()
180+
StackedContexts<TypeCheckBlockContextItem> &
181+
TypeCheckContext::block_context ()
201182
{
202-
rust_assert (!block_stack.empty ());
203-
block_stack.pop_back ();
183+
return block_stack;
204184
}
205185

206186
void

0 commit comments

Comments
 (0)