aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/backend/rust-compile.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/rust/backend/rust-compile.cc')
-rw-r--r--gcc/rust/backend/rust-compile.cc70
1 files changed, 28 insertions, 42 deletions
diff --git a/gcc/rust/backend/rust-compile.cc b/gcc/rust/backend/rust-compile.cc
index 56d3e40..f97f701 100644
--- a/gcc/rust/backend/rust-compile.cc
+++ b/gcc/rust/backend/rust-compile.cc
@@ -322,12 +322,21 @@ CompileExpr::visit (HIR::MethodCallExpr &expr)
return;
}
- // lookup compiled functions
+ // address of compiled function
+ Bexpression *fn_expr = ctx->get_backend ()->error_expression ();
+
+ // lookup compiled functions since it may have already been compiled
Bfunction *fn = nullptr;
- if (!ctx->lookup_function_decl (fntype->get_ty_ref (), &fn))
+ if (ctx->lookup_function_decl (fntype->get_ty_ref (), &fn))
+ {
+ fn_expr
+ = ctx->get_backend ()->function_code_expression (fn, expr.get_locus ());
+ }
+ else
{
- // this might fail because its a forward decl so we can attempt to
- // resolve it now
+ // Now we can try and resolve the address since this might be a forward
+ // declared function, generic function which has not be compiled yet or
+ // its an not yet trait bound function
HIR::ImplItem *resolved_item = ctx->get_mappings ()->lookup_hir_implitem (
expr.get_mappings ().get_crate_num (), ref, nullptr);
if (resolved_item == nullptr)
@@ -380,16 +389,9 @@ CompileExpr::visit (HIR::MethodCallExpr &expr)
return;
}
- CompileTraitItem::Compile (self_type,
- trait_item_ref->get_hir_trait_item (),
- ctx, fntype);
- if (!ctx->lookup_function_decl (fntype->get_ty_ref (), &fn))
- {
- translated = ctx->get_backend ()->error_expression ();
- rust_error_at (expr.get_locus (),
- "forward declaration was not compiled");
- return;
- }
+ fn_expr = CompileTraitItem::Compile (
+ self_type, trait_item_ref->get_hir_trait_item (), ctx, fntype,
+ true, expr.get_locus ());
}
else
{
@@ -418,20 +420,13 @@ CompileExpr::visit (HIR::MethodCallExpr &expr)
}
if (!fntype->has_subsititions_defined ())
- CompileInherentImplItem::Compile (self_type, impl_item, ctx,
- true);
+ fn_expr
+ = CompileInherentImplItem::Compile (self_type, impl_item, ctx,
+ true);
else
- CompileInherentImplItem::Compile (self_type, impl_item, ctx,
- true, fntype);
-
- if (!ctx->lookup_function_decl (
- impl_item->get_impl_mappings ().get_hirid (), &fn))
- {
- translated = ctx->get_backend ()->error_expression ();
- rust_error_at (expr.get_locus (),
- "forward declaration was not compiled");
- return;
- }
+ fn_expr
+ = CompileInherentImplItem::Compile (self_type, impl_item, ctx,
+ true, fntype);
}
}
else
@@ -446,25 +441,16 @@ CompileExpr::visit (HIR::MethodCallExpr &expr)
}
if (!fntype->has_subsititions_defined ())
- CompileInherentImplItem::Compile (self_type, resolved_item, ctx,
- true);
+ fn_expr
+ = CompileInherentImplItem::Compile (self_type, resolved_item, ctx,
+ true);
else
- CompileInherentImplItem::Compile (self_type, resolved_item, ctx,
- true, fntype);
-
- if (!ctx->lookup_function_decl (fntype->get_ty_ref (), &fn))
- {
- translated = ctx->get_backend ()->error_expression ();
- rust_error_at (expr.get_locus (),
- "forward declaration was not compiled");
- return;
- }
+ fn_expr
+ = CompileInherentImplItem::Compile (self_type, resolved_item, ctx,
+ true, fntype);
}
}
- Bexpression *fn_expr
- = ctx->get_backend ()->function_code_expression (fn, expr.get_locus ());
-
std::vector<Bexpression *> args;
// lookup the autoderef mappings