Skip to content

Commit

Permalink
gccrs: refactor inference variable computation into a seperate method
Browse files Browse the repository at this point in the history
gcc/rust/ChangeLog:

	* typecheck/rust-hir-type-check.cc (TypeResolution::Resolve): refactor
	* typecheck/rust-hir-type-check.h: new prototype
	* typecheck/rust-typecheck-context.cc (TypeCheckContext::compute_inference_variables): x
  • Loading branch information
philberty committed Feb 4, 2024
1 parent f8e4a9c commit a992065
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 33 deletions.
34 changes: 1 addition & 33 deletions gcc/rust/typecheck/rust-hir-type-check.cc
Original file line number Diff line number Diff line change
Expand Up @@ -76,40 +76,8 @@ TypeResolution::Resolve (HIR::Crate &crate)
if (saw_errors ())
return;

auto mappings = Analysis::Mappings::get ();
auto context = TypeCheckContext::get ();

// default inference variables if possible
context->iterate ([&] (HirId id, TyTy::BaseType *ty) mutable -> bool {
// nothing to do
if (ty->get_kind () != TyTy::TypeKind::INFER)
return true;

TyTy::InferType *infer_var = static_cast<TyTy::InferType *> (ty);
TyTy::BaseType *default_type;
bool ok = infer_var->default_type (&default_type);
if (!ok)
{
rust_error_at (mappings->lookup_location (id), ErrorCode::E0282,
"type annotations needed");
return true;
}
else
{
auto result
= unify_site (id, TyTy::TyWithLocation (ty),
TyTy::TyWithLocation (default_type), UNDEF_LOCATION);
rust_assert (result);
rust_assert (result->get_kind () != TyTy::TypeKind::ERROR);
result->set_ref (id);
context->insert_type (
Analysis::NodeMapping (mappings->get_current_crate (), 0, id,
UNKNOWN_LOCAL_DEFID),
result);
}

return true;
});
context->compute_inference_variables (true);
}

// rust-hir-trait-ref.h
Expand Down
2 changes: 2 additions & 0 deletions gcc/rust/typecheck/rust-hir-type-check.h
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,8 @@ class TypeCheckContext
WARN_UNUSED_RESULT std::vector<TyTy::Region>
regions_from_generic_args (const HIR::GenericArgs &args) const;

void compute_inference_variables (bool error);

private:
TypeCheckContext ();

Expand Down
41 changes: 41 additions & 0 deletions gcc/rust/typecheck/rust-typecheck-context.cc
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
// <http://www.gnu.org/licenses/>.

#include "rust-hir-type-check.h"
#include "rust-type-util.h"

namespace Rust {
namespace Resolver {
Expand Down Expand Up @@ -576,6 +577,46 @@ TypeCheckContext::regions_from_generic_args (const HIR::GenericArgs &args) const
return regions;
}

void
TypeCheckContext::compute_inference_variables (bool error)
{
auto mappings = Analysis::Mappings::get ();

// default inference variables if possible
iterate ([&] (HirId id, TyTy::BaseType *ty) mutable -> bool {
// nothing to do
if (ty->get_kind () != TyTy::TypeKind::INFER)
return true;

TyTy::InferType *infer_var = static_cast<TyTy::InferType *> (ty);
TyTy::BaseType *default_type;

rust_debug_loc (mappings->lookup_location (id),
"trying to default infer-var: %s",
infer_var->as_string ().c_str ());
bool ok = infer_var->default_type (&default_type);
if (!ok)
{
if (error)
rust_error_at (mappings->lookup_location (id), ErrorCode::E0282,
"type annotations needed");
return true;
}

auto result
= unify_site (id, TyTy::TyWithLocation (ty),
TyTy::TyWithLocation (default_type), UNDEF_LOCATION);
rust_assert (result);
rust_assert (result->get_kind () != TyTy::TypeKind::ERROR);
result->set_ref (id);
insert_type (Analysis::NodeMapping (mappings->get_current_crate (), 0, id,
UNKNOWN_LOCAL_DEFID),
result);

return true;
});
}

// TypeCheckContextItem

TypeCheckContextItem::Item::Item (HIR::Function *item) : item (item) {}
Expand Down

0 comments on commit a992065

Please sign in to comment.