https://gcc.gnu.org/g:1c13bc20ca23774567e192a47d894cad362086df

commit r15-8593-g1c13bc20ca23774567e192a47d894cad362086df
Author: Prajwal S N <prajwalnadi...@gmail.com>
Date:   Mon Dec 16 13:29:46 2024 +0530

    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 <prajwalnadi...@gmail.com>

Diff:
---
 gcc/rust/typecheck/rust-hir-trait-resolve.cc       |  4 ++--
 gcc/rust/typecheck/rust-hir-type-check-implitem.cc |  5 +++--
 gcc/rust/typecheck/rust-hir-type-check-type.cc     |  7 +++---
 gcc/rust/typecheck/rust-hir-type-check.h           |  8 +++----
 gcc/rust/typecheck/rust-typecheck-context.cc       | 26 +++-------------------
 5 files changed, 15 insertions(+), 35 deletions(-)

diff --git a/gcc/rust/typecheck/rust-hir-trait-resolve.cc 
b/gcc/rust/typecheck/rust-hir-trait-resolve.cc
index 14e26f4512b8..82019328e16a 100644
--- a/gcc/rust/typecheck/rust-hir-trait-resolve.cc
+++ b/gcc/rust/typecheck/rust-hir-trait-resolve.cc
@@ -278,7 +278,7 @@ TraitResolver::resolve_trait (HIR::Trait *trait_reference)
     }
   self->inherit_bounds (specified_bounds);
 
-  context->push_block_context (TypeCheckBlockContextItem (trait_reference));
+  context->block_context ().enter (TypeCheckBlockContextItem 
(trait_reference));
   std::vector<TraitItemReference> item_refs;
   for (auto &item : trait_reference->get_trait_items ())
     {
@@ -308,7 +308,7 @@ TraitResolver::resolve_trait (HIR::Trait *trait_reference)
   // resolve the blocks of functions etc because it can end up in a recursive
   // loop of trying to resolve traits as required by the types
   tref->on_resolved ();
-  context->pop_block_context ();
+  context->block_context ().exit ();
 
   return tref;
 }
diff --git a/gcc/rust/typecheck/rust-hir-type-check-implitem.cc 
b/gcc/rust/typecheck/rust-hir-type-check-implitem.cc
index 4521822410c9..937a8a8d0efc 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-implitem.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-implitem.cc
@@ -335,9 +335,10 @@ TypeCheckImplItem::Resolve (
 
   // resolve
   TypeCheckImplItem resolver (parent, self, substitutions);
-  resolver.context->push_block_context (TypeCheckBlockContextItem (&parent));
+  resolver.context->block_context ().enter (
+    TypeCheckBlockContextItem (&parent));
   item.accept_vis (resolver);
-  resolver.context->pop_block_context ();
+  resolver.context->block_context ().exit ();
 
   return resolver.result;
 }
diff --git a/gcc/rust/typecheck/rust-hir-type-check-type.cc 
b/gcc/rust/typecheck/rust-hir-type-check-type.cc
index 859cdfedcd0b..bb23f8441edd 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-type.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-type.cc
@@ -591,10 +591,11 @@ TypeCheckType::resolve_segments (
       bool first_segment = i == offset;
       bool selfResolveOk = false;
 
-      if (first_segment && tySegIsBigSelf && context->have_block_context ()
-         && context->peek_block_context ().is_impl_block ())
+      if (first_segment && tySegIsBigSelf
+         && context->block_context ().is_in_context ()
+         && context->block_context ().peek ().is_impl_block ())
        {
-         TypeCheckBlockContextItem ctx = context->peek_block_context ();
+         TypeCheckBlockContextItem ctx = context->block_context ().peek ();
          TyTy::BaseType *lookup = nullptr;
          selfResolveOk
            = resolve_associated_type (seg->as_string (), ctx, &lookup);
diff --git a/gcc/rust/typecheck/rust-hir-type-check.h 
b/gcc/rust/typecheck/rust-hir-type-check.h
index 08c3d354f795..ef1f2dd02148 100644
--- a/gcc/rust/typecheck/rust-hir-type-check.h
+++ b/gcc/rust/typecheck/rust-hir-type-check.h
@@ -22,6 +22,7 @@
 #include "rust-hir-map.h"
 #include "rust-tyty.h"
 #include "rust-hir-trait-reference.h"
+#include "rust-stacked-contexts.h"
 #include "rust-autoderef.h"
 #include "rust-tyty-region.h"
 #include "rust-tyty-variance-analysis.h"
@@ -186,10 +187,7 @@ public:
                         TyTy::BaseType *return_type);
   void pop_return_type ();
 
-  bool have_block_context () const;
-  TypeCheckBlockContextItem peek_block_context ();
-  void push_block_context (TypeCheckBlockContextItem item);
-  void pop_block_context ();
+  StackedContexts<TypeCheckBlockContextItem> &block_context ();
 
   void iterate (std::function<bool (HirId, TyTy::BaseType *)> cb);
 
@@ -282,7 +280,7 @@ private:
   std::vector<std::pair<TypeCheckContextItem, TyTy::BaseType *>>
     return_type_stack;
   std::vector<TyTy::BaseType *> loop_type_stack;
-  std::vector<TypeCheckBlockContextItem> block_stack;
+  StackedContexts<TypeCheckBlockContextItem> block_stack;
   std::map<DefId, TraitReference> trait_context;
   std::map<HirId, TyTy::BaseType *> receiver_context;
   std::map<HirId, AssociatedImplTrait> associated_impl_traits;
diff --git a/gcc/rust/typecheck/rust-typecheck-context.cc 
b/gcc/rust/typecheck/rust-typecheck-context.cc
index e72ce41606d0..8ff8839f7336 100644
--- a/gcc/rust/typecheck/rust-typecheck-context.cc
+++ b/gcc/rust/typecheck/rust-typecheck-context.cc
@@ -177,30 +177,10 @@ TypeCheckContext::peek_context ()
   return return_type_stack.back ().first;
 }
 
-bool
-TypeCheckContext::have_block_context () const
-{
-  return !block_stack.empty ();
-}
-
-TypeCheckBlockContextItem
-TypeCheckContext::peek_block_context ()
-{
-  rust_assert (!block_stack.empty ());
-  return block_stack.back ();
-}
-
-void
-TypeCheckContext::push_block_context (TypeCheckBlockContextItem block)
-{
-  block_stack.push_back (block);
-}
-
-void
-TypeCheckContext::pop_block_context ()
+StackedContexts<TypeCheckBlockContextItem> &
+TypeCheckContext::block_context ()
 {
-  rust_assert (!block_stack.empty ());
-  block_stack.pop_back ();
+  return block_stack;
 }
 
 void

Reply via email to