diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2021-06-24 13:50:44 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-06-24 13:50:44 +0000 |
commit | c87f2c72dcfa67f1a78fafacaf49043f11c7df6a (patch) | |
tree | 02daa3d23d04cb9c950b15d5a7a94f171e1241db /gcc/rust/backend/rust-compile.cc | |
parent | 23e748d7a6855ce132299cfef9692ee9c681de59 (diff) | |
parent | 92a434a33904608f5659cf7b5d4df3d2a99bd5bd (diff) | |
download | gcc-c87f2c72dcfa67f1a78fafacaf49043f11c7df6a.zip gcc-c87f2c72dcfa67f1a78fafacaf49043f11c7df6a.tar.gz gcc-c87f2c72dcfa67f1a78fafacaf49043f11c7df6a.tar.bz2 |
Merge #523
523: Add support for nested functions r=philberty a=philberty
This is a missed pieces of functionality for statements in rust.
Co-authored-by: Philip Herron <philip.herron@embecosm.com>
Diffstat (limited to 'gcc/rust/backend/rust-compile.cc')
-rw-r--r-- | gcc/rust/backend/rust-compile.cc | 51 |
1 files changed, 37 insertions, 14 deletions
diff --git a/gcc/rust/backend/rust-compile.cc b/gcc/rust/backend/rust-compile.cc index 351271c..5ffd11a 100644 --- a/gcc/rust/backend/rust-compile.cc +++ b/gcc/rust/backend/rust-compile.cc @@ -212,20 +212,8 @@ CompileBlock::visit (HIR::BlockExpr &expr) } std::vector<Bvariable *> locals; - rib->iterate_decls ([&] (NodeId n, Location) mutable -> bool { - Resolver::Definition d; - bool ok = ctx->get_resolver ()->lookup_definition (n, &d); - rust_assert (ok); - - HIR::Stmt *decl = nullptr; - ok = ctx->get_mappings ()->resolve_nodeid_to_stmt (d.parent, &decl); - rust_assert (ok); - - Bvariable *compiled = CompileVarDecl::compile (fndecl, decl, ctx); - locals.push_back (compiled); - - return true; - }); + bool ok = compile_locals_for_block (*rib, fndecl, locals); + rust_assert (ok); Bblock *enclosing_scope = ctx->peek_enclosing_scope (); Bblock *new_block @@ -415,6 +403,41 @@ HIRCompileBase::compile_function_body ( } } +bool +HIRCompileBase::compile_locals_for_block (Resolver::Rib &rib, Bfunction *fndecl, + std::vector<Bvariable *> &locals) +{ + rib.iterate_decls ([&] (NodeId n, Location) mutable -> bool { + Resolver::Definition d; + bool ok = ctx->get_resolver ()->lookup_definition (n, &d); + rust_assert (ok); + + HIR::Stmt *decl = nullptr; + ok = ctx->get_mappings ()->resolve_nodeid_to_stmt (d.parent, &decl); + rust_assert (ok); + + // if its a function we extract this out side of this fn context + // and it is not a local to this function + bool is_item = ctx->get_mappings ()->lookup_hir_item ( + decl->get_mappings ().get_crate_num (), + decl->get_mappings ().get_hirid ()) + != nullptr; + if (is_item) + { + HIR::Item *item = static_cast<HIR::Item *> (decl); + CompileItem::compile (item, ctx, true); + return true; + } + + Bvariable *compiled = CompileVarDecl::compile (fndecl, decl, ctx); + locals.push_back (compiled); + + return true; + }); + + return true; +} + // Mr Mangle time static const std::string kMangledSymbolPrefix = "_ZN"; |