aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorOwen Avery <powerboat9.gamer@gmail.com>2024-10-15 15:35:21 -0400
committerP-E-P <32375388+P-E-P@users.noreply.github.com>2024-10-16 09:29:59 +0000
commit0b18baee05946a25ab757cac238c52e103e9a861 (patch)
treecdee07480a6aa79147be659b37be19369fcdb43d /gcc
parenteb863f60b61c1d62250a6a1c4d9a95e8a1ac3d39 (diff)
downloadgcc-0b18baee05946a25ab757cac238c52e103e9a861.zip
gcc-0b18baee05946a25ab757cac238c52e103e9a861.tar.gz
gcc-0b18baee05946a25ab757cac238c52e103e9a861.tar.bz2
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>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/resolve/rust-name-resolution-context.cc2
-rw-r--r--gcc/rust/resolve/rust-name-resolution-context.h2
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-pattern.cc30
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 28907dc..05c392d 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 34800ba..13acef3 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 1265564..e5859ed 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)