diff --git a/src/shared/cplusplus/Bind.cpp b/src/shared/cplusplus/Bind.cpp
index 3e440efa81a835a503bb4f55307641438ae1d4a0..e57a62bfafde0ed7c123083c73350661fc6dcbc0 100644
--- a/src/shared/cplusplus/Bind.cpp
+++ b/src/shared/cplusplus/Bind.cpp
@@ -1036,12 +1036,14 @@ bool Bind::visit(CaseStatementAST *ast)
 
 bool Bind::visit(CompoundStatementAST *ast)
 {
-    // unsigned lbrace_token = ast->lbrace_token;
+    Block *block = control()->newBlock(ast->firstToken());
+    ast->symbol = block;
+    _scope->addMember(block);
+    Scope *previousScope = switchScope(block);
     for (StatementListAST *it = ast->statement_list; it; it = it->next) {
         this->statement(it->value);
     }
-    // unsigned rbrace_token = ast->rbrace_token;
-    // Block *symbol = ast->symbol;
+    (void) switchScope(previousScope);
     return false;
 }
 
@@ -1708,10 +1710,13 @@ bool Bind::visit(FunctionDefinitionAST *ast)
 
     this->ctorInitializer(ast->ctor_initializer, fun);
 
-    if (! _skipFunctionBodies) {
+    if (! _skipFunctionBodies && ast->function_body) {
         Scope *previousScope = switchScope(fun);
         this->statement(ast->function_body);
         (void) switchScope(previousScope);
+
+        if (CompoundStatementAST *c = ast->function_body->asCompoundStatement())
+            fun->setBlock(c->symbol);
     }
 
     // Function *symbol = ast->symbol;