Skip to content

Commit

Permalink
Use nr2.0 in typechecker
Browse files Browse the repository at this point in the history
I probably missed a few spots, but this should cover most of the type
checker.

gcc/rust/ChangeLog:

	* typecheck/rust-hir-type-check-expr.cc: Add includes.
	(TypeCheckExpr::visit): Use name resolver 2.0.
	(TypeCheckExpr::resolve_operator_overload): Likewise.
	(TypeCheckExpr::resolve_fn_trait_call): Likewise.
	* typecheck/rust-hir-type-check-path.cc
	(TypeCheckExpr::visit): Likewise.
	(TypeCheckExpr::resolve_segments): Likewise.
	* typecheck/rust-hir-type-check-type.cc
	(TypeCheckType::resolve_segments): Likewise.
	(ResolveWhereClauseItem::visit): Likewise.
	(TypeCheckType::visit): Avoid usage of
	Resolver::get_unit_type_node_id when handling TupleType, use
	name resolver 2.0 when handling QualifiedPathInType.

gcc/testsuite/ChangeLog:

	* rust/compile/nr2/exclude: Remove entries.

Signed-off-by: Owen Avery <[email protected]>
  • Loading branch information
powerboat9 committed Nov 19, 2024
1 parent 41a1247 commit ce2c34f
Show file tree
Hide file tree
Showing 4 changed files with 155 additions and 41 deletions.
45 changes: 40 additions & 5 deletions gcc/rust/typecheck/rust-hir-type-check-expr.cc
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@
#include "rust-hir-type-check-stmt.h"
#include "rust-hir-type-check-item.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 {
Expand Down Expand Up @@ -1246,8 +1250,17 @@ TypeCheckExpr::visit (HIR::MethodCallExpr &expr)
// store the expected fntype
context->insert_type (expr.get_method_name ().get_mappings (), lookup);

if (flag_name_resolution_2_0)
{
auto &nr_ctx = const_cast<Resolver2_0::NameResolutionContext &> (
Resolver2_0::ImmutableNameResolutionContext::get ().resolver ());

nr_ctx.map_usage (Resolver2_0::Usage (expr.get_mappings ().get_nodeid ()),
Resolver2_0::Definition (resolved_node_id));
}
// set up the resolved name on the path
if (resolver->get_name_scope ().decl_was_declared_here (resolved_node_id))
else if (resolver->get_name_scope ().decl_was_declared_here (
resolved_node_id))
{
resolver->insert_resolved_name (expr.get_mappings ().get_nodeid (),
resolved_node_id);
Expand Down Expand Up @@ -1835,8 +1848,19 @@ TypeCheckExpr::resolve_operator_overload (LangItem::Kind lang_item_type,
context->insert_operator_overload (expr.get_mappings ().get_hirid (), type);

// set up the resolved name on the path
resolver->insert_resolved_name (expr.get_mappings ().get_nodeid (),
resolved_node_id);
if (flag_name_resolution_2_0)
{
auto &nr_ctx = const_cast<Resolver2_0::NameResolutionContext &> (
Resolver2_0::ImmutableNameResolutionContext::get ().resolver ());

nr_ctx.map_usage (Resolver2_0::Usage (expr.get_mappings ().get_nodeid ()),
Resolver2_0::Definition (resolved_node_id));
}
else
{
resolver->insert_resolved_name (expr.get_mappings ().get_nodeid (),
resolved_node_id);
}

// return the result of the function back
infered = function_ret_tyty;
Expand Down Expand Up @@ -2005,8 +2029,19 @@ TypeCheckExpr::resolve_fn_trait_call (HIR::CallExpr &expr,
context->insert_operator_overload (expr.get_mappings ().get_hirid (), fn);

// set up the resolved name on the path
resolver->insert_resolved_name (expr.get_mappings ().get_nodeid (),
resolved_node_id);
if (flag_name_resolution_2_0)
{
auto &nr_ctx = const_cast<Resolver2_0::NameResolutionContext &> (
Resolver2_0::ImmutableNameResolutionContext::get ().resolver ());

nr_ctx.map_usage (Resolver2_0::Usage (expr.get_mappings ().get_nodeid ()),
Resolver2_0::Definition (resolved_node_id));
}
else
{
resolver->insert_resolved_name (expr.get_mappings ().get_nodeid (),
resolved_node_id);
}

// return the result of the function back
*result = function_ret_tyty;
Expand Down
27 changes: 24 additions & 3 deletions gcc/rust/typecheck/rust-hir-type-check-path.cc
Original file line number Diff line number Diff line change
Expand Up @@ -155,8 +155,20 @@ TypeCheckExpr::visit (HIR::QualifiedPathInExpression &expr)
bool fully_resolved = expr.get_segments ().size () <= 1;
if (fully_resolved)
{
resolver->insert_resolved_name (expr.get_mappings ().get_nodeid (),
root_resolved_node_id);
if (flag_name_resolution_2_0)
{
auto &nr_ctx = const_cast<Resolver2_0::NameResolutionContext &> (
Resolver2_0::ImmutableNameResolutionContext::get ().resolver ());

nr_ctx.map_usage (Resolver2_0::Usage (
expr.get_mappings ().get_nodeid ()),
Resolver2_0::Definition (root_resolved_node_id));
}
else
{
resolver->insert_resolved_name (expr.get_mappings ().get_nodeid (),
root_resolved_node_id);
}
context->insert_receiver (expr.get_mappings ().get_hirid (), root);
return;
}
Expand Down Expand Up @@ -493,8 +505,17 @@ TypeCheckExpr::resolve_segments (NodeId root_resolved_node_id,
rust_assert (resolved_node_id != UNKNOWN_NODEID);
context->insert_receiver (expr_mappings.get_hirid (), prev_segment);

if (flag_name_resolution_2_0)
{
auto &nr_ctx = const_cast<Resolver2_0::NameResolutionContext &> (
Resolver2_0::ImmutableNameResolutionContext::get ().resolver ());

nr_ctx.map_usage (Resolver2_0::Usage (expr_mappings.get_nodeid ()),
Resolver2_0::Definition (resolved_node_id));
}
// name scope first
if (resolver->get_name_scope ().decl_was_declared_here (resolved_node_id))
else if (resolver->get_name_scope ().decl_was_declared_here (
resolved_node_id))
{
resolver->insert_resolved_name (expr_mappings.get_nodeid (),
resolved_node_id);
Expand Down
122 changes: 91 additions & 31 deletions gcc/rust/typecheck/rust-hir-type-check-type.cc
Original file line number Diff line number Diff line change
Expand Up @@ -109,12 +109,7 @@ TypeCheckType::visit (HIR::TupleType &tuple)
{
if (tuple.is_unit_type ())
{
auto unit_node_id = resolver->get_unit_type_node_id ();
if (!context->lookup_builtin (unit_node_id, &translated))
{
rust_error_at (tuple.get_locus (),
"failed to lookup builtin unit type");
}
translated = TyTy::TupleType::get_unit_type ();
return;
}

Expand Down Expand Up @@ -175,9 +170,25 @@ TypeCheckType::visit (HIR::QualifiedPathInType &path)
{
// then this is just a normal path-in-expression
NodeId root_resolved_node_id = UNKNOWN_NODEID;
bool ok = resolver->lookup_resolved_type (
qual_path_type.get_type ()->get_mappings ().get_nodeid (),
&root_resolved_node_id);
bool ok = false;
if (flag_name_resolution_2_0)
{
auto &nr_ctx
= Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();

if (auto id = nr_ctx.lookup (
qual_path_type.get_type ()->get_mappings ().get_nodeid ()))
{
root_resolved_node_id = *id;
ok = true;
}
}
else
{
ok = resolver->lookup_resolved_type (
qual_path_type.get_type ()->get_mappings ().get_nodeid (),
&root_resolved_node_id);
}
rust_assert (ok);

translated = resolve_segments (root_resolved_node_id,
Expand Down Expand Up @@ -325,8 +336,21 @@ TypeCheckType::visit (HIR::QualifiedPathInType &path)
bool fully_resolved = path.get_segments ().empty ();
if (fully_resolved)
{
resolver->insert_resolved_type (path.get_mappings ().get_nodeid (),
root_resolved_node_id);
if (flag_name_resolution_2_0)
{
auto &nr_ctx = const_cast<Resolver2_0::NameResolutionContext &> (
Resolver2_0::ImmutableNameResolutionContext::get ().resolver ());

nr_ctx.map_usage (Resolver2_0::Usage (
path.get_mappings ().get_nodeid ()),
Resolver2_0::Definition (root_resolved_node_id));
}
else
{
resolver->insert_resolved_type (path.get_mappings ().get_nodeid (),
root_resolved_node_id);
}

context->insert_receiver (path.get_mappings ().get_hirid (), root);
return;
}
Expand Down Expand Up @@ -597,33 +621,53 @@ TypeCheckType::resolve_segments (
context->insert_receiver (expr_mappings.get_hirid (), prev_segment);
rust_assert (resolved_node_id != UNKNOWN_NODEID);

// lookup if the name resolver was able to canonically resolve this or not
NodeId path_resolved_id = UNKNOWN_NODEID;
if (resolver->lookup_resolved_name (expr_mappings.get_nodeid (),
&path_resolved_id))
{
rust_assert (path_resolved_id == resolved_node_id);
}
// check the type scope
else if (resolver->lookup_resolved_type (expr_mappings.get_nodeid (),
&path_resolved_id))
if (flag_name_resolution_2_0)
{
rust_assert (path_resolved_id == resolved_node_id);
auto &nr_ctx = const_cast<Resolver2_0::NameResolutionContext &> (
Resolver2_0::ImmutableNameResolutionContext::get ().resolver ());

auto old = nr_ctx.lookup (expr_mappings.get_nodeid ());
if (old.has_value ())
{
rust_assert (*old == resolved_node_id);
}
else
{
nr_ctx.map_usage (Resolver2_0::Usage (expr_mappings.get_nodeid ()),
Resolver2_0::Definition (resolved_node_id));
}
}
else
{
// name scope first
if (resolver->get_name_scope ().decl_was_declared_here (resolved_node_id))
// lookup if the name resolver was able to canonically resolve this or not
NodeId path_resolved_id = UNKNOWN_NODEID;
if (resolver->lookup_resolved_name (expr_mappings.get_nodeid (),
&path_resolved_id))
{
resolver->insert_resolved_name (expr_mappings.get_nodeid (),
resolved_node_id);
rust_assert (path_resolved_id == resolved_node_id);
}
// check the type scope
else if (resolver->get_type_scope ().decl_was_declared_here (
resolved_node_id))
else if (resolver->lookup_resolved_type (expr_mappings.get_nodeid (),
&path_resolved_id))
{
resolver->insert_resolved_type (expr_mappings.get_nodeid (),
resolved_node_id);
rust_assert (path_resolved_id == resolved_node_id);
}
else
{
// name scope first
if (resolver->get_name_scope ().decl_was_declared_here (
resolved_node_id))
{
resolver->insert_resolved_name (expr_mappings.get_nodeid (),
resolved_node_id);
}
// check the type scope
else if (resolver->get_type_scope ().decl_was_declared_here (
resolved_node_id))
{
resolver->insert_resolved_type (expr_mappings.get_nodeid (),
resolved_node_id);
}
}
}

Expand Down Expand Up @@ -995,7 +1039,23 @@ ResolveWhereClauseItem::visit (HIR::TypeBoundWhereClauseItem &item)

// then lookup the reference_node_id
NodeId ref_node_id = UNKNOWN_NODEID;
if (!resolver->lookup_resolved_type (ast_node_id, &ref_node_id))
if (flag_name_resolution_2_0)
{
auto &nr_ctx
= Resolver2_0::ImmutableNameResolutionContext::get ().resolver ();

if (auto id = nr_ctx.lookup (ast_node_id))
ref_node_id = *id;
}
else
{
NodeId id = UNKNOWN_NODEID;

if (resolver->lookup_resolved_type (ast_node_id, &id))
ref_node_id = id;
}

if (ref_node_id == UNKNOWN_NODEID)
{
// FIXME
rust_error_at (UNDEF_LOCATION,
Expand Down
2 changes: 0 additions & 2 deletions gcc/testsuite/rust/compile/nr2/exclude
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,6 @@ issue-2330.rs
issue-2375.rs
issue-2478.rs
issue-2479.rs
issue-2514.rs
issue-2723-1.rs
issue-2723-2.rs
issue-2772-1.rs
Expand Down Expand Up @@ -198,7 +197,6 @@ issue-3046.rs
unknown-associated-item.rs
issue-3030.rs
issue-3035.rs
issue-3082.rs
issue-3139-1.rs
issue-3139-2.rs
issue-3139-3.rs
Expand Down

0 comments on commit ce2c34f

Please sign in to comment.