Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion gcc/rust/typecheck/rust-hir-type-check.h
Original file line number Diff line number Diff line change
Expand Up @@ -263,13 +263,15 @@ class TypeCheckContext
WARN_UNUSED_RESULT std::vector<TyTy::Region>
regions_from_generic_args (const HIR::GenericArgs &args) const;

void compute_inference_variables (bool error);
void compute_inference_variables (bool emit_error);

TyTy::VarianceAnalysis::CrateCtx &get_variance_analysis_ctx ();

private:
TypeCheckContext ();

bool compute_infer_var (HirId id, TyTy::BaseType *ty, bool emit_error);

std::map<NodeId, HirId> node_id_refs;
std::map<HirId, TyTy::BaseType *> resolved;
std::vector<std::unique_ptr<TyTy::BaseType>> builtins;
Expand Down
67 changes: 36 additions & 31 deletions gcc/rust/typecheck/rust-typecheck-context.cc
Original file line number Diff line number Diff line change
Expand Up @@ -575,43 +575,48 @@ TypeCheckContext::regions_from_generic_args (const HIR::GenericArgs &args) const
}

void
TypeCheckContext::compute_inference_variables (bool error)
TypeCheckContext::compute_inference_variables (bool emit_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;
return compute_infer_var (id, ty, emit_error);
});
}

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);
bool
TypeCheckContext::compute_infer_var (HirId id, TyTy::BaseType *ty,
bool emit_error)
{
auto &mappings = Analysis::Mappings::get ();

// 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 (emit_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_implicit_type (id, result);

return true;
}

TyTy::VarianceAnalysis::CrateCtx &
Expand Down