Explorar o código

The next part of a for loop is an expression, not a statement (#1285)

This should not parse:

	contract C {
	    function f() external {
		for (uint256 i = 0; i < 100; uint256 x = 0) {}
	    }
	}

Fixes https://github.com/hyperledger/solang/issues/1283.

Signed-off-by: Sean Young <sean@mess.org>
Sean Young %!s(int64=2) %!d(string=hai) anos
pai
achega
77a1a21e01

+ 1 - 1
solang-parser/src/helpers/fmt.rs

@@ -2285,7 +2285,7 @@ mod tests {
                     loc!(),
                     None,
                     Some(Box::new(expr!(true))),
-                    Some(Box::new(pt::Statement::Expression(loc!(), expr!(++i)))),
+                    Some(Box::new(expr!(++i))),
                     Some(Box::new(stmt!({})))
                 ) => "for (; true; ++i) {}",
 

+ 1 - 1
solang-parser/src/pt.rs

@@ -1446,7 +1446,7 @@ pub enum Statement {
         Loc,
         Option<Box<Statement>>,
         Option<Box<Expression>>,
-        Option<Box<Statement>>,
+        Option<Box<Expression>>,
         Option<Box<Statement>>,
     ),
     /// `do <1> while ({2});`

+ 3 - 3
solang-parser/src/solidity.lalrpop

@@ -768,7 +768,7 @@ OpenStatement: Statement = {
     <l:@L> "if" "(" <cond:Expression> ")" <body:ClosedStatement> "else" <o:OpenStatement> <r:@R> => {
         Statement::If(Loc::File(file_no, l, r), cond, Box::new(body), Some(Box::new(o)))
     },
-    <l:@L> "for" "(" <b:SimpleStatement?> ";" <c:Expression?> ";" <n:SimpleStatement?> ")" <block:OpenStatement> <r:@R> => {
+    <l:@L> "for" "(" <b:SimpleStatement?> ";" <c:Expression?> ";" <n:Expression?> ")" <block:OpenStatement> <r:@R> => {
         Statement::For(Loc::File(file_no, l, r), b.map(Box::new), c.map(Box::new), n.map(Box::new), Some(Box::new(block)))
     },
     <l:@L> "while" "(" <e:Expression> ")" <b:OpenStatement> <r:@R> => {
@@ -784,10 +784,10 @@ ClosedStatement: Statement = {
     <l:@L> "while" "(" <e:Expression> ")" <b:ClosedStatement> <r:@R> => {
         Statement::While(Loc::File(file_no, l, r), e, Box::new(b))
     },
-    <l:@L> "for" "(" <b:SimpleStatement?> ";" <c:Expression?> ";" <n:SimpleStatement?> ")" <block:ClosedStatement> <r:@R> => {
+    <l:@L> "for" "(" <b:SimpleStatement?> ";" <c:Expression?> ";" <n:Expression?> ")" <block:ClosedStatement> <r:@R> => {
         Statement::For(Loc::File(file_no, l, r), b.map(Box::new), c.map(Box::new), n.map(Box::new), Some(Box::new(block)))
     },
-    <l:@L> "for" "(" <b:SimpleStatement?> ";" <c:Expression?> ";" <n:SimpleStatement?> ")" <r:@R> ";" => {
+    <l:@L> "for" "(" <b:SimpleStatement?> ";" <c:Expression?> ";" <n:Expression?> ")" <r:@R> ";" => {
         Statement::For(Loc::File(file_no, l, r), b.map(Box::new), c.map(Box::new), n.map(Box::new), None)
     }
 }

+ 2 - 2
src/bin/languageserver/mod.rs

@@ -255,8 +255,8 @@ impl<'a> Builder<'a> {
                 for stat in init {
                     self.statement(stat, symtab);
                 }
-                for stat in next {
-                    self.statement(stat, symtab);
+                if let Some(exp) = next {
+                    self.expression(exp, symtab);
                 }
                 for stat in body {
                     self.statement(stat, symtab);

+ 8 - 31
src/codegen/statements.rs

@@ -384,7 +384,7 @@ pub(crate) fn statement(
 
             loops.new_scope(
                 end_block,
-                if next.is_empty() {
+                if next.is_none() {
                     body_block
                 } else {
                     next_block
@@ -421,22 +421,10 @@ pub(crate) fn statement(
             if body_reachable {
                 cfg.set_basic_block(next_block);
 
-                if !next.is_empty() {
-                    for stmt in next {
-                        statement(
-                            stmt,
-                            func,
-                            cfg,
-                            contract_no,
-                            ns,
-                            vartab,
-                            loops,
-                            placeholder,
-                            return_override,
-                            opt,
-                        );
-                        body_reachable = stmt.reachable();
-                    }
+                if let Some(next) = next {
+                    expression(next, cfg, contract_no, Some(func), ns, vartab, opt);
+
+                    body_reachable = next.ty() != Type::Unreachable;
                 }
 
                 if body_reachable {
@@ -530,21 +518,10 @@ pub(crate) fn statement(
 
             let mut next_reachable = true;
 
-            for stmt in next {
-                statement(
-                    stmt,
-                    func,
-                    cfg,
-                    contract_no,
-                    ns,
-                    vartab,
-                    loops,
-                    placeholder,
-                    return_override,
-                    opt,
-                );
+            if let Some(next) = next {
+                expression(next, cfg, contract_no, Some(func), ns, vartab, opt);
 
-                next_reachable = stmt.reachable();
+                next_reachable = next.ty() != Type::Unreachable;
             }
 
             if next_reachable {

+ 2 - 8
src/sema/ast.rs

@@ -1615,7 +1615,7 @@ pub enum Statement {
         reachable: bool,
         init: Vec<Statement>,
         cond: Option<Expression>,
-        next: Vec<Statement>,
+        next: Option<Expression>,
         body: Vec<Statement>,
     },
     DoWhile(pt::Loc, bool, Vec<Statement>, Expression),
@@ -1689,9 +1689,7 @@ impl Recurse for Statement {
                         stmt.recurse(cx, f);
                     }
                 }
-                Statement::For {
-                    init, next, body, ..
-                } => {
+                Statement::For { init, body, .. } => {
                     for stmt in init {
                         stmt.recurse(cx, f);
                     }
@@ -1699,10 +1697,6 @@ impl Recurse for Statement {
                     for stmt in body {
                         stmt.recurse(cx, f);
                     }
-
-                    for stmt in next {
-                        stmt.recurse(cx, f);
-                    }
                 }
                 Statement::While(_, _, _, body) => {
                     for stmt in body {

+ 3 - 1
src/sema/dotgraphviz.rs

@@ -1520,7 +1520,9 @@ impl Dot {
                     if let Some(cond) = cond {
                         self.add_expression(cond, Some(func), ns, parent, String::from("cond"));
                     }
-                    self.add_statement(next, func, ns, parent, String::from("next"));
+                    if let Some(next) = next {
+                        self.add_expression(next, Some(func), ns, parent, String::from("next"));
+                    }
                     self.add_statement(body, func, ns, parent, String::from("body"));
                 }
                 Statement::DoWhile(loc, _, body, cond) => {

+ 3 - 1
src/sema/mutability.rs

@@ -188,7 +188,9 @@ fn recurse_statements(stmts: &[Statement], ns: &Namespace, state: &mut StateChec
                 if let Some(cond) = cond {
                     cond.recurse(state, read_expression);
                 }
-                recurse_statements(next, ns, state);
+                if let Some(next) = next {
+                    next.recurse(state, read_expression);
+                }
                 recurse_statements(body, ns, state);
             }
             Statement::Expression(_, _, expr) => {

+ 19 - 21
src/sema/statements.rs

@@ -555,7 +555,7 @@ fn statement(
             ));
             Err(())
         }
-        pt::Statement::For(loc, init_stmt, None, next_stmt, body_stmt) => {
+        pt::Statement::For(loc, init_stmt, None, next_expr, body_stmt) => {
             symtable.new_scope();
 
             let mut init = Vec::new();
@@ -590,18 +590,17 @@ fn statement(
 
             let control = loops.leave_scope();
             let reachable = control.no_breaks > 0;
-            let mut next = Vec::new();
+            let mut next = None;
 
-            if let Some(next_stmt) = next_stmt {
-                statement(
-                    next_stmt,
-                    &mut next,
+            if let Some(next_expr) = next_expr {
+                next = Some(expression(
+                    next_expr,
                     context,
-                    symtable,
-                    loops,
                     ns,
+                    symtable,
                     diagnostics,
-                )?;
+                    ResolveTo::Type(&Type::Bool),
+                )?);
             }
 
             symtable.leave_scope();
@@ -617,12 +616,12 @@ fn statement(
 
             Ok(reachable)
         }
-        pt::Statement::For(loc, init_stmt, Some(cond_expr), next_stmt, body_stmt) => {
+        pt::Statement::For(loc, init_stmt, Some(cond_expr), next_expr, body_stmt) => {
             symtable.new_scope();
 
             let mut init = Vec::new();
             let mut body = Vec::new();
-            let mut next = Vec::new();
+            let mut next = None;
 
             if let Some(init_stmt) = init_stmt {
                 statement(
@@ -636,7 +635,7 @@ fn statement(
                 )?;
             }
 
-            let expr = expression(
+            let cond = expression(
                 cond_expr,
                 context,
                 ns,
@@ -645,7 +644,7 @@ fn statement(
                 ResolveTo::Type(&Type::Bool),
             )?;
 
-            let cond = expr.cast(&cond_expr.loc(), &Type::Bool, true, ns, diagnostics)?;
+            let cond = cond.cast(&cond_expr.loc(), &Type::Bool, true, ns, diagnostics)?;
 
             // continue goes to next, and if that does exist, cond
             loops.new_scope();
@@ -669,17 +668,16 @@ fn statement(
                 body_reachable = true;
             }
 
-            if body_reachable {
-                if let Some(next_stmt) = next_stmt {
-                    statement(
-                        next_stmt,
-                        &mut next,
+            if let Some(next_expr) = next_expr {
+                if body_reachable {
+                    next = Some(expression(
+                        next_expr,
                         context,
-                        symtable,
-                        loops,
                         ns,
+                        symtable,
                         diagnostics,
-                    )?;
+                        ResolveTo::Type(&Type::Bool),
+                    )?);
                 }
             }
 

+ 1 - 1
src/sema/tests/mod.rs

@@ -100,7 +100,7 @@ fn test_statement_reachable() {
                 reachable: false,
                 init: vec![],
                 cond: None,
-                next: vec![],
+                next: None,
                 body: vec![],
             },
             false,

+ 86 - 90
tests/contract_testcases/solana/address_member_call.dot

@@ -22,57 +22,55 @@ strict digraph "tests/contract_testcases/solana/address_member_call.sol" {
 	variable_22 [label="variable: i\nuint8\ntests/contract_testcases/solana/address_member_call.sol:25:27-28"]
 	builtins_23 [label="builtin ArrayLength\ntests/contract_testcases/solana/address_member_call.sol:25:31-48"]
 	variable_24 [label="variable: _receivers\naddress[]\ntests/contract_testcases/solana/address_member_call.sol:25:31-41"]
-	expr_25 [label="expression\ntests/contract_testcases/solana/address_member_call.sol:25:50-53"]
 	post_increment [label="post increment\nuint8\ntests/contract_testcases/solana/address_member_call.sol:25:50-53"]
-	variable_27 [label="variable: i\nuint8\ntests/contract_testcases/solana/address_member_call.sol:25:50-51"]
-	expr_28 [label="expression\ntests/contract_testcases/solana/address_member_call.sol:26:13-33"]
+	variable_26 [label="variable: i\nuint8\ntests/contract_testcases/solana/address_member_call.sol:25:50-51"]
+	expr_27 [label="expression\ntests/contract_testcases/solana/address_member_call.sol:26:13-33"]
 	assign [label="assign\nuint64\ntests/contract_testcases/solana/address_member_call.sol:26:13-33"]
-	variable_30 [label="variable: total\nuint64\ntests/contract_testcases/solana/address_member_call.sol:26:13-18"]
+	variable_29 [label="variable: total\nuint64\ntests/contract_testcases/solana/address_member_call.sol:26:13-18"]
 	add [label="add\nuint64\ntests/contract_testcases/solana/address_member_call.sol:26:13-33"]
-	variable_32 [label="variable: total\nuint64\ntests/contract_testcases/solana/address_member_call.sol:26:13-18"]
+	variable_31 [label="variable: total\nuint64\ntests/contract_testcases/solana/address_member_call.sol:26:13-18"]
 	load [label="load uint64\ntests/contract_testcases/solana/address_member_call.sol:26:22-33"]
 	subscript [label="subscript uint64[]\ntests/contract_testcases/solana/address_member_call.sol:26:22-33"]
-	variable_35 [label="variable: _amounts\nuint64[]\ntests/contract_testcases/solana/address_member_call.sol:26:22-30"]
-	variable_36 [label="variable: i\nuint8\ntests/contract_testcases/solana/address_member_call.sol:26:31-32"]
-	expr_37 [label="expression\ntests/contract_testcases/solana/address_member_call.sol:28:9-31:10"]
-	builtins_38 [label="builtin Require\ntests/contract_testcases/solana/address_member_call.sol:28:9-16"]
-	equal_39 [label="equal\ntests/contract_testcases/solana/address_member_call.sol:29:13-27"]
-	variable_40 [label="variable: total\nuint64\ntests/contract_testcases/solana/address_member_call.sol:29:13-18"]
-	variable_41 [label="variable: value\nuint64\ntests/contract_testcases/solana/address_member_call.sol:29:22-27"]
-	alloc_array_42 [label="alloc array string\ninitializer: 546f74616c207061796d656e742076616c756520646f6573206e6f74206d617463682065746865722073656e74\ntests/contract_testcases/solana/address_member_call.sol:30:13-60"]
-	number_literal_43 [label="uint32 literal: 45\ntests/contract_testcases/solana/address_member_call.sol:30:13-60"]
-	for_44 [label="for\ntests/contract_testcases/solana/address_member_call.sol:33:9-35:10"]
-	var_decl_45 [label="variable decl uint8 i\ntests/contract_testcases/solana/address_member_call.sol:33:14-25"]
-	number_literal_46 [label="uint8 literal: 0\ntests/contract_testcases/solana/address_member_call.sol:33:24-25"]
-	less_47 [label="less\ntests/contract_testcases/solana/address_member_call.sol:33:27-48"]
-	zero_ext_48 [label="zero extend uint32\ntests/contract_testcases/solana/address_member_call.sol:33:27-28"]
-	variable_49 [label="variable: i\nuint8\ntests/contract_testcases/solana/address_member_call.sol:33:27-28"]
-	builtins_50 [label="builtin ArrayLength\ntests/contract_testcases/solana/address_member_call.sol:33:31-48"]
-	variable_51 [label="variable: _receivers\naddress[]\ntests/contract_testcases/solana/address_member_call.sol:33:31-41"]
-	expr_52 [label="expression\ntests/contract_testcases/solana/address_member_call.sol:33:50-53"]
-	post_increment_53 [label="post increment\nuint8\ntests/contract_testcases/solana/address_member_call.sol:33:50-53"]
-	variable_54 [label="variable: i\nuint8\ntests/contract_testcases/solana/address_member_call.sol:33:50-51"]
-	expr_55 [label="expression\ntests/contract_testcases/solana/address_member_call.sol:34:13-57"]
-	builtins_56 [label="builtin PayableTransfer\ntests/contract_testcases/solana/address_member_call.sol:34:13-57"]
+	variable_34 [label="variable: _amounts\nuint64[]\ntests/contract_testcases/solana/address_member_call.sol:26:22-30"]
+	variable_35 [label="variable: i\nuint8\ntests/contract_testcases/solana/address_member_call.sol:26:31-32"]
+	expr_36 [label="expression\ntests/contract_testcases/solana/address_member_call.sol:28:9-31:10"]
+	builtins_37 [label="builtin Require\ntests/contract_testcases/solana/address_member_call.sol:28:9-16"]
+	equal_38 [label="equal\ntests/contract_testcases/solana/address_member_call.sol:29:13-27"]
+	variable_39 [label="variable: total\nuint64\ntests/contract_testcases/solana/address_member_call.sol:29:13-18"]
+	variable_40 [label="variable: value\nuint64\ntests/contract_testcases/solana/address_member_call.sol:29:22-27"]
+	alloc_array_41 [label="alloc array string\ninitializer: 546f74616c207061796d656e742076616c756520646f6573206e6f74206d617463682065746865722073656e74\ntests/contract_testcases/solana/address_member_call.sol:30:13-60"]
+	number_literal_42 [label="uint32 literal: 45\ntests/contract_testcases/solana/address_member_call.sol:30:13-60"]
+	for_43 [label="for\ntests/contract_testcases/solana/address_member_call.sol:33:9-35:10"]
+	var_decl_44 [label="variable decl uint8 i\ntests/contract_testcases/solana/address_member_call.sol:33:14-25"]
+	number_literal_45 [label="uint8 literal: 0\ntests/contract_testcases/solana/address_member_call.sol:33:24-25"]
+	less_46 [label="less\ntests/contract_testcases/solana/address_member_call.sol:33:27-48"]
+	zero_ext_47 [label="zero extend uint32\ntests/contract_testcases/solana/address_member_call.sol:33:27-28"]
+	variable_48 [label="variable: i\nuint8\ntests/contract_testcases/solana/address_member_call.sol:33:27-28"]
+	builtins_49 [label="builtin ArrayLength\ntests/contract_testcases/solana/address_member_call.sol:33:31-48"]
+	variable_50 [label="variable: _receivers\naddress[]\ntests/contract_testcases/solana/address_member_call.sol:33:31-41"]
+	post_increment_51 [label="post increment\nuint8\ntests/contract_testcases/solana/address_member_call.sol:33:50-53"]
+	variable_52 [label="variable: i\nuint8\ntests/contract_testcases/solana/address_member_call.sol:33:50-51"]
+	expr_53 [label="expression\ntests/contract_testcases/solana/address_member_call.sol:34:13-57"]
+	builtins_54 [label="builtin PayableTransfer\ntests/contract_testcases/solana/address_member_call.sol:34:13-57"]
 	cast [label="cast address payable\ntests/contract_testcases/solana/address_member_call.sol:34:13-35"]
-	load_58 [label="load address\ntests/contract_testcases/solana/address_member_call.sol:34:13-35"]
-	subscript_59 [label="subscript address[]\ntests/contract_testcases/solana/address_member_call.sol:34:21-34"]
-	variable_60 [label="variable: _receivers\naddress[]\ntests/contract_testcases/solana/address_member_call.sol:34:21-31"]
-	variable_61 [label="variable: i\nuint8\ntests/contract_testcases/solana/address_member_call.sol:34:32-33"]
-	cast_62 [label="cast uint64\ntests/contract_testcases/solana/address_member_call.sol:34:45-56"]
-	load_63 [label="load uint64\ntests/contract_testcases/solana/address_member_call.sol:34:45-56"]
-	subscript_64 [label="subscript uint64[]\ntests/contract_testcases/solana/address_member_call.sol:34:45-56"]
-	variable_65 [label="variable: _amounts\nuint64[]\ntests/contract_testcases/solana/address_member_call.sol:34:45-53"]
-	variable_66 [label="variable: i\nuint8\ntests/contract_testcases/solana/address_member_call.sol:34:54-55"]
+	load_56 [label="load address\ntests/contract_testcases/solana/address_member_call.sol:34:13-35"]
+	subscript_57 [label="subscript address[]\ntests/contract_testcases/solana/address_member_call.sol:34:21-34"]
+	variable_58 [label="variable: _receivers\naddress[]\ntests/contract_testcases/solana/address_member_call.sol:34:21-31"]
+	variable_59 [label="variable: i\nuint8\ntests/contract_testcases/solana/address_member_call.sol:34:32-33"]
+	cast_60 [label="cast uint64\ntests/contract_testcases/solana/address_member_call.sol:34:45-56"]
+	load_61 [label="load uint64\ntests/contract_testcases/solana/address_member_call.sol:34:45-56"]
+	subscript_62 [label="subscript uint64[]\ntests/contract_testcases/solana/address_member_call.sol:34:45-56"]
+	variable_63 [label="variable: _amounts\nuint64[]\ntests/contract_testcases/solana/address_member_call.sol:34:45-53"]
+	variable_64 [label="variable: i\nuint8\ntests/contract_testcases/solana/address_member_call.sol:34:54-55"]
 	emit [label="emit\nevent MyContract.Receipt\ntests/contract_testcases/solana/address_member_call.sol:37:9-43:10"]
-	cast_68 [label="cast address\ntests/contract_testcases/solana/address_member_call.sol:38:13-26"]
-	builtins_69 [label="builtin GetAddress\ntests/contract_testcases/solana/address_member_call.sol:38:21-25"]
-	number_literal_70 [label="address literal: 0\ntests/contract_testcases/solana/address_member_call.sol:39:13-54"]
-	variable_71 [label="variable: _receivers\naddress[]\ntests/contract_testcases/solana/address_member_call.sol:40:13-23"]
-	variable_72 [label="variable: _amounts\nuint64[]\ntests/contract_testcases/solana/address_member_call.sol:41:13-21"]
-	variable_73 [label="variable: _payment\nstring\ntests/contract_testcases/solana/address_member_call.sol:42:13-21"]
+	cast_66 [label="cast address\ntests/contract_testcases/solana/address_member_call.sol:38:13-26"]
+	builtins_67 [label="builtin GetAddress\ntests/contract_testcases/solana/address_member_call.sol:38:21-25"]
+	number_literal_68 [label="address literal: 0\ntests/contract_testcases/solana/address_member_call.sol:39:13-54"]
+	variable_69 [label="variable: _receivers\naddress[]\ntests/contract_testcases/solana/address_member_call.sol:40:13-23"]
+	variable_70 [label="variable: _amounts\nuint64[]\ntests/contract_testcases/solana/address_member_call.sol:41:13-21"]
+	variable_71 [label="variable: _payment\nstring\ntests/contract_testcases/solana/address_member_call.sol:42:13-21"]
 	diagnostic [label="pragma 'solidity' is ignored\nlevel Debug\ntests/contract_testcases/solana/address_member_call.sol:2:1-24"]
-	diagnostic_76 [label="found contract 'MyContract'\nlevel Debug\ntests/contract_testcases/solana/address_member_call.sol:4:1-45:2"]
+	diagnostic_74 [label="found contract 'MyContract'\nlevel Debug\ntests/contract_testcases/solana/address_member_call.sol:4:1-45:2"]
 	events -> Receipt
 	contracts -> contract
 	contract -> send [label="function"]
@@ -96,55 +94,53 @@ strict digraph "tests/contract_testcases/solana/address_member_call.sol" {
 	zero_ext -> variable_22 [label="expr"]
 	less -> builtins_23 [label="right"]
 	builtins_23 -> variable_24 [label="arg #0"]
-	for -> expr_25 [label="next"]
-	expr_25 -> post_increment [label="expr"]
-	post_increment -> variable_27 [label="expr"]
-	for -> expr_28 [label="body"]
-	expr_28 -> assign [label="expr"]
-	assign -> variable_30 [label="left"]
+	for -> post_increment [label="next"]
+	post_increment -> variable_26 [label="expr"]
+	for -> expr_27 [label="body"]
+	expr_27 -> assign [label="expr"]
+	assign -> variable_29 [label="left"]
 	assign -> add [label="right"]
-	add -> variable_32 [label="left"]
+	add -> variable_31 [label="left"]
 	add -> load [label="right"]
 	load -> subscript [label="expr"]
-	subscript -> variable_35 [label="array"]
-	subscript -> variable_36 [label="index"]
-	for -> expr_37 [label="next"]
-	expr_37 -> builtins_38 [label="expr"]
-	builtins_38 -> equal_39 [label="arg #0"]
-	equal_39 -> variable_40 [label="left"]
-	equal_39 -> variable_41 [label="right"]
-	builtins_38 -> alloc_array_42 [label="arg #1"]
-	alloc_array_42 -> number_literal_43 [label="length"]
-	expr_37 -> for_44 [label="next"]
-	for_44 -> var_decl_45 [label="init"]
-	var_decl_45 -> number_literal_46 [label="init"]
-	for_44 -> less_47 [label="cond"]
-	less_47 -> zero_ext_48 [label="left"]
-	zero_ext_48 -> variable_49 [label="expr"]
-	less_47 -> builtins_50 [label="right"]
-	builtins_50 -> variable_51 [label="arg #0"]
-	for_44 -> expr_52 [label="next"]
-	expr_52 -> post_increment_53 [label="expr"]
-	post_increment_53 -> variable_54 [label="expr"]
-	for_44 -> expr_55 [label="body"]
-	expr_55 -> builtins_56 [label="expr"]
-	builtins_56 -> cast [label="arg #0"]
-	cast -> load_58 [label="expr"]
-	load_58 -> subscript_59 [label="expr"]
-	subscript_59 -> variable_60 [label="array"]
-	subscript_59 -> variable_61 [label="index"]
-	builtins_56 -> cast_62 [label="arg #1"]
-	cast_62 -> load_63 [label="expr"]
-	load_63 -> subscript_64 [label="expr"]
-	subscript_64 -> variable_65 [label="array"]
-	subscript_64 -> variable_66 [label="index"]
-	for_44 -> emit [label="next"]
-	emit -> cast_68 [label="arg #0"]
-	cast_68 -> builtins_69 [label="expr"]
-	emit -> number_literal_70 [label="arg #1"]
-	emit -> variable_71 [label="arg #2"]
-	emit -> variable_72 [label="arg #3"]
-	emit -> variable_73 [label="arg #4"]
+	subscript -> variable_34 [label="array"]
+	subscript -> variable_35 [label="index"]
+	for -> expr_36 [label="next"]
+	expr_36 -> builtins_37 [label="expr"]
+	builtins_37 -> equal_38 [label="arg #0"]
+	equal_38 -> variable_39 [label="left"]
+	equal_38 -> variable_40 [label="right"]
+	builtins_37 -> alloc_array_41 [label="arg #1"]
+	alloc_array_41 -> number_literal_42 [label="length"]
+	expr_36 -> for_43 [label="next"]
+	for_43 -> var_decl_44 [label="init"]
+	var_decl_44 -> number_literal_45 [label="init"]
+	for_43 -> less_46 [label="cond"]
+	less_46 -> zero_ext_47 [label="left"]
+	zero_ext_47 -> variable_48 [label="expr"]
+	less_46 -> builtins_49 [label="right"]
+	builtins_49 -> variable_50 [label="arg #0"]
+	for_43 -> post_increment_51 [label="next"]
+	post_increment_51 -> variable_52 [label="expr"]
+	for_43 -> expr_53 [label="body"]
+	expr_53 -> builtins_54 [label="expr"]
+	builtins_54 -> cast [label="arg #0"]
+	cast -> load_56 [label="expr"]
+	load_56 -> subscript_57 [label="expr"]
+	subscript_57 -> variable_58 [label="array"]
+	subscript_57 -> variable_59 [label="index"]
+	builtins_54 -> cast_60 [label="arg #1"]
+	cast_60 -> load_61 [label="expr"]
+	load_61 -> subscript_62 [label="expr"]
+	subscript_62 -> variable_63 [label="array"]
+	subscript_62 -> variable_64 [label="index"]
+	for_43 -> emit [label="next"]
+	emit -> cast_66 [label="arg #0"]
+	cast_66 -> builtins_67 [label="expr"]
+	emit -> number_literal_68 [label="arg #1"]
+	emit -> variable_69 [label="arg #2"]
+	emit -> variable_70 [label="arg #3"]
+	emit -> variable_71 [label="arg #4"]
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_76 [label="Debug"]
+	diagnostics -> diagnostic_74 [label="Debug"]
 }

+ 13 - 15
tests/contract_testcases/solana/for_if_no_else.dot

@@ -7,17 +7,16 @@ strict digraph "tests/contract_testcases/solana/for_if_no_else.sol" {
 	less [label="less\ntests/contract_testcases/solana/for_if_no_else.sol:2:16-21"]
 	variable [label="variable: i\nint256\ntests/contract_testcases/solana/for_if_no_else.sol:2:16-17"]
 	number_literal_8 [label="int256 literal: 10\ntests/contract_testcases/solana/for_if_no_else.sol:2:19-21"]
-	expr [label="expression\ntests/contract_testcases/solana/for_if_no_else.sol:2:23-26"]
 	post_increment [label="post increment\nint256\ntests/contract_testcases/solana/for_if_no_else.sol:2:23-26"]
-	variable_11 [label="variable: i\nint256\ntests/contract_testcases/solana/for_if_no_else.sol:2:23-24"]
+	variable_10 [label="variable: i\nint256\ntests/contract_testcases/solana/for_if_no_else.sol:2:23-24"]
 	if [label="if\ntests/contract_testcases/solana/for_if_no_else.sol:3:3-4:13"]
 	more [label="more\ntests/contract_testcases/solana/for_if_no_else.sol:3:7-12"]
-	variable_14 [label="variable: i\nint256\ntests/contract_testcases/solana/for_if_no_else.sol:3:7-8"]
-	number_literal_15 [label="int256 literal: 0\ntests/contract_testcases/solana/for_if_no_else.sol:3:11-12"]
+	variable_13 [label="variable: i\nint256\ntests/contract_testcases/solana/for_if_no_else.sol:3:7-8"]
+	number_literal_14 [label="int256 literal: 0\ntests/contract_testcases/solana/for_if_no_else.sol:3:11-12"]
 	return [label="return\ntests/contract_testcases/solana/for_if_no_else.sol:4:4-12"]
-	number_literal_17 [label="int256 literal: 1\ntests/contract_testcases/solana/for_if_no_else.sol:4:11-12"]
-	return_18 [label="return\ntests/contract_testcases/solana/for_if_no_else.sol:6:2-10"]
-	number_literal_19 [label="int256 literal: 2\ntests/contract_testcases/solana/for_if_no_else.sol:6:9-10"]
+	number_literal_16 [label="int256 literal: 1\ntests/contract_testcases/solana/for_if_no_else.sol:4:11-12"]
+	return_17 [label="return\ntests/contract_testcases/solana/for_if_no_else.sol:6:2-10"]
+	number_literal_18 [label="int256 literal: 2\ntests/contract_testcases/solana/for_if_no_else.sol:6:9-10"]
 	diagnostic [label="function can be declared 'pure'\nlevel Warning\ntests/contract_testcases/solana/for_if_no_else.sol:1:1-29"]
 	free_functions -> foo [label="function"]
 	foo -> returns [label="returns"]
@@ -27,16 +26,15 @@ strict digraph "tests/contract_testcases/solana/for_if_no_else.sol" {
 	for -> less [label="cond"]
 	less -> variable [label="left"]
 	less -> number_literal_8 [label="right"]
-	for -> expr [label="next"]
-	expr -> post_increment [label="expr"]
-	post_increment -> variable_11 [label="expr"]
+	for -> post_increment [label="next"]
+	post_increment -> variable_10 [label="expr"]
 	for -> if [label="body"]
 	if -> more [label="cond"]
-	more -> variable_14 [label="left"]
-	more -> number_literal_15 [label="right"]
+	more -> variable_13 [label="left"]
+	more -> number_literal_14 [label="right"]
 	if -> return [label="then"]
-	return -> number_literal_17 [label="expr"]
-	for -> return_18 [label="next"]
-	return_18 -> number_literal_19 [label="expr"]
+	return -> number_literal_16 [label="expr"]
+	for -> return_17 [label="next"]
+	return_17 -> number_literal_18 [label="expr"]
 	diagnostics -> diagnostic [label="Warning"]
 }

+ 45 - 47
tests/contract_testcases/solana/import_free_function.dot

@@ -7,36 +7,35 @@ strict digraph "tests/contract_testcases/solana/import_free_function.sol" {
 	less [label="less\ntests/contract_testcases/solana/for_if_no_else.sol:2:16-21"]
 	variable [label="variable: i\nint256\ntests/contract_testcases/solana/for_if_no_else.sol:2:16-17"]
 	number_literal_8 [label="int256 literal: 10\ntests/contract_testcases/solana/for_if_no_else.sol:2:19-21"]
-	expr [label="expression\ntests/contract_testcases/solana/for_if_no_else.sol:2:23-26"]
 	post_increment [label="post increment\nint256\ntests/contract_testcases/solana/for_if_no_else.sol:2:23-26"]
-	variable_11 [label="variable: i\nint256\ntests/contract_testcases/solana/for_if_no_else.sol:2:23-24"]
+	variable_10 [label="variable: i\nint256\ntests/contract_testcases/solana/for_if_no_else.sol:2:23-24"]
 	if [label="if\ntests/contract_testcases/solana/for_if_no_else.sol:3:3-4:13"]
 	more [label="more\ntests/contract_testcases/solana/for_if_no_else.sol:3:7-12"]
-	variable_14 [label="variable: i\nint256\ntests/contract_testcases/solana/for_if_no_else.sol:3:7-8"]
-	number_literal_15 [label="int256 literal: 0\ntests/contract_testcases/solana/for_if_no_else.sol:3:11-12"]
+	variable_13 [label="variable: i\nint256\ntests/contract_testcases/solana/for_if_no_else.sol:3:7-8"]
+	number_literal_14 [label="int256 literal: 0\ntests/contract_testcases/solana/for_if_no_else.sol:3:11-12"]
 	return [label="return\ntests/contract_testcases/solana/for_if_no_else.sol:4:4-12"]
-	number_literal_17 [label="int256 literal: 1\ntests/contract_testcases/solana/for_if_no_else.sol:4:11-12"]
-	return_18 [label="return\ntests/contract_testcases/solana/for_if_no_else.sol:6:2-10"]
-	number_literal_19 [label="int256 literal: 2\ntests/contract_testcases/solana/for_if_no_else.sol:6:9-10"]
+	number_literal_16 [label="int256 literal: 1\ntests/contract_testcases/solana/for_if_no_else.sol:4:11-12"]
+	return_17 [label="return\ntests/contract_testcases/solana/for_if_no_else.sol:6:2-10"]
+	number_literal_18 [label="int256 literal: 2\ntests/contract_testcases/solana/for_if_no_else.sol:6:9-10"]
 	bar [label="function bar\ntests/contract_testcases/solana/import_free_function.sol:6:1-16\nsignature bar()\nvisibility internal\nmutability nonpayable"]
-	var_decl_21 [label="variable decl int256 x\ntests/contract_testcases/solana/import_free_function.sol:7:2-15"]
+	var_decl_20 [label="variable decl int256 x\ntests/contract_testcases/solana/import_free_function.sol:7:2-15"]
 	call_internal_function [label="call internal function\ntests/contract_testcases/solana/import_free_function.sol:7:10-15"]
 	internal_function [label="function() internal returns (int256)\nfree function foo\ntests/contract_testcases/solana/import_free_function.sol:7:10-15"]
-	expr_24 [label="expression\ntests/contract_testcases/solana/import_free_function.sol:8:2-19"]
+	expr [label="expression\ntests/contract_testcases/solana/import_free_function.sol:8:2-19"]
 	assign [label="assign\nint256\ntests/contract_testcases/solana/import_free_function.sol:8:2-19"]
-	variable_26 [label="variable: x\nint256\ntests/contract_testcases/solana/import_free_function.sol:8:2-3"]
-	call_internal_function_27 [label="call internal function\ntests/contract_testcases/solana/import_free_function.sol:8:6-19"]
-	internal_function_28 [label="function() internal returns (int256)\nfree function foo\ntests/contract_testcases/solana/import_free_function.sol:8:6-19"]
-	expr_29 [label="expression\ntests/contract_testcases/solana/import_free_function.sol:9:2-13"]
-	assign_30 [label="assign\nint256\ntests/contract_testcases/solana/import_free_function.sol:9:2-13"]
-	variable_31 [label="variable: x\nint256\ntests/contract_testcases/solana/import_free_function.sol:9:2-3"]
-	call_internal_function_32 [label="call internal function\ntests/contract_testcases/solana/import_free_function.sol:9:6-13"]
-	internal_function_33 [label="function() internal returns (int256)\nfree function foo\ntests/contract_testcases/solana/import_free_function.sol:9:6-13"]
-	expr_34 [label="expression\ntests/contract_testcases/solana/import_free_function.sol:10:2-15"]
-	assign_35 [label="assign\nint256\ntests/contract_testcases/solana/import_free_function.sol:10:2-15"]
-	variable_36 [label="variable: x\nint256\ntests/contract_testcases/solana/import_free_function.sol:10:2-3"]
-	call_internal_function_37 [label="call internal function\ntests/contract_testcases/solana/import_free_function.sol:10:6-15"]
-	internal_function_38 [label="function() internal returns (int256)\nfree function foo\ntests/contract_testcases/solana/import_free_function.sol:10:6-15"]
+	variable_25 [label="variable: x\nint256\ntests/contract_testcases/solana/import_free_function.sol:8:2-3"]
+	call_internal_function_26 [label="call internal function\ntests/contract_testcases/solana/import_free_function.sol:8:6-19"]
+	internal_function_27 [label="function() internal returns (int256)\nfree function foo\ntests/contract_testcases/solana/import_free_function.sol:8:6-19"]
+	expr_28 [label="expression\ntests/contract_testcases/solana/import_free_function.sol:9:2-13"]
+	assign_29 [label="assign\nint256\ntests/contract_testcases/solana/import_free_function.sol:9:2-13"]
+	variable_30 [label="variable: x\nint256\ntests/contract_testcases/solana/import_free_function.sol:9:2-3"]
+	call_internal_function_31 [label="call internal function\ntests/contract_testcases/solana/import_free_function.sol:9:6-13"]
+	internal_function_32 [label="function() internal returns (int256)\nfree function foo\ntests/contract_testcases/solana/import_free_function.sol:9:6-13"]
+	expr_33 [label="expression\ntests/contract_testcases/solana/import_free_function.sol:10:2-15"]
+	assign_34 [label="assign\nint256\ntests/contract_testcases/solana/import_free_function.sol:10:2-15"]
+	variable_35 [label="variable: x\nint256\ntests/contract_testcases/solana/import_free_function.sol:10:2-3"]
+	call_internal_function_36 [label="call internal function\ntests/contract_testcases/solana/import_free_function.sol:10:6-15"]
+	internal_function_37 [label="function() internal returns (int256)\nfree function foo\ntests/contract_testcases/solana/import_free_function.sol:10:6-15"]
 	diagnostic [label="function can be declared 'pure'\nlevel Warning\ntests/contract_testcases/solana/for_if_no_else.sol:1:1-29"]
 	free_functions -> foo [label="function"]
 	foo -> returns [label="returns"]
@@ -46,35 +45,34 @@ strict digraph "tests/contract_testcases/solana/import_free_function.sol" {
 	for -> less [label="cond"]
 	less -> variable [label="left"]
 	less -> number_literal_8 [label="right"]
-	for -> expr [label="next"]
-	expr -> post_increment [label="expr"]
-	post_increment -> variable_11 [label="expr"]
+	for -> post_increment [label="next"]
+	post_increment -> variable_10 [label="expr"]
 	for -> if [label="body"]
 	if -> more [label="cond"]
-	more -> variable_14 [label="left"]
-	more -> number_literal_15 [label="right"]
+	more -> variable_13 [label="left"]
+	more -> number_literal_14 [label="right"]
 	if -> return [label="then"]
-	return -> number_literal_17 [label="expr"]
-	for -> return_18 [label="next"]
-	return_18 -> number_literal_19 [label="expr"]
+	return -> number_literal_16 [label="expr"]
+	for -> return_17 [label="next"]
+	return_17 -> number_literal_18 [label="expr"]
 	free_functions -> bar [label="function"]
-	bar -> var_decl_21 [label="body"]
-	var_decl_21 -> call_internal_function [label="init"]
+	bar -> var_decl_20 [label="body"]
+	var_decl_20 -> call_internal_function [label="init"]
 	call_internal_function -> internal_function [label="function"]
-	var_decl_21 -> expr_24 [label="next"]
-	expr_24 -> assign [label="expr"]
-	assign -> variable_26 [label="left"]
-	assign -> call_internal_function_27 [label="right"]
-	call_internal_function_27 -> internal_function_28 [label="function"]
-	expr_24 -> expr_29 [label="next"]
-	expr_29 -> assign_30 [label="expr"]
-	assign_30 -> variable_31 [label="left"]
-	assign_30 -> call_internal_function_32 [label="right"]
-	call_internal_function_32 -> internal_function_33 [label="function"]
-	expr_29 -> expr_34 [label="next"]
-	expr_34 -> assign_35 [label="expr"]
-	assign_35 -> variable_36 [label="left"]
-	assign_35 -> call_internal_function_37 [label="right"]
-	call_internal_function_37 -> internal_function_38 [label="function"]
+	var_decl_20 -> expr [label="next"]
+	expr -> assign [label="expr"]
+	assign -> variable_25 [label="left"]
+	assign -> call_internal_function_26 [label="right"]
+	call_internal_function_26 -> internal_function_27 [label="function"]
+	expr -> expr_28 [label="next"]
+	expr_28 -> assign_29 [label="expr"]
+	assign_29 -> variable_30 [label="left"]
+	assign_29 -> call_internal_function_31 [label="right"]
+	call_internal_function_31 -> internal_function_32 [label="function"]
+	expr_28 -> expr_33 [label="next"]
+	expr_33 -> assign_34 [label="expr"]
+	assign_34 -> variable_35 [label="left"]
+	assign_34 -> call_internal_function_36 [label="right"]
+	call_internal_function_36 -> internal_function_37 [label="function"]
 	diagnostics -> diagnostic [label="Warning"]
 }

+ 51 - 53
tests/contract_testcases/solana/import_free_function_chain.dot

@@ -7,40 +7,39 @@ strict digraph "tests/contract_testcases/solana/import_free_function_chain.sol"
 	less [label="less\ntests/contract_testcases/solana/for_if_no_else.sol:2:16-21"]
 	variable [label="variable: i\nint256\ntests/contract_testcases/solana/for_if_no_else.sol:2:16-17"]
 	number_literal_8 [label="int256 literal: 10\ntests/contract_testcases/solana/for_if_no_else.sol:2:19-21"]
-	expr [label="expression\ntests/contract_testcases/solana/for_if_no_else.sol:2:23-26"]
 	post_increment [label="post increment\nint256\ntests/contract_testcases/solana/for_if_no_else.sol:2:23-26"]
-	variable_11 [label="variable: i\nint256\ntests/contract_testcases/solana/for_if_no_else.sol:2:23-24"]
+	variable_10 [label="variable: i\nint256\ntests/contract_testcases/solana/for_if_no_else.sol:2:23-24"]
 	if [label="if\ntests/contract_testcases/solana/for_if_no_else.sol:3:3-4:13"]
 	more [label="more\ntests/contract_testcases/solana/for_if_no_else.sol:3:7-12"]
-	variable_14 [label="variable: i\nint256\ntests/contract_testcases/solana/for_if_no_else.sol:3:7-8"]
-	number_literal_15 [label="int256 literal: 0\ntests/contract_testcases/solana/for_if_no_else.sol:3:11-12"]
+	variable_13 [label="variable: i\nint256\ntests/contract_testcases/solana/for_if_no_else.sol:3:7-8"]
+	number_literal_14 [label="int256 literal: 0\ntests/contract_testcases/solana/for_if_no_else.sol:3:11-12"]
 	return [label="return\ntests/contract_testcases/solana/for_if_no_else.sol:4:4-12"]
-	number_literal_17 [label="int256 literal: 1\ntests/contract_testcases/solana/for_if_no_else.sol:4:11-12"]
-	return_18 [label="return\ntests/contract_testcases/solana/for_if_no_else.sol:6:2-10"]
-	number_literal_19 [label="int256 literal: 2\ntests/contract_testcases/solana/for_if_no_else.sol:6:9-10"]
+	number_literal_16 [label="int256 literal: 1\ntests/contract_testcases/solana/for_if_no_else.sol:4:11-12"]
+	return_17 [label="return\ntests/contract_testcases/solana/for_if_no_else.sol:6:2-10"]
+	number_literal_18 [label="int256 literal: 2\ntests/contract_testcases/solana/for_if_no_else.sol:6:9-10"]
 	bar [label="function bar\ntests/contract_testcases/solana/import_free_function.sol:6:1-16\nsignature bar()\nvisibility internal\nmutability nonpayable"]
-	var_decl_21 [label="variable decl int256 x\ntests/contract_testcases/solana/import_free_function.sol:7:2-15"]
+	var_decl_20 [label="variable decl int256 x\ntests/contract_testcases/solana/import_free_function.sol:7:2-15"]
 	call_internal_function [label="call internal function\ntests/contract_testcases/solana/import_free_function.sol:7:10-15"]
 	internal_function [label="function() internal returns (int256)\nfree function foo\ntests/contract_testcases/solana/import_free_function.sol:7:10-15"]
-	expr_24 [label="expression\ntests/contract_testcases/solana/import_free_function.sol:8:2-19"]
+	expr [label="expression\ntests/contract_testcases/solana/import_free_function.sol:8:2-19"]
 	assign [label="assign\nint256\ntests/contract_testcases/solana/import_free_function.sol:8:2-19"]
-	variable_26 [label="variable: x\nint256\ntests/contract_testcases/solana/import_free_function.sol:8:2-3"]
-	call_internal_function_27 [label="call internal function\ntests/contract_testcases/solana/import_free_function.sol:8:6-19"]
-	internal_function_28 [label="function() internal returns (int256)\nfree function foo\ntests/contract_testcases/solana/import_free_function.sol:8:6-19"]
-	expr_29 [label="expression\ntests/contract_testcases/solana/import_free_function.sol:9:2-13"]
-	assign_30 [label="assign\nint256\ntests/contract_testcases/solana/import_free_function.sol:9:2-13"]
-	variable_31 [label="variable: x\nint256\ntests/contract_testcases/solana/import_free_function.sol:9:2-3"]
-	call_internal_function_32 [label="call internal function\ntests/contract_testcases/solana/import_free_function.sol:9:6-13"]
-	internal_function_33 [label="function() internal returns (int256)\nfree function foo\ntests/contract_testcases/solana/import_free_function.sol:9:6-13"]
-	expr_34 [label="expression\ntests/contract_testcases/solana/import_free_function.sol:10:2-15"]
-	assign_35 [label="assign\nint256\ntests/contract_testcases/solana/import_free_function.sol:10:2-15"]
-	variable_36 [label="variable: x\nint256\ntests/contract_testcases/solana/import_free_function.sol:10:2-3"]
-	call_internal_function_37 [label="call internal function\ntests/contract_testcases/solana/import_free_function.sol:10:6-15"]
-	internal_function_38 [label="function() internal returns (int256)\nfree function foo\ntests/contract_testcases/solana/import_free_function.sol:10:6-15"]
+	variable_25 [label="variable: x\nint256\ntests/contract_testcases/solana/import_free_function.sol:8:2-3"]
+	call_internal_function_26 [label="call internal function\ntests/contract_testcases/solana/import_free_function.sol:8:6-19"]
+	internal_function_27 [label="function() internal returns (int256)\nfree function foo\ntests/contract_testcases/solana/import_free_function.sol:8:6-19"]
+	expr_28 [label="expression\ntests/contract_testcases/solana/import_free_function.sol:9:2-13"]
+	assign_29 [label="assign\nint256\ntests/contract_testcases/solana/import_free_function.sol:9:2-13"]
+	variable_30 [label="variable: x\nint256\ntests/contract_testcases/solana/import_free_function.sol:9:2-3"]
+	call_internal_function_31 [label="call internal function\ntests/contract_testcases/solana/import_free_function.sol:9:6-13"]
+	internal_function_32 [label="function() internal returns (int256)\nfree function foo\ntests/contract_testcases/solana/import_free_function.sol:9:6-13"]
+	expr_33 [label="expression\ntests/contract_testcases/solana/import_free_function.sol:10:2-15"]
+	assign_34 [label="assign\nint256\ntests/contract_testcases/solana/import_free_function.sol:10:2-15"]
+	variable_35 [label="variable: x\nint256\ntests/contract_testcases/solana/import_free_function.sol:10:2-3"]
+	call_internal_function_36 [label="call internal function\ntests/contract_testcases/solana/import_free_function.sol:10:6-15"]
+	internal_function_37 [label="function() internal returns (int256)\nfree function foo\ntests/contract_testcases/solana/import_free_function.sol:10:6-15"]
 	baz [label="function baz\ntests/contract_testcases/solana/import_free_function_chain.sol:4:1-16\nsignature baz()\nvisibility internal\nmutability nonpayable"]
-	var_decl_40 [label="variable decl int256 x\ntests/contract_testcases/solana/import_free_function_chain.sol:5:2-19"]
-	call_internal_function_41 [label="call internal function\ntests/contract_testcases/solana/import_free_function_chain.sol:5:10-19"]
-	internal_function_42 [label="function() internal returns (int256)\nfree function foo\ntests/contract_testcases/solana/import_free_function_chain.sol:5:10-19"]
+	var_decl_39 [label="variable decl int256 x\ntests/contract_testcases/solana/import_free_function_chain.sol:5:2-19"]
+	call_internal_function_40 [label="call internal function\ntests/contract_testcases/solana/import_free_function_chain.sol:5:10-19"]
+	internal_function_41 [label="function() internal returns (int256)\nfree function foo\ntests/contract_testcases/solana/import_free_function_chain.sol:5:10-19"]
 	diagnostic [label="function can be declared 'pure'\nlevel Warning\ntests/contract_testcases/solana/for_if_no_else.sol:1:1-29"]
 	free_functions -> foo [label="function"]
 	foo -> returns [label="returns"]
@@ -50,39 +49,38 @@ strict digraph "tests/contract_testcases/solana/import_free_function_chain.sol"
 	for -> less [label="cond"]
 	less -> variable [label="left"]
 	less -> number_literal_8 [label="right"]
-	for -> expr [label="next"]
-	expr -> post_increment [label="expr"]
-	post_increment -> variable_11 [label="expr"]
+	for -> post_increment [label="next"]
+	post_increment -> variable_10 [label="expr"]
 	for -> if [label="body"]
 	if -> more [label="cond"]
-	more -> variable_14 [label="left"]
-	more -> number_literal_15 [label="right"]
+	more -> variable_13 [label="left"]
+	more -> number_literal_14 [label="right"]
 	if -> return [label="then"]
-	return -> number_literal_17 [label="expr"]
-	for -> return_18 [label="next"]
-	return_18 -> number_literal_19 [label="expr"]
+	return -> number_literal_16 [label="expr"]
+	for -> return_17 [label="next"]
+	return_17 -> number_literal_18 [label="expr"]
 	free_functions -> bar [label="function"]
-	bar -> var_decl_21 [label="body"]
-	var_decl_21 -> call_internal_function [label="init"]
+	bar -> var_decl_20 [label="body"]
+	var_decl_20 -> call_internal_function [label="init"]
 	call_internal_function -> internal_function [label="function"]
-	var_decl_21 -> expr_24 [label="next"]
-	expr_24 -> assign [label="expr"]
-	assign -> variable_26 [label="left"]
-	assign -> call_internal_function_27 [label="right"]
-	call_internal_function_27 -> internal_function_28 [label="function"]
-	expr_24 -> expr_29 [label="next"]
-	expr_29 -> assign_30 [label="expr"]
-	assign_30 -> variable_31 [label="left"]
-	assign_30 -> call_internal_function_32 [label="right"]
-	call_internal_function_32 -> internal_function_33 [label="function"]
-	expr_29 -> expr_34 [label="next"]
-	expr_34 -> assign_35 [label="expr"]
-	assign_35 -> variable_36 [label="left"]
-	assign_35 -> call_internal_function_37 [label="right"]
-	call_internal_function_37 -> internal_function_38 [label="function"]
+	var_decl_20 -> expr [label="next"]
+	expr -> assign [label="expr"]
+	assign -> variable_25 [label="left"]
+	assign -> call_internal_function_26 [label="right"]
+	call_internal_function_26 -> internal_function_27 [label="function"]
+	expr -> expr_28 [label="next"]
+	expr_28 -> assign_29 [label="expr"]
+	assign_29 -> variable_30 [label="left"]
+	assign_29 -> call_internal_function_31 [label="right"]
+	call_internal_function_31 -> internal_function_32 [label="function"]
+	expr_28 -> expr_33 [label="next"]
+	expr_33 -> assign_34 [label="expr"]
+	assign_34 -> variable_35 [label="left"]
+	assign_34 -> call_internal_function_36 [label="right"]
+	call_internal_function_36 -> internal_function_37 [label="function"]
 	free_functions -> baz [label="function"]
-	baz -> var_decl_40 [label="body"]
-	var_decl_40 -> call_internal_function_41 [label="init"]
-	call_internal_function_41 -> internal_function_42 [label="function"]
+	baz -> var_decl_39 [label="body"]
+	var_decl_39 -> call_internal_function_40 [label="init"]
+	call_internal_function_40 -> internal_function_41 [label="function"]
 	diagnostics -> diagnostic [label="Warning"]
 }

+ 225 - 231
tests/contract_testcases/solana/issues678.dot

@@ -30,139 +30,136 @@ strict digraph "tests/contract_testcases/solana/issues678.sol" {
 	zero_ext [label="zero extend uint256\ntests/contract_testcases/solana/issues678.sol:22:30-44"]
 	array_length_32 [label="array length uint32\nelement struct Shares.Share\ntests/contract_testcases/solana/issues678.sol:22:38-44"]
 	storage_var_33 [label="storage variable\nShares._shares\nstruct Shares.Share[] storage\ntests/contract_testcases/solana/issues678.sol:22:30-37"]
-	expr_34 [label="expression\ntests/contract_testcases/solana/issues678.sol:22:46-49"]
 	post_increment [label="post increment\nuint256\ntests/contract_testcases/solana/issues678.sol:22:46-49"]
-	variable_36 [label="variable: i\nuint256\ntests/contract_testcases/solana/issues678.sol:22:46-47"]
-	expr_37 [label="expression\ntests/contract_testcases/solana/issues678.sol:23:13-50"]
+	variable_35 [label="variable: i\nuint256\ntests/contract_testcases/solana/issues678.sol:22:46-47"]
+	expr_36 [label="expression\ntests/contract_testcases/solana/issues678.sol:23:13-50"]
 	assign [label="assign\naddress\ntests/contract_testcases/solana/issues678.sol:23:13-50"]
 	subscript [label="subscript address[]\ntests/contract_testcases/solana/issues678.sol:23:13-26"]
-	variable_40 [label="variable: retAddress\naddress[]\ntests/contract_testcases/solana/issues678.sol:23:13-23"]
-	variable_41 [label="variable: i\nuint256\ntests/contract_testcases/solana/issues678.sol:23:24-25"]
+	variable_39 [label="variable: retAddress\naddress[]\ntests/contract_testcases/solana/issues678.sol:23:13-23"]
+	variable_40 [label="variable: i\nuint256\ntests/contract_testcases/solana/issues678.sol:23:24-25"]
 	cast [label="cast address\ntests/contract_testcases/solana/issues678.sol:23:29-50"]
 	storage_load [label="storage load address payable\ntests/contract_testcases/solana/issues678.sol:23:29-50"]
 	structmember [label="struct member #0 address payable storage\ntests/contract_testcases/solana/issues678.sol:23:40-50"]
-	subscript_45 [label="subscript struct Shares.Share[] storage\ntests/contract_testcases/solana/issues678.sol:23:29-39"]
-	storage_var_46 [label="storage variable\nShares._shares\nstruct Shares.Share[] storage\ntests/contract_testcases/solana/issues678.sol:23:29-36"]
-	variable_47 [label="variable: i\nuint256\ntests/contract_testcases/solana/issues678.sol:23:37-38"]
-	expr_48 [label="expression\ntests/contract_testcases/solana/issues678.sol:24:13-44"]
-	assign_49 [label="assign\nuint256\ntests/contract_testcases/solana/issues678.sol:24:13-44"]
-	subscript_50 [label="subscript uint256[]\ntests/contract_testcases/solana/issues678.sol:24:13-24"]
-	variable_51 [label="variable: retShare\nuint256[]\ntests/contract_testcases/solana/issues678.sol:24:13-21"]
-	variable_52 [label="variable: i\nuint256\ntests/contract_testcases/solana/issues678.sol:24:22-23"]
-	storage_load_53 [label="storage load uint256\ntests/contract_testcases/solana/issues678.sol:24:27-44"]
-	structmember_54 [label="struct member #1 uint256 storage\ntests/contract_testcases/solana/issues678.sol:24:38-44"]
-	subscript_55 [label="subscript struct Shares.Share[] storage\ntests/contract_testcases/solana/issues678.sol:24:27-37"]
-	storage_var_56 [label="storage variable\nShares._shares\nstruct Shares.Share[] storage\ntests/contract_testcases/solana/issues678.sol:24:27-34"]
-	variable_57 [label="variable: i\nuint256\ntests/contract_testcases/solana/issues678.sol:24:35-36"]
+	subscript_44 [label="subscript struct Shares.Share[] storage\ntests/contract_testcases/solana/issues678.sol:23:29-39"]
+	storage_var_45 [label="storage variable\nShares._shares\nstruct Shares.Share[] storage\ntests/contract_testcases/solana/issues678.sol:23:29-36"]
+	variable_46 [label="variable: i\nuint256\ntests/contract_testcases/solana/issues678.sol:23:37-38"]
+	expr_47 [label="expression\ntests/contract_testcases/solana/issues678.sol:24:13-44"]
+	assign_48 [label="assign\nuint256\ntests/contract_testcases/solana/issues678.sol:24:13-44"]
+	subscript_49 [label="subscript uint256[]\ntests/contract_testcases/solana/issues678.sol:24:13-24"]
+	variable_50 [label="variable: retShare\nuint256[]\ntests/contract_testcases/solana/issues678.sol:24:13-21"]
+	variable_51 [label="variable: i\nuint256\ntests/contract_testcases/solana/issues678.sol:24:22-23"]
+	storage_load_52 [label="storage load uint256\ntests/contract_testcases/solana/issues678.sol:24:27-44"]
+	structmember_53 [label="struct member #1 uint256 storage\ntests/contract_testcases/solana/issues678.sol:24:38-44"]
+	subscript_54 [label="subscript struct Shares.Share[] storage\ntests/contract_testcases/solana/issues678.sol:24:27-37"]
+	storage_var_55 [label="storage variable\nShares._shares\nstruct Shares.Share[] storage\ntests/contract_testcases/solana/issues678.sol:24:27-34"]
+	variable_56 [label="variable: i\nuint256\ntests/contract_testcases/solana/issues678.sol:24:35-36"]
 	return [label="return\ntests/contract_testcases/solana/issues678.sol:26:9-38"]
 	list [label="list\ntests/contract_testcases/solana/issues678.sol:26:9-38"]
-	variable_60 [label="variable: retAddress\naddress[]\ntests/contract_testcases/solana/issues678.sol:26:17-27"]
-	variable_61 [label="variable: retShare\nuint256[]\ntests/contract_testcases/solana/issues678.sol:26:29-37"]
+	variable_59 [label="variable: retAddress\naddress[]\ntests/contract_testcases/solana/issues678.sol:26:17-27"]
+	variable_60 [label="variable: retShare\nuint256[]\ntests/contract_testcases/solana/issues678.sol:26:29-37"]
 	_senderIsAShareOwner [label="function _senderIsAShareOwner\ncontract: Shares\ntests/contract_testcases/solana/issues678.sol:29:5-78\nsignature _senderIsAShareOwner(bytes32)\nvisibility private\nmutability view"]
-	parameters_63 [label="parameters\naddress sender"]
-	returns_64 [label="returns\nbool "]
-	for_65 [label="for\ntests/contract_testcases/solana/issues678.sol:30:9-34:10"]
-	var_decl_66 [label="variable decl uint256 i\ntests/contract_testcases/solana/issues678.sol:30:14-24"]
-	number_literal_67 [label="uint256 literal: 0\ntests/contract_testcases/solana/issues678.sol:30:23-24"]
-	less_68 [label="less\ntests/contract_testcases/solana/issues678.sol:30:26-44"]
-	variable_69 [label="variable: i\nuint256\ntests/contract_testcases/solana/issues678.sol:30:26-27"]
-	zero_ext_70 [label="zero extend uint256\ntests/contract_testcases/solana/issues678.sol:30:30-44"]
-	array_length_71 [label="array length uint32\nelement struct Shares.Share\ntests/contract_testcases/solana/issues678.sol:30:38-44"]
-	storage_var_72 [label="storage variable\nShares._shares\nstruct Shares.Share[] storage\ntests/contract_testcases/solana/issues678.sol:30:30-37"]
-	expr_73 [label="expression\ntests/contract_testcases/solana/issues678.sol:30:46-49"]
-	post_increment_74 [label="post increment\nuint256\ntests/contract_testcases/solana/issues678.sol:30:46-49"]
-	variable_75 [label="variable: i\nuint256\ntests/contract_testcases/solana/issues678.sol:30:46-47"]
+	parameters_62 [label="parameters\naddress sender"]
+	returns_63 [label="returns\nbool "]
+	for_64 [label="for\ntests/contract_testcases/solana/issues678.sol:30:9-34:10"]
+	var_decl_65 [label="variable decl uint256 i\ntests/contract_testcases/solana/issues678.sol:30:14-24"]
+	number_literal_66 [label="uint256 literal: 0\ntests/contract_testcases/solana/issues678.sol:30:23-24"]
+	less_67 [label="less\ntests/contract_testcases/solana/issues678.sol:30:26-44"]
+	variable_68 [label="variable: i\nuint256\ntests/contract_testcases/solana/issues678.sol:30:26-27"]
+	zero_ext_69 [label="zero extend uint256\ntests/contract_testcases/solana/issues678.sol:30:30-44"]
+	array_length_70 [label="array length uint32\nelement struct Shares.Share\ntests/contract_testcases/solana/issues678.sol:30:38-44"]
+	storage_var_71 [label="storage variable\nShares._shares\nstruct Shares.Share[] storage\ntests/contract_testcases/solana/issues678.sol:30:30-37"]
+	post_increment_72 [label="post increment\nuint256\ntests/contract_testcases/solana/issues678.sol:30:46-49"]
+	variable_73 [label="variable: i\nuint256\ntests/contract_testcases/solana/issues678.sol:30:46-47"]
 	if [label="if\ntests/contract_testcases/solana/issues678.sol:31:13-33:14"]
 	equal [label="equal\ntests/contract_testcases/solana/issues678.sol:31:17-48"]
-	cast_78 [label="cast address\ntests/contract_testcases/solana/issues678.sol:31:28-38"]
-	storage_load_79 [label="storage load address payable\ntests/contract_testcases/solana/issues678.sol:31:28-38"]
-	structmember_80 [label="struct member #0 address payable storage\ntests/contract_testcases/solana/issues678.sol:31:28-38"]
-	subscript_81 [label="subscript struct Shares.Share[] storage\ntests/contract_testcases/solana/issues678.sol:31:17-27"]
-	storage_var_82 [label="storage variable\nShares._shares\nstruct Shares.Share[] storage\ntests/contract_testcases/solana/issues678.sol:31:17-24"]
-	variable_83 [label="variable: i\nuint256\ntests/contract_testcases/solana/issues678.sol:31:25-26"]
-	variable_84 [label="variable: sender\naddress\ntests/contract_testcases/solana/issues678.sol:31:42-48"]
-	return_85 [label="return\ntests/contract_testcases/solana/issues678.sol:32:17-28"]
+	cast_76 [label="cast address\ntests/contract_testcases/solana/issues678.sol:31:28-38"]
+	storage_load_77 [label="storage load address payable\ntests/contract_testcases/solana/issues678.sol:31:28-38"]
+	structmember_78 [label="struct member #0 address payable storage\ntests/contract_testcases/solana/issues678.sol:31:28-38"]
+	subscript_79 [label="subscript struct Shares.Share[] storage\ntests/contract_testcases/solana/issues678.sol:31:17-27"]
+	storage_var_80 [label="storage variable\nShares._shares\nstruct Shares.Share[] storage\ntests/contract_testcases/solana/issues678.sol:31:17-24"]
+	variable_81 [label="variable: i\nuint256\ntests/contract_testcases/solana/issues678.sol:31:25-26"]
+	variable_82 [label="variable: sender\naddress\ntests/contract_testcases/solana/issues678.sol:31:42-48"]
+	return_83 [label="return\ntests/contract_testcases/solana/issues678.sol:32:17-28"]
 	bool_literal [label="bool literal: true\ntests/contract_testcases/solana/issues678.sol:32:24-28"]
-	return_87 [label="return\ntests/contract_testcases/solana/issues678.sol:35:9-21"]
-	bool_literal_88 [label="bool literal: false\ntests/contract_testcases/solana/issues678.sol:35:16-21"]
+	return_85 [label="return\ntests/contract_testcases/solana/issues678.sol:35:9-21"]
+	bool_literal_86 [label="bool literal: false\ntests/contract_testcases/solana/issues678.sol:35:16-21"]
 	withdraw [label="function withdraw\ncontract: Shares\ntests/contract_testcases/solana/issues678.sol:41:5-47\nsignature withdraw(bytes32)\nvisibility external\nmutability nonpayable"]
-	tags_90 [label="dev: Allow a share owner to retrieve his money. It empty the money contained inside of the smart contract to give it to owners."]
-	parameters_91 [label="parameters\naddress sender"]
-	expr_92 [label="expression\ntests/contract_testcases/solana/issues678.sol:42:9-97"]
-	builtins_93 [label="builtin Require\ntests/contract_testcases/solana/issues678.sol:42:9-16"]
+	tags_88 [label="dev: Allow a share owner to retrieve his money. It empty the money contained inside of the smart contract to give it to owners."]
+	parameters_89 [label="parameters\naddress sender"]
+	expr_90 [label="expression\ntests/contract_testcases/solana/issues678.sol:42:9-97"]
+	builtins_91 [label="builtin Require\ntests/contract_testcases/solana/issues678.sol:42:9-16"]
 	call_internal_function [label="call internal function\ntests/contract_testcases/solana/issues678.sol:42:17-45"]
 	internal_function [label="function(address) internal view returns (bool)\nShares._senderIsAShareOwner\ntests/contract_testcases/solana/issues678.sol:42:17-45"]
-	variable_96 [label="variable: sender\naddress\ntests/contract_testcases/solana/issues678.sol:42:38-44"]
-	alloc_array_97 [label="alloc array string\ninitializer: 596f752063616e277420776974686472617720696620796f7520617265206e6f742061207368617265206f776e6572\ntests/contract_testcases/solana/issues678.sol:42:47-96"]
-	number_literal_98 [label="uint32 literal: 47\ntests/contract_testcases/solana/issues678.sol:42:47-96"]
-	var_decl_99 [label="variable decl uint256 curr_balance\ntests/contract_testcases/solana/issues678.sol:43:9-50"]
+	variable_94 [label="variable: sender\naddress\ntests/contract_testcases/solana/issues678.sol:42:38-44"]
+	alloc_array_95 [label="alloc array string\ninitializer: 596f752063616e277420776974686472617720696620796f7520617265206e6f742061207368617265206f776e6572\ntests/contract_testcases/solana/issues678.sol:42:47-96"]
+	number_literal_96 [label="uint32 literal: 47\ntests/contract_testcases/solana/issues678.sol:42:47-96"]
+	var_decl_97 [label="variable decl uint256 curr_balance\ntests/contract_testcases/solana/issues678.sol:43:9-50"]
 	sign_ext [label="sign extend uint256\ntests/contract_testcases/solana/issues678.sol:43:29-50"]
-	builtins_101 [label="builtin Balance\ntests/contract_testcases/solana/issues678.sol:43:29-50"]
-	cast_102 [label="cast address\ntests/contract_testcases/solana/issues678.sol:43:29-42"]
-	builtins_103 [label="builtin GetAddress\ntests/contract_testcases/solana/issues678.sol:43:37-41"]
-	expr_104 [label="expression\ntests/contract_testcases/solana/issues678.sol:44:9-66"]
-	builtins_105 [label="builtin Require\ntests/contract_testcases/solana/issues678.sol:44:9-16"]
+	builtins_99 [label="builtin Balance\ntests/contract_testcases/solana/issues678.sol:43:29-50"]
+	cast_100 [label="cast address\ntests/contract_testcases/solana/issues678.sol:43:29-42"]
+	builtins_101 [label="builtin GetAddress\ntests/contract_testcases/solana/issues678.sol:43:37-41"]
+	expr_102 [label="expression\ntests/contract_testcases/solana/issues678.sol:44:9-66"]
+	builtins_103 [label="builtin Require\ntests/contract_testcases/solana/issues678.sol:44:9-16"]
 	more [label="more\ntests/contract_testcases/solana/issues678.sol:44:17-33"]
-	variable_107 [label="variable: curr_balance\nuint256\ntests/contract_testcases/solana/issues678.sol:44:17-29"]
-	number_literal_108 [label="uint256 literal: 0\ntests/contract_testcases/solana/issues678.sol:44:32-33"]
-	alloc_array_109 [label="alloc array string\ninitializer: 5468657265206973206e6f7468696e6720746f207769746864726177\ntests/contract_testcases/solana/issues678.sol:44:35-65"]
-	number_literal_110 [label="uint32 literal: 28\ntests/contract_testcases/solana/issues678.sol:44:35-65"]
-	for_111 [label="for\ntests/contract_testcases/solana/issues678.sol:45:9-49:10"]
-	var_decl_112 [label="variable decl uint256 i\ntests/contract_testcases/solana/issues678.sol:45:14-24"]
-	number_literal_113 [label="uint256 literal: 0\ntests/contract_testcases/solana/issues678.sol:45:23-24"]
-	less_114 [label="less\ntests/contract_testcases/solana/issues678.sol:45:26-44"]
-	variable_115 [label="variable: i\nuint256\ntests/contract_testcases/solana/issues678.sol:45:26-27"]
-	zero_ext_116 [label="zero extend uint256\ntests/contract_testcases/solana/issues678.sol:45:30-44"]
-	array_length_117 [label="array length uint32\nelement struct Shares.Share\ntests/contract_testcases/solana/issues678.sol:45:38-44"]
-	storage_var_118 [label="storage variable\nShares._shares\nstruct Shares.Share[] storage\ntests/contract_testcases/solana/issues678.sol:45:30-37"]
-	expr_119 [label="expression\ntests/contract_testcases/solana/issues678.sol:45:46-49"]
-	post_increment_120 [label="post increment\nuint256\ntests/contract_testcases/solana/issues678.sol:45:46-49"]
-	variable_121 [label="variable: i\nuint256\ntests/contract_testcases/solana/issues678.sol:45:46-47"]
-	var_decl_122 [label="variable decl uint256 to_transfer\ntests/contract_testcases/solana/issues678.sol:46:13-71"]
+	variable_105 [label="variable: curr_balance\nuint256\ntests/contract_testcases/solana/issues678.sol:44:17-29"]
+	number_literal_106 [label="uint256 literal: 0\ntests/contract_testcases/solana/issues678.sol:44:32-33"]
+	alloc_array_107 [label="alloc array string\ninitializer: 5468657265206973206e6f7468696e6720746f207769746864726177\ntests/contract_testcases/solana/issues678.sol:44:35-65"]
+	number_literal_108 [label="uint32 literal: 28\ntests/contract_testcases/solana/issues678.sol:44:35-65"]
+	for_109 [label="for\ntests/contract_testcases/solana/issues678.sol:45:9-49:10"]
+	var_decl_110 [label="variable decl uint256 i\ntests/contract_testcases/solana/issues678.sol:45:14-24"]
+	number_literal_111 [label="uint256 literal: 0\ntests/contract_testcases/solana/issues678.sol:45:23-24"]
+	less_112 [label="less\ntests/contract_testcases/solana/issues678.sol:45:26-44"]
+	variable_113 [label="variable: i\nuint256\ntests/contract_testcases/solana/issues678.sol:45:26-27"]
+	zero_ext_114 [label="zero extend uint256\ntests/contract_testcases/solana/issues678.sol:45:30-44"]
+	array_length_115 [label="array length uint32\nelement struct Shares.Share\ntests/contract_testcases/solana/issues678.sol:45:38-44"]
+	storage_var_116 [label="storage variable\nShares._shares\nstruct Shares.Share[] storage\ntests/contract_testcases/solana/issues678.sol:45:30-37"]
+	post_increment_117 [label="post increment\nuint256\ntests/contract_testcases/solana/issues678.sol:45:46-49"]
+	variable_118 [label="variable: i\nuint256\ntests/contract_testcases/solana/issues678.sol:45:46-47"]
+	var_decl_119 [label="variable decl uint256 to_transfer\ntests/contract_testcases/solana/issues678.sol:46:13-71"]
 	divide [label="divide\nuint256\ntests/contract_testcases/solana/issues678.sol:46:32-71"]
 	multiply [label="multiply\nuint256\ntests/contract_testcases/solana/issues678.sol:46:32-64"]
-	variable_125 [label="variable: curr_balance\nuint256\ntests/contract_testcases/solana/issues678.sol:46:32-44"]
-	storage_load_126 [label="storage load uint256\ntests/contract_testcases/solana/issues678.sol:46:47-64"]
-	structmember_127 [label="struct member #1 uint256 storage\ntests/contract_testcases/solana/issues678.sol:46:58-64"]
-	subscript_128 [label="subscript struct Shares.Share[] storage\ntests/contract_testcases/solana/issues678.sol:46:47-57"]
-	storage_var_129 [label="storage variable\nShares._shares\nstruct Shares.Share[] storage\ntests/contract_testcases/solana/issues678.sol:46:47-54"]
-	variable_130 [label="variable: i\nuint256\ntests/contract_testcases/solana/issues678.sol:46:55-56"]
-	number_literal_131 [label="uint256 literal: 1000\ntests/contract_testcases/solana/issues678.sol:46:67-71"]
-	expr_132 [label="expression\ntests/contract_testcases/solana/issues678.sol:47:13-64"]
-	builtins_133 [label="builtin PayableTransfer\ntests/contract_testcases/solana/issues678.sol:47:13-64"]
-	storage_load_134 [label="storage load address payable\ntests/contract_testcases/solana/issues678.sol:47:24-34"]
-	structmember_135 [label="struct member #0 address payable storage\ntests/contract_testcases/solana/issues678.sol:47:24-34"]
-	subscript_136 [label="subscript struct Shares.Share[] storage\ntests/contract_testcases/solana/issues678.sol:47:13-23"]
-	storage_var_137 [label="storage variable\nShares._shares\nstruct Shares.Share[] storage\ntests/contract_testcases/solana/issues678.sol:47:13-20"]
-	variable_138 [label="variable: i\nuint256\ntests/contract_testcases/solana/issues678.sol:47:21-22"]
-	cast_139 [label="cast uint64\ntests/contract_testcases/solana/issues678.sol:47:44-63"]
+	variable_122 [label="variable: curr_balance\nuint256\ntests/contract_testcases/solana/issues678.sol:46:32-44"]
+	storage_load_123 [label="storage load uint256\ntests/contract_testcases/solana/issues678.sol:46:47-64"]
+	structmember_124 [label="struct member #1 uint256 storage\ntests/contract_testcases/solana/issues678.sol:46:58-64"]
+	subscript_125 [label="subscript struct Shares.Share[] storage\ntests/contract_testcases/solana/issues678.sol:46:47-57"]
+	storage_var_126 [label="storage variable\nShares._shares\nstruct Shares.Share[] storage\ntests/contract_testcases/solana/issues678.sol:46:47-54"]
+	variable_127 [label="variable: i\nuint256\ntests/contract_testcases/solana/issues678.sol:46:55-56"]
+	number_literal_128 [label="uint256 literal: 1000\ntests/contract_testcases/solana/issues678.sol:46:67-71"]
+	expr_129 [label="expression\ntests/contract_testcases/solana/issues678.sol:47:13-64"]
+	builtins_130 [label="builtin PayableTransfer\ntests/contract_testcases/solana/issues678.sol:47:13-64"]
+	storage_load_131 [label="storage load address payable\ntests/contract_testcases/solana/issues678.sol:47:24-34"]
+	structmember_132 [label="struct member #0 address payable storage\ntests/contract_testcases/solana/issues678.sol:47:24-34"]
+	subscript_133 [label="subscript struct Shares.Share[] storage\ntests/contract_testcases/solana/issues678.sol:47:13-23"]
+	storage_var_134 [label="storage variable\nShares._shares\nstruct Shares.Share[] storage\ntests/contract_testcases/solana/issues678.sol:47:13-20"]
+	variable_135 [label="variable: i\nuint256\ntests/contract_testcases/solana/issues678.sol:47:21-22"]
+	cast_136 [label="cast uint64\ntests/contract_testcases/solana/issues678.sol:47:44-63"]
 	trunc [label="truncate uint64\ntests/contract_testcases/solana/issues678.sol:47:44-63"]
-	variable_141 [label="variable: to_transfer\nuint256\ntests/contract_testcases/solana/issues678.sol:47:51-62"]
+	variable_138 [label="variable: to_transfer\nuint256\ntests/contract_testcases/solana/issues678.sol:47:51-62"]
 	emit [label="emit\nevent Shares.Transfer\ntests/contract_testcases/solana/issues678.sol:48:13-76"]
-	cast_143 [label="cast address\ntests/contract_testcases/solana/issues678.sol:48:38-48"]
-	storage_load_144 [label="storage load address payable\ntests/contract_testcases/solana/issues678.sol:48:38-48"]
-	structmember_145 [label="struct member #0 address payable storage\ntests/contract_testcases/solana/issues678.sol:48:38-48"]
-	subscript_146 [label="subscript struct Shares.Share[] storage\ntests/contract_testcases/solana/issues678.sol:48:27-37"]
-	storage_var_147 [label="storage variable\nShares._shares\nstruct Shares.Share[] storage\ntests/contract_testcases/solana/issues678.sol:48:27-34"]
-	variable_148 [label="variable: i\nuint256\ntests/contract_testcases/solana/issues678.sol:48:35-36"]
-	variable_149 [label="variable: to_transfer\nuint256\ntests/contract_testcases/solana/issues678.sol:48:50-61"]
-	variable_150 [label="variable: curr_balance\nuint256\ntests/contract_testcases/solana/issues678.sol:48:63-75"]
-	if_151 [label="if\ntests/contract_testcases/solana/issues678.sol:50:9-54:10"]
-	more_152 [label="more\ntests/contract_testcases/solana/issues678.sol:50:13-38"]
-	cast_153 [label="cast uint64\ntests/contract_testcases/solana/issues678.sol:50:13-34"]
-	builtins_154 [label="builtin Balance\ntests/contract_testcases/solana/issues678.sol:50:13-34"]
-	cast_155 [label="cast address\ntests/contract_testcases/solana/issues678.sol:50:13-26"]
-	builtins_156 [label="builtin GetAddress\ntests/contract_testcases/solana/issues678.sol:50:21-25"]
-	number_literal_157 [label="uint64 literal: 0\ntests/contract_testcases/solana/issues678.sol:50:37-38"]
-	expr_158 [label="expression\ntests/contract_testcases/solana/issues678.sol:53:13-60"]
-	builtins_159 [label="builtin PayableTransfer\ntests/contract_testcases/solana/issues678.sol:53:13-60"]
-	cast_160 [label="cast address payable\ntests/contract_testcases/solana/issues678.sol:53:13-28"]
-	variable_161 [label="variable: sender\naddress\ntests/contract_testcases/solana/issues678.sol:53:21-27"]
-	builtins_162 [label="builtin Balance\ntests/contract_testcases/solana/issues678.sol:53:38-59"]
-	cast_163 [label="cast address\ntests/contract_testcases/solana/issues678.sol:53:38-51"]
-	builtins_164 [label="builtin GetAddress\ntests/contract_testcases/solana/issues678.sol:53:46-50"]
+	cast_140 [label="cast address\ntests/contract_testcases/solana/issues678.sol:48:38-48"]
+	storage_load_141 [label="storage load address payable\ntests/contract_testcases/solana/issues678.sol:48:38-48"]
+	structmember_142 [label="struct member #0 address payable storage\ntests/contract_testcases/solana/issues678.sol:48:38-48"]
+	subscript_143 [label="subscript struct Shares.Share[] storage\ntests/contract_testcases/solana/issues678.sol:48:27-37"]
+	storage_var_144 [label="storage variable\nShares._shares\nstruct Shares.Share[] storage\ntests/contract_testcases/solana/issues678.sol:48:27-34"]
+	variable_145 [label="variable: i\nuint256\ntests/contract_testcases/solana/issues678.sol:48:35-36"]
+	variable_146 [label="variable: to_transfer\nuint256\ntests/contract_testcases/solana/issues678.sol:48:50-61"]
+	variable_147 [label="variable: curr_balance\nuint256\ntests/contract_testcases/solana/issues678.sol:48:63-75"]
+	if_148 [label="if\ntests/contract_testcases/solana/issues678.sol:50:9-54:10"]
+	more_149 [label="more\ntests/contract_testcases/solana/issues678.sol:50:13-38"]
+	cast_150 [label="cast uint64\ntests/contract_testcases/solana/issues678.sol:50:13-34"]
+	builtins_151 [label="builtin Balance\ntests/contract_testcases/solana/issues678.sol:50:13-34"]
+	cast_152 [label="cast address\ntests/contract_testcases/solana/issues678.sol:50:13-26"]
+	builtins_153 [label="builtin GetAddress\ntests/contract_testcases/solana/issues678.sol:50:21-25"]
+	number_literal_154 [label="uint64 literal: 0\ntests/contract_testcases/solana/issues678.sol:50:37-38"]
+	expr_155 [label="expression\ntests/contract_testcases/solana/issues678.sol:53:13-60"]
+	builtins_156 [label="builtin PayableTransfer\ntests/contract_testcases/solana/issues678.sol:53:13-60"]
+	cast_157 [label="cast address payable\ntests/contract_testcases/solana/issues678.sol:53:13-28"]
+	variable_158 [label="variable: sender\naddress\ntests/contract_testcases/solana/issues678.sol:53:21-27"]
+	builtins_159 [label="builtin Balance\ntests/contract_testcases/solana/issues678.sol:53:38-59"]
+	cast_160 [label="cast address\ntests/contract_testcases/solana/issues678.sol:53:38-51"]
+	builtins_161 [label="builtin GetAddress\ntests/contract_testcases/solana/issues678.sol:53:46-50"]
 	diagnostic [label="pragma 'solidity' is ignored\nlevel Debug\ntests/contract_testcases/solana/issues678.sol:2:1-23"]
-	diagnostic_167 [label="found contract 'Shares'\nlevel Debug\ntests/contract_testcases/solana/issues678.sol:4:1-56:2"]
+	diagnostic_164 [label="found contract 'Shares'\nlevel Debug\ntests/contract_testcases/solana/issues678.sol:4:1-56:2"]
 	structs -> Share
 	events -> Transfer
 	contracts -> contract
@@ -194,137 +191,134 @@ strict digraph "tests/contract_testcases/solana/issues678.sol" {
 	less -> zero_ext [label="right"]
 	zero_ext -> array_length_32 [label="expr"]
 	array_length_32 -> storage_var_33 [label="array"]
-	for -> expr_34 [label="next"]
-	expr_34 -> post_increment [label="expr"]
-	post_increment -> variable_36 [label="expr"]
-	for -> expr_37 [label="body"]
-	expr_37 -> assign [label="expr"]
+	for -> post_increment [label="next"]
+	post_increment -> variable_35 [label="expr"]
+	for -> expr_36 [label="body"]
+	expr_36 -> assign [label="expr"]
 	assign -> subscript [label="left"]
-	subscript -> variable_40 [label="array"]
-	subscript -> variable_41 [label="index"]
+	subscript -> variable_39 [label="array"]
+	subscript -> variable_40 [label="index"]
 	assign -> cast [label="right"]
 	cast -> storage_load [label="expr"]
 	storage_load -> structmember [label="expr"]
-	structmember -> subscript_45 [label="var"]
-	subscript_45 -> storage_var_46 [label="array"]
-	subscript_45 -> variable_47 [label="index"]
-	expr_37 -> expr_48 [label="next"]
-	expr_48 -> assign_49 [label="expr"]
-	assign_49 -> subscript_50 [label="left"]
-	subscript_50 -> variable_51 [label="array"]
-	subscript_50 -> variable_52 [label="index"]
-	assign_49 -> storage_load_53 [label="right"]
-	storage_load_53 -> structmember_54 [label="expr"]
-	structmember_54 -> subscript_55 [label="var"]
-	subscript_55 -> storage_var_56 [label="array"]
-	subscript_55 -> variable_57 [label="index"]
+	structmember -> subscript_44 [label="var"]
+	subscript_44 -> storage_var_45 [label="array"]
+	subscript_44 -> variable_46 [label="index"]
+	expr_36 -> expr_47 [label="next"]
+	expr_47 -> assign_48 [label="expr"]
+	assign_48 -> subscript_49 [label="left"]
+	subscript_49 -> variable_50 [label="array"]
+	subscript_49 -> variable_51 [label="index"]
+	assign_48 -> storage_load_52 [label="right"]
+	storage_load_52 -> structmember_53 [label="expr"]
+	structmember_53 -> subscript_54 [label="var"]
+	subscript_54 -> storage_var_55 [label="array"]
+	subscript_54 -> variable_56 [label="index"]
 	for -> return [label="next"]
 	return -> list [label="expr"]
-	list -> variable_60 [label="entry #0"]
-	list -> variable_61 [label="entry #1"]
+	list -> variable_59 [label="entry #0"]
+	list -> variable_60 [label="entry #1"]
 	contract -> _senderIsAShareOwner [label="function"]
-	_senderIsAShareOwner -> parameters_63 [label="parameters"]
-	_senderIsAShareOwner -> returns_64 [label="returns"]
-	_senderIsAShareOwner -> for_65 [label="body"]
-	for_65 -> var_decl_66 [label="init"]
-	var_decl_66 -> number_literal_67 [label="init"]
-	for_65 -> less_68 [label="cond"]
-	less_68 -> variable_69 [label="left"]
-	less_68 -> zero_ext_70 [label="right"]
-	zero_ext_70 -> array_length_71 [label="expr"]
-	array_length_71 -> storage_var_72 [label="array"]
-	for_65 -> expr_73 [label="next"]
-	expr_73 -> post_increment_74 [label="expr"]
-	post_increment_74 -> variable_75 [label="expr"]
-	for_65 -> if [label="body"]
+	_senderIsAShareOwner -> parameters_62 [label="parameters"]
+	_senderIsAShareOwner -> returns_63 [label="returns"]
+	_senderIsAShareOwner -> for_64 [label="body"]
+	for_64 -> var_decl_65 [label="init"]
+	var_decl_65 -> number_literal_66 [label="init"]
+	for_64 -> less_67 [label="cond"]
+	less_67 -> variable_68 [label="left"]
+	less_67 -> zero_ext_69 [label="right"]
+	zero_ext_69 -> array_length_70 [label="expr"]
+	array_length_70 -> storage_var_71 [label="array"]
+	for_64 -> post_increment_72 [label="next"]
+	post_increment_72 -> variable_73 [label="expr"]
+	for_64 -> if [label="body"]
 	if -> equal [label="cond"]
-	equal -> cast_78 [label="left"]
-	cast_78 -> storage_load_79 [label="expr"]
-	storage_load_79 -> structmember_80 [label="expr"]
-	structmember_80 -> subscript_81 [label="var"]
-	subscript_81 -> storage_var_82 [label="array"]
-	subscript_81 -> variable_83 [label="index"]
-	equal -> variable_84 [label="right"]
-	if -> return_85 [label="then"]
-	return_85 -> bool_literal [label="expr"]
-	for_65 -> return_87 [label="next"]
-	return_87 -> bool_literal_88 [label="expr"]
+	equal -> cast_76 [label="left"]
+	cast_76 -> storage_load_77 [label="expr"]
+	storage_load_77 -> structmember_78 [label="expr"]
+	structmember_78 -> subscript_79 [label="var"]
+	subscript_79 -> storage_var_80 [label="array"]
+	subscript_79 -> variable_81 [label="index"]
+	equal -> variable_82 [label="right"]
+	if -> return_83 [label="then"]
+	return_83 -> bool_literal [label="expr"]
+	for_64 -> return_85 [label="next"]
+	return_85 -> bool_literal_86 [label="expr"]
 	contract -> withdraw [label="function"]
-	withdraw -> tags_90 [label="tags"]
-	withdraw -> parameters_91 [label="parameters"]
-	withdraw -> expr_92 [label="body"]
-	expr_92 -> builtins_93 [label="expr"]
-	builtins_93 -> call_internal_function [label="arg #0"]
+	withdraw -> tags_88 [label="tags"]
+	withdraw -> parameters_89 [label="parameters"]
+	withdraw -> expr_90 [label="body"]
+	expr_90 -> builtins_91 [label="expr"]
+	builtins_91 -> call_internal_function [label="arg #0"]
 	call_internal_function -> internal_function [label="function"]
-	call_internal_function -> variable_96 [label="arg #0"]
-	builtins_93 -> alloc_array_97 [label="arg #1"]
-	alloc_array_97 -> number_literal_98 [label="length"]
-	expr_92 -> var_decl_99 [label="next"]
-	var_decl_99 -> sign_ext [label="init"]
-	sign_ext -> builtins_101 [label="expr"]
-	builtins_101 -> cast_102 [label="arg #0"]
-	cast_102 -> builtins_103 [label="expr"]
-	var_decl_99 -> expr_104 [label="next"]
-	expr_104 -> builtins_105 [label="expr"]
-	builtins_105 -> more [label="arg #0"]
-	more -> variable_107 [label="left"]
-	more -> number_literal_108 [label="right"]
-	builtins_105 -> alloc_array_109 [label="arg #1"]
-	alloc_array_109 -> number_literal_110 [label="length"]
-	expr_104 -> for_111 [label="next"]
-	for_111 -> var_decl_112 [label="init"]
-	var_decl_112 -> number_literal_113 [label="init"]
-	for_111 -> less_114 [label="cond"]
-	less_114 -> variable_115 [label="left"]
-	less_114 -> zero_ext_116 [label="right"]
-	zero_ext_116 -> array_length_117 [label="expr"]
-	array_length_117 -> storage_var_118 [label="array"]
-	for_111 -> expr_119 [label="next"]
-	expr_119 -> post_increment_120 [label="expr"]
-	post_increment_120 -> variable_121 [label="expr"]
-	for_111 -> var_decl_122 [label="body"]
-	var_decl_122 -> divide [label="init"]
+	call_internal_function -> variable_94 [label="arg #0"]
+	builtins_91 -> alloc_array_95 [label="arg #1"]
+	alloc_array_95 -> number_literal_96 [label="length"]
+	expr_90 -> var_decl_97 [label="next"]
+	var_decl_97 -> sign_ext [label="init"]
+	sign_ext -> builtins_99 [label="expr"]
+	builtins_99 -> cast_100 [label="arg #0"]
+	cast_100 -> builtins_101 [label="expr"]
+	var_decl_97 -> expr_102 [label="next"]
+	expr_102 -> builtins_103 [label="expr"]
+	builtins_103 -> more [label="arg #0"]
+	more -> variable_105 [label="left"]
+	more -> number_literal_106 [label="right"]
+	builtins_103 -> alloc_array_107 [label="arg #1"]
+	alloc_array_107 -> number_literal_108 [label="length"]
+	expr_102 -> for_109 [label="next"]
+	for_109 -> var_decl_110 [label="init"]
+	var_decl_110 -> number_literal_111 [label="init"]
+	for_109 -> less_112 [label="cond"]
+	less_112 -> variable_113 [label="left"]
+	less_112 -> zero_ext_114 [label="right"]
+	zero_ext_114 -> array_length_115 [label="expr"]
+	array_length_115 -> storage_var_116 [label="array"]
+	for_109 -> post_increment_117 [label="next"]
+	post_increment_117 -> variable_118 [label="expr"]
+	for_109 -> var_decl_119 [label="body"]
+	var_decl_119 -> divide [label="init"]
 	divide -> multiply [label="left"]
-	multiply -> variable_125 [label="left"]
-	multiply -> storage_load_126 [label="right"]
-	storage_load_126 -> structmember_127 [label="expr"]
-	structmember_127 -> subscript_128 [label="var"]
-	subscript_128 -> storage_var_129 [label="array"]
-	subscript_128 -> variable_130 [label="index"]
-	divide -> number_literal_131 [label="right"]
-	var_decl_122 -> expr_132 [label="next"]
-	expr_132 -> builtins_133 [label="expr"]
-	builtins_133 -> storage_load_134 [label="arg #0"]
-	storage_load_134 -> structmember_135 [label="expr"]
-	structmember_135 -> subscript_136 [label="var"]
-	subscript_136 -> storage_var_137 [label="array"]
-	subscript_136 -> variable_138 [label="index"]
-	builtins_133 -> cast_139 [label="arg #1"]
-	cast_139 -> trunc [label="expr"]
-	trunc -> variable_141 [label="expr"]
-	expr_132 -> emit [label="next"]
-	emit -> cast_143 [label="arg #0"]
-	cast_143 -> storage_load_144 [label="expr"]
-	storage_load_144 -> structmember_145 [label="expr"]
-	structmember_145 -> subscript_146 [label="var"]
-	subscript_146 -> storage_var_147 [label="array"]
-	subscript_146 -> variable_148 [label="index"]
-	emit -> variable_149 [label="arg #1"]
-	emit -> variable_150 [label="arg #2"]
-	for_111 -> if_151 [label="next"]
-	if_151 -> more_152 [label="cond"]
-	more_152 -> cast_153 [label="left"]
-	cast_153 -> builtins_154 [label="expr"]
-	builtins_154 -> cast_155 [label="arg #0"]
-	cast_155 -> builtins_156 [label="expr"]
-	more_152 -> number_literal_157 [label="right"]
-	if_151 -> expr_158 [label="then"]
-	expr_158 -> builtins_159 [label="expr"]
+	multiply -> variable_122 [label="left"]
+	multiply -> storage_load_123 [label="right"]
+	storage_load_123 -> structmember_124 [label="expr"]
+	structmember_124 -> subscript_125 [label="var"]
+	subscript_125 -> storage_var_126 [label="array"]
+	subscript_125 -> variable_127 [label="index"]
+	divide -> number_literal_128 [label="right"]
+	var_decl_119 -> expr_129 [label="next"]
+	expr_129 -> builtins_130 [label="expr"]
+	builtins_130 -> storage_load_131 [label="arg #0"]
+	storage_load_131 -> structmember_132 [label="expr"]
+	structmember_132 -> subscript_133 [label="var"]
+	subscript_133 -> storage_var_134 [label="array"]
+	subscript_133 -> variable_135 [label="index"]
+	builtins_130 -> cast_136 [label="arg #1"]
+	cast_136 -> trunc [label="expr"]
+	trunc -> variable_138 [label="expr"]
+	expr_129 -> emit [label="next"]
+	emit -> cast_140 [label="arg #0"]
+	cast_140 -> storage_load_141 [label="expr"]
+	storage_load_141 -> structmember_142 [label="expr"]
+	structmember_142 -> subscript_143 [label="var"]
+	subscript_143 -> storage_var_144 [label="array"]
+	subscript_143 -> variable_145 [label="index"]
+	emit -> variable_146 [label="arg #1"]
+	emit -> variable_147 [label="arg #2"]
+	for_109 -> if_148 [label="next"]
+	if_148 -> more_149 [label="cond"]
+	more_149 -> cast_150 [label="left"]
+	cast_150 -> builtins_151 [label="expr"]
+	builtins_151 -> cast_152 [label="arg #0"]
+	cast_152 -> builtins_153 [label="expr"]
+	more_149 -> number_literal_154 [label="right"]
+	if_148 -> expr_155 [label="then"]
+	expr_155 -> builtins_156 [label="expr"]
+	builtins_156 -> cast_157 [label="arg #0"]
+	cast_157 -> variable_158 [label="expr"]
+	builtins_156 -> builtins_159 [label="arg #1"]
 	builtins_159 -> cast_160 [label="arg #0"]
-	cast_160 -> variable_161 [label="expr"]
-	builtins_159 -> builtins_162 [label="arg #1"]
-	builtins_162 -> cast_163 [label="arg #0"]
-	cast_163 -> builtins_164 [label="expr"]
+	cast_160 -> builtins_161 [label="expr"]
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_167 [label="Debug"]
+	diagnostics -> diagnostic_164 [label="Debug"]
 }

+ 16 - 18
tests/contract_testcases/substrate/arrays/push_array_phi_node.dot

@@ -26,20 +26,19 @@ strict digraph "tests/contract_testcases/substrate/arrays/push_array_phi_node.so
 	zero_ext [label="zero extend uint256\ntests/contract_testcases/substrate/arrays/push_array_phi_node.sol:12:33-41"]
 	builtins_26 [label="builtin ArrayLength\ntests/contract_testcases/substrate/arrays/push_array_phi_node.sol:12:33-41"]
 	variable_27 [label="variable: a\nuint256[]\ntests/contract_testcases/substrate/arrays/push_array_phi_node.sol:12:33-34"]
-	expr_28 [label="expression\ntests/contract_testcases/substrate/arrays/push_array_phi_node.sol:12:43-46"]
 	post_increment [label="post increment\nuint256\ntests/contract_testcases/substrate/arrays/push_array_phi_node.sol:12:43-46"]
-	variable_30 [label="variable: i\nuint256\ntests/contract_testcases/substrate/arrays/push_array_phi_node.sol:12:43-44"]
-	expr_31 [label="expression\ntests/contract_testcases/substrate/arrays/push_array_phi_node.sol:13:6-23"]
+	variable_29 [label="variable: i\nuint256\ntests/contract_testcases/substrate/arrays/push_array_phi_node.sol:12:43-44"]
+	expr_30 [label="expression\ntests/contract_testcases/substrate/arrays/push_array_phi_node.sol:13:6-23"]
 	assign [label="assign\nuint256\ntests/contract_testcases/substrate/arrays/push_array_phi_node.sol:13:6-23"]
-	variable_33 [label="variable: sum\nuint256\ntests/contract_testcases/substrate/arrays/push_array_phi_node.sol:13:6-9"]
+	variable_32 [label="variable: sum\nuint256\ntests/contract_testcases/substrate/arrays/push_array_phi_node.sol:13:6-9"]
 	add [label="add\nuint256\ntests/contract_testcases/substrate/arrays/push_array_phi_node.sol:13:12-23"]
-	variable_35 [label="variable: sum\nuint256\ntests/contract_testcases/substrate/arrays/push_array_phi_node.sol:13:12-15"]
+	variable_34 [label="variable: sum\nuint256\ntests/contract_testcases/substrate/arrays/push_array_phi_node.sol:13:12-15"]
 	load [label="load uint256\ntests/contract_testcases/substrate/arrays/push_array_phi_node.sol:13:18-23"]
 	subscript [label="subscript uint256[]\ntests/contract_testcases/substrate/arrays/push_array_phi_node.sol:13:18-23"]
-	variable_38 [label="variable: a\nuint256[]\ntests/contract_testcases/substrate/arrays/push_array_phi_node.sol:13:18-19"]
-	number_literal_39 [label="uint32 literal: 10\ntests/contract_testcases/substrate/arrays/push_array_phi_node.sol:13:20-22"]
+	variable_37 [label="variable: a\nuint256[]\ntests/contract_testcases/substrate/arrays/push_array_phi_node.sol:13:18-19"]
+	number_literal_38 [label="uint32 literal: 10\ntests/contract_testcases/substrate/arrays/push_array_phi_node.sol:13:20-22"]
 	return [label="return\ntests/contract_testcases/substrate/arrays/push_array_phi_node.sol:16:9-19"]
-	variable_41 [label="variable: sum\nuint256\ntests/contract_testcases/substrate/arrays/push_array_phi_node.sol:16:16-19"]
+	variable_40 [label="variable: sum\nuint256\ntests/contract_testcases/substrate/arrays/push_array_phi_node.sol:16:16-19"]
 	diagnostic [label="found contract 'Array_bound_Test'\nlevel Debug\ntests/contract_testcases/substrate/arrays/push_array_phi_node.sol:1:1-18:2"]
 	contracts -> contract
 	contract -> array_bound [label="function"]
@@ -68,19 +67,18 @@ strict digraph "tests/contract_testcases/substrate/arrays/push_array_phi_node.so
 	less -> zero_ext [label="right"]
 	zero_ext -> builtins_26 [label="expr"]
 	builtins_26 -> variable_27 [label="arg #0"]
-	for -> expr_28 [label="next"]
-	expr_28 -> post_increment [label="expr"]
-	post_increment -> variable_30 [label="expr"]
-	for -> expr_31 [label="body"]
-	expr_31 -> assign [label="expr"]
-	assign -> variable_33 [label="left"]
+	for -> post_increment [label="next"]
+	post_increment -> variable_29 [label="expr"]
+	for -> expr_30 [label="body"]
+	expr_30 -> assign [label="expr"]
+	assign -> variable_32 [label="left"]
 	assign -> add [label="right"]
-	add -> variable_35 [label="left"]
+	add -> variable_34 [label="left"]
 	add -> load [label="right"]
 	load -> subscript [label="expr"]
-	subscript -> variable_38 [label="array"]
-	subscript -> number_literal_39 [label="index"]
+	subscript -> variable_37 [label="array"]
+	subscript -> number_literal_38 [label="index"]
 	for -> return [label="next"]
-	return -> variable_41 [label="expr"]
+	return -> variable_40 [label="expr"]
 	diagnostics -> diagnostic [label="Debug"]
 }

+ 33 - 35
tests/contract_testcases/substrate/storage/double_index_storage.dot

@@ -19,29 +19,28 @@ strict digraph "tests/contract_testcases/substrate/storage/double_index_storage.
 	less [label="less\ntests/contract_testcases/substrate/storage/double_index_storage.sol:23:26-36"]
 	variable_20 [label="variable: i\nuint256\ntests/contract_testcases/substrate/storage/double_index_storage.sol:23:26-27"]
 	variable_21 [label="variable: length\nuint256\ntests/contract_testcases/substrate/storage/double_index_storage.sol:23:30-36"]
-	expr_22 [label="expression\ntests/contract_testcases/substrate/storage/double_index_storage.sol:23:38-41"]
 	post_increment [label="post increment\nuint256\ntests/contract_testcases/substrate/storage/double_index_storage.sol:23:38-41"]
-	variable_24 [label="variable: i\nuint256\ntests/contract_testcases/substrate/storage/double_index_storage.sol:23:38-39"]
-	var_decl_25 [label="variable decl struct BeeeefRegistry.Entry entry\ntests/contract_testcases/substrate/storage/double_index_storage.sol:24:13-67"]
+	variable_23 [label="variable: i\nuint256\ntests/contract_testcases/substrate/storage/double_index_storage.sol:23:38-39"]
+	var_decl_24 [label="variable decl struct BeeeefRegistry.Entry entry\ntests/contract_testcases/substrate/storage/double_index_storage.sol:24:13-67"]
 	storage_load [label="storage load struct BeeeefRegistry.Entry\ntests/contract_testcases/substrate/storage/double_index_storage.sol:24:34-67"]
 	subscript [label="subscript mapping(bytes32 => struct BeeeefRegistry.Entry) storage\ntests/contract_testcases/substrate/storage/double_index_storage.sol:24:34-67"]
 	structmember [label="struct member #1 mapping(bytes32 => struct BeeeefRegistry.Entry) storage\ntests/contract_testcases/substrate/storage/double_index_storage.sol:24:42-49"]
 	storage_var [label="storage variable\nBeeeefRegistry.entries\nstruct BeeeefRegistry.Data storage\ntests/contract_testcases/substrate/storage/double_index_storage.sol:24:34-41"]
-	storage_load_30 [label="storage load bytes32\ntests/contract_testcases/substrate/storage/double_index_storage.sol:24:50-66"]
-	subscript_31 [label="subscript bytes32[] storage\ntests/contract_testcases/substrate/storage/double_index_storage.sol:24:50-66"]
-	structmember_32 [label="struct member #2 bytes32[] storage\ntests/contract_testcases/substrate/storage/double_index_storage.sol:24:58-63"]
-	storage_var_33 [label="storage variable\nBeeeefRegistry.entries\nstruct BeeeefRegistry.Data storage\ntests/contract_testcases/substrate/storage/double_index_storage.sol:24:50-57"]
-	variable_34 [label="variable: i\nuint256\ntests/contract_testcases/substrate/storage/double_index_storage.sol:24:64-65"]
-	expr_35 [label="expression\ntests/contract_testcases/substrate/storage/double_index_storage.sol:25:13-40"]
-	assign_36 [label="assign\naddress\ntests/contract_testcases/substrate/storage/double_index_storage.sol:25:13-40"]
-	subscript_37 [label="subscript address[]\ntests/contract_testcases/substrate/storage/double_index_storage.sol:25:13-24"]
-	variable_38 [label="variable: accounts\naddress[]\ntests/contract_testcases/substrate/storage/double_index_storage.sol:25:13-21"]
-	variable_39 [label="variable: i\nuint256\ntests/contract_testcases/substrate/storage/double_index_storage.sol:25:22-23"]
+	storage_load_29 [label="storage load bytes32\ntests/contract_testcases/substrate/storage/double_index_storage.sol:24:50-66"]
+	subscript_30 [label="subscript bytes32[] storage\ntests/contract_testcases/substrate/storage/double_index_storage.sol:24:50-66"]
+	structmember_31 [label="struct member #2 bytes32[] storage\ntests/contract_testcases/substrate/storage/double_index_storage.sol:24:58-63"]
+	storage_var_32 [label="storage variable\nBeeeefRegistry.entries\nstruct BeeeefRegistry.Data storage\ntests/contract_testcases/substrate/storage/double_index_storage.sol:24:50-57"]
+	variable_33 [label="variable: i\nuint256\ntests/contract_testcases/substrate/storage/double_index_storage.sol:24:64-65"]
+	expr_34 [label="expression\ntests/contract_testcases/substrate/storage/double_index_storage.sol:25:13-40"]
+	assign_35 [label="assign\naddress\ntests/contract_testcases/substrate/storage/double_index_storage.sol:25:13-40"]
+	subscript_36 [label="subscript address[]\ntests/contract_testcases/substrate/storage/double_index_storage.sol:25:13-24"]
+	variable_37 [label="variable: accounts\naddress[]\ntests/contract_testcases/substrate/storage/double_index_storage.sol:25:13-21"]
+	variable_38 [label="variable: i\nuint256\ntests/contract_testcases/substrate/storage/double_index_storage.sol:25:22-23"]
 	load [label="load address\ntests/contract_testcases/substrate/storage/double_index_storage.sol:25:27-40"]
-	structmember_41 [label="struct member #2 address\ntests/contract_testcases/substrate/storage/double_index_storage.sol:25:33-40"]
-	variable_42 [label="variable: entry\nstruct BeeeefRegistry.Entry\ntests/contract_testcases/substrate/storage/double_index_storage.sol:25:27-32"]
+	structmember_40 [label="struct member #2 address\ntests/contract_testcases/substrate/storage/double_index_storage.sol:25:33-40"]
+	variable_41 [label="variable: entry\nstruct BeeeefRegistry.Entry\ntests/contract_testcases/substrate/storage/double_index_storage.sol:25:27-32"]
 	diagnostic [label="found contract 'BeeeefRegistry'\nlevel Debug\ntests/contract_testcases/substrate/storage/double_index_storage.sol:2:1-28:2"]
-	diagnostic_45 [label="conversion truncates uint256 to uint32, as memory size is type uint32 on target substrate\nlevel Warning\ntests/contract_testcases/substrate/storage/double_index_storage.sol:22:34-40"]
+	diagnostic_44 [label="conversion truncates uint256 to uint32, as memory size is type uint32 on target substrate\nlevel Warning\ntests/contract_testcases/substrate/storage/double_index_storage.sol:22:34-40"]
 	structs -> Entry
 	structs -> Data
 	contracts -> contract
@@ -62,27 +61,26 @@ strict digraph "tests/contract_testcases/substrate/storage/double_index_storage.
 	for -> less [label="cond"]
 	less -> variable_20 [label="left"]
 	less -> variable_21 [label="right"]
-	for -> expr_22 [label="next"]
-	expr_22 -> post_increment [label="expr"]
-	post_increment -> variable_24 [label="expr"]
-	for -> var_decl_25 [label="body"]
-	var_decl_25 -> storage_load [label="init"]
+	for -> post_increment [label="next"]
+	post_increment -> variable_23 [label="expr"]
+	for -> var_decl_24 [label="body"]
+	var_decl_24 -> storage_load [label="init"]
 	storage_load -> subscript [label="expr"]
 	subscript -> structmember [label="array"]
 	structmember -> storage_var [label="var"]
-	subscript -> storage_load_30 [label="index"]
-	storage_load_30 -> subscript_31 [label="expr"]
-	subscript_31 -> structmember_32 [label="array"]
-	structmember_32 -> storage_var_33 [label="var"]
-	subscript_31 -> variable_34 [label="index"]
-	var_decl_25 -> expr_35 [label="next"]
-	expr_35 -> assign_36 [label="expr"]
-	assign_36 -> subscript_37 [label="left"]
-	subscript_37 -> variable_38 [label="array"]
-	subscript_37 -> variable_39 [label="index"]
-	assign_36 -> load [label="right"]
-	load -> structmember_41 [label="expr"]
-	structmember_41 -> variable_42 [label="var"]
+	subscript -> storage_load_29 [label="index"]
+	storage_load_29 -> subscript_30 [label="expr"]
+	subscript_30 -> structmember_31 [label="array"]
+	structmember_31 -> storage_var_32 [label="var"]
+	subscript_30 -> variable_33 [label="index"]
+	var_decl_24 -> expr_34 [label="next"]
+	expr_34 -> assign_35 [label="expr"]
+	assign_35 -> subscript_36 [label="left"]
+	subscript_36 -> variable_37 [label="array"]
+	subscript_36 -> variable_38 [label="index"]
+	assign_35 -> load [label="right"]
+	load -> structmember_40 [label="expr"]
+	structmember_40 -> variable_41 [label="var"]
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_45 [label="Warning"]
+	diagnostics -> diagnostic_44 [label="Warning"]
 }