https://gcc.gnu.org/g:215139e7e81edb17447a97f7612b581eeedf8f20

commit r15-2575-g215139e7e81edb17447a97f7612b581eeedf8f20
Author: Pierre-Emmanuel Patry <pierre-emmanuel.pa...@embecosm.com>
Date:   Wed Mar 13 16:44:00 2024 +0100

    gccrs: Prevent getting immutable context with classic nr
    
    Immutable name resolution context is not initialized when the classic
    name resolution is in use. It can therefore not be used, the getter would
    error out.
    
    gcc/rust/ChangeLog:
    
            * typecheck/rust-hir-type-check-path.cc 
(TypeCheckExpr::resolve_root_path):
            Only get immutable name resolution context when name resolution 2.0 
is
            used.
            * typecheck/rust-hir-type-check-type.cc 
(TypeCheckType::resolve_root_path):
            Likewise.
    
    Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.pa...@embecosm.com>

Diff:
---
 gcc/rust/typecheck/rust-hir-type-check-path.cc | 14 ++++++++------
 gcc/rust/typecheck/rust-hir-type-check-type.cc | 17 +++++++++--------
 2 files changed, 17 insertions(+), 14 deletions(-)

diff --git a/gcc/rust/typecheck/rust-hir-type-check-path.cc 
b/gcc/rust/typecheck/rust-hir-type-check-path.cc
index b0e52c454e9d..dd6ab03a3627 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-path.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-path.cc
@@ -199,16 +199,18 @@ TypeCheckExpr::resolve_root_path (HIR::PathInExpression 
&expr, size_t *offset,
       bool is_root = *offset == 0;
       NodeId ast_node_id = seg.get_mappings ().get_nodeid ();
 
-      auto nr_ctx
-       = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
-
       // then lookup the reference_node_id
       NodeId ref_node_id = UNKNOWN_NODEID;
 
       if (flag_name_resolution_2_0)
-       // assign the ref_node_id if we've found something
-       nr_ctx.lookup (expr.get_mappings ().get_nodeid ())
-         .map ([&ref_node_id] (NodeId resolved) { ref_node_id = resolved; });
+       {
+         auto nr_ctx
+           = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+
+         // assign the ref_node_id if we've found something
+         nr_ctx.lookup (expr.get_mappings ().get_nodeid ())
+           .map ([&ref_node_id] (NodeId resolved) { ref_node_id = resolved; });
+       }
       else if (!resolver->lookup_resolved_name (ast_node_id, &ref_node_id))
        resolver->lookup_resolved_type (ast_node_id, &ref_node_id);
 
diff --git a/gcc/rust/typecheck/rust-hir-type-check-type.cc 
b/gcc/rust/typecheck/rust-hir-type-check-type.cc
index 588e5bce88e1..44ebc159b23a 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-type.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-type.cc
@@ -341,19 +341,20 @@ TypeCheckType::resolve_root_path (HIR::TypePath &path, 
size_t *offset,
       bool is_root = *offset == 0;
       NodeId ast_node_id = seg->get_mappings ().get_nodeid ();
 
-      auto nr_ctx
-       = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
-
       // then lookup the reference_node_id
       NodeId ref_node_id = UNKNOWN_NODEID;
 
       // FIXME: HACK: ARTHUR: Remove this
       if (flag_name_resolution_2_0)
-       // assign the ref_node_id if we've found something
-       nr_ctx.lookup (path.get_mappings ().get_nodeid ())
-         .map ([&ref_node_id, &path] (NodeId resolved) {
-           ref_node_id = resolved;
-         });
+       {
+         auto nr_ctx
+           = Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();
+         // assign the ref_node_id if we've found something
+         nr_ctx.lookup (path.get_mappings ().get_nodeid ())
+           .map ([&ref_node_id, &path] (NodeId resolved) {
+             ref_node_id = resolved;
+           });
+       }
       else if (!resolver->lookup_resolved_name (ast_node_id, &ref_node_id))
        resolver->lookup_resolved_type (ast_node_id, &ref_node_id);

Reply via email to