diff options
author | Owen Avery <powerboat9.gamer@gmail.com> | 2024-10-15 15:35:21 -0400 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2025-03-19 15:32:17 +0100 |
commit | 9753ae307b89cc1e6934ecc16736abe2158a7333 (patch) | |
tree | 6d7667050b2b7044b327d9fc0099f492fb3ff57e | |
parent | 1f1eeb5ac040a6a83e608fdfcac81a9e96d11b11 (diff) | |
download | gcc-9753ae307b89cc1e6934ecc16736abe2158a7333.zip gcc-9753ae307b89cc1e6934ecc16736abe2158a7333.tar.gz gcc-9753ae307b89cc1e6934ecc16736abe2158a7333.tar.bz2 |
gccrs: Use name resolver 2.0 during pattern typechecking
gcc/rust/ChangeLog:
* typecheck/rust-hir-type-check-pattern.cc: Add includes.
(TypeCheckPattern::visit): Use name resolver 2.0 if enabled.
* resolve/rust-name-resolution-context.cc
(NameResolutionContext::lookup): Make const qualified.
* resolve/rust-name-resolution-context.h
(NameResolutionContext::lookup): Likewise.
Signed-off-by: Owen Avery <powerboat9.gamer@gmail.com>
-rw-r--r-- | gcc/rust/resolve/rust-name-resolution-context.cc | 2 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-name-resolution-context.h | 2 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-pattern.cc | 30 |
3 files changed, 26 insertions, 8 deletions
diff --git a/gcc/rust/resolve/rust-name-resolution-context.cc b/gcc/rust/resolve/rust-name-resolution-context.cc index d79f7b5..9bfaa09 100644 --- a/gcc/rust/resolve/rust-name-resolution-context.cc +++ b/gcc/rust/resolve/rust-name-resolution-context.cc @@ -92,7 +92,7 @@ NameResolutionContext::map_usage (Usage usage, Definition definition) } tl::optional<NodeId> -NameResolutionContext::lookup (NodeId usage) +NameResolutionContext::lookup (NodeId usage) const { auto it = resolved_nodes.find (Usage (usage)); diff --git a/gcc/rust/resolve/rust-name-resolution-context.h b/gcc/rust/resolve/rust-name-resolution-context.h index e2652dc..cd6fa93 100644 --- a/gcc/rust/resolve/rust-name-resolution-context.h +++ b/gcc/rust/resolve/rust-name-resolution-context.h @@ -213,7 +213,7 @@ public: // TODO: Use newtype pattern for Usage and Definition void map_usage (Usage usage, Definition definition); - tl::optional<NodeId> lookup (NodeId usage); + tl::optional<NodeId> lookup (NodeId usage) const; private: /* Map of "usage" nodes which have been resolved to a "definition" node */ diff --git a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc index 5319636..88e4d32f 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc +++ b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc @@ -20,6 +20,10 @@ #include "rust-hir-pattern.h" #include "rust-hir-type-check-expr.h" #include "rust-type-util.h" +#include "rust-immutable-name-resolution-context.h" + +// for flag_name_resolution_2_0 +#include "options.h" namespace Rust { namespace Resolver { @@ -49,12 +53,26 @@ TypeCheckPattern::visit (HIR::PathInExpression &pattern) NodeId ref_node_id = UNKNOWN_NODEID; bool maybe_item = false; - maybe_item - |= resolver->lookup_resolved_name (pattern.get_mappings ().get_nodeid (), - &ref_node_id); - maybe_item - |= resolver->lookup_resolved_type (pattern.get_mappings ().get_nodeid (), - &ref_node_id); + + if (flag_name_resolution_2_0) + { + auto &nr_ctx + = Resolver2_0::ImmutableNameResolutionContext::get ().resolver (); + + if (auto id = nr_ctx.lookup (pattern.get_mappings ().get_nodeid ())) + { + ref_node_id = *id; + maybe_item = true; + } + } + else + { + maybe_item |= resolver->lookup_resolved_name ( + pattern.get_mappings ().get_nodeid (), &ref_node_id); + maybe_item |= resolver->lookup_resolved_type ( + pattern.get_mappings ().get_nodeid (), &ref_node_id); + } + bool path_is_const_item = false; if (maybe_item) |