Browse Source

Refactor builtin structs (#950)

* Change Type::Struct(usize) to Type::Struct(StructType)

Signed-off-by: Lucas Steuernagel <lucas.tnagel@gmail.com>

* Wire up Solana builtins with Type::Struct(StructDecl)

Signed-off-by: Lucas Steuernagel <lucas.tnagel@gmail.com>

* Eliminate codegen::Expression::ExternalFunction

Signed-off-by: Lucas Steuernagel <lucas.tnagel@gmail.com>

* Reverse order of attributes of ExternalFunction's struct

Signed-off-by: Lucas Steuernagel <lucas.tnagel@gmail.com>
Lucas Steuernagel 3 years ago
parent
commit
e1244ce456
100 changed files with 1393 additions and 1444 deletions
  1. 2 2
      src/abi/ethereum.rs
  2. 4 4
      src/abi/substrate.rs
  3. 2 2
      src/bin/languageserver/mod.rs
  4. 9 17
      src/codegen/cfg.rs
  5. 0 18
      src/codegen/constant_folding.rs
  6. 10 10
      src/codegen/encoding/borsh_encoding.rs
  7. 12 12
      src/codegen/encoding/mod.rs
  8. 15 11
      src/codegen/expression.rs
  9. 10 30
      src/codegen/mod.rs
  10. 3 3
      src/codegen/statements.rs
  11. 2 3
      src/codegen/storage.rs
  12. 1 1
      src/codegen/strength_reduce/tests.rs
  13. 1 1
      src/codegen/subexpression_elimination/operator.rs
  14. 1 1
      src/codegen/tests.rs
  15. 1 2
      src/codegen/undefined_variable.rs
  16. 1 1
      src/codegen/yul/builtin.rs
  17. 1 1
      src/codegen/yul/expression.rs
  18. 1 1
      src/codegen/yul/mod.rs
  19. 3 3
      src/codegen/yul/statements.rs
  20. 3 3
      src/codegen/yul/tests/expression.rs
  21. 6 5
      src/emit/binary.rs
  22. 22 20
      src/emit/ethabiencoder.rs
  23. 11 79
      src/emit/mod.rs
  24. 16 10
      src/emit/solana.rs
  25. 14 14
      src/emit/substrate.rs
  26. 7 8
      src/lib.rs
  27. 6 6
      src/sema/ast.rs
  28. 5 169
      src/sema/builtin.rs
  29. 199 0
      src/sema/builtin_structs.rs
  30. 31 31
      src/sema/expression.rs
  31. 3 3
      src/sema/functions.rs
  32. 1 0
      src/sema/mod.rs
  33. 3 3
      src/sema/namespace.rs
  34. 1 1
      src/sema/tests/mod.rs
  35. 47 29
      src/sema/types.rs
  36. 1 2
      src/sema/unused_variable.rs
  37. 3 3
      src/sema/variables.rs
  38. 1 1
      src/sema/yul/ast.rs
  39. 1 1
      src/sema/yul/block.rs
  40. 1 1
      src/sema/yul/expression.rs
  41. 1 1
      src/sema/yul/for_loop.rs
  42. 1 1
      src/sema/yul/functions.rs
  43. 1 1
      src/sema/yul/mod.rs
  44. 1 1
      src/sema/yul/statements.rs
  45. 1 1
      src/sema/yul/switch.rs
  46. 2 2
      src/sema/yul/tests/expression.rs
  47. 1 1
      src/sema/yul/tests/mod.rs
  48. 1 1
      src/sema/yul/types.rs
  49. 1 1
      src/sema/yul/unused_variable.rs
  50. 2 2
      tests/codegen_testcases/solidity/borsh_encoding_simple_types.sol
  51. 2 2
      tests/codegen_testcases/yul/expression.sol
  52. 2 2
      tests/codegen_testcases/yul/external_function.sol
  53. 7 7
      tests/contract_testcases/solana/abstract_interface.dot
  54. 2 2
      tests/contract_testcases/solana/accessor/constant.dot
  55. 4 4
      tests/contract_testcases/solana/accessor/constant_01.dot
  56. 7 7
      tests/contract_testcases/solana/account_info.dot
  57. 59 59
      tests/contract_testcases/solana/account_meta.dot
  58. 2 2
      tests/contract_testcases/solana/address_cast.dot
  59. 109 109
      tests/contract_testcases/solana/address_member_call.dot
  60. 11 11
      tests/contract_testcases/solana/call/abi_encode_call.dot
  61. 38 38
      tests/contract_testcases/solana/call/call_args_three_ways.dot
  62. 2 2
      tests/contract_testcases/solana/call/calltys.dot
  63. 2 2
      tests/contract_testcases/solana/call/calltys_01.dot
  64. 2 2
      tests/contract_testcases/solana/call/calltys_02.dot
  65. 2 2
      tests/contract_testcases/solana/comment.dot
  66. 9 9
      tests/contract_testcases/solana/constant/not_constant.dot
  67. 9 9
      tests/contract_testcases/solana/constant/not_constant_01.dot
  68. 14 14
      tests/contract_testcases/solana/contract_var_base_function_init.dot
  69. 6 6
      tests/contract_testcases/solana/create_contract/syntax.dot
  70. 6 6
      tests/contract_testcases/solana/create_contract/syntax_01.dot
  71. 200 200
      tests/contract_testcases/solana/doccomments_everywhere.dot
  72. 3 3
      tests/contract_testcases/solana/error.dot
  73. 10 10
      tests/contract_testcases/solana/event.dot
  74. 20 20
      tests/contract_testcases/solana/expressions/bytes32_0.dot
  75. 2 2
      tests/contract_testcases/solana/expressions/bytes32_0_01.dot
  76. 52 52
      tests/contract_testcases/solana/expressions/bytes32_0_02.dot
  77. 5 5
      tests/contract_testcases/solana/expressions/const_in_type.dot
  78. 19 19
      tests/contract_testcases/solana/expressions/contract_compare.dot
  79. 19 19
      tests/contract_testcases/solana/expressions/contract_no_init.dot
  80. 2 2
      tests/contract_testcases/solana/expressions/interfaceid.dot
  81. 2 2
      tests/contract_testcases/solana/expressions/pushpop.dot
  82. 2 2
      tests/contract_testcases/solana/expressions/pushpop_01.dot
  83. 6 6
      tests/contract_testcases/solana/expressions/selector_in_free_function.dot
  84. 10 10
      tests/contract_testcases/solana/expressions/selector_in_free_function_01.dot
  85. 10 10
      tests/contract_testcases/solana/expressions/selector_in_free_function_02.dot
  86. 5 5
      tests/contract_testcases/solana/expressions/slice.dot
  87. 2 2
      tests/contract_testcases/solana/expressions/tx.dot
  88. 2 2
      tests/contract_testcases/solana/expressions/tx_01.dot
  89. 14 14
      tests/contract_testcases/solana/for_if_no_else.dot
  90. 19 19
      tests/contract_testcases/solana/garbage_function_args.dot
  91. 2 2
      tests/contract_testcases/solana/hash/constants_hash_tests.dot
  92. 2 2
      tests/contract_testcases/solana/hash/constants_hash_tests_01.dot
  93. 4 4
      tests/contract_testcases/solana/immutable_function.dot
  94. 66 66
      tests/contract_testcases/solana/immutable_function_type.dot
  95. 46 46
      tests/contract_testcases/solana/import_free_function.dot
  96. 52 52
      tests/contract_testcases/solana/import_free_function_chain.dot
  97. 11 11
      tests/contract_testcases/solana/large_exponent.dot
  98. 10 10
      tests/contract_testcases/solana/multidimensional_array.dot
  99. 15 15
      tests/contract_testcases/solana/mutability.dot
  100. 13 13
      tests/contract_testcases/solana/negative_exponent.dot

+ 2 - 2
src/abi/ethereum.rs

@@ -1,5 +1,5 @@
 // ethereum style ABIs
-use crate::sema::ast::{Namespace, Parameter, Type};
+use crate::sema::ast::{Namespace, Parameter, StructType, Type};
 use serde::Serialize;
 use solang_parser::pt;
 
@@ -44,7 +44,7 @@ impl Type {
     /// Is this type a struct, or an array of structs?
     fn is_struct_or_array_of_struct(&self) -> Option<usize> {
         match self {
-            Type::Struct(n) => Some(*n),
+            Type::Struct(StructType::UserDefined(n)) => Some(*n),
             Type::Array(ty, _) => ty.is_struct_or_array_of_struct(),
             _ => None,
         }

+ 4 - 4
src/abi/substrate.rs

@@ -577,14 +577,14 @@ fn ty_to_abi(ty: &ast::Type, ns: &ast::Namespace, registry: &mut Abi) -> ParamTy
                 display_name: vec!["AccountId".to_owned()],
             }
         }
-        ast::Type::Struct(n) => {
-            let mut display_name = vec![ns.structs[*n].name.to_owned()];
+        ast::Type::Struct(struct_type) => {
+            let mut display_name = vec![struct_type.definition(ns).name.to_owned()];
 
-            if let Some(contract_name) = &ns.structs[*n].contract {
+            if let Some(contract_name) = &struct_type.definition(ns).contract {
                 display_name.insert(0, contract_name.to_owned());
             }
 
-            let def = &ns.structs[*n];
+            let def = struct_type.definition(ns);
             let fields = def
                 .fields
                 .iter()

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

@@ -1037,8 +1037,8 @@ impl SolangServer {
         match ty {
             ast::Type::Ref(ty) => SolangServer::expanded_ty(ty, ns),
             ast::Type::StorageRef(_, ty) => SolangServer::expanded_ty(ty, ns),
-            ast::Type::Struct(n) => {
-                let strct = &ns.structs[*n];
+            ast::Type::Struct(struct_type) => {
+                let strct = struct_type.definition(ns);
 
                 let mut msg = render(&strct.tags);
 

+ 9 - 17
src/codegen/cfg.rs

@@ -6,13 +6,14 @@ use super::{
     vartable::{Vars, Vartable},
     vector_to_slice, Options,
 };
-use crate::ast::FunctionAttributes;
 use crate::codegen::subexpression_elimination::common_sub_expression_elimination;
 use crate::codegen::{undefined_variable, Expression, LLVMName};
-use crate::sema::ast::RetrieveType;
-use crate::sema::ast::{CallTy, Contract, Function, Namespace, Parameter, StringLocation, Type};
+use crate::sema::ast::{
+    CallTy, Contract, Function, FunctionAttributes, Namespace, Parameter, RetrieveType,
+    StringLocation, StructType, Type,
+};
 use crate::sema::{contracts::collect_base_args, diagnostics::Diagnostics, Recurse};
-use crate::{ast, Target};
+use crate::{sema::ast, Target};
 use indexmap::IndexMap;
 use num_bigint::BigInt;
 use num_traits::One;
@@ -727,15 +728,6 @@ impl ControlFlowGraph {
                     .collect::<Vec<String>>()
                     .join(", ")
             ),
-            Expression::ExternalFunction {
-                address,
-                function_no,
-                ..
-            } => format!(
-                "external {} address {}",
-                self.expr_to_string(contract, ns, address),
-                ns.functions[*function_no].print_name(ns)
-            ),
             Expression::InternalFunctionCfg(cfg_no) => {
                 format!("function {}", contract.cfg[*cfg_no].name)
             }
@@ -1898,14 +1890,14 @@ impl Namespace {
     }
 
     /// Checks if struct contains only primitive types and returns its memory non-padded size
-    pub fn calculate_struct_non_padded_size(&self, struct_no: usize) -> Option<BigInt> {
+    pub fn calculate_struct_non_padded_size(&self, struct_type: &StructType) -> Option<BigInt> {
         let mut size = BigInt::from(0u8);
-        for field in &self.structs[struct_no].fields {
+        for field in &struct_type.definition(self).fields {
             if !field.ty.is_primitive() {
                 // If a struct contains a non-primitive type, we cannot calculate its
                 // size during compile time
-                if let Type::Struct(no) = &field.ty {
-                    if let Some(struct_size) = self.calculate_struct_non_padded_size(*no) {
+                if let Type::Struct(struct_ty) = &field.ty {
+                    if let Some(struct_size) = self.calculate_struct_non_padded_size(struct_ty) {
                         size.add_assign(struct_size);
                         continue;
                     }

+ 0 - 18
src/codegen/constant_folding.rs

@@ -1061,24 +1061,6 @@ fn expression(
                 false,
             )
         }
-        Expression::ExternalFunction {
-            loc,
-            ty,
-            address,
-            function_no,
-        } => {
-            let address = expression(address, vars, cfg, ns);
-
-            (
-                Expression::ExternalFunction {
-                    loc: *loc,
-                    ty: ty.clone(),
-                    address: Box::new(address.0),
-                    function_no: *function_no,
-                },
-                address.1,
-            )
-        }
         Expression::AbiEncode {
             loc,
             tys,

+ 10 - 10
src/codegen/encoding/borsh_encoding.rs

@@ -1,4 +1,3 @@
-use crate::ast::{ArrayLength, Namespace, RetrieveType, Type};
 use crate::codegen::cfg::{ControlFlowGraph, Instr};
 use crate::codegen::encoding::{
     calculate_size_args, finish_array_loop, increment_four, load_array_item, load_struct_member,
@@ -6,6 +5,7 @@ use crate::codegen::encoding::{
 };
 use crate::codegen::vartable::Vartable;
 use crate::codegen::{Builtin, Expression};
+use crate::sema::ast::{ArrayLength, Namespace, RetrieveType, StructType, Type};
 use num_bigint::BigInt;
 use num_traits::{One, Zero};
 use solang_parser::pt::Loc;
@@ -252,12 +252,12 @@ impl BorshEncoding {
                 Expression::NumberLiteral(Loc::Codegen, Type::Uint(32), BigInt::one())
             }
 
-            Type::Struct(struct_no) => self.encode_struct(
+            Type::Struct(struct_ty) => self.encode_struct(
                 expr,
                 buffer,
                 offset.clone(),
                 &expr_ty,
-                *struct_no,
+                struct_ty,
                 arg_no,
                 ns,
                 vartab,
@@ -307,14 +307,14 @@ impl BorshEncoding {
             | Type::Mapping(..) => unreachable!("This type cannot be encoded"),
 
             Type::Ref(r) => {
-                if let Type::Struct(struct_no) = &**r {
+                if let Type::Struct(struct_ty) = &**r {
                     // Structs references should not be dereferenced
                     return self.encode_struct(
                         expr,
                         buffer,
                         offset.clone(),
                         &expr_ty,
-                        *struct_no,
+                        struct_ty,
                         arg_no,
                         ns,
                         vartab,
@@ -617,13 +617,13 @@ impl BorshEncoding {
         buffer: &Expression,
         mut offset: Expression,
         expr_ty: &Type,
-        struct_no: usize,
+        struct_ty: &StructType,
         arg_no: usize,
         ns: &Namespace,
         vartab: &mut Vartable,
         cfg: &mut ControlFlowGraph,
     ) -> Expression {
-        let size = if let Some(no_padding_size) = ns.calculate_struct_non_padded_size(struct_no) {
+        let size = if let Some(no_padding_size) = ns.calculate_struct_non_padded_size(struct_ty) {
             let padded_size = expr_ty.solana_storage_size(ns);
             // If the size without padding equals the size with padding, we
             // can memcpy this struct directly.
@@ -657,14 +657,14 @@ impl BorshEncoding {
             None
         };
 
-        let qty = ns.structs[struct_no].fields.len();
-        let first_ty = ns.structs[struct_no].fields[0].ty.clone();
+        let qty = struct_ty.definition(ns).fields.len();
+        let first_ty = struct_ty.definition(ns).fields[0].ty.clone();
         let loaded = load_struct_member(first_ty, expr.clone(), 0);
 
         let mut advance = self.encode(&loaded, buffer, &offset, arg_no, ns, vartab, cfg);
         let mut runtime_size = advance.clone();
         for i in 1..qty {
-            let ith_type = ns.structs[struct_no].fields[i].ty.clone();
+            let ith_type = struct_ty.definition(ns).fields[i].ty.clone();
             offset = Expression::Add(
                 Loc::Codegen,
                 Type::Uint(32),

+ 12 - 12
src/codegen/encoding/mod.rs

@@ -1,11 +1,11 @@
 mod borsh_encoding;
 
-use crate::ast::{ArrayLength, Namespace, RetrieveType, Type};
 use crate::codegen::cfg::{ControlFlowGraph, Instr};
 use crate::codegen::encoding::borsh_encoding::BorshEncoding;
 use crate::codegen::expression::load_storage;
 use crate::codegen::vartable::Vartable;
 use crate::codegen::{Builtin, Expression};
+use crate::sema::ast::{ArrayLength, Namespace, RetrieveType, StructType, Type};
 use crate::Target;
 use num_bigint::BigInt;
 use solang_parser::pt::Loc;
@@ -82,8 +82,8 @@ fn get_expr_size<T: AbiEncoding>(
             Expression::NumberLiteral(Loc::Codegen, Type::Uint(32), BigInt::from(ns.value_length))
         }
 
-        Type::Struct(struct_no) => {
-            calculate_struct_size(encoder, arg_no, expr, *struct_no, ns, vartab, cfg)
+        Type::Struct(struct_ty) => {
+            calculate_struct_size(encoder, arg_no, expr, struct_ty, ns, vartab, cfg)
         }
 
         Type::Array(ty, dims) => {
@@ -112,8 +112,8 @@ fn get_expr_size<T: AbiEncoding>(
         | Type::Mapping(..) => unreachable!("This type cannot be encoded"),
 
         Type::Ref(r) => {
-            if let Type::Struct(struct_no) = &**r {
-                return calculate_struct_size(encoder, arg_no, expr, *struct_no, ns, vartab, cfg);
+            if let Type::Struct(struct_ty) = &**r {
+                return calculate_struct_size(encoder, arg_no, expr, struct_ty, ns, vartab, cfg);
             }
             let loaded = Expression::Load(Loc::Codegen, *r.clone(), Box::new(expr.clone()));
             get_expr_size(encoder, arg_no, &loaded, ns, vartab, cfg)
@@ -153,9 +153,9 @@ fn calculate_array_size<T: AbiEncoding>(
     // Check if the array contains only fixed sized elements
     let primitive_size = if elem_ty.is_primitive() && direct_assessment {
         Some(elem_ty.memory_size_of(ns))
-    } else if let Type::Struct(struct_no) = elem_ty {
+    } else if let Type::Struct(struct_ty) = elem_ty {
         if direct_assessment {
-            ns.calculate_struct_non_padded_size(*struct_no)
+            ns.calculate_struct_non_padded_size(struct_ty)
         } else {
             None
         }
@@ -353,20 +353,20 @@ fn calculate_struct_size<T: AbiEncoding>(
     encoder: &mut T,
     arg_no: usize,
     expr: &Expression,
-    struct_no: usize,
+    struct_ty: &StructType,
     ns: &Namespace,
     vartab: &mut Vartable,
     cfg: &mut ControlFlowGraph,
 ) -> Expression {
-    if let Some(struct_size) = ns.calculate_struct_non_padded_size(struct_no) {
+    if let Some(struct_size) = ns.calculate_struct_non_padded_size(struct_ty) {
         return Expression::NumberLiteral(Loc::Codegen, Type::Uint(32), struct_size);
     }
 
-    let first_type = ns.structs[struct_no].fields[0].ty.clone();
+    let first_type = struct_ty.definition(ns).fields[0].ty.clone();
     let first_field = load_struct_member(first_type, expr.clone(), 0);
     let mut size = get_expr_size(encoder, arg_no, &first_field, ns, vartab, cfg);
-    for i in 1..ns.structs[struct_no].fields.len() {
-        let ty = ns.structs[struct_no].fields[i].ty.clone();
+    for i in 1..struct_ty.definition(ns).fields.len() {
+        let ty = struct_ty.definition(ns).fields[i].ty.clone();
         let field = load_struct_member(ty.clone(), expr.clone(), i);
         size = Expression::Add(
             Loc::Codegen,

+ 15 - 11
src/codegen/expression.rs

@@ -15,7 +15,7 @@ use crate::sema::{
     ast,
     ast::{
         ArrayLength, CallTy, FormatArg, Function, Namespace, Parameter, RetrieveType,
-        StringLocation, Type,
+        StringLocation, StructType, Type,
     },
     diagnostics::Diagnostics,
     eval::{eval_const_number, eval_const_rational},
@@ -446,13 +446,17 @@ pub fn expression(
             function_no,
         } => {
             let address = expression(address, cfg, contract_no, func, ns, vartab, opt);
-
-            Expression::ExternalFunction {
-                loc: *loc,
-                ty: ty.clone(),
-                address: Box::new(address),
-                function_no: *function_no,
-            }
+            let selector = Expression::NumberLiteral(
+                *loc,
+                Type::Uint(32),
+                BigInt::from(ns.functions[*function_no].selector()),
+            );
+            let struct_literal = Expression::StructLiteral(
+                *loc,
+                Type::Struct(StructType::ExternalFunction),
+                vec![selector, address],
+            );
+            Expression::Cast(*loc, ty.clone(), Box::new(struct_literal))
         }
         ast::Expression::Subscript(loc, elem_ty, array_ty, array, index) => array_subscript(
             loc,
@@ -468,11 +472,11 @@ pub fn expression(
             opt,
         ),
         ast::Expression::StructMember(loc, ty, var, field_no) if ty.is_contract_storage() => {
-            if let Type::Struct(struct_no) = var.ty().deref_any() {
+            if let Type::Struct(struct_ty) = var.ty().deref_any() {
                 let offset = if ns.target == Target::Solana {
-                    ns.structs[*struct_no].storage_offsets[*field_no].clone()
+                    struct_ty.definition(ns).storage_offsets[*field_no].clone()
                 } else {
-                    ns.structs[*struct_no].fields[..*field_no]
+                    struct_ty.definition(ns).fields[..*field_no]
                         .iter()
                         .map(|field| field.ty.storage_slots(ns))
                         .sum()

+ 10 - 30
src/codegen/mod.rs

@@ -24,12 +24,12 @@ use self::{
 };
 #[cfg(feature = "llvm")]
 use crate::emit::Generate;
-use crate::sema::ast::{Layout, Namespace};
-use crate::{ast, Target};
+use crate::sema::ast::{
+    FormatArg, Function, Layout, Namespace, RetrieveType, StringLocation, Type,
+};
+use crate::{sema::ast, Target};
 use std::cmp::Ordering;
 
-use crate::ast::Function;
-use crate::ast::{FormatArg, RetrieveType, StringLocation, Type};
 use crate::codegen::cfg::ASTFunction;
 use crate::codegen::yul::generate_yul_function_cfg;
 use crate::sema::Recurse;
@@ -368,12 +368,6 @@ pub enum Expression {
     UnsignedDivide(pt::Loc, Type, Box<Expression>, Box<Expression>),
     SignedDivide(pt::Loc, Type, Box<Expression>, Box<Expression>),
     Equal(pt::Loc, Box<Expression>, Box<Expression>),
-    ExternalFunction {
-        loc: pt::Loc,
-        ty: Type,
-        address: Box<Expression>,
-        function_no: usize,
-    },
     FormatString(pt::Loc, Vec<(FormatArg, Expression)>),
     FunctionArg(pt::Loc, Type, usize),
     GetRef(pt::Loc, Type, Box<Expression>),
@@ -439,7 +433,6 @@ impl CodeLocation for Expression {
         match self {
             Expression::AbiEncode { loc, .. }
             | Expression::StorageArrayLength { loc, .. }
-            | Expression::ExternalFunction { loc, .. }
             | Expression::Builtin(loc, ..)
             | Expression::Cast(loc, ..)
             | Expression::NumberLiteral(loc, ..)
@@ -555,7 +548,6 @@ impl Recurse for Expression {
             | Expression::ZeroExt(_, _, exp)
             | Expression::SignExt(_, _, exp)
             | Expression::Complement(_, _, exp)
-            | Expression::ExternalFunction { address: exp, .. }
             | Expression::Load(_, _, exp)
             | Expression::StorageArrayLength { array: exp, .. }
             | Expression::StructMember(_, _, exp, _)
@@ -635,7 +627,6 @@ impl RetrieveType for Expression {
             | Expression::StructLiteral(_, ty, ..)
             | Expression::ArrayLiteral(_, ty, ..)
             | Expression::ConstArrayLiteral(_, ty, ..)
-            | Expression::ExternalFunction { ty, .. }
             | Expression::StructMember(_, ty, ..)
             | Expression::StringConcat(_, ty, ..)
             | Expression::FunctionArg(_, ty, ..)
@@ -1184,17 +1175,6 @@ impl Expression {
                         }
                     },
                 ),
-                Expression::ExternalFunction {
-                    loc,
-                    ty,
-                    address,
-                    function_no,
-                } => Expression::ExternalFunction {
-                    loc: *loc,
-                    ty: ty.clone(),
-                    address: Box::new(filter(address, ctx)),
-                    function_no: *function_no,
-                },
                 Expression::FormatString(loc, args) => {
                     let args = args.iter().map(|(f, e)| (*f, filter(e, ctx))).collect();
 
@@ -1211,7 +1191,7 @@ impl Expression {
         )
     }
 
-    fn external_function_address(&self) -> Expression {
+    fn external_function_selector(&self) -> Expression {
         debug_assert!(
             matches!(self.ty(), Type::ExternalFunction { .. }),
             "This is not an external function"
@@ -1219,14 +1199,14 @@ impl Expression {
         let loc = self.loc();
         let struct_member = Expression::StructMember(
             loc,
-            Type::Ref(Box::new(Type::Address(false))),
+            Type::Ref(Box::new(Type::Bytes(4))),
             Box::new(self.clone()),
             0,
         );
-        Expression::Load(loc, Type::Address(false), Box::new(struct_member))
+        Expression::Load(loc, Type::Bytes(4), Box::new(struct_member))
     }
 
-    fn external_function_selector(&self) -> Expression {
+    fn external_function_address(&self) -> Expression {
         debug_assert!(
             matches!(self.ty(), Type::ExternalFunction { .. }),
             "This is not an external function"
@@ -1234,11 +1214,11 @@ impl Expression {
         let loc = self.loc();
         let struct_member = Expression::StructMember(
             loc,
-            Type::Ref(Box::new(Type::Bytes(4))),
+            Type::Ref(Box::new(Type::Address(false))),
             Box::new(self.clone()),
             1,
         );
-        Expression::Load(loc, Type::Bytes(4), Box::new(struct_member))
+        Expression::Load(loc, Type::Address(false), Box::new(struct_member))
     }
 }
 

+ 3 - 3
src/codegen/statements.rs

@@ -7,12 +7,12 @@ use super::{
     cfg::{ControlFlowGraph, Instr},
     vartable::Vartable,
 };
-use crate::ast;
 use crate::codegen::unused_variable::{
     should_remove_assignment, should_remove_variable, SideEffectsCheckParameters,
 };
 use crate::codegen::yul::inline_assembly_cfg;
 use crate::codegen::Expression;
+use crate::sema::ast;
 use crate::sema::ast::RetrieveType;
 use crate::sema::ast::{
     ArrayLength, CallTy, DestructureField, Function, Namespace, Parameter, Statement, TryCatch,
@@ -1444,9 +1444,9 @@ impl Type {
                 Some(Expression::BytesLiteral(pt::Loc::Codegen, self.clone(), l))
             }
             Type::Enum(e) => ns.enums[*e].ty.default(ns),
-            Type::Struct(struct_no) => {
+            Type::Struct(struct_ty) => {
                 // make sure all our fields have default values
-                for field in &ns.structs[*struct_no].fields {
+                for field in &struct_ty.definition(ns).fields {
                     field.ty.default(ns)?;
                 }
 

+ 2 - 3
src/codegen/storage.rs

@@ -1,5 +1,5 @@
-use crate::ast;
 use crate::codegen::Expression;
+use crate::sema::ast;
 use num_bigint::BigInt;
 use num_traits::FromPrimitive;
 use num_traits::One;
@@ -11,8 +11,7 @@ use super::{
     cfg::{ControlFlowGraph, Instr},
     vartable::Vartable,
 };
-use crate::sema::ast::RetrieveType;
-use crate::sema::ast::{Function, Namespace, Type};
+use crate::sema::ast::{Function, Namespace, RetrieveType, Type};
 use solang_parser::pt;
 
 /// Given a storage slot which is the start of the array, calculate the

+ 1 - 1
src/codegen/strength_reduce/tests.rs

@@ -1,9 +1,9 @@
 #![cfg(test)]
 use super::expression_values::expression_values;
 use super::{highest_set_bit, Variables};
-use crate::ast::{Namespace, Type};
 use crate::codegen::strength_reduce::value::Value;
 use crate::codegen::Expression;
+use crate::sema::ast::{Namespace, Type};
 use bitvec::prelude::BitArray;
 use num_bigint::BigInt;
 use std::collections::{HashMap, HashSet};

+ 1 - 1
src/codegen/subexpression_elimination/operator.rs

@@ -1,5 +1,5 @@
-use crate::ast::Type;
 use crate::codegen::Expression;
+use crate::sema::ast::Type;
 
 /// This enum defines operator types for the graph
 #[derive(PartialEq, Eq, Hash, Clone, Debug)]

+ 1 - 1
src/codegen/tests.rs

@@ -1,5 +1,5 @@
 #[cfg(test)]
-use crate::{ast, codegen};
+use crate::{codegen, sema::ast};
 
 #[test]
 fn test_builtin_conversion() {

+ 1 - 2
src/codegen/undefined_variable.rs

@@ -1,8 +1,7 @@
-use crate::ast::Type;
 use crate::codegen::cfg::{ASTFunction, ControlFlowGraph, Instr};
 use crate::codegen::reaching_definitions::{apply_transfers, VarDefs};
 use crate::codegen::{Builtin, Expression};
-use crate::sema::ast::{Diagnostic, ErrorType, Level, Namespace, Note};
+use crate::sema::ast::{Diagnostic, ErrorType, Level, Namespace, Note, Type};
 use crate::sema::symtable;
 use solang_parser::pt::CodeLocation;
 use solang_parser::pt::{Loc, StorageLocation};

+ 1 - 1
src/codegen/yul/builtin.rs

@@ -1,10 +1,10 @@
-use crate::ast::{Namespace, RetrieveType, Type};
 use crate::codegen::{
     cfg::{ControlFlowGraph, Instr},
     vartable::Vartable,
     yul::expression::expression,
     {Builtin, Expression, Options},
 };
+use crate::sema::ast::{Namespace, RetrieveType, Type};
 use crate::sema::{
     diagnostics::Diagnostics,
     expression::coerce_number,

+ 1 - 1
src/codegen/yul/expression.rs

@@ -1,9 +1,9 @@
-use crate::ast::{ArrayLength, Namespace, Type};
 use crate::codegen;
 use crate::codegen::cfg::{ControlFlowGraph, Instr, InternalCallTy};
 use crate::codegen::vartable::Vartable;
 use crate::codegen::yul::builtin::process_builtin;
 use crate::codegen::{Builtin, Expression, Options};
+use crate::sema::ast::{ArrayLength, Namespace, Type};
 use crate::sema::yul::ast;
 use crate::sema::yul::ast::YulSuffix;
 use num_bigint::{BigInt, Sign};

+ 1 - 1
src/codegen/yul/mod.rs

@@ -1,4 +1,3 @@
-use crate::ast::Namespace;
 use crate::codegen::cfg::{
     optimize_and_check_cfg, populate_arguments, populate_named_returns, ASTFunction,
     ControlFlowGraph, Instr,
@@ -7,6 +6,7 @@ use crate::codegen::statements::LoopScopes;
 use crate::codegen::vartable::Vartable;
 use crate::codegen::yul::statements::statement;
 use crate::codegen::{Expression, Options};
+use crate::sema::ast::Namespace;
 use crate::sema::yul::ast::InlineAssembly;
 use solang_parser::pt;
 use solang_parser::pt::FunctionTy;

+ 3 - 3
src/codegen/yul/statements.rs

@@ -1,10 +1,10 @@
-use crate::ast::{Namespace, RetrieveType, Type};
 use crate::codegen::cfg::{ControlFlowGraph, Instr};
 use crate::codegen::statements::LoopScopes;
 use crate::codegen::vartable::Vartable;
 use crate::codegen::yul::builtin::process_builtin;
 use crate::codegen::yul::expression::{expression, process_function_call};
 use crate::codegen::{Expression, Options};
+use crate::sema::ast::{Namespace, RetrieveType, Type};
 use crate::sema::yul::ast;
 use crate::sema::yul::ast::{YulStatement, YulSuffix};
 use num_bigint::BigInt;
@@ -261,10 +261,10 @@ fn cfg_single_assigment(
                     var_no,
                 ) => {
                     let (member_no, casted_expr, member_ty) = match suffix {
+                        YulSuffix::Selector => (0, rhs.cast(&Type::Uint(32), ns), Type::Uint(32)),
                         YulSuffix::Address => {
-                            (0, rhs.cast(&Type::Address(false), ns), Type::Address(false))
+                            (1, rhs.cast(&Type::Address(false), ns), Type::Address(false))
                         }
-                        YulSuffix::Selector => (1, rhs.cast(&Type::Uint(32), ns), Type::Uint(32)),
                         _ => unreachable!(),
                     };
 

+ 3 - 3
src/codegen/yul/tests/expression.rs

@@ -1,11 +1,11 @@
 #![cfg(test)]
 
-use crate::ast::{Contract, Layout, Mutability, Namespace, Type, Variable};
 use crate::codegen::cfg::ControlFlowGraph;
 use crate::codegen::vartable::Vartable;
 use crate::codegen::yul::expression::expression;
 use crate::codegen::{Builtin, Expression, Options};
 use crate::sema::ast::ArrayLength;
+use crate::sema::ast::{Contract, Layout, Mutability, Namespace, Type, Variable};
 use crate::sema::yul::ast;
 use crate::sema::yul::ast::YulSuffix;
 use crate::{sema, Target};
@@ -557,7 +557,7 @@ fn selector_suffix() {
                     },
                     4
                 )),
-                1
+                0
             ))
         )
     );
@@ -626,7 +626,7 @@ fn address_suffix() {
                     },
                     4
                 )),
-                0
+                1
             ))
         )
     );

+ 6 - 5
src/emit/binary.rs

@@ -1,4 +1,4 @@
-use crate::sema::ast::{ArrayLength, BuiltinStruct, Contract, Namespace, Type};
+use crate::sema::ast::{ArrayLength, Contract, Namespace, StructType, Type};
 use std::cell::RefCell;
 use std::ffi::CStr;
 use std::path::Path;
@@ -774,7 +774,7 @@ impl<'a> Binary<'a> {
 
     /// Return the llvm type for the resolved type.
     pub(crate) fn llvm_type(&self, ty: &Type, ns: &Namespace) -> BasicTypeEnum<'a> {
-        if ty.builtin_struct(ns) == BuiltinStruct::AccountInfo {
+        if ty.is_builtin_struct() == Some(StructType::AccountInfo) {
             return self
                 .module
                 .get_struct_type("struct.SolAccountInfo")
@@ -829,10 +829,11 @@ impl<'a> Binary<'a> {
 
                     BasicTypeEnum::ArrayType(aty)
                 }
-                Type::Struct(n) => self
+                Type::Struct(str_ty) => self
                     .context
                     .struct_type(
-                        &ns.structs[*n]
+                        &str_ty
+                            .definition(ns)
                             .fields
                             .iter()
                             .map(|f| self.llvm_field_ty(&f.ty, ns))
@@ -859,7 +860,7 @@ impl<'a> Binary<'a> {
 
                     BasicTypeEnum::PointerType(
                         self.context
-                            .struct_type(&[address, selector], false)
+                            .struct_type(&[selector, address], false)
                             .ptr_type(AddressSpace::Generic),
                     )
                 }

+ 22 - 20
src/emit/ethabiencoder.rs

@@ -102,7 +102,7 @@ impl<'a, 'b> EncoderBuilder<'a, 'b> {
         ns: &ast::Namespace,
     ) -> IntValue<'c> {
         match ty {
-            ast::Type::Struct(n) => {
+            ast::Type::Struct(str_ty) => {
                 let arg = if load {
                     binary.builder.build_load(arg.into_pointer_value(), "")
                 } else {
@@ -125,7 +125,7 @@ impl<'a, 'b> EncoderBuilder<'a, 'b> {
 
                 let mut normal_sum = binary.context.i32_type().const_zero();
 
-                for (i, field) in ns.structs[*n].fields.iter().enumerate() {
+                for (i, field) in str_ty.definition(ns).fields.iter().enumerate() {
                     let elem = unsafe {
                         binary.builder.build_gep(
                             arg.into_pointer_value(),
@@ -157,7 +157,7 @@ impl<'a, 'b> EncoderBuilder<'a, 'b> {
 
                 let mut null_sum = binary.context.i32_type().const_zero();
 
-                for field in &ns.structs[*n].fields {
+                for field in &str_ty.definition(ns).fields {
                     null_sum = binary.builder.build_int_add(
                         null_sum,
                         EncoderBuilder::encoded_packed_length(
@@ -339,7 +339,7 @@ impl<'a, 'b> EncoderBuilder<'a, 'b> {
         ns: &ast::Namespace,
     ) -> IntValue<'c> {
         match ty {
-            ast::Type::Struct(n) if ty.is_dynamic(ns) => {
+            ast::Type::Struct(str_ty) if ty.is_dynamic(ns) => {
                 let arg = if load {
                     binary.builder.build_load(arg.into_pointer_value(), "")
                 } else {
@@ -362,7 +362,7 @@ impl<'a, 'b> EncoderBuilder<'a, 'b> {
 
                 let mut normal_sum = binary.context.i32_type().const_zero();
 
-                for (i, field) in ns.structs[*n].fields.iter().enumerate() {
+                for (i, field) in str_ty.definition(ns).fields.iter().enumerate() {
                     // a struct with dynamic fields gets stored in the dynamic part
                     normal_sum = binary.builder.build_int_add(
                         normal_sum,
@@ -404,7 +404,7 @@ impl<'a, 'b> EncoderBuilder<'a, 'b> {
 
                 let mut null_sum = binary.context.i32_type().const_zero();
 
-                for field in &ns.structs[*n].fields {
+                for field in &str_ty.definition(ns).fields {
                     // a struct with dynamic fields gets stored in the dynamic part
                     null_sum = binary.builder.build_int_add(
                         null_sum,
@@ -608,7 +608,8 @@ impl<'a, 'b> EncoderBuilder<'a, 'b> {
                 32
             }
             ast::Type::Enum(_) => 32,
-            ast::Type::Struct(n) => ns.structs[*n]
+            ast::Type::Struct(str_ty) => str_ty
+                .definition(ns)
                 .fields
                 .iter()
                 .map(|f| EncoderBuilder::encoded_fixed_length(&f.ty, ns))
@@ -1185,7 +1186,7 @@ impl<'a, 'b> EncoderBuilder<'a, 'b> {
 
                 *dynamic = dynamic_phi.as_basic_value().into_pointer_value();
             }
-            ast::Type::Struct(n) if ty.is_dynamic(ns) => {
+            ast::Type::Struct(str_ty) if ty.is_dynamic(ns) => {
                 let arg = if load {
                     binary.builder.build_load(arg.into_pointer_value(), "")
                 } else {
@@ -1215,7 +1216,8 @@ impl<'a, 'b> EncoderBuilder<'a, 'b> {
                 let mut null_fields_dynamic = *dynamic;
 
                 // add size of fixed fields to dynamic
-                let fixed_field_length = ns.structs[*n]
+                let fixed_field_length = str_ty
+                    .definition(ns)
                     .fields
                     .iter()
                     .map(|f| EncoderBuilder::encoded_fixed_length(&f.ty, ns))
@@ -1256,7 +1258,7 @@ impl<'a, 'b> EncoderBuilder<'a, 'b> {
                     .i32_type()
                     .const_int(fixed_field_length, false);
 
-                for (i, field) in ns.structs[*n].fields.iter().enumerate() {
+                for (i, field) in str_ty.definition(ns).fields.iter().enumerate() {
                     let elem = unsafe {
                         binary.builder.build_gep(
                             arg.into_pointer_value(),
@@ -1294,7 +1296,7 @@ impl<'a, 'b> EncoderBuilder<'a, 'b> {
                     .i32_type()
                     .const_int(fixed_field_length, false);
 
-                for field in &ns.structs[*n].fields {
+                for field in &str_ty.definition(ns).fields {
                     let elem = binary.default_value(&field.ty, ns);
 
                     self.encode_ty(
@@ -1339,7 +1341,7 @@ impl<'a, 'b> EncoderBuilder<'a, 'b> {
 
                 *offset = offset_phi.as_basic_value().into_int_value();
             }
-            ast::Type::Struct(n) => {
+            ast::Type::Struct(str_ty) => {
                 let arg = if load {
                     binary
                         .builder
@@ -1365,7 +1367,7 @@ impl<'a, 'b> EncoderBuilder<'a, 'b> {
                 let mut normal_offset = *offset;
                 let mut normal_dynamic = *dynamic;
 
-                for (i, field) in ns.structs[*n].fields.iter().enumerate() {
+                for (i, field) in str_ty.definition(ns).fields.iter().enumerate() {
                     let elem = unsafe {
                         binary.builder.build_gep(
                             arg,
@@ -1401,7 +1403,7 @@ impl<'a, 'b> EncoderBuilder<'a, 'b> {
                 let mut null_dynamic = *dynamic;
 
                 // FIXME: abi encoding fixed length fields with default values. This should always be 0
-                for field in &ns.structs[*n].fields {
+                for field in &str_ty.definition(ns).fields {
                     let elem = binary.default_value(&field.ty, ns);
 
                     self.encode_ty(
@@ -1892,7 +1894,7 @@ impl<'a, 'b> EncoderBuilder<'a, 'b> {
 
                 *output = output_phi.as_basic_value().into_pointer_value();
             }
-            ast::Type::Struct(n) => {
+            ast::Type::Struct(str_ty) => {
                 let arg = if load {
                     binary
                         .builder
@@ -1916,7 +1918,7 @@ impl<'a, 'b> EncoderBuilder<'a, 'b> {
 
                 let mut normal_output = *output;
 
-                for (i, field) in ns.structs[*n].fields.iter().enumerate() {
+                for (i, field) in str_ty.definition(ns).fields.iter().enumerate() {
                     let elem = unsafe {
                         binary.builder.build_gep(
                             arg,
@@ -1948,7 +1950,7 @@ impl<'a, 'b> EncoderBuilder<'a, 'b> {
                 let mut null_output = *output;
 
                 // FIXME: abi encoding fixed length fields with default values. This should always be 0
-                for field in &ns.structs[*n].fields {
+                for field in &str_ty.definition(ns).fields {
                     let elem = binary.default_value(&field.ty, ns);
 
                     self.encode_packed_ty(
@@ -2906,7 +2908,7 @@ impl EthAbiDecoder {
 
                 dest.into()
             }
-            ast::Type::Struct(n) => {
+            ast::Type::Struct(str_ty) => {
                 let llvm_ty = binary.llvm_type(ty.deref_any(), ns);
 
                 let size = llvm_ty
@@ -2930,7 +2932,7 @@ impl EthAbiDecoder {
                     binary.builder.build_pointer_cast(
                         new,
                         llvm_ty.ptr_type(AddressSpace::Generic),
-                        &ns.structs[*n].name,
+                        &str_ty.definition(ns).name,
                     )
                 });
 
@@ -2968,7 +2970,7 @@ impl EthAbiDecoder {
                     base_offset
                 };
 
-                for (i, field) in ns.structs[*n].fields.iter().enumerate() {
+                for (i, field) in str_ty.definition(ns).fields.iter().enumerate() {
                     let elem = unsafe {
                         binary.builder.build_gep(
                             struct_pointer,

+ 11 - 79
src/emit/mod.rs

@@ -1,8 +1,8 @@
 use crate::codegen::{Builtin, Expression};
 use crate::sema::ast::RetrieveType;
 use crate::sema::ast::{
-    ArrayLength, BuiltinStruct, CallTy, Contract, FormatArg, Function, Namespace, Parameter,
-    StringLocation, Type,
+    ArrayLength, CallTy, Contract, FormatArg, Function, Namespace, Parameter, StringLocation,
+    StructType, Type,
 };
 use solang_parser::pt;
 use std::convert::TryFrom;
@@ -551,7 +551,7 @@ pub trait TargetRuntime<'a> {
                     dest.into()
                 }
             }
-            Type::Struct(n) => {
+            Type::Struct(str_ty) => {
                 let llvm_ty = bin.llvm_type(ty.deref_any(), ns);
                 // LLVMSizeOf() produces an i64
                 let size = bin.builder.build_int_truncate(
@@ -578,7 +578,7 @@ pub trait TargetRuntime<'a> {
                     "dest",
                 );
 
-                for (i, field) in ns.structs[*n].fields.iter().enumerate() {
+                for (i, field) in str_ty.definition(ns).fields.iter().enumerate() {
                     let val = self.storage_load_slot(bin, &field.ty, slot, slot_ptr, function, ns);
 
                     let elem = unsafe {
@@ -877,8 +877,8 @@ pub trait TargetRuntime<'a> {
                     );
                 }
             }
-            Type::Struct(n) => {
-                for (i, field) in ns.structs[*n].fields.iter().enumerate() {
+            Type::Struct(str_ty) => {
+                for (i, field) in str_ty.definition(ns).fields.iter().enumerate() {
                     let mut elem = unsafe {
                         bin.builder.build_gep(
                             dest.into_pointer_value(),
@@ -1087,8 +1087,8 @@ pub trait TargetRuntime<'a> {
                     self.storage_delete_slot(bin, &Type::Uint(256), slot, slot_ptr, function, ns);
                 }
             }
-            Type::Struct(n) => {
-                for (_, field) in ns.structs[*n].fields.iter().enumerate() {
+            Type::Struct(str_ty) => {
+                for (_, field) in str_ty.definition(ns).fields.iter().enumerate() {
                     self.storage_delete_slot(bin, &field.ty, slot, slot_ptr, function, ns);
 
                     if !field.ty.is_reference_type(ns)
@@ -2295,7 +2295,7 @@ pub trait TargetRuntime<'a> {
 
                     self.storage_subscript(bin, function, ty, array, index, ns)
                         .into()
-                } else if elem_ty.builtin_struct(ns) == BuiltinStruct::AccountInfo {
+                } else if elem_ty.is_builtin_struct() == Some(StructType::AccountInfo) {
                     let array = self
                         .expression(bin, a, vartab, function, ns)
                         .into_pointer_value();
@@ -2364,7 +2364,7 @@ pub trait TargetRuntime<'a> {
                 }
             }
             Expression::StructMember(_, _, a, _)
-                if a.ty().builtin_struct(ns) == BuiltinStruct::AccountInfo =>
+                if a.ty().is_builtin_struct() == Some(StructType::AccountInfo) =>
             {
                 self.builtin(bin, e, vartab, function, ns)
             }
@@ -2512,7 +2512,7 @@ pub trait TargetRuntime<'a> {
                 }
             }
             Expression::Builtin(_, _, Builtin::ArrayLength, args)
-                if args[0].ty().array_deref().builtin_struct(ns) == BuiltinStruct::None =>
+                if args[0].ty().array_deref().is_builtin_struct().is_none() =>
             {
                 let array = self.expression(bin, &args[0], vartab, function, ns);
 
@@ -2893,74 +2893,6 @@ pub trait TargetRuntime<'a> {
                     .build_int_truncate(quotient, res_ty, "quotient")
                     .into()
             }
-            Expression::ExternalFunction {
-                ty,
-                address,
-                function_no,
-                ..
-            } => {
-                let address = self
-                    .expression(bin, address, vartab, function, ns)
-                    .into_array_value();
-
-                let selector = ns.functions[*function_no].selector();
-
-                assert!(matches!(ty, Type::ExternalFunction { .. }));
-
-                let ty = bin.llvm_type(ty, ns);
-
-                let ef = bin
-                    .builder
-                    .build_call(
-                        bin.module.get_function("__malloc").unwrap(),
-                        &[ty.into_pointer_type()
-                            .get_element_type()
-                            .size_of()
-                            .unwrap()
-                            .const_cast(bin.context.i32_type(), false)
-                            .into()],
-                        "",
-                    )
-                    .try_as_basic_value()
-                    .left()
-                    .unwrap()
-                    .into_pointer_value();
-
-                let ef =
-                    bin.builder
-                        .build_pointer_cast(ef, ty.into_pointer_type(), "function_type");
-
-                let address_member = unsafe {
-                    bin.builder.build_gep(
-                        ef,
-                        &[
-                            bin.context.i32_type().const_zero(),
-                            bin.context.i32_type().const_zero(),
-                        ],
-                        "address",
-                    )
-                };
-
-                bin.builder.build_store(address_member, address);
-
-                let selector_member = unsafe {
-                    bin.builder.build_gep(
-                        ef,
-                        &[
-                            bin.context.i32_type().const_zero(),
-                            bin.context.i32_type().const_int(1, false),
-                        ],
-                        "selector",
-                    )
-                };
-
-                bin.builder.build_store(
-                    selector_member,
-                    bin.context.i32_type().const_int(selector as u64, false),
-                );
-
-                ef.into()
-            }
             Expression::Builtin(_, _, hash @ Builtin::Ripemd160, args)
             | Expression::Builtin(_, _, hash @ Builtin::Keccak256, args)
             | Expression::Builtin(_, _, hash @ Builtin::Blake2_128, args)

+ 16 - 10
src/emit/solana.rs

@@ -5,7 +5,7 @@ use solang_parser::pt;
 use std::collections::HashMap;
 use std::str;
 
-use crate::ast::Type;
+use crate::sema::ast::Type;
 use inkwell::module::{Linkage, Module};
 use inkwell::types::{BasicType, IntType};
 use inkwell::values::{
@@ -914,9 +914,11 @@ impl SolanaTarget {
                     binary.builder.build_store(offset_ptr, new_offset);
                 }
             }
-        } else if let ast::Type::Struct(struct_no) = ty {
-            for (i, field) in ns.structs[*struct_no].fields.iter().enumerate() {
-                let field_offset = ns.structs[*struct_no].storage_offsets[i].to_u64().unwrap();
+        } else if let ast::Type::Struct(struct_ty) = ty {
+            for (i, field) in struct_ty.definition(ns).fields.iter().enumerate() {
+                let field_offset = struct_ty.definition(ns).storage_offsets[i]
+                    .to_u64()
+                    .unwrap();
 
                 let offset = binary.builder.build_int_add(
                     slot,
@@ -2219,7 +2221,7 @@ impl<'a> TargetRuntime<'a> for SolanaTarget {
                     .left()
                     .unwrap()
             }
-            ast::Type::Struct(struct_no) => {
+            ast::Type::Struct(struct_ty) => {
                 let llvm_ty = binary.llvm_type(ty.deref_any(), ns);
                 // LLVMSizeOf() produces an i64
                 let size = binary.builder.build_int_truncate(
@@ -2246,8 +2248,10 @@ impl<'a> TargetRuntime<'a> for SolanaTarget {
                     "dest",
                 );
 
-                for (i, field) in ns.structs[*struct_no].fields.iter().enumerate() {
-                    let field_offset = ns.structs[*struct_no].storage_offsets[i].to_u64().unwrap();
+                for (i, field) in struct_ty.definition(ns).fields.iter().enumerate() {
+                    let field_offset = struct_ty.definition(ns).storage_offsets[i]
+                        .to_u64()
+                        .unwrap();
 
                     let mut offset = binary.builder.build_int_add(
                         *slot,
@@ -2704,9 +2708,11 @@ impl<'a> TargetRuntime<'a> for SolanaTarget {
 
             // done
             builder.finish(binary);
-        } else if let ast::Type::Struct(struct_no) = ty {
-            for (i, field) in ns.structs[*struct_no].fields.iter().enumerate() {
-                let field_offset = ns.structs[*struct_no].storage_offsets[i].to_u64().unwrap();
+        } else if let ast::Type::Struct(struct_ty) = ty {
+            for (i, field) in struct_ty.definition(ns).fields.iter().enumerate() {
+                let field_offset = struct_ty.definition(ns).storage_offsets[i]
+                    .to_u64()
+                    .unwrap();
 
                 let mut offset = binary.builder.build_int_add(
                     *offset,

+ 14 - 14
src/emit/substrate.rs

@@ -746,7 +746,7 @@ impl SubstrateTarget {
             ast::Type::UserType(n) => {
                 self.decode_ty(binary, function, &ns.user_types[*n].ty, data, end, ns)
             }
-            ast::Type::Struct(n) => {
+            ast::Type::Struct(str_ty) => {
                 let llvm_ty = binary.llvm_type(ty.deref_any(), ns);
 
                 let size = llvm_ty
@@ -772,7 +772,7 @@ impl SubstrateTarget {
                     "dest",
                 );
 
-                for (i, field) in ns.structs[*n].fields.iter().enumerate() {
+                for (i, field) in str_ty.definition(ns).fields.iter().enumerate() {
                     let elem = unsafe {
                         binary.builder.build_gep(
                             dest,
@@ -1005,7 +1005,7 @@ impl SubstrateTarget {
                         ef,
                         &[
                             binary.context.i32_type().const_zero(),
-                            binary.context.i32_type().const_zero(),
+                            binary.context.i32_type().const_int(1, false),
                         ],
                         "address",
                     )
@@ -1018,7 +1018,7 @@ impl SubstrateTarget {
                         ef,
                         &[
                             binary.context.i32_type().const_zero(),
-                            binary.context.i32_type().const_int(1, false),
+                            binary.context.i32_type().const_zero(),
                         ],
                         "selector",
                     )
@@ -1362,13 +1362,13 @@ impl SubstrateTarget {
                     },
                 );
             }
-            ast::Type::Struct(n) => {
+            ast::Type::Struct(str_ty) => {
                 let arg = if load {
                     binary
                         .builder
                         .build_load(
                             arg.into_pointer_value(),
-                            &format!("encode_{}", ns.structs[*n].name),
+                            &format!("encode_{}", str_ty.definition(ns).name),
                         )
                         .into_pointer_value()
                 } else {
@@ -1388,7 +1388,7 @@ impl SubstrateTarget {
                 binary.builder.position_at_end(normal_struct);
 
                 let mut normal_data = *data;
-                for (i, field) in ns.structs[*n].fields.iter().enumerate() {
+                for (i, field) in str_ty.definition(ns).fields.iter().enumerate() {
                     let elem = unsafe {
                         binary.builder.build_gep(
                             arg,
@@ -1420,7 +1420,7 @@ impl SubstrateTarget {
 
                 let mut null_data = *data;
 
-                for field in &ns.structs[*n].fields {
+                for field in &str_ty.definition(ns).fields {
                     let elem = binary.default_value(&field.ty, ns);
 
                     self.encode_ty(
@@ -1521,7 +1521,7 @@ impl SubstrateTarget {
                         arg.into_pointer_value(),
                         &[
                             binary.context.i32_type().const_zero(),
-                            binary.context.i32_type().const_zero(),
+                            binary.context.i32_type().const_int(1, false),
                         ],
                         "address",
                     )
@@ -1545,7 +1545,7 @@ impl SubstrateTarget {
                         arg.into_pointer_value(),
                         &[
                             binary.context.i32_type().const_zero(),
-                            binary.context.i32_type().const_int(1, false),
+                            binary.context.i32_type().const_zero(),
                         ],
                         "selector",
                     )
@@ -1599,13 +1599,13 @@ impl SubstrateTarget {
             ast::Type::Enum(n) => {
                 self.encoded_length(arg, load, packed, &ns.enums[*n].ty, function, binary, ns)
             }
-            ast::Type::Struct(n) => {
+            ast::Type::Struct(str_ty) => {
                 let arg = if load {
                     binary
                         .builder
                         .build_load(
                             arg.into_pointer_value(),
-                            &format!("encoded_length_struct_{}", ns.structs[*n].name),
+                            &format!("encoded_length_struct_{}", str_ty.definition(ns).name),
                         )
                         .into_pointer_value()
                 } else {
@@ -1627,7 +1627,7 @@ impl SubstrateTarget {
                 let mut normal_sum = binary.context.i32_type().const_zero();
 
                 // avoid generating load instructions for structs with only fixed fields
-                for (i, field) in ns.structs[*n].fields.iter().enumerate() {
+                for (i, field) in str_ty.definition(ns).fields.iter().enumerate() {
                     let elem = unsafe {
                         binary.builder.build_gep(
                             arg,
@@ -1662,7 +1662,7 @@ impl SubstrateTarget {
 
                 let mut null_sum = binary.context.i32_type().const_zero();
 
-                for field in &ns.structs[*n].fields {
+                for field in &str_ty.definition(ns).fields {
                     null_sum = binary.builder.build_int_add(
                         null_sum,
                         self.encoded_length(

+ 7 - 8
src/lib.rs

@@ -14,7 +14,6 @@ mod linker;
 pub mod sema;
 
 use file_resolver::FileResolver;
-use sema::ast;
 use sema::diagnostics;
 use solang_parser::pt;
 use std::{ffi::OsStr, fmt};
@@ -115,7 +114,7 @@ pub fn compile(
     opt_level: inkwell::OptimizationLevel,
     target: Target,
     math_overflow_check: bool,
-) -> (Vec<(Vec<u8>, String)>, ast::Namespace) {
+) -> (Vec<(Vec<u8>, String)>, sema::ast::Namespace) {
     let mut ns = parse_and_resolve(filename, resolver, target);
 
     if ns.diagnostics.any_errors() {
@@ -152,7 +151,7 @@ pub fn compile(
 #[cfg(feature = "llvm")]
 pub fn compile_many<'a>(
     context: &'a inkwell::context::Context,
-    namespaces: &'a [&ast::Namespace],
+    namespaces: &'a [&sema::ast::Namespace],
     filename: &str,
     opt: inkwell::OptimizationLevel,
     math_overflow_check: bool,
@@ -169,14 +168,14 @@ pub fn parse_and_resolve(
     filename: &OsStr,
     resolver: &mut FileResolver,
     target: Target,
-) -> ast::Namespace {
-    let mut ns = ast::Namespace::new(target);
+) -> sema::ast::Namespace {
+    let mut ns = sema::ast::Namespace::new(target);
 
     match resolver.resolve_file(None, filename) {
         Err(message) => {
-            ns.diagnostics.push(ast::Diagnostic {
-                ty: ast::ErrorType::ParserError,
-                level: ast::Level::Error,
+            ns.diagnostics.push(sema::ast::Diagnostic {
+                ty: sema::ast::ErrorType::ParserError,
+                level: sema::ast::Level::Error,
                 message,
                 loc: pt::Loc::CommandLine,
                 notes: Vec::new(),

+ 6 - 6
src/sema/ast.rs

@@ -31,7 +31,7 @@ pub enum Type {
     /// The usize is an index into enums in the namespace
     Enum(usize),
     /// The usize is an index into contracts in the namespace
-    Struct(usize),
+    Struct(StructType),
     Mapping(Box<Type>, Box<Type>),
     /// The usize is an index into contracts in the namespace
     Contract(usize),
@@ -112,11 +112,12 @@ impl Type {
     }
 }
 
-#[derive(PartialEq, Clone, Debug, Copy)]
-pub enum BuiltinStruct {
-    None,
+#[derive(PartialEq, Eq, Clone, Debug, Copy, Hash)]
+pub enum StructType {
+    UserDefined(usize),
     AccountInfo,
     AccountMeta,
+    ExternalFunction,
 }
 
 #[derive(PartialEq, Clone, Debug)]
@@ -124,7 +125,6 @@ pub struct StructDecl {
     pub tags: Vec<Tag>,
     pub name: String,
     pub loc: pt::Loc,
-    pub builtin: BuiltinStruct,
     pub contract: Option<String>,
     pub fields: Vec<Parameter>,
     // List of offsets of the fields, last entry is the offset for the struct overall size
@@ -443,7 +443,7 @@ pub enum Symbol {
     Enum(pt::Loc, usize),
     Function(Vec<(pt::Loc, usize)>),
     Variable(pt::Loc, Option<usize>, usize),
-    Struct(pt::Loc, usize),
+    Struct(pt::Loc, StructType),
     Event(Vec<(pt::Loc, usize)>),
     Contract(pt::Loc, usize),
     Import(pt::Loc, usize),

+ 5 - 169
src/sema/builtin.rs

@@ -1,6 +1,6 @@
 use super::ast::{
-    ArrayLength, Builtin, BuiltinStruct, Diagnostic, Expression, File, Function, Namespace,
-    Parameter, StructDecl, Symbol, Type,
+    ArrayLength, Builtin, Diagnostic, Expression, File, Function, Namespace, Parameter, StructType,
+    Symbol, Type,
 };
 use super::diagnostics::Diagnostics;
 use super::eval::eval_const_number;
@@ -513,7 +513,7 @@ static BUILTIN_VARIABLE: Lazy<[Prototype; 16]> = Lazy::new(|| {
             name: "accounts",
             params: vec![],
             ret: vec![Type::Array(
-                Box::new(Type::Struct(0)),
+                Box::new(Type::Struct(StructType::AccountInfo)),
                 vec![ArrayLength::Dynamic],
             )],
             target: vec![Target::Solana],
@@ -1435,118 +1435,6 @@ impl Namespace {
             cache_no: None,
         });
 
-        let account_info_no = self.structs.len();
-
-        let fields = vec![
-            Parameter {
-                loc: pt::Loc::Builtin,
-                id: Some(pt::Identifier {
-                    name: String::from("key"),
-                    loc: pt::Loc::Builtin,
-                }),
-                ty: Type::Address(false),
-                ty_loc: None,
-                indexed: false,
-                readonly: true,
-                recursive: false,
-            },
-            Parameter {
-                loc: pt::Loc::Builtin,
-                id: Some(pt::Identifier {
-                    name: String::from("lamports"),
-                    loc: pt::Loc::Builtin,
-                }),
-                ty: Type::Uint(64),
-                ty_loc: None,
-                indexed: false,
-                readonly: false,
-                recursive: false,
-            },
-            Parameter {
-                loc: pt::Loc::Builtin,
-                id: Some(pt::Identifier {
-                    name: String::from("data"),
-                    loc: pt::Loc::Builtin,
-                }),
-                ty: Type::DynamicBytes,
-                ty_loc: None,
-                indexed: false,
-                readonly: true,
-                recursive: false,
-            },
-            Parameter {
-                loc: pt::Loc::Builtin,
-                id: Some(pt::Identifier {
-                    name: String::from("owner"),
-                    loc: pt::Loc::Builtin,
-                }),
-                ty: Type::Address(false),
-                ty_loc: None,
-                indexed: false,
-                readonly: true,
-                recursive: false,
-            },
-            Parameter {
-                loc: pt::Loc::Builtin,
-                id: Some(pt::Identifier {
-                    name: String::from("rent_epoch"),
-                    loc: pt::Loc::Builtin,
-                }),
-                ty: Type::Uint(64),
-                ty_loc: None,
-                indexed: false,
-                readonly: true,
-                recursive: false,
-            },
-            Parameter {
-                loc: pt::Loc::Builtin,
-                id: Some(pt::Identifier {
-                    name: String::from("is_signer"),
-                    loc: pt::Loc::Builtin,
-                }),
-                ty: Type::Bool,
-                ty_loc: None,
-                indexed: false,
-                readonly: true,
-                recursive: false,
-            },
-            Parameter {
-                loc: pt::Loc::Builtin,
-                id: Some(pt::Identifier {
-                    name: String::from("is_writable"),
-                    loc: pt::Loc::Builtin,
-                }),
-                ty: Type::Bool,
-                ty_loc: None,
-                indexed: false,
-                readonly: true,
-                recursive: false,
-            },
-            Parameter {
-                loc: pt::Loc::Builtin,
-                id: Some(pt::Identifier {
-                    name: String::from("executable"),
-                    loc: pt::Loc::Builtin,
-                }),
-                ty: Type::Bool,
-                ty_loc: None,
-                indexed: false,
-                readonly: true,
-                recursive: false,
-            },
-        ];
-
-        self.structs.push(StructDecl {
-            tags: Vec::new(),
-            loc: pt::Loc::Builtin,
-            builtin: BuiltinStruct::AccountInfo,
-            contract: None,
-            name: String::from("AccountInfo"),
-            fields,
-            offsets: Vec::new(),
-            storage_offsets: Vec::new(),
-        });
-
         let id = pt::Identifier {
             loc: pt::Loc::Builtin,
             name: String::from("AccountInfo"),
@@ -1556,61 +1444,9 @@ impl Namespace {
             file_no,
             None,
             &id,
-            Symbol::Struct(pt::Loc::Builtin, account_info_no)
+            Symbol::Struct(pt::Loc::Builtin, StructType::AccountInfo)
         ));
 
-        let account_meta_no = self.structs.len();
-
-        let fields = vec![
-            Parameter {
-                loc: pt::Loc::Builtin,
-                id: Some(pt::Identifier {
-                    name: String::from("pubkey"),
-                    loc: pt::Loc::Builtin,
-                }),
-                ty: Type::Ref(Box::new(Type::Address(false))),
-                ty_loc: None,
-                indexed: false,
-                readonly: false,
-                recursive: false,
-            },
-            Parameter {
-                loc: pt::Loc::Builtin,
-                id: Some(pt::Identifier {
-                    name: String::from("is_writable"),
-                    loc: pt::Loc::Builtin,
-                }),
-                ty: Type::Bool,
-                ty_loc: None,
-                indexed: false,
-                readonly: false,
-                recursive: false,
-            },
-            Parameter {
-                loc: pt::Loc::Builtin,
-                id: Some(pt::Identifier {
-                    name: String::from("is_signer"),
-                    loc: pt::Loc::Builtin,
-                }),
-                ty: Type::Bool,
-                ty_loc: None,
-                indexed: false,
-                readonly: false,
-                recursive: false,
-            },
-        ];
-
-        self.structs.push(StructDecl {
-            tags: Vec::new(),
-            loc: pt::Loc::Builtin,
-            builtin: BuiltinStruct::AccountMeta,
-            contract: None,
-            name: String::from("AccountMeta"),
-            fields,
-            offsets: Vec::new(),
-            storage_offsets: Vec::new(),
-        });
-
         let id = pt::Identifier {
             loc: pt::Loc::Builtin,
             name: String::from("AccountMeta"),
@@ -1620,7 +1456,7 @@ impl Namespace {
             file_no,
             None,
             &id,
-            Symbol::Struct(pt::Loc::Builtin, account_meta_no)
+            Symbol::Struct(pt::Loc::Builtin, StructType::AccountMeta)
         ));
 
         let mut func = Function::new(

+ 199 - 0
src/sema/builtin_structs.rs

@@ -0,0 +1,199 @@
+use crate::sema::ast::{Namespace, Parameter, StructDecl, StructType, Type};
+use once_cell::sync::Lazy;
+use solang_parser::pt;
+
+static BUILTIN_STRUCTS: Lazy<[StructDecl; 3]> = Lazy::new(|| {
+    [
+        StructDecl {
+            tags: Vec::new(),
+            loc: pt::Loc::Builtin,
+            contract: None,
+            name: "AccountInfo".to_string(),
+            fields: vec![
+                Parameter {
+                    loc: pt::Loc::Builtin,
+                    id: Some(pt::Identifier {
+                        name: String::from("key"),
+                        loc: pt::Loc::Builtin,
+                    }),
+                    ty: Type::Address(false),
+                    ty_loc: None,
+                    indexed: false,
+                    readonly: true,
+                    recursive: false,
+                },
+                Parameter {
+                    loc: pt::Loc::Builtin,
+                    id: Some(pt::Identifier {
+                        name: String::from("lamports"),
+                        loc: pt::Loc::Builtin,
+                    }),
+                    ty: Type::Uint(64),
+                    ty_loc: None,
+                    indexed: false,
+                    readonly: false,
+                    recursive: false,
+                },
+                Parameter {
+                    loc: pt::Loc::Builtin,
+                    id: Some(pt::Identifier {
+                        name: String::from("data"),
+                        loc: pt::Loc::Builtin,
+                    }),
+                    ty: Type::DynamicBytes,
+                    ty_loc: None,
+                    indexed: false,
+                    readonly: true,
+                    recursive: false,
+                },
+                Parameter {
+                    loc: pt::Loc::Builtin,
+                    id: Some(pt::Identifier {
+                        name: String::from("owner"),
+                        loc: pt::Loc::Builtin,
+                    }),
+                    ty: Type::Address(false),
+                    ty_loc: None,
+                    indexed: false,
+                    readonly: true,
+                    recursive: false,
+                },
+                Parameter {
+                    loc: pt::Loc::Builtin,
+                    id: Some(pt::Identifier {
+                        name: String::from("rent_epoch"),
+                        loc: pt::Loc::Builtin,
+                    }),
+                    ty: Type::Uint(64),
+                    ty_loc: None,
+                    indexed: false,
+                    readonly: true,
+                    recursive: false,
+                },
+                Parameter {
+                    loc: pt::Loc::Builtin,
+                    id: Some(pt::Identifier {
+                        name: String::from("is_signer"),
+                        loc: pt::Loc::Builtin,
+                    }),
+                    ty: Type::Bool,
+                    ty_loc: None,
+                    indexed: false,
+                    readonly: true,
+                    recursive: false,
+                },
+                Parameter {
+                    loc: pt::Loc::Builtin,
+                    id: Some(pt::Identifier {
+                        name: String::from("is_writable"),
+                        loc: pt::Loc::Builtin,
+                    }),
+                    ty: Type::Bool,
+                    ty_loc: None,
+                    indexed: false,
+                    readonly: true,
+                    recursive: false,
+                },
+                Parameter {
+                    loc: pt::Loc::Builtin,
+                    id: Some(pt::Identifier {
+                        name: String::from("executable"),
+                        loc: pt::Loc::Builtin,
+                    }),
+                    ty: Type::Bool,
+                    ty_loc: None,
+                    indexed: false,
+                    readonly: true,
+                    recursive: false,
+                },
+            ],
+            offsets: Vec::new(),
+            storage_offsets: Vec::new(),
+        },
+        StructDecl {
+            tags: Vec::new(),
+            loc: pt::Loc::Builtin,
+            contract: None,
+            name: "AccountMeta".to_string(),
+            fields: vec![
+                Parameter {
+                    loc: pt::Loc::Builtin,
+                    id: Some(pt::Identifier {
+                        name: String::from("pubkey"),
+                        loc: pt::Loc::Builtin,
+                    }),
+                    ty: Type::Ref(Box::new(Type::Address(false))),
+                    ty_loc: None,
+                    indexed: false,
+                    readonly: false,
+                    recursive: false,
+                },
+                Parameter {
+                    loc: pt::Loc::Builtin,
+                    id: Some(pt::Identifier {
+                        name: String::from("is_writable"),
+                        loc: pt::Loc::Builtin,
+                    }),
+                    ty: Type::Bool,
+                    ty_loc: None,
+                    indexed: false,
+                    readonly: false,
+                    recursive: false,
+                },
+                Parameter {
+                    loc: pt::Loc::Builtin,
+                    id: Some(pt::Identifier {
+                        name: String::from("is_signer"),
+                        loc: pt::Loc::Builtin,
+                    }),
+                    ty: Type::Bool,
+                    ty_loc: None,
+                    indexed: false,
+                    readonly: false,
+                    recursive: false,
+                },
+            ],
+            offsets: Vec::new(),
+            storage_offsets: Vec::new(),
+        },
+        StructDecl {
+            tags: Vec::new(),
+            name: "ExternalFunction".to_string(),
+            loc: pt::Loc::Builtin,
+            contract: None,
+            fields: vec![
+                Parameter {
+                    loc: pt::Loc::Builtin,
+                    id: None,
+                    ty: Type::Bytes(4),
+                    ty_loc: None,
+                    indexed: false,
+                    readonly: false,
+                    recursive: false,
+                },
+                Parameter {
+                    loc: pt::Loc::Builtin,
+                    id: None,
+                    ty: Type::Address(false),
+                    ty_loc: None,
+                    indexed: false,
+                    readonly: false,
+                    recursive: false,
+                },
+            ],
+            offsets: Vec::new(),
+            storage_offsets: Vec::new(),
+        },
+    ]
+});
+
+impl StructType {
+    pub fn definition<'a>(&'a self, ns: &'a Namespace) -> &StructDecl {
+        match self {
+            StructType::UserDefined(struct_no) => &ns.structs[*struct_no],
+            StructType::AccountInfo => &BUILTIN_STRUCTS[0],
+            StructType::AccountMeta => &BUILTIN_STRUCTS[1],
+            StructType::ExternalFunction => &BUILTIN_STRUCTS[2],
+        }
+    }
+}

+ 31 - 31
src/sema/expression.rs

@@ -1,7 +1,7 @@
 use super::address::to_hexstr_eip55;
 use super::ast::{
-    ArrayLength, Builtin, BuiltinStruct, CallArgs, CallTy, Diagnostic, Expression, Function,
-    Mutability, Namespace, StringLocation, Symbol, Type,
+    ArrayLength, Builtin, CallArgs, CallTy, Diagnostic, Expression, Function, Mutability,
+    Namespace, RetrieveType, StringLocation, StructType, Symbol, Type,
 };
 use super::builtin;
 use super::contracts::is_base;
@@ -10,7 +10,6 @@ use super::eval::eval_const_number;
 use super::eval::eval_const_rational;
 use super::format::string_format;
 use super::{symtable::Symtable, using};
-use crate::ast::RetrieveType;
 use crate::sema::unused_variable::{
     assigned_variable, check_function_call, check_var_usage_expression, used_variable,
 };
@@ -1260,10 +1259,10 @@ fn get_int_length(
             ));
             Err(())
         }
-        Type::Struct(n) => {
+        Type::Struct(str_ty) => {
             diagnostics.push(Diagnostic::error(
                 *l_loc,
-                format!("type struct {} not allowed", ns.structs[*n]),
+                format!("type struct {} not allowed", str_ty.definition(ns)),
             ));
             Err(())
         }
@@ -4588,8 +4587,9 @@ fn member_access(
     let expr = expression(e, context, ns, symtable, diagnostics, resolve_to)?;
     let expr_ty = expr.ty();
 
-    if let Type::Struct(struct_no) = expr_ty.deref_memory() {
-        if let Some((i, f)) = ns.structs[*struct_no]
+    if let Type::Struct(struct_ty) = expr_ty.deref_memory() {
+        if let Some((i, f)) = struct_ty
+            .definition(ns)
             .fields
             .iter()
             .enumerate()
@@ -4600,7 +4600,8 @@ fn member_access(
                     id.loc,
                     format!(
                         "struct '{}' field '{}' is readonly",
-                        ns.structs[*struct_no], id.name
+                        struct_ty.definition(ns),
+                        id.name
                     ),
                 ));
                 Err(())
@@ -4625,7 +4626,8 @@ fn member_access(
                 id.loc,
                 format!(
                     "struct '{}' does not have a field called '{}'",
-                    ns.structs[*struct_no], id.name
+                    struct_ty.definition(ns),
+                    id.name
                 ),
             ));
             return Err(());
@@ -4693,8 +4695,9 @@ fn member_access(
             }
         }
         Type::StorageRef(immutable, r) => match *r {
-            Type::Struct(n) => {
-                return if let Some((field_no, field)) = ns.structs[n]
+            Type::Struct(str_ty) => {
+                return if let Some((field_no, field)) = str_ty
+                    .definition(ns)
                     .fields
                     .iter()
                     .enumerate()
@@ -4711,7 +4714,8 @@ fn member_access(
                         id.loc,
                         format!(
                             "struct '{}' does not have a field called '{}'",
-                            ns.structs[n].name, id.name
+                            str_ty.definition(ns).name,
+                            id.name
                         ),
                     ));
                     Err(())
@@ -5070,21 +5074,18 @@ fn array_subscript(
 /// Resolve a function call with positional arguments
 fn struct_literal(
     loc: &pt::Loc,
-    struct_no: usize,
+    struct_ty: &StructType,
     args: &[pt::Expression],
     context: &ExprContext,
     ns: &mut Namespace,
     symtable: &mut Symtable,
     diagnostics: &mut Diagnostics,
 ) -> Result<Expression, ()> {
-    let struct_def = ns.structs[struct_no].clone();
+    let struct_def = struct_ty.definition(ns).clone();
 
-    let ty = Type::Struct(struct_no);
+    let ty = Type::Struct(*struct_ty);
 
-    if ty
-        .contains_builtins(ns, BuiltinStruct::AccountInfo)
-        .is_some()
-    {
+    if ty.contains_builtins(ns, &StructType::AccountInfo).is_some() {
         diagnostics.push(Diagnostic::error(
             *loc,
             format!(
@@ -5653,20 +5654,17 @@ fn function_call_named_args(
 /// Resolve a struct literal with named fields
 fn named_struct_literal(
     loc: &pt::Loc,
-    struct_no: usize,
+    str_ty: &StructType,
     args: &[pt::NamedArgument],
     context: &ExprContext,
     ns: &mut Namespace,
     symtable: &mut Symtable,
     diagnostics: &mut Diagnostics,
 ) -> Result<Expression, ()> {
-    let struct_def = ns.structs[struct_no].clone();
-    let ty = Type::Struct(struct_no);
+    let struct_def = str_ty.definition(ns).clone();
+    let ty = Type::Struct(*str_ty);
 
-    if ty
-        .contains_builtins(ns, BuiltinStruct::AccountInfo)
-        .is_some()
-    {
+    if ty.contains_builtins(ns, &StructType::AccountInfo).is_some() {
         diagnostics.push(Diagnostic::error(
             *loc,
             format!(
@@ -7343,7 +7341,9 @@ fn parse_call_args(
 
                 // if let chains would really help here
                 if let Type::Array(elem_ty, dims) = expr_ty.deref_memory() {
-                    if elem_ty.builtin_struct(ns) == BuiltinStruct::AccountMeta && dims.len() == 1 {
+                    if elem_ty.is_builtin_struct() == Some(StructType::AccountMeta)
+                        && dims.len() == 1
+                    {
                         correct_ty = true;
                     }
                 }
@@ -7395,8 +7395,8 @@ pub fn named_call_expr(
         ty,
         &mut nullsink,
     ) {
-        Ok(Type::Struct(n)) => {
-            return named_struct_literal(loc, n, args, context, ns, symtable, diagnostics);
+        Ok(Type::Struct(str_ty)) => {
+            return named_struct_literal(loc, &str_ty, args, context, ns, symtable, diagnostics);
         }
         Ok(_) => {
             diagnostics.push(Diagnostic::error(
@@ -7462,8 +7462,8 @@ pub fn call_expr(
         ty,
         &mut nullsink,
     ) {
-        Ok(Type::Struct(n)) => {
-            return struct_literal(loc, n, args, context, ns, symtable, diagnostics);
+        Ok(Type::Struct(str_ty)) => {
+            return struct_literal(loc, &str_ty, args, context, ns, symtable, diagnostics);
         }
         Ok(to) => {
             // Cast

+ 3 - 3
src/sema/functions.rs

@@ -1,5 +1,5 @@
 use super::ast::{
-    BuiltinStruct, Diagnostic, Function, Mutability, Namespace, Parameter, Symbol, Type,
+    Diagnostic, Function, Mutability, Namespace, Parameter, StructType, Symbol, Type,
 };
 use super::contracts::is_base;
 use super::diagnostics::Diagnostics;
@@ -837,7 +837,7 @@ pub fn resolve_params(
                         success = false;
                     }
 
-                    if let Some(ty) = ty.contains_builtins(ns, BuiltinStruct::AccountInfo) {
+                    if let Some(ty) = ty.contains_builtins(ns, &StructType::AccountInfo) {
                         let message = format!(
                             "parameter of type '{}' not alowed in public or external functions",
                             ty.to_string(ns)
@@ -944,7 +944,7 @@ pub fn resolve_returns(
                         success = false;
                     }
 
-                    if let Some(ty) = ty.contains_builtins(ns, BuiltinStruct::AccountInfo) {
+                    if let Some(ty) = ty.contains_builtins(ns, &StructType::AccountInfo) {
                         let message = format!(
                             "return type '{}' not allowed in public or external functions",
                             ty.to_string(ns)

+ 1 - 0
src/sema/mod.rs

@@ -12,6 +12,7 @@ use std::ffi::OsStr;
 mod address;
 pub mod ast;
 pub mod builtin;
+mod builtin_structs;
 pub(crate) mod contracts;
 pub mod diagnostics;
 mod dotgraphviz;

+ 3 - 3
src/sema/namespace.rs

@@ -1047,9 +1047,9 @@ impl Namespace {
                 Box::new(Type::Enum(*n)),
                 resolve_dimensions(&dimensions, diagnostics)?,
             )),
-            Some(Symbol::Struct(_, n)) if dimensions.is_empty() => Ok(Type::Struct(*n)),
-            Some(Symbol::Struct(_, n)) => Ok(Type::Array(
-                Box::new(Type::Struct(*n)),
+            Some(Symbol::Struct(_, str_ty)) if dimensions.is_empty() => Ok(Type::Struct(*str_ty)),
+            Some(Symbol::Struct(_, str_ty)) => Ok(Type::Array(
+                Box::new(Type::Struct(*str_ty)),
                 resolve_dimensions(&dimensions, diagnostics)?,
             )),
             Some(Symbol::Contract(_, n)) if dimensions.is_empty() => Ok(Type::Contract(*n)),

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

@@ -1,5 +1,5 @@
 #![cfg(test)]
-use crate::ast::{Expression, Parameter, Statement, TryCatch, Type};
+use crate::sema::ast::{Expression, Parameter, Statement, TryCatch, Type};
 use crate::sema::diagnostics::Diagnostics;
 use crate::sema::expression::unescape;
 use crate::sema::yul::ast::InlineAssembly;

+ 47 - 29
src/sema/types.rs

@@ -2,8 +2,8 @@ use super::tags::resolve_tags;
 use super::SOLANA_BUCKET_SIZE;
 use super::{
     ast::{
-        ArrayLength, BuiltinStruct, Contract, Diagnostic, EnumDecl, EventDecl, Namespace,
-        Parameter, StructDecl, Symbol, Tag, Type, UserTypeDecl,
+        ArrayLength, Contract, Diagnostic, EnumDecl, EventDecl, Namespace, Parameter, StructDecl,
+        StructType, Symbol, Tag, Type, UserTypeDecl,
     },
     diagnostics::Diagnostics,
     SOLANA_SPARSE_ARRAY_SIZE,
@@ -16,6 +16,7 @@ use solang_parser::{
     pt,
     pt::CodeLocation,
 };
+use std::collections::HashSet;
 use std::{collections::HashMap, fmt::Write, ops::Mul};
 
 /// List the types which should be resolved later
@@ -77,12 +78,11 @@ pub fn resolve_typenames<'a>(
                     file_no,
                     None,
                     &def.name,
-                    Symbol::Struct(def.name.loc, struct_no),
+                    Symbol::Struct(def.name.loc, StructType::UserDefined(struct_no)),
                 ) {
                     ns.structs.push(StructDecl {
                         tags: Vec::new(),
                         name: def.name.name.to_owned(),
-                        builtin: BuiltinStruct::None,
                         loc: def.name.loc,
                         contract: None,
                         fields: Vec::new(),
@@ -211,15 +211,15 @@ fn type_decl(
 /// check if a struct contains itself. This function calls itself recursively
 fn find_struct_recursion(struct_no: usize, structs_visited: &mut Vec<usize>, ns: &mut Namespace) {
     let def = ns.structs[struct_no].clone();
-    let mut types_seen = Vec::new();
+    let mut types_seen: HashSet<usize> = HashSet::new();
 
     for (field_no, field) in def.fields.iter().enumerate() {
-        if let Type::Struct(field_struct_no) = field.ty {
+        if let Type::Struct(StructType::UserDefined(field_struct_no)) = field.ty {
             if types_seen.contains(&field_struct_no) {
                 continue;
             }
 
-            types_seen.push(field_struct_no);
+            types_seen.insert(field_struct_no);
 
             if structs_visited.contains(&field_struct_no) {
                 ns.diagnostics.push(Diagnostic::error_with_note(
@@ -329,12 +329,11 @@ fn resolve_contract<'a>(
                     file_no,
                     Some(contract_no),
                     &pt.name,
-                    Symbol::Struct(pt.name.loc, struct_no),
+                    Symbol::Struct(pt.name.loc, StructType::UserDefined(struct_no)),
                 ) {
                     ns.structs.push(StructDecl {
                         tags: Vec::new(),
                         name: pt.name.name.to_owned(),
-                        builtin: BuiltinStruct::None,
                         loc: pt.name.loc,
                         contract: Some(def.name.name.to_owned()),
                         fields: Vec::new(),
@@ -789,7 +788,7 @@ impl Type {
             Type::String => "string".to_string(),
             Type::DynamicBytes => "bytes".to_string(),
             Type::Enum(n) => format!("enum {}", ns.enums[*n]),
-            Type::Struct(n) => format!("struct {}", ns.structs[*n]),
+            Type::Struct(str_ty) => format!("struct {}", str_ty.definition(ns)),
             Type::Array(ty, len) => format!(
                 "{}{}",
                 ty.to_string(ns),
@@ -900,10 +899,11 @@ impl Type {
             Type::Ref(r) => r.to_string(ns),
             Type::StorageRef(_, r) => r.to_string(ns),
             Type::Struct(_) if say_tuple => "tuple".to_string(),
-            Type::Struct(struct_no) => {
+            Type::Struct(struct_type) => {
                 format!(
                     "({})",
-                    ns.structs[*struct_no]
+                    struct_type
+                        .definition(ns)
                         .fields
                         .iter()
                         .map(|f| f.ty.to_signature_string(say_tuple, ns))
@@ -1033,7 +1033,8 @@ impl Type {
                         .product::<BigInt>(),
                 )
             }
-            Type::Struct(n) => ns.structs[*n]
+            Type::Struct(str_ty) => str_ty
+                .definition(ns)
                 .fields
                 .iter()
                 .map(|d| d.ty.memory_size_of(ns))
@@ -1070,7 +1071,8 @@ impl Type {
                         .product::<BigInt>(),
                 )
             }
-            Type::Struct(n) => ns.structs[*n]
+            Type::Struct(str_ty) => str_ty
+                .definition(ns)
                 .offsets
                 .last()
                 .cloned()
@@ -1095,7 +1097,8 @@ impl Type {
             Type::Uint(n) | Type::Int(n) if *n <= 16 => 2,
             Type::Uint(n) | Type::Int(n) if *n <= 32 => 4,
             Type::Uint(_) | Type::Int(_) => 8,
-            Type::Struct(n) => ns.structs[*n]
+            Type::Struct(str_ty) => str_ty
+                .definition(ns)
                 .fields
                 .iter()
                 .map(|f| if f.recursive { 1 } else { f.ty.align_of(ns) })
@@ -1188,7 +1191,8 @@ impl Type {
                         )
                     }
                 }
-                Type::Struct(n) => ns.structs[*n]
+                Type::Struct(str_ty) => str_ty
+                    .definition(ns)
                     .storage_offsets
                     .last()
                     .cloned()
@@ -1207,7 +1211,8 @@ impl Type {
         } else {
             match self {
                 Type::StorageRef(_, r) | Type::Ref(r) => r.storage_slots(ns),
-                Type::Struct(n) => ns.structs[*n]
+                Type::Struct(str_ty) => str_ty
+                    .definition(ns)
                     .fields
                     .iter()
                     .map(|f| {
@@ -1259,7 +1264,8 @@ impl Type {
                         ty.storage_align(ns)
                     }
                 }
-                Type::Struct(n) => ns.structs[*n]
+                Type::Struct(str_ty) => str_ty
+                    .definition(ns)
                     .fields
                     .iter()
                     .map(|field| {
@@ -1327,7 +1333,11 @@ impl Type {
 
                 ty.is_dynamic(ns)
             }
-            Type::Struct(n) => ns.structs[*n].fields.iter().any(|f| f.ty.is_dynamic(ns)),
+            Type::Struct(str_ty) => str_ty
+                .definition(ns)
+                .fields
+                .iter()
+                .any(|f| f.ty.is_dynamic(ns)),
             Type::StorageRef(_, r) => r.is_dynamic(ns),
             _ => false,
         }
@@ -1392,7 +1402,8 @@ impl Type {
         match self {
             Type::Mapping(..) => true,
             Type::Array(ty, _) => ty.contains_mapping(ns),
-            Type::Struct(n) => ns.structs[*n]
+            Type::Struct(str_ty) => str_ty
+                .definition(ns)
                 .fields
                 .iter()
                 .any(|f| !f.recursive && f.ty.contains_mapping(ns)),
@@ -1406,7 +1417,8 @@ impl Type {
         match self {
             Type::InternalFunction { .. } => true,
             Type::Array(ty, _) => ty.contains_internal_function(ns),
-            Type::Struct(n) => ns.structs[*n]
+            Type::Struct(str_ty) => str_ty
+                .definition(ns)
                 .fields
                 .iter()
                 .any(|f| !f.recursive && f.ty.contains_internal_function(ns)),
@@ -1416,11 +1428,17 @@ impl Type {
     }
 
     /// Is this structure a builtin
-    pub fn builtin_struct(&self, ns: &Namespace) -> BuiltinStruct {
+    pub fn is_builtin_struct(&self) -> Option<StructType> {
         match self {
-            Type::Struct(n) => ns.structs[*n].builtin,
-            Type::StorageRef(_, r) | Type::Ref(r) => r.builtin_struct(ns),
-            _ => BuiltinStruct::None,
+            Type::Struct(str_ty) => {
+                if matches!(str_ty, StructType::UserDefined(_)) {
+                    None
+                } else {
+                    Some(*str_ty)
+                }
+            }
+            Type::StorageRef(_, r) | Type::Ref(r) => r.is_builtin_struct(),
+            _ => None,
         }
     }
 
@@ -1428,15 +1446,15 @@ impl Type {
     pub fn contains_builtins<'a>(
         &'a self,
         ns: &'a Namespace,
-        builtin: BuiltinStruct,
+        builtin: &StructType,
     ) -> Option<&'a Type> {
         match self {
             Type::Array(ty, _) => ty.contains_builtins(ns, builtin),
             Type::Mapping(key, value) => key
                 .contains_builtins(ns, builtin)
                 .or_else(|| value.contains_builtins(ns, builtin)),
-            Type::Struct(n) if ns.structs[*n].builtin == builtin => Some(self),
-            Type::Struct(n) => ns.structs[*n].fields.iter().find_map(|f| {
+            Type::Struct(str_ty) if str_ty == builtin => Some(self),
+            Type::Struct(str_ty) => str_ty.definition(ns).fields.iter().find_map(|f| {
                 if f.recursive {
                     None
                 } else {
@@ -1486,7 +1504,7 @@ impl Type {
             Type::DynamicBytes => "bytes".to_string(),
             Type::String => "string".to_string(),
             Type::Enum(i) => format!("{}", ns.enums[*i]),
-            Type::Struct(i) => format!("{}", ns.structs[*i]),
+            Type::Struct(str_ty) => format!("{}", str_ty.definition(ns)),
             Type::Array(ty, len) => format!(
                 "{}{}",
                 ty.to_llvm_string(ns),

+ 1 - 2
src/sema/unused_variable.rs

@@ -1,5 +1,4 @@
-use crate::ast::EventDecl;
-use crate::sema::ast::{Builtin, CallArgs, Diagnostic, Expression, Namespace};
+use crate::sema::ast::{Builtin, CallArgs, Diagnostic, EventDecl, Expression, Namespace};
 use crate::sema::symtable::{Symtable, VariableUsage};
 use crate::sema::{ast, symtable};
 use solang_parser::pt::{ContractTy, Loc};

+ 3 - 3
src/sema/variables.rs

@@ -1,6 +1,6 @@
 use super::{
     ast::{
-        BuiltinStruct, Diagnostic, Expression, Function, Namespace, Parameter, Statement, Symbol,
+        Diagnostic, Expression, Function, Namespace, Parameter, Statement, StructType, Symbol,
         Type, Variable,
     },
     contracts::is_base,
@@ -307,12 +307,12 @@ pub fn variable_decl<'a>(
             ),
         ));
         return None;
-    } else if let Some(ty) = ty.contains_builtins(ns, BuiltinStruct::AccountInfo) {
+    } else if let Some(ty) = ty.contains_builtins(ns, &StructType::AccountInfo) {
         let message = format!("variable cannot be of builtin type '{}'", ty.to_string(ns));
         ns.diagnostics
             .push(Diagnostic::error(def.ty.loc(), message));
         return None;
-    } else if let Some(ty) = ty.contains_builtins(ns, BuiltinStruct::AccountMeta) {
+    } else if let Some(ty) = ty.contains_builtins(ns, &StructType::AccountMeta) {
         let message = format!("variable cannot be of builtin type '{}'", ty.to_string(ns));
         ns.diagnostics
             .push(Diagnostic::error(def.ty.loc(), message));

+ 1 - 1
src/sema/yul/ast.rs

@@ -1,4 +1,4 @@
-use crate::ast::{FunctionAttributes, Parameter, RetrieveType, Type};
+use crate::sema::ast::{FunctionAttributes, Parameter, RetrieveType, Type};
 use crate::sema::symtable::Symtable;
 use crate::sema::yul::builtin::YulBuiltInFunction;
 use crate::sema::Recurse;

+ 1 - 1
src/sema/yul/block.rs

@@ -1,4 +1,4 @@
-use crate::ast::Namespace;
+use crate::sema::ast::Namespace;
 use crate::sema::expression::ExprContext;
 use crate::sema::symtable::{LoopScopes, Symtable};
 use crate::sema::yul::ast::{YulBlock, YulStatement};

+ 1 - 1
src/sema/yul/expression.rs

@@ -1,4 +1,4 @@
-use crate::ast::{ArrayLength, Namespace, Parameter, Symbol, Type};
+use crate::sema::ast::{ArrayLength, Namespace, Parameter, Symbol, Type};
 use crate::sema::diagnostics::Diagnostics;
 use crate::sema::expression::{unescape, ExprContext};
 use crate::sema::symtable::{Symtable, VariableUsage};

+ 1 - 1
src/sema/yul/for_loop.rs

@@ -1,4 +1,4 @@
-use crate::ast::Namespace;
+use crate::sema::ast::Namespace;
 use crate::sema::expression::ExprContext;
 use crate::sema::symtable::{LoopScopes, Symtable};
 use crate::sema::yul::ast::{YulBlock, YulStatement};

+ 1 - 1
src/sema/yul/functions.rs

@@ -1,4 +1,4 @@
-use crate::ast::{Namespace, Parameter, Type};
+use crate::sema::ast::{Namespace, Parameter, Type};
 use crate::sema::expression::ExprContext;
 use crate::sema::symtable::{LoopScopes, Symtable, VariableInitializer, VariableUsage};
 use crate::sema::yul::ast::YulFunction;

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

@@ -1,4 +1,4 @@
-use crate::ast::Namespace;
+use crate::sema::ast::Namespace;
 use crate::sema::expression::ExprContext;
 use crate::sema::symtable::{LoopScopes, Symtable};
 use crate::sema::yul::ast::InlineAssembly;

+ 1 - 1
src/sema/yul/statements.rs

@@ -1,4 +1,4 @@
-use crate::ast::{Namespace, Type};
+use crate::sema::ast::{Namespace, Type};
 use crate::sema::expression::ExprContext;
 use crate::sema::symtable::{LoopScopes, Symtable, VariableInitializer, VariableUsage};
 use crate::sema::yul::ast::{YulExpression, YulStatement};

+ 1 - 1
src/sema/yul/switch.rs

@@ -1,4 +1,4 @@
-use crate::ast::Namespace;
+use crate::sema::ast::Namespace;
 use crate::sema::expression::ExprContext;
 use crate::sema::symtable::{LoopScopes, Symtable};
 use crate::sema::yul::ast::{CaseBlock, YulBlock, YulExpression, YulStatement};

+ 2 - 2
src/sema/yul/tests/expression.rs

@@ -1,7 +1,7 @@
 #![cfg(test)]
 
-use crate::ast::{ArrayLength, Namespace, Parameter, Symbol, Type, Variable};
 use crate::diagnostics::Diagnostics;
+use crate::sema::ast::{ArrayLength, Namespace, Parameter, Symbol, Type, Variable};
 use crate::sema::expression::ExprContext;
 use crate::sema::symtable::{Symtable, VariableInitializer, VariableUsage};
 use crate::sema::yul::ast::{YulExpression, YulSuffix};
@@ -9,7 +9,7 @@ use crate::sema::yul::builtin::YulBuiltInFunction;
 use crate::sema::yul::expression::{check_type, resolve_yul_expression};
 use crate::sema::yul::functions::FunctionsTable;
 use crate::sema::yul::tests::parse;
-use crate::{ast, parse_and_resolve, FileResolver, Target};
+use crate::{parse_and_resolve, sema::ast, FileResolver, Target};
 use num_bigint::BigInt;
 use solang_parser::pt;
 use solang_parser::pt::{

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

@@ -1,6 +1,6 @@
 #![cfg(test)]
 
-use crate::{ast, parse_and_resolve, FileResolver, Target};
+use crate::{parse_and_resolve, sema::ast, FileResolver, Target};
 use std::ffi::OsStr;
 
 mod block;

+ 1 - 1
src/sema/yul/types.rs

@@ -1,5 +1,5 @@
-use crate::ast::{Namespace, Type};
 use crate::pt::CodeLocation;
+use crate::sema::ast::{Namespace, Type};
 use crate::sema::yul::ast::YulExpression;
 use crate::sema::yul::functions::FunctionsTable;
 use solang_parser::diagnostics::Diagnostic;

+ 1 - 1
src/sema/yul/unused_variable.rs

@@ -1,4 +1,4 @@
-use crate::ast::Namespace;
+use crate::sema::ast::Namespace;
 use crate::sema::symtable::Symtable;
 use crate::sema::yul::ast::YulExpression;
 

+ 2 - 2
tests/codegen_testcases/solidity/borsh_encoding_simple_types.sol

@@ -240,8 +240,8 @@ contract EncodingTest {
         uint64 pr = 9234;
 
         // CHECK: ty:bytes %abi_encoded.temp.106 = (alloc bytes len (uint32 36 + uint32 8))
-        // CHECK: writebuffer buffer:%abi_encoded.temp.106 offset:uint32 0 value:(load (struct %fPtr field 1))
-        // CHECK: writebuffer buffer:%abi_encoded.temp.106 offset:(uint32 0 + uint32 4) value:(load (struct %fPtr field 0))
+        // CHECK: writebuffer buffer:%abi_encoded.temp.106 offset:uint32 0 value:(load (struct %fPtr field 0))
+        // CHECK: writebuffer buffer:%abi_encoded.temp.106 offset:(uint32 0 + uint32 4) value:(load (struct %fPtr field 1))
         // CHECK: writebuffer buffer:%abi_encoded.temp.106 offset:(uint32 0 + uint32 36) value:%pr
 
         bytes memory b = abi.encode(fPtr, pr);

+ 2 - 2
tests/codegen_testcases/yul/expression.sol

@@ -144,10 +144,10 @@ contract testing {
             // CHECK: ty:uint256 %p = (zext uint256 (builtin ArrayLength ((arg #0))))
             let p := vl.length
 
-            // CHECK: ty:uint256 %q = uint256((load (struct %fPtr field 0)))
+            // CHECK: ty:uint256 %q = uint256((load (struct %fPtr field 1)))
             let q := fPtr.address
 
-            // CHECK: ty:uint256 %r = (zext uint256 (load (struct %fPtr field 1)))
+            // CHECK: ty:uint256 %r = (zext uint256 (load (struct %fPtr field 0)))
             let r := fPtr.selector
 
             // CHECK: ty:uint256 %s = (arg #1)

+ 2 - 2
tests/codegen_testcases/yul/external_function.sol

@@ -5,9 +5,9 @@ contract C {
     function combineToFunctionPointer(address newAddress, bytes4 newSelector) public pure returns (bytes4, address) {
         function() external fun;
         assembly {
-            // CHECK: store (struct %fun field 1), uint32((arg #1))
+            // CHECK: store (struct %fun field 0), uint32((arg #1))
             fun.selector := newSelector
-            // CHECK: store (struct %fun field 0), (arg #0)
+            // CHECK: store (struct %fun field 1), (arg #0)
             fun.address  := newAddress
         }
 

+ 7 - 7
tests/contract_testcases/solana/abstract_interface.dot

@@ -2,27 +2,27 @@ strict digraph "tests/contract_testcases/solana/abstract_interface.sol" {
 	contract [label="contract A\ntests/contract_testcases/solana/abstract_interface.sol:1:1-3:2"]
 	v [label="function v\ncontract: A\ntests/contract_testcases/solana/abstract_interface.sol:2:2-32\nsignature v(int256)\nvisibility public\nmutability nonpayable\nvirtual"]
 	parameters [label="parameters\nint256 "]
-	contract_5 [label="contract C\ntests/contract_testcases/solana/abstract_interface.sol:3:2-8:2"]
+	contract_4 [label="contract C\ntests/contract_testcases/solana/abstract_interface.sol:3:2-8:2"]
 	t [label="function t\ncontract: C\ntests/contract_testcases/solana/abstract_interface.sol:5:2-24\nsignature t(bytes32)\nvisibility public\nmutability nonpayable"]
-	parameters_7 [label="parameters\ncontract A a"]
+	parameters_6 [label="parameters\ncontract A a"]
 	expr [label="expression\ntests/contract_testcases/solana/abstract_interface.sol:6:3-9"]
 	call_external_function [label="call external function\ntests/contract_testcases/solana/abstract_interface.sol:6:3-9"]
 	external_function [label="function(int256) external returns (void)\nA.v\ntests/contract_testcases/solana/abstract_interface.sol:6:3-9"]
 	variable [label="variable: a\ncontract A\ntests/contract_testcases/solana/abstract_interface.sol:6:3-4"]
 	number_literal [label="int256 literal: 1\ntests/contract_testcases/solana/abstract_interface.sol:6:7-8"]
 	diagnostic [label="found abstract contract 'A'\nlevel Debug\ntests/contract_testcases/solana/abstract_interface.sol:1:1-3:2"]
-	diagnostic_15 [label="found contract 'C'\nlevel Debug\ntests/contract_testcases/solana/abstract_interface.sol:3:2-8:2"]
+	diagnostic_14 [label="found contract 'C'\nlevel Debug\ntests/contract_testcases/solana/abstract_interface.sol:3:2-8:2"]
 	contracts -> contract
 	contract -> v [label="function"]
 	v -> parameters [label="parameters"]
-	contracts -> contract_5
-	contract_5 -> t [label="function"]
-	t -> parameters_7 [label="parameters"]
+	contracts -> contract_4
+	contract_4 -> t [label="function"]
+	t -> parameters_6 [label="parameters"]
 	t -> expr [label="body"]
 	expr -> call_external_function [label="expr"]
 	call_external_function -> external_function [label="function"]
 	external_function -> variable [label="address"]
 	call_external_function -> number_literal [label="arg #0"]
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_15 [label="Debug"]
+	diagnostics -> diagnostic_14 [label="Debug"]
 }

+ 2 - 2
tests/contract_testcases/solana/accessor/constant.dot

@@ -6,7 +6,7 @@ strict digraph "tests/contract_testcases/solana/accessor/constant.sol" {
 	return [label="return\nimplicit"]
 	constant [label="constant variable\nx.z\nbytes32\nimplicit"]
 	diagnostic [label="found contract 'x'\nlevel Debug\ntests/contract_testcases/solana/accessor/constant.sol:2:9-4:10"]
-	diagnostic_10 [label="cannot call function in constant expression\nlevel Error\ntests/contract_testcases/solana/accessor/constant.sol:3:41-53"]
+	diagnostic_9 [label="cannot call function in constant expression\nlevel Error\ntests/contract_testcases/solana/accessor/constant.sol:3:41-53"]
 	contracts -> contract
 	contract -> var [label="variable"]
 	contract -> z [label="function"]
@@ -14,5 +14,5 @@ strict digraph "tests/contract_testcases/solana/accessor/constant.sol" {
 	z -> return [label="body"]
 	return -> constant [label="expr"]
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_10 [label="Error"]
+	diagnostics -> diagnostic_9 [label="Error"]
 }

+ 4 - 4
tests/contract_testcases/solana/accessor/constant_01.dot

@@ -1,20 +1,20 @@
 strict digraph "tests/contract_testcases/solana/accessor/constant_01.sol" {
 	contract [label="contract x\ntests/contract_testcases/solana/accessor/constant_01.sol:2:9-5:10"]
 	var [label="variable foo\nvisibility internal\ntests/contract_testcases/solana/accessor/constant_01.sol:3:13-22"]
-	var_4 [label="variable z\nvisibility public\nconstant\ntests/contract_testcases/solana/accessor/constant_01.sol:4:13-55"]
+	var_3 [label="variable z\nvisibility public\nconstant\ntests/contract_testcases/solana/accessor/constant_01.sol:4:13-55"]
 	z [label="function z\ncontract: x\ntests/contract_testcases/solana/accessor/constant_01.sol:4:37-38\nsignature z()\nvisibility public\nmutability view"]
 	returns [label="returns\nbytes32 "]
 	return [label="return\nimplicit"]
 	constant [label="constant variable\nx.z\nbytes32\nimplicit"]
 	diagnostic [label="found contract 'x'\nlevel Debug\ntests/contract_testcases/solana/accessor/constant_01.sol:2:9-5:10"]
-	diagnostic_11 [label="cannot read contract variable 'foo' in constant expression\nlevel Error\ntests/contract_testcases/solana/accessor/constant_01.sol:4:51-54"]
+	diagnostic_10 [label="cannot read contract variable 'foo' in constant expression\nlevel Error\ntests/contract_testcases/solana/accessor/constant_01.sol:4:51-54"]
 	contracts -> contract
 	contract -> var [label="variable"]
-	contract -> var_4 [label="variable"]
+	contract -> var_3 [label="variable"]
 	contract -> z [label="function"]
 	z -> returns [label="returns"]
 	z -> return [label="body"]
 	return -> constant [label="expr"]
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_11 [label="Error"]
+	diagnostics -> diagnostic_10 [label="Error"]
 }

+ 7 - 7
tests/contract_testcases/solana/account_info.dot

@@ -6,12 +6,12 @@ strict digraph "tests/contract_testcases/solana/account_info.sol" {
 	parameters [label="parameters\nstruct AccountInfo "]
 	returns [label="returns\nstruct AccountInfo "]
 	diagnostic [label="found contract 'c'\nlevel Debug\ntests/contract_testcases/solana/account_info.sol:2:1-24:2"]
-	diagnostic_10 [label="variable cannot be of builtin type 'struct AccountInfo'\nlevel Error\ntests/contract_testcases/solana/account_info.sol:4:2-13"]
-	diagnostic_11 [label="parameter of type 'struct AccountInfo' not alowed in public or external functions\nlevel Error\ntests/contract_testcases/solana/account_info.sol:6:15-26"]
-	diagnostic_12 [label="return type 'struct AccountInfo' not allowed in public or external functions\nlevel Error\ntests/contract_testcases/solana/account_info.sol:6:44-55"]
-	diagnostic_13 [label="builtin struct 'AccountInfo' cannot be created using struct literal\nlevel Error\ntests/contract_testcases/solana/account_info.sol:10:8-36"]
-	diagnostic_14 [label="builtin struct 'AccountInfo' cannot be created using struct literal\nlevel Error\ntests/contract_testcases/solana/account_info.sol:15:8-22"]
-	diagnostic_15 [label="struct 'AccountInfo' field 'key' is readonly\nlevel Error\ntests/contract_testcases/solana/account_info.sol:20:6-9"]
+	diagnostic_9 [label="variable cannot be of builtin type 'struct AccountInfo'\nlevel Error\ntests/contract_testcases/solana/account_info.sol:4:2-13"]
+	diagnostic_10 [label="parameter of type 'struct AccountInfo' not alowed in public or external functions\nlevel Error\ntests/contract_testcases/solana/account_info.sol:6:15-26"]
+	diagnostic_11 [label="return type 'struct AccountInfo' not allowed in public or external functions\nlevel Error\ntests/contract_testcases/solana/account_info.sol:6:44-55"]
+	diagnostic_12 [label="builtin struct 'AccountInfo' cannot be created using struct literal\nlevel Error\ntests/contract_testcases/solana/account_info.sol:10:8-36"]
+	diagnostic_13 [label="builtin struct 'AccountInfo' cannot be created using struct literal\nlevel Error\ntests/contract_testcases/solana/account_info.sol:15:8-22"]
+	diagnostic_14 [label="struct 'AccountInfo' field 'key' is readonly\nlevel Error\ntests/contract_testcases/solana/account_info.sol:20:6-9"]
 	contracts -> contract
 	contract -> f [label="function"]
 	contract -> f2 [label="function"]
@@ -19,10 +19,10 @@ strict digraph "tests/contract_testcases/solana/account_info.sol" {
 	notpub -> parameters [label="parameters"]
 	notpub -> returns [label="returns"]
 	diagnostics -> diagnostic [label="Debug"]
+	diagnostics -> diagnostic_9 [label="Error"]
 	diagnostics -> diagnostic_10 [label="Error"]
 	diagnostics -> diagnostic_11 [label="Error"]
 	diagnostics -> diagnostic_12 [label="Error"]
 	diagnostics -> diagnostic_13 [label="Error"]
 	diagnostics -> diagnostic_14 [label="Error"]
-	diagnostics -> diagnostic_15 [label="Error"]
 }

+ 59 - 59
tests/contract_testcases/solana/account_meta.dot

@@ -8,47 +8,47 @@ strict digraph "tests/contract_testcases/solana/account_meta.sol" {
 	cast [label="cast address\ntests/contract_testcases/solana/account_meta.sol:5:42-61"]
 	builtins [label="builtin Sender\ntests/contract_testcases/solana/account_meta.sol:5:50-60"]
 	bool_literal [label="bool literal: true\ntests/contract_testcases/solana/account_meta.sol:5:63-67"]
-	bool_literal_11 [label="bool literal: false\ntests/contract_testcases/solana/account_meta.sol:5:69-74"]
+	bool_literal_10 [label="bool literal: false\ntests/contract_testcases/solana/account_meta.sol:5:69-74"]
 	return [label="return\ntests/contract_testcases/solana/account_meta.sol:6:3-41"]
 	list [label="list\ntests/contract_testcases/solana/account_meta.sol:6:3-41"]
 	load [label="load bool\ntests/contract_testcases/solana/account_meta.sol:6:3-41"]
 	structmember [label="struct member #1 bool\ntests/contract_testcases/solana/account_meta.sol:6:16-27"]
 	variable [label="variable: meta\nstruct AccountMeta\ntests/contract_testcases/solana/account_meta.sol:6:11-15"]
+	load_16 [label="load address\ntests/contract_testcases/solana/account_meta.sol:6:3-41"]
 	load_17 [label="load address\ntests/contract_testcases/solana/account_meta.sol:6:3-41"]
-	load_18 [label="load address\ntests/contract_testcases/solana/account_meta.sol:6:3-41"]
-	structmember_19 [label="struct member #0 address\ntests/contract_testcases/solana/account_meta.sol:6:34-40"]
-	variable_20 [label="variable: meta\nstruct AccountMeta\ntests/contract_testcases/solana/account_meta.sol:6:29-33"]
+	structmember_18 [label="struct member #0 address\ntests/contract_testcases/solana/account_meta.sol:6:34-40"]
+	variable_19 [label="variable: meta\nstruct AccountMeta\ntests/contract_testcases/solana/account_meta.sol:6:29-33"]
 	bar [label="function bar\ncontract: spl\ntests/contract_testcases/solana/account_meta.sol:9:2-56\nsignature bar(bytes32)\nvisibility public\nmutability nonpayable"]
 	parameters [label="parameters\naddress x"]
-	returns_23 [label="returns\nbool \naddress "]
-	var_decl_24 [label="variable decl struct AccountMeta[2] meta\ntests/contract_testcases/solana/account_meta.sol:10:3-13:4"]
+	returns_22 [label="returns\nbool \naddress "]
+	var_decl_23 [label="variable decl struct AccountMeta[2] meta\ntests/contract_testcases/solana/account_meta.sol:10:3-13:4"]
 	array_literal [label="array literal: struct AccountMeta[2]\ntests/contract_testcases/solana/account_meta.sol:10:29-13:4"]
-	struct_literal_26 [label="struct literal: struct AccountMeta\ntests/contract_testcases/solana/account_meta.sol:11:4-34"]
-	getref_27 [label="getref address\ntests/contract_testcases/solana/account_meta.sol:11:4-34"]
-	variable_28 [label="variable: x\naddress\ntests/contract_testcases/solana/account_meta.sol:11:20-21"]
-	bool_literal_29 [label="bool literal: true\ntests/contract_testcases/solana/account_meta.sol:11:23-27"]
-	bool_literal_30 [label="bool literal: true\ntests/contract_testcases/solana/account_meta.sol:11:29-33"]
-	struct_literal_31 [label="struct literal: struct AccountMeta\ntests/contract_testcases/solana/account_meta.sol:12:4-70"]
-	getref_32 [label="getref address\ntests/contract_testcases/solana/account_meta.sol:12:4-70"]
-	variable_33 [label="variable: x\naddress\ntests/contract_testcases/solana/account_meta.sol:12:29-30"]
-	bool_literal_34 [label="bool literal: false\ntests/contract_testcases/solana/account_meta.sol:12:45-50"]
-	bool_literal_35 [label="bool literal: false\ntests/contract_testcases/solana/account_meta.sol:12:63-68"]
-	return_36 [label="return\ntests/contract_testcases/solana/account_meta.sol:15:3-47"]
-	list_37 [label="list\ntests/contract_testcases/solana/account_meta.sol:15:3-47"]
-	load_38 [label="load bool\ntests/contract_testcases/solana/account_meta.sol:15:3-47"]
-	structmember_39 [label="struct member #1 bool\ntests/contract_testcases/solana/account_meta.sol:15:19-30"]
+	struct_literal_25 [label="struct literal: struct AccountMeta\ntests/contract_testcases/solana/account_meta.sol:11:4-34"]
+	getref_26 [label="getref address\ntests/contract_testcases/solana/account_meta.sol:11:4-34"]
+	variable_27 [label="variable: x\naddress\ntests/contract_testcases/solana/account_meta.sol:11:20-21"]
+	bool_literal_28 [label="bool literal: true\ntests/contract_testcases/solana/account_meta.sol:11:23-27"]
+	bool_literal_29 [label="bool literal: true\ntests/contract_testcases/solana/account_meta.sol:11:29-33"]
+	struct_literal_30 [label="struct literal: struct AccountMeta\ntests/contract_testcases/solana/account_meta.sol:12:4-70"]
+	getref_31 [label="getref address\ntests/contract_testcases/solana/account_meta.sol:12:4-70"]
+	variable_32 [label="variable: x\naddress\ntests/contract_testcases/solana/account_meta.sol:12:29-30"]
+	bool_literal_33 [label="bool literal: false\ntests/contract_testcases/solana/account_meta.sol:12:45-50"]
+	bool_literal_34 [label="bool literal: false\ntests/contract_testcases/solana/account_meta.sol:12:63-68"]
+	return_35 [label="return\ntests/contract_testcases/solana/account_meta.sol:15:3-47"]
+	list_36 [label="list\ntests/contract_testcases/solana/account_meta.sol:15:3-47"]
+	load_37 [label="load bool\ntests/contract_testcases/solana/account_meta.sol:15:3-47"]
+	structmember_38 [label="struct member #1 bool\ntests/contract_testcases/solana/account_meta.sol:15:19-30"]
 	subscript [label="subscript struct AccountMeta[2]\ntests/contract_testcases/solana/account_meta.sol:15:11-18"]
-	variable_41 [label="variable: meta\nstruct AccountMeta[2]\ntests/contract_testcases/solana/account_meta.sol:15:11-15"]
+	variable_40 [label="variable: meta\nstruct AccountMeta[2]\ntests/contract_testcases/solana/account_meta.sol:15:11-15"]
 	number_literal [label="uint32 literal: 1\ntests/contract_testcases/solana/account_meta.sol:15:16-17"]
+	load_42 [label="load address\ntests/contract_testcases/solana/account_meta.sol:15:3-47"]
 	load_43 [label="load address\ntests/contract_testcases/solana/account_meta.sol:15:3-47"]
-	load_44 [label="load address\ntests/contract_testcases/solana/account_meta.sol:15:3-47"]
-	structmember_45 [label="struct member #0 address\ntests/contract_testcases/solana/account_meta.sol:15:40-46"]
-	subscript_46 [label="subscript struct AccountMeta[2]\ntests/contract_testcases/solana/account_meta.sol:15:32-39"]
-	variable_47 [label="variable: meta\nstruct AccountMeta[2]\ntests/contract_testcases/solana/account_meta.sol:15:32-36"]
-	number_literal_48 [label="uint32 literal: 0\ntests/contract_testcases/solana/account_meta.sol:15:37-38"]
+	structmember_44 [label="struct member #0 address\ntests/contract_testcases/solana/account_meta.sol:15:40-46"]
+	subscript_45 [label="subscript struct AccountMeta[2]\ntests/contract_testcases/solana/account_meta.sol:15:32-39"]
+	variable_46 [label="variable: meta\nstruct AccountMeta[2]\ntests/contract_testcases/solana/account_meta.sol:15:32-36"]
+	number_literal_47 [label="uint32 literal: 0\ntests/contract_testcases/solana/account_meta.sol:15:37-38"]
 	diagnostic [label="found contract 'spl'\nlevel Debug\ntests/contract_testcases/solana/account_meta.sol:2:1-18:2"]
-	diagnostic_51 [label="function can be declared 'pure'\nlevel Warning\ntests/contract_testcases/solana/account_meta.sol:4:2-47"]
-	diagnostic_52 [label="function can be declared 'pure'\nlevel Warning\ntests/contract_testcases/solana/account_meta.sol:9:2-56"]
+	diagnostic_50 [label="function can be declared 'pure'\nlevel Warning\ntests/contract_testcases/solana/account_meta.sol:4:2-47"]
+	diagnostic_51 [label="function can be declared 'pure'\nlevel Warning\ntests/contract_testcases/solana/account_meta.sol:9:2-56"]
 	contracts -> contract
 	contract -> foo [label="function"]
 	foo -> returns [label="returns"]
@@ -58,45 +58,45 @@ strict digraph "tests/contract_testcases/solana/account_meta.sol" {
 	getref -> cast [label="expr"]
 	cast -> builtins [label="expr"]
 	struct_literal -> bool_literal [label="arg #1"]
-	struct_literal -> bool_literal_11 [label="arg #2"]
+	struct_literal -> bool_literal_10 [label="arg #2"]
 	var_decl -> return [label="next"]
 	return -> list [label="expr"]
 	list -> load [label="entry #0"]
 	load -> structmember [label="expr"]
 	structmember -> variable [label="var"]
-	list -> load_17 [label="entry #1"]
-	load_17 -> load_18 [label="expr"]
-	load_18 -> structmember_19 [label="expr"]
-	structmember_19 -> variable_20 [label="var"]
+	list -> load_16 [label="entry #1"]
+	load_16 -> load_17 [label="expr"]
+	load_17 -> structmember_18 [label="expr"]
+	structmember_18 -> variable_19 [label="var"]
 	contract -> bar [label="function"]
 	bar -> parameters [label="parameters"]
-	bar -> returns_23 [label="returns"]
-	bar -> var_decl_24 [label="body"]
-	var_decl_24 -> array_literal [label="init"]
-	array_literal -> struct_literal_26 [label="arg #0"]
-	struct_literal_26 -> getref_27 [label="arg #0"]
-	getref_27 -> variable_28 [label="expr"]
-	struct_literal_26 -> bool_literal_29 [label="arg #1"]
-	struct_literal_26 -> bool_literal_30 [label="arg #2"]
-	array_literal -> struct_literal_31 [label="arg #1"]
-	struct_literal_31 -> getref_32 [label="arg #0"]
-	getref_32 -> variable_33 [label="expr"]
-	struct_literal_31 -> bool_literal_34 [label="arg #1"]
-	struct_literal_31 -> bool_literal_35 [label="arg #2"]
-	var_decl_24 -> return_36 [label="next"]
-	return_36 -> list_37 [label="expr"]
-	list_37 -> load_38 [label="entry #0"]
-	load_38 -> structmember_39 [label="expr"]
-	structmember_39 -> subscript [label="var"]
-	subscript -> variable_41 [label="array"]
+	bar -> returns_22 [label="returns"]
+	bar -> var_decl_23 [label="body"]
+	var_decl_23 -> array_literal [label="init"]
+	array_literal -> struct_literal_25 [label="arg #0"]
+	struct_literal_25 -> getref_26 [label="arg #0"]
+	getref_26 -> variable_27 [label="expr"]
+	struct_literal_25 -> bool_literal_28 [label="arg #1"]
+	struct_literal_25 -> bool_literal_29 [label="arg #2"]
+	array_literal -> struct_literal_30 [label="arg #1"]
+	struct_literal_30 -> getref_31 [label="arg #0"]
+	getref_31 -> variable_32 [label="expr"]
+	struct_literal_30 -> bool_literal_33 [label="arg #1"]
+	struct_literal_30 -> bool_literal_34 [label="arg #2"]
+	var_decl_23 -> return_35 [label="next"]
+	return_35 -> list_36 [label="expr"]
+	list_36 -> load_37 [label="entry #0"]
+	load_37 -> structmember_38 [label="expr"]
+	structmember_38 -> subscript [label="var"]
+	subscript -> variable_40 [label="array"]
 	subscript -> number_literal [label="index"]
-	list_37 -> load_43 [label="entry #1"]
-	load_43 -> load_44 [label="expr"]
-	load_44 -> structmember_45 [label="expr"]
-	structmember_45 -> subscript_46 [label="var"]
-	subscript_46 -> variable_47 [label="array"]
-	subscript_46 -> number_literal_48 [label="index"]
+	list_36 -> load_42 [label="entry #1"]
+	load_42 -> load_43 [label="expr"]
+	load_43 -> structmember_44 [label="expr"]
+	structmember_44 -> subscript_45 [label="var"]
+	subscript_45 -> variable_46 [label="array"]
+	subscript_45 -> number_literal_47 [label="index"]
 	diagnostics -> diagnostic [label="Debug"]
+	diagnostics -> diagnostic_50 [label="Warning"]
 	diagnostics -> diagnostic_51 [label="Warning"]
-	diagnostics -> diagnostic_52 [label="Warning"]
 }

+ 2 - 2
tests/contract_testcases/solana/address_cast.dot

@@ -2,9 +2,9 @@ strict digraph "tests/contract_testcases/solana/address_cast.sol" {
 	contract [label="contract c\ntests/contract_testcases/solana/address_cast.sol:1:1-8:2"]
 	foo [label="function foo\ncontract: c\ntests/contract_testcases/solana/address_cast.sol:2:2-23\nsignature foo()\nvisibility public\nmutability nonpayable"]
 	diagnostic [label="found contract 'c'\nlevel Debug\ntests/contract_testcases/solana/address_cast.sol:1:1-8:2"]
-	diagnostic_6 [label="expression is not assignable\nlevel Error\ntests/contract_testcases/solana/address_cast.sol:6:3-13"]
+	diagnostic_5 [label="expression is not assignable\nlevel Error\ntests/contract_testcases/solana/address_cast.sol:6:3-13"]
 	contracts -> contract
 	contract -> foo [label="function"]
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_6 [label="Error"]
+	diagnostics -> diagnostic_5 [label="Error"]
 }

+ 109 - 109
tests/contract_testcases/solana/address_member_call.dot

@@ -6,73 +6,73 @@ strict digraph "tests/contract_testcases/solana/address_member_call.sol" {
 	expr [label="expression\ntests/contract_testcases/solana/address_member_call.sol:19:9-22:10"]
 	builtins [label="builtin Require\ntests/contract_testcases/solana/address_member_call.sol:19:9-16"]
 	equal [label="equal\ntests/contract_testcases/solana/address_member_call.sol:20:13-49"]
-	builtins_10 [label="builtin ArrayLength\ntests/contract_testcases/solana/address_member_call.sol:20:13-30"]
+	builtins_9 [label="builtin ArrayLength\ntests/contract_testcases/solana/address_member_call.sol:20:13-30"]
 	variable [label="variable: _receivers\naddress[]\ntests/contract_testcases/solana/address_member_call.sol:20:13-23"]
-	builtins_12 [label="builtin ArrayLength\ntests/contract_testcases/solana/address_member_call.sol:20:34-49"]
-	variable_13 [label="variable: _amounts\nuint64[]\ntests/contract_testcases/solana/address_member_call.sol:20:34-42"]
+	builtins_11 [label="builtin ArrayLength\ntests/contract_testcases/solana/address_member_call.sol:20:34-49"]
+	variable_12 [label="variable: _amounts\nuint64[]\ntests/contract_testcases/solana/address_member_call.sol:20:34-42"]
 	alloc_array [label="alloc array string\ninitializer: 526563656976657220636f756e7420646f6573206e6f74206d6174636820616d6f756e7420636f756e742e\ntests/contract_testcases/solana/address_member_call.sol:21:13-58"]
 	number_literal [label="uint32 literal: 43\ntests/contract_testcases/solana/address_member_call.sol:21:13-58"]
 	var_decl [label="variable decl uint64 total\ntests/contract_testcases/solana/address_member_call.sol:24:9-25"]
-	number_literal_17 [label="uint64 literal: 0\ntests/contract_testcases/solana/address_member_call.sol:24:24-25"]
+	number_literal_16 [label="uint64 literal: 0\ntests/contract_testcases/solana/address_member_call.sol:24:24-25"]
 	for [label="for\ntests/contract_testcases/solana/address_member_call.sol:25:9-27:10"]
-	var_decl_19 [label="variable decl uint8 i\ntests/contract_testcases/solana/address_member_call.sol:25:14-25"]
-	number_literal_20 [label="uint8 literal: 0\ntests/contract_testcases/solana/address_member_call.sol:25:24-25"]
+	var_decl_18 [label="variable decl uint8 i\ntests/contract_testcases/solana/address_member_call.sol:25:14-25"]
+	number_literal_19 [label="uint8 literal: 0\ntests/contract_testcases/solana/address_member_call.sol:25:24-25"]
 	less [label="less\ntests/contract_testcases/solana/address_member_call.sol:25:27-48"]
 	zero_ext [label="zero extend uint32\ntests/contract_testcases/solana/address_member_call.sol:25:27-28"]
-	variable_23 [label="variable: i\nuint8\ntests/contract_testcases/solana/address_member_call.sol:25:27-28"]
-	builtins_24 [label="builtin ArrayLength\ntests/contract_testcases/solana/address_member_call.sol:25:31-48"]
-	variable_25 [label="variable: _receivers\naddress[]\ntests/contract_testcases/solana/address_member_call.sol:25:31-41"]
-	expr_26 [label="expression\ntests/contract_testcases/solana/address_member_call.sol:25:50-53"]
+	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_28 [label="variable: i\nuint8\ntests/contract_testcases/solana/address_member_call.sol:25:50-51"]
-	expr_29 [label="expression\ntests/contract_testcases/solana/address_member_call.sol:26:13-33"]
+	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"]
 	assign [label="assign\nvoid\ntests/contract_testcases/solana/address_member_call.sol:26:13-33"]
-	variable_31 [label="variable: total\nuint64\ntests/contract_testcases/solana/address_member_call.sol:26:13-18"]
+	variable_30 [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_33 [label="variable: total\nuint64\ntests/contract_testcases/solana/address_member_call.sol:26:13-18"]
+	variable_32 [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_36 [label="variable: _amounts\nuint64[]\ntests/contract_testcases/solana/address_member_call.sol:26:22-30"]
-	variable_37 [label="variable: i\nuint8\ntests/contract_testcases/solana/address_member_call.sol:26:31-32"]
-	expr_38 [label="expression\ntests/contract_testcases/solana/address_member_call.sol:28:9-31:10"]
-	builtins_39 [label="builtin Require\ntests/contract_testcases/solana/address_member_call.sol:28:9-16"]
-	equal_40 [label="equal\ntests/contract_testcases/solana/address_member_call.sol:29:13-27"]
-	variable_41 [label="variable: total\nuint64\ntests/contract_testcases/solana/address_member_call.sol:29:13-18"]
-	variable_42 [label="variable: value\nuint64\ntests/contract_testcases/solana/address_member_call.sol:29:22-27"]
-	alloc_array_43 [label="alloc array string\ninitializer: 546f74616c207061796d656e742076616c756520646f6573206e6f74206d617463682065746865722073656e74\ntests/contract_testcases/solana/address_member_call.sol:30:13-60"]
-	number_literal_44 [label="uint32 literal: 45\ntests/contract_testcases/solana/address_member_call.sol:30:13-60"]
-	for_45 [label="for\ntests/contract_testcases/solana/address_member_call.sol:33:9-35:10"]
-	var_decl_46 [label="variable decl uint8 i\ntests/contract_testcases/solana/address_member_call.sol:33:14-25"]
-	number_literal_47 [label="uint8 literal: 0\ntests/contract_testcases/solana/address_member_call.sol:33:24-25"]
-	less_48 [label="less\ntests/contract_testcases/solana/address_member_call.sol:33:27-48"]
-	zero_ext_49 [label="zero extend uint32\ntests/contract_testcases/solana/address_member_call.sol:33:27-28"]
-	variable_50 [label="variable: i\nuint8\ntests/contract_testcases/solana/address_member_call.sol:33:27-28"]
-	builtins_51 [label="builtin ArrayLength\ntests/contract_testcases/solana/address_member_call.sol:33:31-48"]
-	variable_52 [label="variable: _receivers\naddress[]\ntests/contract_testcases/solana/address_member_call.sol:33:31-41"]
-	expr_53 [label="expression\ntests/contract_testcases/solana/address_member_call.sol:33:50-53"]
-	post_increment_54 [label="post increment\nuint8\ntests/contract_testcases/solana/address_member_call.sol:33:50-53"]
-	variable_55 [label="variable: i\nuint8\ntests/contract_testcases/solana/address_member_call.sol:33:50-51"]
-	expr_56 [label="expression\ntests/contract_testcases/solana/address_member_call.sol:34:13-57"]
-	builtins_57 [label="builtin PayableTransfer\ntests/contract_testcases/solana/address_member_call.sol:34:13-57"]
+	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"]
 	cast [label="cast address payable\ntests/contract_testcases/solana/address_member_call.sol:34:13-35"]
-	load_59 [label="load address\ntests/contract_testcases/solana/address_member_call.sol:34:13-35"]
-	subscript_60 [label="subscript address[]\ntests/contract_testcases/solana/address_member_call.sol:34:21-34"]
-	variable_61 [label="variable: _receivers\naddress[]\ntests/contract_testcases/solana/address_member_call.sol:34:21-31"]
-	variable_62 [label="variable: i\nuint8\ntests/contract_testcases/solana/address_member_call.sol:34:32-33"]
-	cast_63 [label="cast uint64\ntests/contract_testcases/solana/address_member_call.sol:34:45-56"]
-	load_64 [label="load uint64\ntests/contract_testcases/solana/address_member_call.sol:34:45-56"]
-	subscript_65 [label="subscript uint64[]\ntests/contract_testcases/solana/address_member_call.sol:34:45-56"]
-	variable_66 [label="variable: _amounts\nuint64[]\ntests/contract_testcases/solana/address_member_call.sol:34:45-53"]
-	variable_67 [label="variable: i\nuint8\ntests/contract_testcases/solana/address_member_call.sol:34:54-55"]
+	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"]
 	emit [label="emit\nevent MyContract.Receipt\ntests/contract_testcases/solana/address_member_call.sol:37:9-43:10"]
-	cast_69 [label="cast address\ntests/contract_testcases/solana/address_member_call.sol:38:13-23"]
-	builtins_70 [label="builtin Sender\ntests/contract_testcases/solana/address_member_call.sol:38:13-23"]
-	number_literal_71 [label="address literal: 0\ntests/contract_testcases/solana/address_member_call.sol:39:13-54"]
-	variable_72 [label="variable: _receivers\naddress[]\ntests/contract_testcases/solana/address_member_call.sol:40:13-23"]
-	variable_73 [label="variable: _amounts\nuint64[]\ntests/contract_testcases/solana/address_member_call.sol:41:13-21"]
-	variable_74 [label="variable: _payment\nstring\ntests/contract_testcases/solana/address_member_call.sol:42:13-21"]
+	cast_68 [label="cast address\ntests/contract_testcases/solana/address_member_call.sol:38:13-23"]
+	builtins_69 [label="builtin Sender\ntests/contract_testcases/solana/address_member_call.sol:38:13-23"]
+	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"]
 	diagnostic [label="pragma 'solidity' is ignored\nlevel Debug\ntests/contract_testcases/solana/address_member_call.sol:1:32-2:24"]
-	diagnostic_77 [label="found contract 'MyContract'\nlevel Debug\ntests/contract_testcases/solana/address_member_call.sol:3:1-45:2"]
+	diagnostic_76 [label="found contract 'MyContract'\nlevel Debug\ntests/contract_testcases/solana/address_member_call.sol:3:1-45:2"]
 	events -> Receipt
 	contracts -> contract
 	contract -> send [label="function"]
@@ -80,71 +80,71 @@ strict digraph "tests/contract_testcases/solana/address_member_call.sol" {
 	send -> expr [label="body"]
 	expr -> builtins [label="expr"]
 	builtins -> equal [label="arg #0"]
-	equal -> builtins_10 [label="left"]
-	builtins_10 -> variable [label="arg #0"]
-	equal -> builtins_12 [label="right"]
-	builtins_12 -> variable_13 [label="arg #0"]
+	equal -> builtins_9 [label="left"]
+	builtins_9 -> variable [label="arg #0"]
+	equal -> builtins_11 [label="right"]
+	builtins_11 -> variable_12 [label="arg #0"]
 	builtins -> alloc_array [label="arg #1"]
 	alloc_array -> number_literal [label="length"]
 	expr -> var_decl [label="next"]
-	var_decl -> number_literal_17 [label="init"]
+	var_decl -> number_literal_16 [label="init"]
 	var_decl -> for [label="next"]
-	for -> var_decl_19 [label="init"]
-	var_decl_19 -> number_literal_20 [label="init"]
+	for -> var_decl_18 [label="init"]
+	var_decl_18 -> number_literal_19 [label="init"]
 	for -> less [label="cond"]
 	less -> zero_ext [label="left"]
-	zero_ext -> variable_23 [label="expr"]
-	less -> builtins_24 [label="right"]
-	builtins_24 -> variable_25 [label="arg #0"]
-	for -> expr_26 [label="next"]
-	expr_26 -> post_increment [label="expr"]
-	post_increment -> variable_28 [label="expr"]
-	for -> expr_29 [label="body"]
-	expr_29 -> assign [label="expr"]
-	assign -> variable_31 [label="left"]
+	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"]
 	assign -> add [label="right"]
-	add -> variable_33 [label="left"]
+	add -> variable_32 [label="left"]
 	add -> load [label="right"]
 	load -> subscript [label="expr"]
-	subscript -> variable_36 [label="array"]
-	subscript -> variable_37 [label="index"]
-	for -> expr_38 [label="next"]
-	expr_38 -> builtins_39 [label="expr"]
-	builtins_39 -> equal_40 [label="arg #0"]
-	equal_40 -> variable_41 [label="left"]
-	equal_40 -> variable_42 [label="right"]
-	builtins_39 -> alloc_array_43 [label="arg #1"]
-	alloc_array_43 -> number_literal_44 [label="length"]
-	expr_38 -> for_45 [label="next"]
-	for_45 -> var_decl_46 [label="init"]
-	var_decl_46 -> number_literal_47 [label="init"]
-	for_45 -> less_48 [label="cond"]
-	less_48 -> zero_ext_49 [label="left"]
-	zero_ext_49 -> variable_50 [label="expr"]
-	less_48 -> builtins_51 [label="right"]
-	builtins_51 -> variable_52 [label="arg #0"]
-	for_45 -> expr_53 [label="next"]
-	expr_53 -> post_increment_54 [label="expr"]
-	post_increment_54 -> variable_55 [label="expr"]
-	for_45 -> expr_56 [label="body"]
-	expr_56 -> builtins_57 [label="expr"]
-	builtins_57 -> cast [label="arg #0"]
-	cast -> load_59 [label="expr"]
-	load_59 -> subscript_60 [label="expr"]
-	subscript_60 -> variable_61 [label="array"]
-	subscript_60 -> variable_62 [label="index"]
-	builtins_57 -> cast_63 [label="arg #1"]
-	cast_63 -> load_64 [label="expr"]
-	load_64 -> subscript_65 [label="expr"]
-	subscript_65 -> variable_66 [label="array"]
-	subscript_65 -> variable_67 [label="index"]
-	for_45 -> emit [label="next"]
-	emit -> cast_69 [label="arg #0"]
-	cast_69 -> builtins_70 [label="expr"]
-	emit -> number_literal_71 [label="arg #1"]
-	emit -> variable_72 [label="arg #2"]
-	emit -> variable_73 [label="arg #3"]
-	emit -> variable_74 [label="arg #4"]
+	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"]
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_77 [label="Debug"]
+	diagnostics -> diagnostic_76 [label="Debug"]
 }

+ 11 - 11
tests/contract_testcases/solana/call/abi_encode_call.dot

@@ -2,25 +2,25 @@ strict digraph "tests/contract_testcases/solana/call/abi_encode_call.sol" {
 	contract [label="contract abi_encode_call\ntests/contract_testcases/solana/call/abi_encode_call.sol:1:1-9:2"]
 	test1 [label="function test1\ncontract: abi_encode_call\ntests/contract_testcases/solana/call/abi_encode_call.sol:2:5-28\nsignature test1()\nvisibility public\nmutability nonpayable"]
 	test2 [label="function test2\ncontract: abi_encode_call\ntests/contract_testcases/solana/call/abi_encode_call.sol:6:5-28\nsignature test2()\nvisibility public\nmutability nonpayable"]
-	contract_5 [label="contract other\ntests/contract_testcases/solana/call/abi_encode_call.sol:10:1-13:2"]
+	contract_4 [label="contract other\ntests/contract_testcases/solana/call/abi_encode_call.sol:10:1-13:2"]
 	foo [label="function foo\ncontract: other\ntests/contract_testcases/solana/call/abi_encode_call.sol:12:5-42\nsignature foo(int256,int256)\nvisibility public\nmutability nonpayable"]
 	parameters [label="parameters\nint256 foo\nint256 bar"]
 	diagnostic [label="found contract 'abi_encode_call'\nlevel Debug\ntests/contract_testcases/solana/call/abi_encode_call.sol:1:1-9:2"]
-	diagnostic_10 [label="function takes 2 arguments, 1 provided\nlevel Error\ntests/contract_testcases/solana/call/abi_encode_call.sol:3:20-48"]
-	diagnostic_11 [label="conversion from bool to int256 not possible\nlevel Error\ntests/contract_testcases/solana/call/abi_encode_call.sol:7:49-53"]
-	diagnostic_12 [label="found contract 'other'\nlevel Debug\ntests/contract_testcases/solana/call/abi_encode_call.sol:10:1-13:2"]
-	diagnostic_13 [label="declaration of 'foo' shadows function\nlevel Warning\ntests/contract_testcases/solana/call/abi_encode_call.sol:12:22-25"]
+	diagnostic_9 [label="function takes 2 arguments, 1 provided\nlevel Error\ntests/contract_testcases/solana/call/abi_encode_call.sol:3:20-48"]
+	diagnostic_10 [label="conversion from bool to int256 not possible\nlevel Error\ntests/contract_testcases/solana/call/abi_encode_call.sol:7:49-53"]
+	diagnostic_11 [label="found contract 'other'\nlevel Debug\ntests/contract_testcases/solana/call/abi_encode_call.sol:10:1-13:2"]
+	diagnostic_12 [label="declaration of 'foo' shadows function\nlevel Warning\ntests/contract_testcases/solana/call/abi_encode_call.sol:12:22-25"]
 	note [label="previous declaration of function\ntests/contract_testcases/solana/call/abi_encode_call.sol:12:14-17"]
 	contracts -> contract
 	contract -> test1 [label="function"]
 	contract -> test2 [label="function"]
-	contracts -> contract_5
-	contract_5 -> foo [label="function"]
+	contracts -> contract_4
+	contract_4 -> foo [label="function"]
 	foo -> parameters [label="parameters"]
 	diagnostics -> diagnostic [label="Debug"]
+	diagnostics -> diagnostic_9 [label="Error"]
 	diagnostics -> diagnostic_10 [label="Error"]
-	diagnostics -> diagnostic_11 [label="Error"]
-	diagnostics -> diagnostic_12 [label="Debug"]
-	diagnostics -> diagnostic_13 [label="Warning"]
-	diagnostic_13 -> note [label="note"]
+	diagnostics -> diagnostic_11 [label="Debug"]
+	diagnostics -> diagnostic_12 [label="Warning"]
+	diagnostic_12 -> note [label="note"]
 }

+ 38 - 38
tests/contract_testcases/solana/call/call_args_three_ways.dot

@@ -3,66 +3,66 @@ strict digraph "tests/contract_testcases/solana/call/call_args_three_ways.sol" {
 	f [label="function f\ncontract: C\ntests/contract_testcases/solana/call/call_args_three_ways.sol:2:2-21\nsignature f()\nvisibility public\nmutability nonpayable"]
 	var_decl [label="variable decl contract D d\ntests/contract_testcases/solana/call/call_args_three_ways.sol:4:3-28"]
 	constructor [label="constructor contract D\ntests/contract_testcases/solana/call/call_args_three_ways.sol:4:9-28"]
-	var_decl_6 [label="variable decl contract D dd\ntests/contract_testcases/solana/call/call_args_three_ways.sol:5:3-29"]
-	constructor_7 [label="constructor contract D\ntests/contract_testcases/solana/call/call_args_three_ways.sol:5:10-27"]
-	var_decl_8 [label="variable decl contract D ddd\ntests/contract_testcases/solana/call/call_args_three_ways.sol:6:3-28"]
-	constructor_9 [label="constructor contract D\ntests/contract_testcases/solana/call/call_args_three_ways.sol:6:11-28"]
+	var_decl_5 [label="variable decl contract D dd\ntests/contract_testcases/solana/call/call_args_three_ways.sol:5:3-29"]
+	constructor_6 [label="constructor contract D\ntests/contract_testcases/solana/call/call_args_three_ways.sol:5:10-27"]
+	var_decl_7 [label="variable decl contract D ddd\ntests/contract_testcases/solana/call/call_args_three_ways.sol:6:3-28"]
+	constructor_8 [label="constructor contract D\ntests/contract_testcases/solana/call/call_args_three_ways.sol:6:11-28"]
 	g [label="function g\ncontract: C\ntests/contract_testcases/solana/call/call_args_three_ways.sol:8:2-24\nsignature g(bytes32)\nvisibility public\nmutability nonpayable"]
 	parameters [label="parameters\ncontract D d"]
 	expr [label="expression\ntests/contract_testcases/solana/call/call_args_three_ways.sol:10:3-21"]
 	call_external_function [label="call external function\ntests/contract_testcases/solana/call/call_args_three_ways.sol:10:3-21"]
 	external_function [label="function() external payable returns (void)\nD.func\ntests/contract_testcases/solana/call/call_args_three_ways.sol:10:3-21"]
 	variable [label="variable: d\ncontract D\ntests/contract_testcases/solana/call/call_args_three_ways.sol:10:3-4"]
-	expr_16 [label="expression\ntests/contract_testcases/solana/call/call_args_three_ways.sol:11:3-23"]
-	call_external_function_17 [label="call external function\ntests/contract_testcases/solana/call/call_args_three_ways.sol:11:3-23"]
-	external_function_18 [label="function() external payable returns (void)\nD.func\ntests/contract_testcases/solana/call/call_args_three_ways.sol:11:3-23"]
-	variable_19 [label="variable: d\ncontract D\ntests/contract_testcases/solana/call/call_args_three_ways.sol:11:4-5"]
-	expr_20 [label="expression\ntests/contract_testcases/solana/call/call_args_three_ways.sol:12:3-23"]
-	call_external_function_21 [label="call external function\ntests/contract_testcases/solana/call/call_args_three_ways.sol:12:3-23"]
-	external_function_22 [label="function() external payable returns (void)\nD.func\ntests/contract_testcases/solana/call/call_args_three_ways.sol:12:3-23"]
-	variable_23 [label="variable: d\ncontract D\ntests/contract_testcases/solana/call/call_args_three_ways.sol:12:4-5"]
-	contract_24 [label="contract D\ntests/contract_testcases/solana/call/call_args_three_ways.sol:15:1-19:2"]
-	node_25 [label="constructor \ncontract: D\ntests/contract_testcases/solana/call/call_args_three_ways.sol:17:2-23\nsignature ()\nvisibility public\nmutability payable"]
+	expr_15 [label="expression\ntests/contract_testcases/solana/call/call_args_three_ways.sol:11:3-23"]
+	call_external_function_16 [label="call external function\ntests/contract_testcases/solana/call/call_args_three_ways.sol:11:3-23"]
+	external_function_17 [label="function() external payable returns (void)\nD.func\ntests/contract_testcases/solana/call/call_args_three_ways.sol:11:3-23"]
+	variable_18 [label="variable: d\ncontract D\ntests/contract_testcases/solana/call/call_args_three_ways.sol:11:4-5"]
+	expr_19 [label="expression\ntests/contract_testcases/solana/call/call_args_three_ways.sol:12:3-23"]
+	call_external_function_20 [label="call external function\ntests/contract_testcases/solana/call/call_args_three_ways.sol:12:3-23"]
+	external_function_21 [label="function() external payable returns (void)\nD.func\ntests/contract_testcases/solana/call/call_args_three_ways.sol:12:3-23"]
+	variable_22 [label="variable: d\ncontract D\ntests/contract_testcases/solana/call/call_args_three_ways.sol:12:4-5"]
+	contract_23 [label="contract D\ntests/contract_testcases/solana/call/call_args_three_ways.sol:15:1-19:2"]
+	node_24 [label="constructor \ncontract: D\ntests/contract_testcases/solana/call/call_args_three_ways.sol:17:2-23\nsignature ()\nvisibility public\nmutability payable"]
 	func [label="function func\ncontract: D\ntests/contract_testcases/solana/call/call_args_three_ways.sol:18:2-32\nsignature func()\nvisibility public\nmutability payable"]
 	diagnostic [label="found contract 'C'\nlevel Debug\ntests/contract_testcases/solana/call/call_args_three_ways.sol:1:1-14:2"]
-	diagnostic_29 [label="Solana Cross Program Invocation (CPI) cannot transfer native value. See https://solang.readthedocs.io/en/latest/language/functions.html#value_transfer\nlevel Error\ntests/contract_testcases/solana/call/call_args_three_ways.sol:4:16-24"]
-	diagnostic_30 [label="Solana Cross Program Invocation (CPI) cannot transfer native value. See https://solang.readthedocs.io/en/latest/language/functions.html#value_transfer\nlevel Error\ntests/contract_testcases/solana/call/call_args_three_ways.sol:5:18-26"]
-	diagnostic_31 [label="Solana Cross Program Invocation (CPI) cannot transfer native value. See https://solang.readthedocs.io/en/latest/language/functions.html#value_transfer\nlevel Error\ntests/contract_testcases/solana/call/call_args_three_ways.sol:6:17-25"]
-	diagnostic_32 [label="Solana Cross Program Invocation (CPI) cannot transfer native value. See https://solang.readthedocs.io/en/latest/language/functions.html#value_transfer\nlevel Error\ntests/contract_testcases/solana/call/call_args_three_ways.sol:10:10-18"]
-	diagnostic_33 [label="Solana Cross Program Invocation (CPI) cannot transfer native value. See https://solang.readthedocs.io/en/latest/language/functions.html#value_transfer\nlevel Error\ntests/contract_testcases/solana/call/call_args_three_ways.sol:11:12-20"]
-	diagnostic_34 [label="Solana Cross Program Invocation (CPI) cannot transfer native value. See https://solang.readthedocs.io/en/latest/language/functions.html#value_transfer\nlevel Error\ntests/contract_testcases/solana/call/call_args_three_ways.sol:12:11-19"]
-	diagnostic_35 [label="found contract 'D'\nlevel Debug\ntests/contract_testcases/solana/call/call_args_three_ways.sol:15:1-19:2"]
+	diagnostic_28 [label="Solana Cross Program Invocation (CPI) cannot transfer native value. See https://solang.readthedocs.io/en/latest/language/functions.html#value_transfer\nlevel Error\ntests/contract_testcases/solana/call/call_args_three_ways.sol:4:16-24"]
+	diagnostic_29 [label="Solana Cross Program Invocation (CPI) cannot transfer native value. See https://solang.readthedocs.io/en/latest/language/functions.html#value_transfer\nlevel Error\ntests/contract_testcases/solana/call/call_args_three_ways.sol:5:18-26"]
+	diagnostic_30 [label="Solana Cross Program Invocation (CPI) cannot transfer native value. See https://solang.readthedocs.io/en/latest/language/functions.html#value_transfer\nlevel Error\ntests/contract_testcases/solana/call/call_args_three_ways.sol:6:17-25"]
+	diagnostic_31 [label="Solana Cross Program Invocation (CPI) cannot transfer native value. See https://solang.readthedocs.io/en/latest/language/functions.html#value_transfer\nlevel Error\ntests/contract_testcases/solana/call/call_args_three_ways.sol:10:10-18"]
+	diagnostic_32 [label="Solana Cross Program Invocation (CPI) cannot transfer native value. See https://solang.readthedocs.io/en/latest/language/functions.html#value_transfer\nlevel Error\ntests/contract_testcases/solana/call/call_args_three_ways.sol:11:12-20"]
+	diagnostic_33 [label="Solana Cross Program Invocation (CPI) cannot transfer native value. See https://solang.readthedocs.io/en/latest/language/functions.html#value_transfer\nlevel Error\ntests/contract_testcases/solana/call/call_args_three_ways.sol:12:11-19"]
+	diagnostic_34 [label="found contract 'D'\nlevel Debug\ntests/contract_testcases/solana/call/call_args_three_ways.sol:15:1-19:2"]
 	contracts -> contract
 	contract -> f [label="function"]
 	f -> var_decl [label="body"]
 	var_decl -> constructor [label="init"]
-	var_decl -> var_decl_6 [label="next"]
-	var_decl_6 -> constructor_7 [label="init"]
-	var_decl_6 -> var_decl_8 [label="next"]
-	var_decl_8 -> constructor_9 [label="init"]
+	var_decl -> var_decl_5 [label="next"]
+	var_decl_5 -> constructor_6 [label="init"]
+	var_decl_5 -> var_decl_7 [label="next"]
+	var_decl_7 -> constructor_8 [label="init"]
 	contract -> g [label="function"]
 	g -> parameters [label="parameters"]
 	g -> expr [label="body"]
 	expr -> call_external_function [label="expr"]
 	call_external_function -> external_function [label="function"]
 	external_function -> variable [label="address"]
-	expr -> expr_16 [label="next"]
-	expr_16 -> call_external_function_17 [label="expr"]
-	call_external_function_17 -> external_function_18 [label="function"]
-	external_function_18 -> variable_19 [label="address"]
-	expr_16 -> expr_20 [label="next"]
-	expr_20 -> call_external_function_21 [label="expr"]
-	call_external_function_21 -> external_function_22 [label="function"]
-	external_function_22 -> variable_23 [label="address"]
-	contracts -> contract_24
-	contract_24 -> node_25 [label="constructor"]
-	contract_24 -> func [label="function"]
+	expr -> expr_15 [label="next"]
+	expr_15 -> call_external_function_16 [label="expr"]
+	call_external_function_16 -> external_function_17 [label="function"]
+	external_function_17 -> variable_18 [label="address"]
+	expr_15 -> expr_19 [label="next"]
+	expr_19 -> call_external_function_20 [label="expr"]
+	call_external_function_20 -> external_function_21 [label="function"]
+	external_function_21 -> variable_22 [label="address"]
+	contracts -> contract_23
+	contract_23 -> node_24 [label="constructor"]
+	contract_23 -> func [label="function"]
 	diagnostics -> diagnostic [label="Debug"]
+	diagnostics -> diagnostic_28 [label="Error"]
 	diagnostics -> diagnostic_29 [label="Error"]
 	diagnostics -> diagnostic_30 [label="Error"]
 	diagnostics -> diagnostic_31 [label="Error"]
 	diagnostics -> diagnostic_32 [label="Error"]
 	diagnostics -> diagnostic_33 [label="Error"]
-	diagnostics -> diagnostic_34 [label="Error"]
-	diagnostics -> diagnostic_35 [label="Debug"]
+	diagnostics -> diagnostic_34 [label="Debug"]
 }

+ 2 - 2
tests/contract_testcases/solana/call/calltys.dot

@@ -2,9 +2,9 @@ strict digraph "tests/contract_testcases/solana/call/calltys.sol" {
 	contract [label="contract main\ntests/contract_testcases/solana/call/calltys.sol:2:9-8:10"]
 	test [label="function test\ncontract: main\ntests/contract_testcases/solana/call/calltys.sol:3:13-35\nsignature test()\nvisibility public\nmutability nonpayable"]
 	diagnostic [label="found contract 'main'\nlevel Debug\ntests/contract_testcases/solana/call/calltys.sol:2:9-8:10"]
-	diagnostic_6 [label="method 'staticcall' does not exist\nlevel Error\ntests/contract_testcases/solana/call/calltys.sol:6:19-29"]
+	diagnostic_5 [label="method 'staticcall' does not exist\nlevel Error\ntests/contract_testcases/solana/call/calltys.sol:6:19-29"]
 	contracts -> contract
 	contract -> test [label="function"]
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_6 [label="Error"]
+	diagnostics -> diagnostic_5 [label="Error"]
 }

+ 2 - 2
tests/contract_testcases/solana/call/calltys_01.dot

@@ -2,9 +2,9 @@ strict digraph "tests/contract_testcases/solana/call/calltys_01.sol" {
 	contract [label="contract main\ntests/contract_testcases/solana/call/calltys_01.sol:2:9-8:10"]
 	test [label="function test\ncontract: main\ntests/contract_testcases/solana/call/calltys_01.sol:3:13-35\nsignature test()\nvisibility public\nmutability nonpayable"]
 	diagnostic [label="found contract 'main'\nlevel Debug\ntests/contract_testcases/solana/call/calltys_01.sol:2:9-8:10"]
-	diagnostic_6 [label="method 'delegatecall' does not exist\nlevel Error\ntests/contract_testcases/solana/call/calltys_01.sol:6:19-31"]
+	diagnostic_5 [label="method 'delegatecall' does not exist\nlevel Error\ntests/contract_testcases/solana/call/calltys_01.sol:6:19-31"]
 	contracts -> contract
 	contract -> test [label="function"]
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_6 [label="Error"]
+	diagnostics -> diagnostic_5 [label="Error"]
 }

+ 2 - 2
tests/contract_testcases/solana/call/calltys_02.dot

@@ -2,9 +2,9 @@ strict digraph "tests/contract_testcases/solana/call/calltys_02.sol" {
 	contract [label="contract main\ntests/contract_testcases/solana/call/calltys_02.sol:2:9-8:10"]
 	test [label="function test\ncontract: main\ntests/contract_testcases/solana/call/calltys_02.sol:3:13-35\nsignature test()\nvisibility public\nmutability nonpayable"]
 	diagnostic [label="found contract 'main'\nlevel Debug\ntests/contract_testcases/solana/call/calltys_02.sol:2:9-8:10"]
-	diagnostic_6 [label="'gas' not permitted for external calls or constructors on solana\nlevel Error\ntests/contract_testcases/solana/call/calltys_02.sol:6:51-57"]
+	diagnostic_5 [label="'gas' not permitted for external calls or constructors on solana\nlevel Error\ntests/contract_testcases/solana/call/calltys_02.sol:6:51-57"]
 	contracts -> contract
 	contract -> test [label="function"]
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_6 [label="Error"]
+	diagnostics -> diagnostic_5 [label="Error"]
 }

+ 2 - 2
tests/contract_testcases/solana/comment.dot

@@ -1,8 +1,8 @@
 strict digraph "tests/contract_testcases/solana/comment.sol" {
 	contract [label="contract Hello\ntests/contract_testcases/solana/comment.sol:1:24-4:2"]
 	diagnostic [label="pragma 'solidity' is ignored\nlevel Debug\ntests/contract_testcases/solana/comment.sol:1:1-23"]
-	diagnostic_5 [label="found contract 'Hello'\nlevel Debug\ntests/contract_testcases/solana/comment.sol:1:24-4:2"]
+	diagnostic_4 [label="found contract 'Hello'\nlevel Debug\ntests/contract_testcases/solana/comment.sol:1:24-4:2"]
 	contracts -> contract
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_5 [label="Debug"]
+	diagnostics -> diagnostic_4 [label="Debug"]
 }

+ 9 - 9
tests/contract_testcases/solana/constant/not_constant.dot

@@ -6,12 +6,12 @@ strict digraph "tests/contract_testcases/solana/constant/not_constant.sol" {
 	returns [label="returns\nuint256 "]
 	return [label="return\nimplicit"]
 	constant [label="constant variable\nC.STATIC\nuint256\nimplicit"]
-	contract_9 [label="contract foo\ntests/contract_testcases/solana/constant/not_constant.sol:6:9-11:10"]
+	contract_8 [label="contract foo\ntests/contract_testcases/solana/constant/not_constant.sol:6:9-11:10"]
 	f [label="function f\ncontract: foo\ntests/contract_testcases/solana/constant/not_constant.sol:7:13-47\nsignature f()\nvisibility public\nmutability nonpayable"]
-	returns_11 [label="returns\nuint256 "]
+	returns_10 [label="returns\nuint256 "]
 	diagnostic [label="found contract 'C'\nlevel Debug\ntests/contract_testcases/solana/constant/not_constant.sol:2:9-4:10"]
-	diagnostic_14 [label="found contract 'foo'\nlevel Debug\ntests/contract_testcases/solana/constant/not_constant.sol:6:9-11:10"]
-	diagnostic_15 [label="'C' is a contract\nlevel Error\ntests/contract_testcases/solana/constant/not_constant.sol:8:26-27"]
+	diagnostic_13 [label="found contract 'foo'\nlevel Debug\ntests/contract_testcases/solana/constant/not_constant.sol:6:9-11:10"]
+	diagnostic_14 [label="'C' is a contract\nlevel Error\ntests/contract_testcases/solana/constant/not_constant.sol:8:26-27"]
 	contracts -> contract
 	contract -> var [label="variable"]
 	var -> number_literal [label="initializer"]
@@ -19,10 +19,10 @@ strict digraph "tests/contract_testcases/solana/constant/not_constant.sol" {
 	STATIC -> returns [label="returns"]
 	STATIC -> return [label="body"]
 	return -> constant [label="expr"]
-	contracts -> contract_9
-	contract_9 -> f [label="function"]
-	f -> returns_11 [label="returns"]
+	contracts -> contract_8
+	contract_8 -> f [label="function"]
+	f -> returns_10 [label="returns"]
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_14 [label="Debug"]
-	diagnostics -> diagnostic_15 [label="Error"]
+	diagnostics -> diagnostic_13 [label="Debug"]
+	diagnostics -> diagnostic_14 [label="Error"]
 }

+ 9 - 9
tests/contract_testcases/solana/constant/not_constant_01.dot

@@ -7,12 +7,12 @@ strict digraph "tests/contract_testcases/solana/constant/not_constant_01.sol" {
 	return [label="return\nimplicit"]
 	storage_load [label="storage load uint256\nimplicit"]
 	storage_var [label="storage variable\nC.NOT_CONSTANT\nuint256 storage\nimplicit"]
-	contract_10 [label="contract foo\ntests/contract_testcases/solana/constant/not_constant_01.sol:6:9-11:10"]
+	contract_9 [label="contract foo\ntests/contract_testcases/solana/constant/not_constant_01.sol:6:9-11:10"]
 	f [label="function f\ncontract: foo\ntests/contract_testcases/solana/constant/not_constant_01.sol:7:13-47\nsignature f()\nvisibility public\nmutability nonpayable"]
-	returns_12 [label="returns\nuint256 "]
+	returns_11 [label="returns\nuint256 "]
 	diagnostic [label="found contract 'C'\nlevel Debug\ntests/contract_testcases/solana/constant/not_constant_01.sol:2:9-4:10"]
-	diagnostic_15 [label="found contract 'foo'\nlevel Debug\ntests/contract_testcases/solana/constant/not_constant_01.sol:6:9-11:10"]
-	diagnostic_16 [label="need instance of contract 'C' to get variable value 'NOT_CONSTANT'\nlevel Error\ntests/contract_testcases/solana/constant/not_constant_01.sol:8:26-40"]
+	diagnostic_14 [label="found contract 'foo'\nlevel Debug\ntests/contract_testcases/solana/constant/not_constant_01.sol:6:9-11:10"]
+	diagnostic_15 [label="need instance of contract 'C' to get variable value 'NOT_CONSTANT'\nlevel Error\ntests/contract_testcases/solana/constant/not_constant_01.sol:8:26-40"]
 	contracts -> contract
 	contract -> var [label="variable"]
 	var -> number_literal [label="initializer"]
@@ -21,10 +21,10 @@ strict digraph "tests/contract_testcases/solana/constant/not_constant_01.sol" {
 	NOT_CONSTANT -> return [label="body"]
 	return -> storage_load [label="expr"]
 	storage_load -> storage_var [label="expr"]
-	contracts -> contract_10
-	contract_10 -> f [label="function"]
-	f -> returns_12 [label="returns"]
+	contracts -> contract_9
+	contract_9 -> f [label="function"]
+	f -> returns_11 [label="returns"]
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_15 [label="Debug"]
-	diagnostics -> diagnostic_16 [label="Error"]
+	diagnostics -> diagnostic_14 [label="Debug"]
+	diagnostics -> diagnostic_15 [label="Error"]
 }

+ 14 - 14
tests/contract_testcases/solana/contract_var_base_function_init.dot

@@ -7,19 +7,19 @@ strict digraph "tests/contract_testcases/solana/contract_var_base_function_init.
 	divide [label="divide\nint256\ntests/contract_testcases/solana/contract_var_base_function_init.sol:3:16-19"]
 	variable [label="variable: a\nint256\ntests/contract_testcases/solana/contract_var_base_function_init.sol:3:16-17"]
 	number_literal [label="int256 literal: 2\ntests/contract_testcases/solana/contract_var_base_function_init.sol:3:18-19"]
-	contract_10 [label="contract testing\ntests/contract_testcases/solana/contract_var_base_function_init.sol:6:1-10:2"]
+	contract_9 [label="contract testing\ntests/contract_testcases/solana/contract_var_base_function_init.sol:6:1-10:2"]
 	base [label="base b\ntests/contract_testcases/solana/contract_var_base_function_init.sol:7:21-22"]
 	var [label="variable sfPtr\nvisibility internal\ntests/contract_testcases/solana/contract_var_base_function_init.sol:8:5-67"]
 	cast [label="cast function(int256) external pure returns (int256)\ntests/contract_testcases/solana/contract_var_base_function_init.sol:8:55-67"]
 	external_function [label="function(int256) external pure returns (int256)\nb.testPtr\ntests/contract_testcases/solana/contract_var_base_function_init.sol:8:60-67"]
 	builtins [label="builtin GetAddress\ntests/contract_testcases/solana/contract_var_base_function_init.sol:8:55-59"]
-	var_16 [label="variable sgPtr\nvisibility internal\ntests/contract_testcases/solana/contract_var_base_function_init.sol:9:5-62"]
-	cast_17 [label="cast function(int256) internal pure returns (int256)\ntests/contract_testcases/solana/contract_var_base_function_init.sol:9:55-62"]
+	var_15 [label="variable sgPtr\nvisibility internal\ntests/contract_testcases/solana/contract_var_base_function_init.sol:9:5-62"]
+	cast_16 [label="cast function(int256) internal pure returns (int256)\ntests/contract_testcases/solana/contract_var_base_function_init.sol:9:55-62"]
 	internal_function [label="function(int256) internal pure returns (int256)\nb.testPtr\ntests/contract_testcases/solana/contract_var_base_function_init.sol:9:55-62"]
 	diagnostic [label="found contract 'b'\nlevel Debug\ntests/contract_testcases/solana/contract_var_base_function_init.sol:1:1-5:2"]
-	diagnostic_21 [label="found contract 'testing'\nlevel Debug\ntests/contract_testcases/solana/contract_var_base_function_init.sol:6:1-10:2"]
-	diagnostic_22 [label="storage variable 'sfPtr' has been assigned, but never read\nlevel Warning\ntests/contract_testcases/solana/contract_var_base_function_init.sol:8:5-67"]
-	diagnostic_23 [label="storage variable 'sgPtr' has been assigned, but never read\nlevel Warning\ntests/contract_testcases/solana/contract_var_base_function_init.sol:9:5-62"]
+	diagnostic_20 [label="found contract 'testing'\nlevel Debug\ntests/contract_testcases/solana/contract_var_base_function_init.sol:6:1-10:2"]
+	diagnostic_21 [label="storage variable 'sfPtr' has been assigned, but never read\nlevel Warning\ntests/contract_testcases/solana/contract_var_base_function_init.sol:8:5-67"]
+	diagnostic_22 [label="storage variable 'sgPtr' has been assigned, but never read\nlevel Warning\ntests/contract_testcases/solana/contract_var_base_function_init.sol:9:5-62"]
 	contracts -> contract
 	contract -> testPtr [label="function"]
 	testPtr -> parameters [label="parameters"]
@@ -28,17 +28,17 @@ strict digraph "tests/contract_testcases/solana/contract_var_base_function_init.
 	return -> divide [label="expr"]
 	divide -> variable [label="left"]
 	divide -> number_literal [label="right"]
-	contracts -> contract_10
-	contract_10 -> base [label="base"]
-	contract_10 -> var [label="variable"]
+	contracts -> contract_9
+	contract_9 -> base [label="base"]
+	contract_9 -> var [label="variable"]
 	var -> cast [label="initializer"]
 	cast -> external_function [label="expr"]
 	external_function -> builtins [label="address"]
-	contract_10 -> var_16 [label="variable"]
-	var_16 -> cast_17 [label="initializer"]
-	cast_17 -> internal_function [label="expr"]
+	contract_9 -> var_15 [label="variable"]
+	var_15 -> cast_16 [label="initializer"]
+	cast_16 -> internal_function [label="expr"]
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_21 [label="Debug"]
+	diagnostics -> diagnostic_20 [label="Debug"]
+	diagnostics -> diagnostic_21 [label="Warning"]
 	diagnostics -> diagnostic_22 [label="Warning"]
-	diagnostics -> diagnostic_23 [label="Warning"]
 }

+ 6 - 6
tests/contract_testcases/solana/create_contract/syntax.dot

@@ -1,14 +1,14 @@
 strict digraph "tests/contract_testcases/solana/create_contract/syntax.sol" {
 	contract [label="contract y\ntests/contract_testcases/solana/create_contract/syntax.sol:2:9-6:10"]
 	f [label="function f\ncontract: y\ntests/contract_testcases/solana/create_contract/syntax.sol:3:13-32\nsignature f()\nvisibility public\nmutability nonpayable"]
-	contract_4 [label="contract x\ntests/contract_testcases/solana/create_contract/syntax.sol:7:9-22"]
+	contract_3 [label="contract x\ntests/contract_testcases/solana/create_contract/syntax.sol:7:9-22"]
 	diagnostic [label="found contract 'y'\nlevel Debug\ntests/contract_testcases/solana/create_contract/syntax.sol:2:9-6:10"]
-	diagnostic_7 [label="'gas' not permitted for external calls or constructors on solana\nlevel Error\ntests/contract_testcases/solana/create_contract/syntax.sol:4:29-37"]
-	diagnostic_8 [label="found contract 'x'\nlevel Debug\ntests/contract_testcases/solana/create_contract/syntax.sol:7:9-22"]
+	diagnostic_6 [label="'gas' not permitted for external calls or constructors on solana\nlevel Error\ntests/contract_testcases/solana/create_contract/syntax.sol:4:29-37"]
+	diagnostic_7 [label="found contract 'x'\nlevel Debug\ntests/contract_testcases/solana/create_contract/syntax.sol:7:9-22"]
 	contracts -> contract
 	contract -> f [label="function"]
-	contracts -> contract_4
+	contracts -> contract_3
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_7 [label="Error"]
-	diagnostics -> diagnostic_8 [label="Debug"]
+	diagnostics -> diagnostic_6 [label="Error"]
+	diagnostics -> diagnostic_7 [label="Debug"]
 }

+ 6 - 6
tests/contract_testcases/solana/create_contract/syntax_01.dot

@@ -1,14 +1,14 @@
 strict digraph "tests/contract_testcases/solana/create_contract/syntax_01.sol" {
 	contract [label="contract y\ntests/contract_testcases/solana/create_contract/syntax_01.sol:2:9-6:10"]
 	f [label="function f\ncontract: y\ntests/contract_testcases/solana/create_contract/syntax_01.sol:3:13-32\nsignature f()\nvisibility public\nmutability nonpayable"]
-	contract_4 [label="contract x\ntests/contract_testcases/solana/create_contract/syntax_01.sol:7:9-22"]
+	contract_3 [label="contract x\ntests/contract_testcases/solana/create_contract/syntax_01.sol:7:9-22"]
 	diagnostic [label="found contract 'y'\nlevel Debug\ntests/contract_testcases/solana/create_contract/syntax_01.sol:2:9-6:10"]
-	diagnostic_7 [label="'salt' not permitted for external calls or constructors on solana\nlevel Error\ntests/contract_testcases/solana/create_contract/syntax_01.sol:4:29-38"]
-	diagnostic_8 [label="found contract 'x'\nlevel Debug\ntests/contract_testcases/solana/create_contract/syntax_01.sol:7:9-22"]
+	diagnostic_6 [label="'salt' not permitted for external calls or constructors on solana\nlevel Error\ntests/contract_testcases/solana/create_contract/syntax_01.sol:4:29-38"]
+	diagnostic_7 [label="found contract 'x'\nlevel Debug\ntests/contract_testcases/solana/create_contract/syntax_01.sol:7:9-22"]
 	contracts -> contract
 	contract -> f [label="function"]
-	contracts -> contract_4
+	contracts -> contract_3
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_7 [label="Error"]
-	diagnostics -> diagnostic_8 [label="Debug"]
+	diagnostics -> diagnostic_6 [label="Error"]
+	diagnostics -> diagnostic_7 [label="Debug"]
 }

+ 200 - 200
tests/contract_testcases/solana/doccomments_everywhere.dot

@@ -3,10 +3,10 @@ strict digraph "tests/contract_testcases/solana/doccomments_everywhere.sol" {
 	contract [label="contract Property\ntests/contract_testcases/solana/doccomments_everywhere.sol:4:107-99:2"]
 	tags [label="author: Max Campbell (https://github.com/maxall41), RafaCypherpunk (https://github.com/RafaCypherpunk)"]
 	var [label="variable pricePerShare_\nvisibility public\ntests/contract_testcases/solana/doccomments_everywhere.sol:9:3-52"]
-	var_7 [label="variable valueLocked_\nvisibility public\ntests/contract_testcases/solana/doccomments_everywhere.sol:10:3-50"]
-	var_8 [label="variable tokenDeployers_\nvisibility public\ntests/contract_testcases/solana/doccomments_everywhere.sol:11:3-53"]
-	var_9 [label="variable sellingTokens_\nvisibility public\ntests/contract_testcases/solana/doccomments_everywhere.sol:12:3-52"]
-	var_10 [label="variable buyingTokens_\nvisibility public\ntests/contract_testcases/solana/doccomments_everywhere.sol:13:3-51"]
+	var_6 [label="variable valueLocked_\nvisibility public\ntests/contract_testcases/solana/doccomments_everywhere.sol:10:3-50"]
+	var_7 [label="variable tokenDeployers_\nvisibility public\ntests/contract_testcases/solana/doccomments_everywhere.sol:11:3-53"]
+	var_8 [label="variable sellingTokens_\nvisibility public\ntests/contract_testcases/solana/doccomments_everywhere.sol:12:3-52"]
+	var_9 [label="variable buyingTokens_\nvisibility public\ntests/contract_testcases/solana/doccomments_everywhere.sol:13:3-51"]
 	pricePerShare_ [label="function pricePerShare_\ncontract: Property\ntests/contract_testcases/solana/doccomments_everywhere.sol:9:38-52\nsignature pricePerShare_(uint256)\nvisibility public\nmutability view"]
 	parameters [label="parameters\nuint256 "]
 	returns [label="returns\nuint256 "]
@@ -16,133 +16,133 @@ strict digraph "tests/contract_testcases/solana/doccomments_everywhere.sol" {
 	storage_var [label="storage variable\nProperty.pricePerShare_\nmapping(uint256 => uint256) storage\nimplicit"]
 	variable [label="variable: \nuint256\nimplicit"]
 	valueLocked_ [label="function valueLocked_\ncontract: Property\ntests/contract_testcases/solana/doccomments_everywhere.sol:10:38-50\nsignature valueLocked_(bytes32)\nvisibility public\nmutability view"]
-	parameters_20 [label="parameters\naddress "]
-	returns_21 [label="returns\nuint256 "]
-	return_22 [label="return\nimplicit"]
-	storage_load_23 [label="storage load uint256\nimplicit"]
-	subscript_24 [label="subscript mapping(address => uint256) storage\nimplicit"]
-	storage_var_25 [label="storage variable\nProperty.valueLocked_\nmapping(address => uint256) storage\nimplicit"]
-	variable_26 [label="variable: \naddress\nimplicit"]
+	parameters_19 [label="parameters\naddress "]
+	returns_20 [label="returns\nuint256 "]
+	return_21 [label="return\nimplicit"]
+	storage_load_22 [label="storage load uint256\nimplicit"]
+	subscript_23 [label="subscript mapping(address => uint256) storage\nimplicit"]
+	storage_var_24 [label="storage variable\nProperty.valueLocked_\nmapping(address => uint256) storage\nimplicit"]
+	variable_25 [label="variable: \naddress\nimplicit"]
 	tokenDeployers_ [label="function tokenDeployers_\ncontract: Property\ntests/contract_testcases/solana/doccomments_everywhere.sol:11:38-53\nsignature tokenDeployers_(uint256)\nvisibility public\nmutability view"]
-	parameters_28 [label="parameters\nuint256 "]
-	returns_29 [label="returns\naddress "]
-	return_30 [label="return\nimplicit"]
-	storage_load_31 [label="storage load address\nimplicit"]
-	subscript_32 [label="subscript mapping(uint256 => address) storage\nimplicit"]
-	storage_var_33 [label="storage variable\nProperty.tokenDeployers_\nmapping(uint256 => address) storage\nimplicit"]
-	variable_34 [label="variable: \nuint256\nimplicit"]
+	parameters_27 [label="parameters\nuint256 "]
+	returns_28 [label="returns\naddress "]
+	return_29 [label="return\nimplicit"]
+	storage_load_30 [label="storage load address\nimplicit"]
+	subscript_31 [label="subscript mapping(uint256 => address) storage\nimplicit"]
+	storage_var_32 [label="storage variable\nProperty.tokenDeployers_\nmapping(uint256 => address) storage\nimplicit"]
+	variable_33 [label="variable: \nuint256\nimplicit"]
 	sellingTokens_ [label="function sellingTokens_\ncontract: Property\ntests/contract_testcases/solana/doccomments_everywhere.sol:12:38-52\nsignature sellingTokens_(uint256)\nvisibility public\nmutability view"]
-	parameters_36 [label="parameters\nuint256 "]
-	returns_37 [label="returns\nuint256 "]
-	return_38 [label="return\nimplicit"]
-	storage_load_39 [label="storage load uint256\nimplicit"]
-	subscript_40 [label="subscript mapping(uint256 => uint256) storage\nimplicit"]
-	storage_var_41 [label="storage variable\nProperty.sellingTokens_\nmapping(uint256 => uint256) storage\nimplicit"]
-	variable_42 [label="variable: \nuint256\nimplicit"]
+	parameters_35 [label="parameters\nuint256 "]
+	returns_36 [label="returns\nuint256 "]
+	return_37 [label="return\nimplicit"]
+	storage_load_38 [label="storage load uint256\nimplicit"]
+	subscript_39 [label="subscript mapping(uint256 => uint256) storage\nimplicit"]
+	storage_var_40 [label="storage variable\nProperty.sellingTokens_\nmapping(uint256 => uint256) storage\nimplicit"]
+	variable_41 [label="variable: \nuint256\nimplicit"]
 	buyingTokens_ [label="function buyingTokens_\ncontract: Property\ntests/contract_testcases/solana/doccomments_everywhere.sol:13:38-51\nsignature buyingTokens_(uint256)\nvisibility public\nmutability view"]
-	parameters_44 [label="parameters\nuint256 "]
-	returns_45 [label="returns\nuint256 "]
-	return_46 [label="return\nimplicit"]
-	storage_load_47 [label="storage load uint256\nimplicit"]
-	subscript_48 [label="subscript mapping(uint256 => uint256) storage\nimplicit"]
-	storage_var_49 [label="storage variable\nProperty.buyingTokens_\nmapping(uint256 => uint256) storage\nimplicit"]
-	variable_50 [label="variable: \nuint256\nimplicit"]
-	node_51 [label="constructor \ncontract: Property\ntests/contract_testcases/solana/doccomments_everywhere.sol:17:3-76\nsignature ()\nvisibility public\nmutability nonpayable"]
-	node_52 [label="receive \ncontract: Property\ntests/contract_testcases/solana/doccomments_everywhere.sol:19:3-29\nmutability payable"]
+	parameters_43 [label="parameters\nuint256 "]
+	returns_44 [label="returns\nuint256 "]
+	return_45 [label="return\nimplicit"]
+	storage_load_46 [label="storage load uint256\nimplicit"]
+	subscript_47 [label="subscript mapping(uint256 => uint256) storage\nimplicit"]
+	storage_var_48 [label="storage variable\nProperty.buyingTokens_\nmapping(uint256 => uint256) storage\nimplicit"]
+	variable_49 [label="variable: \nuint256\nimplicit"]
+	node_50 [label="constructor \ncontract: Property\ntests/contract_testcases/solana/doccomments_everywhere.sol:17:3-76\nsignature ()\nvisibility public\nmutability nonpayable"]
+	node_51 [label="receive \ncontract: Property\ntests/contract_testcases/solana/doccomments_everywhere.sol:19:3-29\nmutability payable"]
 	expr [label="expression\ntests/contract_testcases/solana/doccomments_everywhere.sol:20:5-68"]
 	assign [label="assign\nuint256 storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:20:5-68"]
-	subscript_55 [label="subscript mapping(address => uint256) storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:20:5-29"]
-	storage_var_56 [label="storage variable\nProperty.valueLocked_\nmapping(address => uint256) storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:20:5-17"]
+	subscript_54 [label="subscript mapping(address => uint256) storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:20:5-29"]
+	storage_var_55 [label="storage variable\nProperty.valueLocked_\nmapping(address => uint256) storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:20:5-17"]
 	cast [label="cast address\ntests/contract_testcases/solana/doccomments_everywhere.sol:20:18-28"]
 	builtins [label="builtin Sender\ntests/contract_testcases/solana/doccomments_everywhere.sol:20:18-28"]
 	add [label="add\nuint256\ntests/contract_testcases/solana/doccomments_everywhere.sol:20:32-68"]
-	storage_load_60 [label="storage load uint256\ntests/contract_testcases/solana/doccomments_everywhere.sol:20:32-56"]
-	subscript_61 [label="subscript mapping(address => uint256) storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:20:32-56"]
-	storage_var_62 [label="storage variable\nProperty.valueLocked_\nmapping(address => uint256) storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:20:32-44"]
-	cast_63 [label="cast address\ntests/contract_testcases/solana/doccomments_everywhere.sol:20:45-55"]
-	builtins_64 [label="builtin Sender\ntests/contract_testcases/solana/doccomments_everywhere.sol:20:45-55"]
+	storage_load_59 [label="storage load uint256\ntests/contract_testcases/solana/doccomments_everywhere.sol:20:32-56"]
+	subscript_60 [label="subscript mapping(address => uint256) storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:20:32-56"]
+	storage_var_61 [label="storage variable\nProperty.valueLocked_\nmapping(address => uint256) storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:20:32-44"]
+	cast_62 [label="cast address\ntests/contract_testcases/solana/doccomments_everywhere.sol:20:45-55"]
+	builtins_63 [label="builtin Sender\ntests/contract_testcases/solana/doccomments_everywhere.sol:20:45-55"]
 	sign_ext [label="sign extend uint256\ntests/contract_testcases/solana/doccomments_everywhere.sol:20:59-68"]
-	builtins_66 [label="builtin Value\ntests/contract_testcases/solana/doccomments_everywhere.sol:20:59-68"]
+	builtins_65 [label="builtin Value\ntests/contract_testcases/solana/doccomments_everywhere.sol:20:59-68"]
 	mintProperty [label="function mintProperty\ncontract: Property\ntests/contract_testcases/solana/doccomments_everywhere.sol:23:3-27:11\nsignature mintProperty(uint256,uint256,uint256)\nvisibility public\nmutability nonpayable"]
-	parameters_68 [label="parameters\nuint256 _shares\nuint256 _pricePerShare\nuint256 _sharesForSale"]
+	parameters_67 [label="parameters\nuint256 _shares\nuint256 _pricePerShare\nuint256 _sharesForSale"]
 	getTokenOwner [label="function getTokenOwner\ncontract: Property\ntests/contract_testcases/solana/doccomments_everywhere.sol:37:3-76\nsignature getTokenOwner(uint256)\nvisibility public\nmutability view"]
-	parameters_70 [label="parameters\nuint256 _id"]
-	returns_71 [label="returns\naddress payable "]
-	return_72 [label="return\ntests/contract_testcases/solana/doccomments_everywhere.sol:38:5-41"]
-	cast_73 [label="cast address payable\ntests/contract_testcases/solana/doccomments_everywhere.sol:38:12-41"]
-	storage_load_74 [label="storage load address\ntests/contract_testcases/solana/doccomments_everywhere.sol:38:12-41"]
-	subscript_75 [label="subscript mapping(uint256 => address) storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:38:20-40"]
-	storage_var_76 [label="storage variable\nProperty.tokenDeployers_\nmapping(uint256 => address) storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:38:20-35"]
-	variable_77 [label="variable: _id\nuint256\ntests/contract_testcases/solana/doccomments_everywhere.sol:38:36-39"]
+	parameters_69 [label="parameters\nuint256 _id"]
+	returns_70 [label="returns\naddress payable "]
+	return_71 [label="return\ntests/contract_testcases/solana/doccomments_everywhere.sol:38:5-41"]
+	cast_72 [label="cast address payable\ntests/contract_testcases/solana/doccomments_everywhere.sol:38:12-41"]
+	storage_load_73 [label="storage load address\ntests/contract_testcases/solana/doccomments_everywhere.sol:38:12-41"]
+	subscript_74 [label="subscript mapping(uint256 => address) storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:38:20-40"]
+	storage_var_75 [label="storage variable\nProperty.tokenDeployers_\nmapping(uint256 => address) storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:38:20-35"]
+	variable_76 [label="variable: _id\nuint256\ntests/contract_testcases/solana/doccomments_everywhere.sol:38:36-39"]
 	getPricePerShare [label="function getPricePerShare\ncontract: Property\ntests/contract_testcases/solana/doccomments_everywhere.sol:41:3-71\nsignature getPricePerShare(uint256)\nvisibility public\nmutability view"]
-	parameters_79 [label="parameters\nuint256 _id"]
-	returns_80 [label="returns\nuint256 "]
-	return_81 [label="return\ntests/contract_testcases/solana/doccomments_everywhere.sol:42:5-31"]
-	storage_load_82 [label="storage load uint256\ntests/contract_testcases/solana/doccomments_everywhere.sol:42:5-31"]
-	subscript_83 [label="subscript mapping(uint256 => uint256) storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:42:12-31"]
-	storage_var_84 [label="storage variable\nProperty.pricePerShare_\nmapping(uint256 => uint256) storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:42:12-26"]
-	variable_85 [label="variable: _id\nuint256\ntests/contract_testcases/solana/doccomments_everywhere.sol:42:27-30"]
+	parameters_78 [label="parameters\nuint256 _id"]
+	returns_79 [label="returns\nuint256 "]
+	return_80 [label="return\ntests/contract_testcases/solana/doccomments_everywhere.sol:42:5-31"]
+	storage_load_81 [label="storage load uint256\ntests/contract_testcases/solana/doccomments_everywhere.sol:42:5-31"]
+	subscript_82 [label="subscript mapping(uint256 => uint256) storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:42:12-31"]
+	storage_var_83 [label="storage variable\nProperty.pricePerShare_\nmapping(uint256 => uint256) storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:42:12-26"]
+	variable_84 [label="variable: _id\nuint256\ntests/contract_testcases/solana/doccomments_everywhere.sol:42:27-30"]
 	purchaseShares [label="function purchaseShares\ncontract: Property\ntests/contract_testcases/solana/doccomments_everywhere.sol:46:3-71\nsignature purchaseShares(uint256,uint256)\nvisibility public\nmutability payable"]
-	tags_87 [label="dev: Used to purchase shares"]
-	parameters_88 [label="parameters\nuint256 _shares\nuint256 _id"]
+	tags_86 [label="dev: Used to purchase shares"]
+	parameters_87 [label="parameters\nuint256 _shares\nuint256 _id"]
 	setSellingShares [label="function setSellingShares\ncontract: Property\ntests/contract_testcases/solana/doccomments_everywhere.sol:67:3-74\nsignature setSellingShares(uint256,uint256)\nvisibility public\nmutability nonpayable"]
-	parameters_90 [label="parameters\nuint256 _newSharesToSell\nuint256 _id"]
-	expr_91 [label="expression\ntests/contract_testcases/solana/doccomments_everywhere.sol:68:5-73"]
-	builtins_92 [label="builtin Require\ntests/contract_testcases/solana/doccomments_everywhere.sol:68:5-12"]
+	parameters_89 [label="parameters\nuint256 _newSharesToSell\nuint256 _id"]
+	expr_90 [label="expression\ntests/contract_testcases/solana/doccomments_everywhere.sol:68:5-73"]
+	builtins_91 [label="builtin Require\ntests/contract_testcases/solana/doccomments_everywhere.sol:68:5-12"]
 	equal [label="equal\ntests/contract_testcases/solana/doccomments_everywhere.sol:68:13-47"]
-	cast_94 [label="cast address\ntests/contract_testcases/solana/doccomments_everywhere.sol:68:13-23"]
-	builtins_95 [label="builtin Sender\ntests/contract_testcases/solana/doccomments_everywhere.sol:68:13-23"]
-	storage_load_96 [label="storage load address\ntests/contract_testcases/solana/doccomments_everywhere.sol:68:27-47"]
-	subscript_97 [label="subscript mapping(uint256 => address) storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:68:27-47"]
-	storage_var_98 [label="storage variable\nProperty.tokenDeployers_\nmapping(uint256 => address) storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:68:27-42"]
-	variable_99 [label="variable: _id\nuint256\ntests/contract_testcases/solana/doccomments_everywhere.sol:68:43-46"]
+	cast_93 [label="cast address\ntests/contract_testcases/solana/doccomments_everywhere.sol:68:13-23"]
+	builtins_94 [label="builtin Sender\ntests/contract_testcases/solana/doccomments_everywhere.sol:68:13-23"]
+	storage_load_95 [label="storage load address\ntests/contract_testcases/solana/doccomments_everywhere.sol:68:27-47"]
+	subscript_96 [label="subscript mapping(uint256 => address) storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:68:27-47"]
+	storage_var_97 [label="storage variable\nProperty.tokenDeployers_\nmapping(uint256 => address) storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:68:27-42"]
+	variable_98 [label="variable: _id\nuint256\ntests/contract_testcases/solana/doccomments_everywhere.sol:68:43-46"]
 	alloc_array [label="alloc array string\ninitializer: 596f7520617265206e6f7420746865206f776e6572\ntests/contract_testcases/solana/doccomments_everywhere.sol:68:49-72"]
 	number_literal [label="uint32 literal: 21\ntests/contract_testcases/solana/doccomments_everywhere.sol:68:49-72"]
-	expr_102 [label="expression\ntests/contract_testcases/solana/doccomments_everywhere.sol:69:5-43"]
-	assign_103 [label="assign\nuint256 storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:69:5-43"]
-	subscript_104 [label="subscript mapping(uint256 => uint256) storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:69:5-24"]
-	storage_var_105 [label="storage variable\nProperty.sellingTokens_\nmapping(uint256 => uint256) storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:69:5-19"]
-	variable_106 [label="variable: _id\nuint256\ntests/contract_testcases/solana/doccomments_everywhere.sol:69:20-23"]
-	variable_107 [label="variable: _newSharesToSell\nuint256\ntests/contract_testcases/solana/doccomments_everywhere.sol:69:27-43"]
+	expr_101 [label="expression\ntests/contract_testcases/solana/doccomments_everywhere.sol:69:5-43"]
+	assign_102 [label="assign\nuint256 storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:69:5-43"]
+	subscript_103 [label="subscript mapping(uint256 => uint256) storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:69:5-24"]
+	storage_var_104 [label="storage variable\nProperty.sellingTokens_\nmapping(uint256 => uint256) storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:69:5-19"]
+	variable_105 [label="variable: _id\nuint256\ntests/contract_testcases/solana/doccomments_everywhere.sol:69:20-23"]
+	variable_106 [label="variable: _newSharesToSell\nuint256\ntests/contract_testcases/solana/doccomments_everywhere.sol:69:27-43"]
 	setBuyingShares [label="function setBuyingShares\ncontract: Property\ntests/contract_testcases/solana/doccomments_everywhere.sol:72:3-73\nsignature setBuyingShares(uint256,uint256)\nvisibility public\nmutability nonpayable"]
-	parameters_109 [label="parameters\nuint256 _newSharesToSell\nuint256 _id"]
-	expr_110 [label="expression\ntests/contract_testcases/solana/doccomments_everywhere.sol:73:5-73"]
-	builtins_111 [label="builtin Require\ntests/contract_testcases/solana/doccomments_everywhere.sol:73:5-12"]
-	equal_112 [label="equal\ntests/contract_testcases/solana/doccomments_everywhere.sol:73:13-47"]
-	cast_113 [label="cast address\ntests/contract_testcases/solana/doccomments_everywhere.sol:73:13-23"]
-	builtins_114 [label="builtin Sender\ntests/contract_testcases/solana/doccomments_everywhere.sol:73:13-23"]
-	storage_load_115 [label="storage load address\ntests/contract_testcases/solana/doccomments_everywhere.sol:73:27-47"]
-	subscript_116 [label="subscript mapping(uint256 => address) storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:73:27-47"]
-	storage_var_117 [label="storage variable\nProperty.tokenDeployers_\nmapping(uint256 => address) storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:73:27-42"]
-	variable_118 [label="variable: _id\nuint256\ntests/contract_testcases/solana/doccomments_everywhere.sol:73:43-46"]
-	alloc_array_119 [label="alloc array string\ninitializer: 596f7520617265206e6f7420746865206f776e6572\ntests/contract_testcases/solana/doccomments_everywhere.sol:73:49-72"]
-	number_literal_120 [label="uint32 literal: 21\ntests/contract_testcases/solana/doccomments_everywhere.sol:73:49-72"]
-	expr_121 [label="expression\ntests/contract_testcases/solana/doccomments_everywhere.sol:74:5-42"]
-	assign_122 [label="assign\nuint256 storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:74:5-42"]
-	subscript_123 [label="subscript mapping(uint256 => uint256) storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:74:5-23"]
-	storage_var_124 [label="storage variable\nProperty.buyingTokens_\nmapping(uint256 => uint256) storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:74:5-18"]
-	variable_125 [label="variable: _id\nuint256\ntests/contract_testcases/solana/doccomments_everywhere.sol:74:19-22"]
-	variable_126 [label="variable: _newSharesToSell\nuint256\ntests/contract_testcases/solana/doccomments_everywhere.sol:74:26-42"]
+	parameters_108 [label="parameters\nuint256 _newSharesToSell\nuint256 _id"]
+	expr_109 [label="expression\ntests/contract_testcases/solana/doccomments_everywhere.sol:73:5-73"]
+	builtins_110 [label="builtin Require\ntests/contract_testcases/solana/doccomments_everywhere.sol:73:5-12"]
+	equal_111 [label="equal\ntests/contract_testcases/solana/doccomments_everywhere.sol:73:13-47"]
+	cast_112 [label="cast address\ntests/contract_testcases/solana/doccomments_everywhere.sol:73:13-23"]
+	builtins_113 [label="builtin Sender\ntests/contract_testcases/solana/doccomments_everywhere.sol:73:13-23"]
+	storage_load_114 [label="storage load address\ntests/contract_testcases/solana/doccomments_everywhere.sol:73:27-47"]
+	subscript_115 [label="subscript mapping(uint256 => address) storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:73:27-47"]
+	storage_var_116 [label="storage variable\nProperty.tokenDeployers_\nmapping(uint256 => address) storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:73:27-42"]
+	variable_117 [label="variable: _id\nuint256\ntests/contract_testcases/solana/doccomments_everywhere.sol:73:43-46"]
+	alloc_array_118 [label="alloc array string\ninitializer: 596f7520617265206e6f7420746865206f776e6572\ntests/contract_testcases/solana/doccomments_everywhere.sol:73:49-72"]
+	number_literal_119 [label="uint32 literal: 21\ntests/contract_testcases/solana/doccomments_everywhere.sol:73:49-72"]
+	expr_120 [label="expression\ntests/contract_testcases/solana/doccomments_everywhere.sol:74:5-42"]
+	assign_121 [label="assign\nuint256 storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:74:5-42"]
+	subscript_122 [label="subscript mapping(uint256 => uint256) storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:74:5-23"]
+	storage_var_123 [label="storage variable\nProperty.buyingTokens_\nmapping(uint256 => uint256) storage\ntests/contract_testcases/solana/doccomments_everywhere.sol:74:5-18"]
+	variable_124 [label="variable: _id\nuint256\ntests/contract_testcases/solana/doccomments_everywhere.sol:74:19-22"]
+	variable_125 [label="variable: _newSharesToSell\nuint256\ntests/contract_testcases/solana/doccomments_everywhere.sol:74:26-42"]
 	sellShares [label="function sellShares\ncontract: Property\ntests/contract_testcases/solana/doccomments_everywhere.sol:77:3-59\nsignature sellShares(uint256,uint256)\nvisibility public\nmutability nonpayable"]
-	parameters_128 [label="parameters\nuint256 shares_\nuint256 _id"]
+	parameters_127 [label="parameters\nuint256 shares_\nuint256 _id"]
 	diagnostic [label="pragma 'solidity' is ignored\nlevel Debug\ntests/contract_testcases/solana/doccomments_everywhere.sol:1:1-24"]
-	diagnostic_131 [label="found contract 'Property'\nlevel Debug\ntests/contract_testcases/solana/doccomments_everywhere.sol:4:107-99:2"]
-	diagnostic_132 [label="'Counters' not found\nlevel Error\ntests/contract_testcases/solana/doccomments_everywhere.sol:6:22-30"]
-	diagnostic_133 [label="'Counters' not found\nlevel Error\ntests/contract_testcases/solana/doccomments_everywhere.sol:7:3-11"]
-	diagnostic_134 [label="'ERC1155' not found\nlevel Error\ntests/contract_testcases/solana/doccomments_everywhere.sol:17:17-24"]
-	diagnostic_135 [label="target solana does not support receive() functions, see https://solang.readthedocs.io/en/latest/language/functions.html#fallback-and-receive-function\nlevel Error\ntests/contract_testcases/solana/doccomments_everywhere.sol:19:3-29"]
-	diagnostic_136 [label="Solana Cross Program Invocation (CPI) cannot transfer native value. See https://solang.readthedocs.io/en/latest/language/functions.html#value_transfer\nlevel Error\ntests/contract_testcases/solana/doccomments_everywhere.sol:20:59-68"]
-	diagnostic_137 [label="'_tokenIds' not found\nlevel Error\ntests/contract_testcases/solana/doccomments_everywhere.sol:28:29-38"]
-	diagnostic_138 [label="cannot find overloaded function which matches signature\nlevel Error\ntests/contract_testcases/solana/doccomments_everywhere.sol:53:7-50"]
-	diagnostic_139 [label="cannot find overloaded function which matches signature\nlevel Error\ntests/contract_testcases/solana/doccomments_everywhere.sol:86:7-38"]
+	diagnostic_130 [label="found contract 'Property'\nlevel Debug\ntests/contract_testcases/solana/doccomments_everywhere.sol:4:107-99:2"]
+	diagnostic_131 [label="'Counters' not found\nlevel Error\ntests/contract_testcases/solana/doccomments_everywhere.sol:6:22-30"]
+	diagnostic_132 [label="'Counters' not found\nlevel Error\ntests/contract_testcases/solana/doccomments_everywhere.sol:7:3-11"]
+	diagnostic_133 [label="'ERC1155' not found\nlevel Error\ntests/contract_testcases/solana/doccomments_everywhere.sol:17:17-24"]
+	diagnostic_134 [label="target solana does not support receive() functions, see https://solang.readthedocs.io/en/latest/language/functions.html#fallback-and-receive-function\nlevel Error\ntests/contract_testcases/solana/doccomments_everywhere.sol:19:3-29"]
+	diagnostic_135 [label="Solana Cross Program Invocation (CPI) cannot transfer native value. See https://solang.readthedocs.io/en/latest/language/functions.html#value_transfer\nlevel Error\ntests/contract_testcases/solana/doccomments_everywhere.sol:20:59-68"]
+	diagnostic_136 [label="'_tokenIds' not found\nlevel Error\ntests/contract_testcases/solana/doccomments_everywhere.sol:28:29-38"]
+	diagnostic_137 [label="cannot find overloaded function which matches signature\nlevel Error\ntests/contract_testcases/solana/doccomments_everywhere.sol:53:7-50"]
+	diagnostic_138 [label="cannot find overloaded function which matches signature\nlevel Error\ntests/contract_testcases/solana/doccomments_everywhere.sol:86:7-38"]
 	events -> MintProperty
 	contracts -> contract
 	contract -> tags [label="tags"]
 	contract -> var [label="variable"]
+	contract -> var_6 [label="variable"]
 	contract -> var_7 [label="variable"]
 	contract -> var_8 [label="variable"]
 	contract -> var_9 [label="variable"]
-	contract -> var_10 [label="variable"]
 	contract -> pricePerShare_ [label="function"]
 	pricePerShare_ -> parameters [label="parameters"]
 	pricePerShare_ -> returns [label="returns"]
@@ -152,117 +152,118 @@ strict digraph "tests/contract_testcases/solana/doccomments_everywhere.sol" {
 	subscript -> storage_var [label="array"]
 	subscript -> variable [label="index"]
 	contract -> valueLocked_ [label="function"]
-	valueLocked_ -> parameters_20 [label="parameters"]
-	valueLocked_ -> returns_21 [label="returns"]
-	valueLocked_ -> return_22 [label="body"]
-	return_22 -> storage_load_23 [label="expr"]
-	storage_load_23 -> subscript_24 [label="expr"]
-	subscript_24 -> storage_var_25 [label="array"]
-	subscript_24 -> variable_26 [label="index"]
+	valueLocked_ -> parameters_19 [label="parameters"]
+	valueLocked_ -> returns_20 [label="returns"]
+	valueLocked_ -> return_21 [label="body"]
+	return_21 -> storage_load_22 [label="expr"]
+	storage_load_22 -> subscript_23 [label="expr"]
+	subscript_23 -> storage_var_24 [label="array"]
+	subscript_23 -> variable_25 [label="index"]
 	contract -> tokenDeployers_ [label="function"]
-	tokenDeployers_ -> parameters_28 [label="parameters"]
-	tokenDeployers_ -> returns_29 [label="returns"]
-	tokenDeployers_ -> return_30 [label="body"]
-	return_30 -> storage_load_31 [label="expr"]
-	storage_load_31 -> subscript_32 [label="expr"]
-	subscript_32 -> storage_var_33 [label="array"]
-	subscript_32 -> variable_34 [label="index"]
+	tokenDeployers_ -> parameters_27 [label="parameters"]
+	tokenDeployers_ -> returns_28 [label="returns"]
+	tokenDeployers_ -> return_29 [label="body"]
+	return_29 -> storage_load_30 [label="expr"]
+	storage_load_30 -> subscript_31 [label="expr"]
+	subscript_31 -> storage_var_32 [label="array"]
+	subscript_31 -> variable_33 [label="index"]
 	contract -> sellingTokens_ [label="function"]
-	sellingTokens_ -> parameters_36 [label="parameters"]
-	sellingTokens_ -> returns_37 [label="returns"]
-	sellingTokens_ -> return_38 [label="body"]
-	return_38 -> storage_load_39 [label="expr"]
-	storage_load_39 -> subscript_40 [label="expr"]
-	subscript_40 -> storage_var_41 [label="array"]
-	subscript_40 -> variable_42 [label="index"]
+	sellingTokens_ -> parameters_35 [label="parameters"]
+	sellingTokens_ -> returns_36 [label="returns"]
+	sellingTokens_ -> return_37 [label="body"]
+	return_37 -> storage_load_38 [label="expr"]
+	storage_load_38 -> subscript_39 [label="expr"]
+	subscript_39 -> storage_var_40 [label="array"]
+	subscript_39 -> variable_41 [label="index"]
 	contract -> buyingTokens_ [label="function"]
-	buyingTokens_ -> parameters_44 [label="parameters"]
-	buyingTokens_ -> returns_45 [label="returns"]
-	buyingTokens_ -> return_46 [label="body"]
-	return_46 -> storage_load_47 [label="expr"]
-	storage_load_47 -> subscript_48 [label="expr"]
-	subscript_48 -> storage_var_49 [label="array"]
-	subscript_48 -> variable_50 [label="index"]
-	contract -> node_51 [label="constructor"]
-	contract -> node_52 [label="receive"]
-	node_52 -> expr [label="body"]
+	buyingTokens_ -> parameters_43 [label="parameters"]
+	buyingTokens_ -> returns_44 [label="returns"]
+	buyingTokens_ -> return_45 [label="body"]
+	return_45 -> storage_load_46 [label="expr"]
+	storage_load_46 -> subscript_47 [label="expr"]
+	subscript_47 -> storage_var_48 [label="array"]
+	subscript_47 -> variable_49 [label="index"]
+	contract -> node_50 [label="constructor"]
+	contract -> node_51 [label="receive"]
+	node_51 -> expr [label="body"]
 	expr -> assign [label="expr"]
-	assign -> subscript_55 [label="left"]
-	subscript_55 -> storage_var_56 [label="array"]
-	subscript_55 -> cast [label="index"]
+	assign -> subscript_54 [label="left"]
+	subscript_54 -> storage_var_55 [label="array"]
+	subscript_54 -> cast [label="index"]
 	cast -> builtins [label="expr"]
 	assign -> add [label="right"]
-	add -> storage_load_60 [label="left"]
-	storage_load_60 -> subscript_61 [label="expr"]
-	subscript_61 -> storage_var_62 [label="array"]
-	subscript_61 -> cast_63 [label="index"]
-	cast_63 -> builtins_64 [label="expr"]
+	add -> storage_load_59 [label="left"]
+	storage_load_59 -> subscript_60 [label="expr"]
+	subscript_60 -> storage_var_61 [label="array"]
+	subscript_60 -> cast_62 [label="index"]
+	cast_62 -> builtins_63 [label="expr"]
 	add -> sign_ext [label="right"]
-	sign_ext -> builtins_66 [label="expr"]
+	sign_ext -> builtins_65 [label="expr"]
 	contract -> mintProperty [label="function"]
-	mintProperty -> parameters_68 [label="parameters"]
+	mintProperty -> parameters_67 [label="parameters"]
 	contract -> getTokenOwner [label="function"]
-	getTokenOwner -> parameters_70 [label="parameters"]
-	getTokenOwner -> returns_71 [label="returns"]
-	getTokenOwner -> return_72 [label="body"]
-	return_72 -> cast_73 [label="expr"]
-	cast_73 -> storage_load_74 [label="expr"]
-	storage_load_74 -> subscript_75 [label="expr"]
-	subscript_75 -> storage_var_76 [label="array"]
-	subscript_75 -> variable_77 [label="index"]
+	getTokenOwner -> parameters_69 [label="parameters"]
+	getTokenOwner -> returns_70 [label="returns"]
+	getTokenOwner -> return_71 [label="body"]
+	return_71 -> cast_72 [label="expr"]
+	cast_72 -> storage_load_73 [label="expr"]
+	storage_load_73 -> subscript_74 [label="expr"]
+	subscript_74 -> storage_var_75 [label="array"]
+	subscript_74 -> variable_76 [label="index"]
 	contract -> getPricePerShare [label="function"]
-	getPricePerShare -> parameters_79 [label="parameters"]
-	getPricePerShare -> returns_80 [label="returns"]
-	getPricePerShare -> return_81 [label="body"]
-	return_81 -> storage_load_82 [label="expr"]
-	storage_load_82 -> subscript_83 [label="expr"]
-	subscript_83 -> storage_var_84 [label="array"]
-	subscript_83 -> variable_85 [label="index"]
+	getPricePerShare -> parameters_78 [label="parameters"]
+	getPricePerShare -> returns_79 [label="returns"]
+	getPricePerShare -> return_80 [label="body"]
+	return_80 -> storage_load_81 [label="expr"]
+	storage_load_81 -> subscript_82 [label="expr"]
+	subscript_82 -> storage_var_83 [label="array"]
+	subscript_82 -> variable_84 [label="index"]
 	contract -> purchaseShares [label="function"]
-	purchaseShares -> tags_87 [label="tags"]
-	purchaseShares -> parameters_88 [label="parameters"]
+	purchaseShares -> tags_86 [label="tags"]
+	purchaseShares -> parameters_87 [label="parameters"]
 	contract -> setSellingShares [label="function"]
-	setSellingShares -> parameters_90 [label="parameters"]
-	setSellingShares -> expr_91 [label="body"]
-	expr_91 -> builtins_92 [label="expr"]
-	builtins_92 -> equal [label="arg #0"]
-	equal -> cast_94 [label="left"]
-	cast_94 -> builtins_95 [label="expr"]
-	equal -> storage_load_96 [label="right"]
-	storage_load_96 -> subscript_97 [label="expr"]
-	subscript_97 -> storage_var_98 [label="array"]
-	subscript_97 -> variable_99 [label="index"]
-	builtins_92 -> alloc_array [label="arg #1"]
+	setSellingShares -> parameters_89 [label="parameters"]
+	setSellingShares -> expr_90 [label="body"]
+	expr_90 -> builtins_91 [label="expr"]
+	builtins_91 -> equal [label="arg #0"]
+	equal -> cast_93 [label="left"]
+	cast_93 -> builtins_94 [label="expr"]
+	equal -> storage_load_95 [label="right"]
+	storage_load_95 -> subscript_96 [label="expr"]
+	subscript_96 -> storage_var_97 [label="array"]
+	subscript_96 -> variable_98 [label="index"]
+	builtins_91 -> alloc_array [label="arg #1"]
 	alloc_array -> number_literal [label="length"]
-	expr_91 -> expr_102 [label="next"]
-	expr_102 -> assign_103 [label="expr"]
-	assign_103 -> subscript_104 [label="left"]
-	subscript_104 -> storage_var_105 [label="array"]
-	subscript_104 -> variable_106 [label="index"]
-	assign_103 -> variable_107 [label="right"]
+	expr_90 -> expr_101 [label="next"]
+	expr_101 -> assign_102 [label="expr"]
+	assign_102 -> subscript_103 [label="left"]
+	subscript_103 -> storage_var_104 [label="array"]
+	subscript_103 -> variable_105 [label="index"]
+	assign_102 -> variable_106 [label="right"]
 	contract -> setBuyingShares [label="function"]
-	setBuyingShares -> parameters_109 [label="parameters"]
-	setBuyingShares -> expr_110 [label="body"]
-	expr_110 -> builtins_111 [label="expr"]
-	builtins_111 -> equal_112 [label="arg #0"]
-	equal_112 -> cast_113 [label="left"]
-	cast_113 -> builtins_114 [label="expr"]
-	equal_112 -> storage_load_115 [label="right"]
-	storage_load_115 -> subscript_116 [label="expr"]
-	subscript_116 -> storage_var_117 [label="array"]
-	subscript_116 -> variable_118 [label="index"]
-	builtins_111 -> alloc_array_119 [label="arg #1"]
-	alloc_array_119 -> number_literal_120 [label="length"]
-	expr_110 -> expr_121 [label="next"]
-	expr_121 -> assign_122 [label="expr"]
-	assign_122 -> subscript_123 [label="left"]
-	subscript_123 -> storage_var_124 [label="array"]
-	subscript_123 -> variable_125 [label="index"]
-	assign_122 -> variable_126 [label="right"]
+	setBuyingShares -> parameters_108 [label="parameters"]
+	setBuyingShares -> expr_109 [label="body"]
+	expr_109 -> builtins_110 [label="expr"]
+	builtins_110 -> equal_111 [label="arg #0"]
+	equal_111 -> cast_112 [label="left"]
+	cast_112 -> builtins_113 [label="expr"]
+	equal_111 -> storage_load_114 [label="right"]
+	storage_load_114 -> subscript_115 [label="expr"]
+	subscript_115 -> storage_var_116 [label="array"]
+	subscript_115 -> variable_117 [label="index"]
+	builtins_110 -> alloc_array_118 [label="arg #1"]
+	alloc_array_118 -> number_literal_119 [label="length"]
+	expr_109 -> expr_120 [label="next"]
+	expr_120 -> assign_121 [label="expr"]
+	assign_121 -> subscript_122 [label="left"]
+	subscript_122 -> storage_var_123 [label="array"]
+	subscript_122 -> variable_124 [label="index"]
+	assign_121 -> variable_125 [label="right"]
 	contract -> sellShares [label="function"]
-	sellShares -> parameters_128 [label="parameters"]
+	sellShares -> parameters_127 [label="parameters"]
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_131 [label="Debug"]
+	diagnostics -> diagnostic_130 [label="Debug"]
+	diagnostics -> diagnostic_131 [label="Error"]
 	diagnostics -> diagnostic_132 [label="Error"]
 	diagnostics -> diagnostic_133 [label="Error"]
 	diagnostics -> diagnostic_134 [label="Error"]
@@ -270,5 +271,4 @@ strict digraph "tests/contract_testcases/solana/doccomments_everywhere.sol" {
 	diagnostics -> diagnostic_136 [label="Error"]
 	diagnostics -> diagnostic_137 [label="Error"]
 	diagnostics -> diagnostic_138 [label="Error"]
-	diagnostics -> diagnostic_139 [label="Error"]
 }

+ 3 - 3
tests/contract_testcases/solana/error.dot

@@ -3,12 +3,12 @@ strict digraph "tests/contract_testcases/solana/error.sol" {
 	foo [label="function foo\ncontract: error\ntests/contract_testcases/solana/error.sol:5:2-30\nsignature foo(bytes32)\nvisibility public\nmutability nonpayable"]
 	parameters [label="parameters\ncontract error x"]
 	diagnostic [label="found contract 'error'\nlevel Debug\ntests/contract_testcases/solana/error.sol:1:1-8:2"]
-	diagnostic_7 [label="function can be declared 'pure'\nlevel Warning\ntests/contract_testcases/solana/error.sol:5:2-30"]
-	diagnostic_8 [label="function parameter 'x' has never been read\nlevel Warning\ntests/contract_testcases/solana/error.sol:5:21-22"]
+	diagnostic_6 [label="function can be declared 'pure'\nlevel Warning\ntests/contract_testcases/solana/error.sol:5:2-30"]
+	diagnostic_7 [label="function parameter 'x' has never been read\nlevel Warning\ntests/contract_testcases/solana/error.sol:5:21-22"]
 	contracts -> contract
 	contract -> foo [label="function"]
 	foo -> parameters [label="parameters"]
 	diagnostics -> diagnostic [label="Debug"]
+	diagnostics -> diagnostic_6 [label="Warning"]
 	diagnostics -> diagnostic_7 [label="Warning"]
-	diagnostics -> diagnostic_8 [label="Warning"]
 }

+ 10 - 10
tests/contract_testcases/solana/event.dot

@@ -3,19 +3,20 @@ strict digraph "tests/contract_testcases/solana/event.sol" {
 	contract [label="contract c\ntests/contract_testcases/solana/event.sol:4:1-11:2"]
 	foo [label="function foo\ncontract: c\ntests/contract_testcases/solana/event.sol:6:5-26\nsignature foo()\nvisibility public\nmutability nonpayable"]
 	diagnostic [label="found contract 'c'\nlevel Debug\ntests/contract_testcases/solana/event.sol:4:1-11:2"]
-	diagnostic_8 [label="'a' not found\nlevel Error\ntests/contract_testcases/solana/event.sol:7:18-19"]
-	diagnostic_9 [label="'a' not found\nlevel Error\ntests/contract_testcases/solana/event.sol:8:24-25"]
-	diagnostic_10 [label="'b' not found\nlevel Error\ntests/contract_testcases/solana/event.sol:8:33-34"]
-	diagnostic_11 [label="duplicate argument with name 'no'\nlevel Error\ntests/contract_testcases/solana/event.sol:8:36-38"]
-	diagnostic_12 [label="'c' is a contract\nlevel Error\ntests/contract_testcases/solana/event.sol:8:40-41"]
-	diagnostic_13 [label="'a' not found\nlevel Error\ntests/contract_testcases/solana/event.sol:9:25-26"]
-	diagnostic_14 [label="'b' not found\nlevel Error\ntests/contract_testcases/solana/event.sol:9:34-35"]
-	diagnostic_15 [label="duplicate argument with name 'no'\nlevel Error\ntests/contract_testcases/solana/event.sol:9:37-39"]
-	diagnostic_16 [label="'c' is a contract\nlevel Error\ntests/contract_testcases/solana/event.sol:9:41-42"]
+	diagnostic_7 [label="'a' not found\nlevel Error\ntests/contract_testcases/solana/event.sol:7:18-19"]
+	diagnostic_8 [label="'a' not found\nlevel Error\ntests/contract_testcases/solana/event.sol:8:24-25"]
+	diagnostic_9 [label="'b' not found\nlevel Error\ntests/contract_testcases/solana/event.sol:8:33-34"]
+	diagnostic_10 [label="duplicate argument with name 'no'\nlevel Error\ntests/contract_testcases/solana/event.sol:8:36-38"]
+	diagnostic_11 [label="'c' is a contract\nlevel Error\ntests/contract_testcases/solana/event.sol:8:40-41"]
+	diagnostic_12 [label="'a' not found\nlevel Error\ntests/contract_testcases/solana/event.sol:9:25-26"]
+	diagnostic_13 [label="'b' not found\nlevel Error\ntests/contract_testcases/solana/event.sol:9:34-35"]
+	diagnostic_14 [label="duplicate argument with name 'no'\nlevel Error\ntests/contract_testcases/solana/event.sol:9:37-39"]
+	diagnostic_15 [label="'c' is a contract\nlevel Error\ntests/contract_testcases/solana/event.sol:9:41-42"]
 	events -> Foo
 	contracts -> contract
 	contract -> foo [label="function"]
 	diagnostics -> diagnostic [label="Debug"]
+	diagnostics -> diagnostic_7 [label="Error"]
 	diagnostics -> diagnostic_8 [label="Error"]
 	diagnostics -> diagnostic_9 [label="Error"]
 	diagnostics -> diagnostic_10 [label="Error"]
@@ -24,5 +25,4 @@ strict digraph "tests/contract_testcases/solana/event.sol" {
 	diagnostics -> diagnostic_13 [label="Error"]
 	diagnostics -> diagnostic_14 [label="Error"]
 	diagnostics -> diagnostic_15 [label="Error"]
-	diagnostics -> diagnostic_16 [label="Error"]
 }

+ 20 - 20
tests/contract_testcases/solana/expressions/bytes32_0.dot

@@ -7,17 +7,17 @@ strict digraph "tests/contract_testcases/solana/expressions/bytes32_0.sol" {
 	variable [label="variable: r\nbytes32\ntests/contract_testcases/solana/expressions/bytes32_0.sol:4:17-18"]
 	number_literal [label="bytes32 literal: 0\ntests/contract_testcases/solana/expressions/bytes32_0.sol:4:21-31"]
 	b4 [label="function b4\ncontract: x\ntests/contract_testcases/solana/expressions/bytes32_0.sol:7:13-57\nsignature b4()\nvisibility public\nmutability pure"]
-	returns_10 [label="returns\nbytes4 r"]
-	expr_11 [label="expression\ntests/contract_testcases/solana/expressions/bytes32_0.sol:8:17-39"]
-	assign_12 [label="assign\nbytes4\ntests/contract_testcases/solana/expressions/bytes32_0.sol:8:17-39"]
-	variable_13 [label="variable: r\nbytes4\ntests/contract_testcases/solana/expressions/bytes32_0.sol:8:17-18"]
-	number_literal_14 [label="bytes4 literal: 3405700781\ntests/contract_testcases/solana/expressions/bytes32_0.sol:8:21-39"]
+	returns_9 [label="returns\nbytes4 r"]
+	expr_10 [label="expression\ntests/contract_testcases/solana/expressions/bytes32_0.sol:8:17-39"]
+	assign_11 [label="assign\nbytes4\ntests/contract_testcases/solana/expressions/bytes32_0.sol:8:17-39"]
+	variable_12 [label="variable: r\nbytes4\ntests/contract_testcases/solana/expressions/bytes32_0.sol:8:17-18"]
+	number_literal_13 [label="bytes4 literal: 3405700781\ntests/contract_testcases/solana/expressions/bytes32_0.sol:8:21-39"]
 	b3 [label="function b3\ncontract: x\ntests/contract_testcases/solana/expressions/bytes32_0.sol:11:13-57\nsignature b3()\nvisibility public\nmutability pure"]
-	returns_16 [label="returns\nbytes3 r"]
-	expr_17 [label="expression\ntests/contract_testcases/solana/expressions/bytes32_0.sol:12:17-37"]
-	assign_18 [label="assign\nbytes3\ntests/contract_testcases/solana/expressions/bytes32_0.sol:12:17-37"]
-	variable_19 [label="variable: r\nbytes3\ntests/contract_testcases/solana/expressions/bytes32_0.sol:12:17-18"]
-	number_literal_20 [label="bytes3 literal: 74291\ntests/contract_testcases/solana/expressions/bytes32_0.sol:12:21-37"]
+	returns_15 [label="returns\nbytes3 r"]
+	expr_16 [label="expression\ntests/contract_testcases/solana/expressions/bytes32_0.sol:12:17-37"]
+	assign_17 [label="assign\nbytes3\ntests/contract_testcases/solana/expressions/bytes32_0.sol:12:17-37"]
+	variable_18 [label="variable: r\nbytes3\ntests/contract_testcases/solana/expressions/bytes32_0.sol:12:17-18"]
+	number_literal_19 [label="bytes3 literal: 74291\ntests/contract_testcases/solana/expressions/bytes32_0.sol:12:21-37"]
 	diagnostic [label="found contract 'x'\nlevel Debug\ntests/contract_testcases/solana/expressions/bytes32_0.sol:2:9-14:10"]
 	contracts -> contract
 	contract -> b32 [label="function"]
@@ -27,16 +27,16 @@ strict digraph "tests/contract_testcases/solana/expressions/bytes32_0.sol" {
 	assign -> variable [label="left"]
 	assign -> number_literal [label="right"]
 	contract -> b4 [label="function"]
-	b4 -> returns_10 [label="returns"]
-	b4 -> expr_11 [label="body"]
-	expr_11 -> assign_12 [label="expr"]
-	assign_12 -> variable_13 [label="left"]
-	assign_12 -> number_literal_14 [label="right"]
+	b4 -> returns_9 [label="returns"]
+	b4 -> expr_10 [label="body"]
+	expr_10 -> assign_11 [label="expr"]
+	assign_11 -> variable_12 [label="left"]
+	assign_11 -> number_literal_13 [label="right"]
 	contract -> b3 [label="function"]
-	b3 -> returns_16 [label="returns"]
-	b3 -> expr_17 [label="body"]
-	expr_17 -> assign_18 [label="expr"]
-	assign_18 -> variable_19 [label="left"]
-	assign_18 -> number_literal_20 [label="right"]
+	b3 -> returns_15 [label="returns"]
+	b3 -> expr_16 [label="body"]
+	expr_16 -> assign_17 [label="expr"]
+	assign_17 -> variable_18 [label="left"]
+	assign_17 -> number_literal_19 [label="right"]
 	diagnostics -> diagnostic [label="Debug"]
 }

+ 2 - 2
tests/contract_testcases/solana/expressions/bytes32_0_01.dot

@@ -3,10 +3,10 @@ strict digraph "tests/contract_testcases/solana/expressions/bytes32_0_01.sol" {
 	b32 [label="function b32\ncontract: foo\ntests/contract_testcases/solana/expressions/bytes32_0_01.sol:3:13-59\nsignature b32()\nvisibility public\nmutability pure"]
 	returns [label="returns\nbytes32 r"]
 	diagnostic [label="found contract 'foo'\nlevel Debug\ntests/contract_testcases/solana/expressions/bytes32_0_01.sol:2:9-6:10"]
-	diagnostic_7 [label="number of 2 bytes cannot be converted to type 'bytes32'\nlevel Error\ntests/contract_testcases/solana/expressions/bytes32_0_01.sol:4:21-36"]
+	diagnostic_6 [label="number of 2 bytes cannot be converted to type 'bytes32'\nlevel Error\ntests/contract_testcases/solana/expressions/bytes32_0_01.sol:4:21-36"]
 	contracts -> contract
 	contract -> b32 [label="function"]
 	b32 -> returns [label="returns"]
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_7 [label="Error"]
+	diagnostics -> diagnostic_6 [label="Error"]
 }

+ 52 - 52
tests/contract_testcases/solana/expressions/bytes32_0_02.dot

@@ -2,81 +2,81 @@ strict digraph "tests/contract_testcases/solana/expressions/bytes32_0_02.sol" {
 	contract [label="contract foo\ntests/contract_testcases/solana/expressions/bytes32_0_02.sol:2:9-14:10"]
 	var [label="variable x\nvisibility public\ntests/contract_testcases/solana/expressions/bytes32_0_02.sol:3:13-36"]
 	number_literal [label="bytes32 literal: 0\ntests/contract_testcases/solana/expressions/bytes32_0_02.sol:3:32-36"]
-	var_5 [label="variable y\nvisibility public\ntests/contract_testcases/solana/expressions/bytes32_0_02.sol:4:13-42"]
-	number_literal_6 [label="bytes32 literal: 0\ntests/contract_testcases/solana/expressions/bytes32_0_02.sol:4:32-42"]
-	var_7 [label="variable z1\nvisibility public\ntests/contract_testcases/solana/expressions/bytes32_0_02.sol:5:13-42"]
-	number_literal_8 [label="bytes3 literal: 1048576\ntests/contract_testcases/solana/expressions/bytes32_0_02.sol:5:32-42"]
-	var_9 [label="variable z2\nvisibility public\ntests/contract_testcases/solana/expressions/bytes32_0_02.sol:7:13-42"]
-	number_literal_10 [label="bytes3 literal: 0\ntests/contract_testcases/solana/expressions/bytes32_0_02.sol:7:32-42"]
-	var_11 [label="variable z3\nvisibility public\ntests/contract_testcases/solana/expressions/bytes32_0_02.sol:9:13-45"]
-	number_literal_12 [label="bytes3 literal: 0\ntests/contract_testcases/solana/expressions/bytes32_0_02.sol:9:32-45"]
+	var_4 [label="variable y\nvisibility public\ntests/contract_testcases/solana/expressions/bytes32_0_02.sol:4:13-42"]
+	number_literal_5 [label="bytes32 literal: 0\ntests/contract_testcases/solana/expressions/bytes32_0_02.sol:4:32-42"]
+	var_6 [label="variable z1\nvisibility public\ntests/contract_testcases/solana/expressions/bytes32_0_02.sol:5:13-42"]
+	number_literal_7 [label="bytes3 literal: 1048576\ntests/contract_testcases/solana/expressions/bytes32_0_02.sol:5:32-42"]
+	var_8 [label="variable z2\nvisibility public\ntests/contract_testcases/solana/expressions/bytes32_0_02.sol:7:13-42"]
+	number_literal_9 [label="bytes3 literal: 0\ntests/contract_testcases/solana/expressions/bytes32_0_02.sol:7:32-42"]
+	var_10 [label="variable z3\nvisibility public\ntests/contract_testcases/solana/expressions/bytes32_0_02.sol:9:13-45"]
+	number_literal_11 [label="bytes3 literal: 0\ntests/contract_testcases/solana/expressions/bytes32_0_02.sol:9:32-45"]
 	x [label="function x\ncontract: foo\ntests/contract_testcases/solana/expressions/bytes32_0_02.sol:3:28-29\nsignature x()\nvisibility public\nmutability view"]
 	returns [label="returns\nbytes32 "]
 	return [label="return\nimplicit"]
 	storage_load [label="storage load bytes32\nimplicit"]
 	storage_var [label="storage variable\nfoo.x\nbytes32 storage\nimplicit"]
 	y [label="function y\ncontract: foo\ntests/contract_testcases/solana/expressions/bytes32_0_02.sol:4:28-29\nsignature y()\nvisibility public\nmutability view"]
-	returns_19 [label="returns\nbytes32 "]
-	return_20 [label="return\nimplicit"]
-	storage_load_21 [label="storage load bytes32\nimplicit"]
-	storage_var_22 [label="storage variable\nfoo.y\nbytes32 storage\nimplicit"]
+	returns_18 [label="returns\nbytes32 "]
+	return_19 [label="return\nimplicit"]
+	storage_load_20 [label="storage load bytes32\nimplicit"]
+	storage_var_21 [label="storage variable\nfoo.y\nbytes32 storage\nimplicit"]
 	z1 [label="function z1\ncontract: foo\ntests/contract_testcases/solana/expressions/bytes32_0_02.sol:5:27-29\nsignature z1()\nvisibility public\nmutability view"]
-	returns_24 [label="returns\nbytes3 "]
-	return_25 [label="return\nimplicit"]
-	storage_load_26 [label="storage load bytes3\nimplicit"]
-	storage_var_27 [label="storage variable\nfoo.z1\nbytes3 storage\nimplicit"]
+	returns_23 [label="returns\nbytes3 "]
+	return_24 [label="return\nimplicit"]
+	storage_load_25 [label="storage load bytes3\nimplicit"]
+	storage_var_26 [label="storage variable\nfoo.z1\nbytes3 storage\nimplicit"]
 	z2 [label="function z2\ncontract: foo\ntests/contract_testcases/solana/expressions/bytes32_0_02.sol:7:27-29\nsignature z2()\nvisibility public\nmutability view"]
-	returns_29 [label="returns\nbytes3 "]
-	return_30 [label="return\nimplicit"]
-	storage_load_31 [label="storage load bytes3\nimplicit"]
-	storage_var_32 [label="storage variable\nfoo.z2\nbytes3 storage\nimplicit"]
+	returns_28 [label="returns\nbytes3 "]
+	return_29 [label="return\nimplicit"]
+	storage_load_30 [label="storage load bytes3\nimplicit"]
+	storage_var_31 [label="storage variable\nfoo.z2\nbytes3 storage\nimplicit"]
 	z3 [label="function z3\ncontract: foo\ntests/contract_testcases/solana/expressions/bytes32_0_02.sol:9:27-29\nsignature z3()\nvisibility public\nmutability view"]
-	returns_34 [label="returns\nbytes3 "]
-	return_35 [label="return\nimplicit"]
-	storage_load_36 [label="storage load bytes3\nimplicit"]
-	storage_var_37 [label="storage variable\nfoo.z3\nbytes3 storage\nimplicit"]
+	returns_33 [label="returns\nbytes3 "]
+	return_34 [label="return\nimplicit"]
+	storage_load_35 [label="storage load bytes3\nimplicit"]
+	storage_var_36 [label="storage variable\nfoo.z3\nbytes3 storage\nimplicit"]
 	b32 [label="function b32\ncontract: foo\ntests/contract_testcases/solana/expressions/bytes32_0_02.sol:11:13-59\nsignature b32()\nvisibility public\nmutability pure"]
-	returns_39 [label="returns\nbytes32 r"]
+	returns_38 [label="returns\nbytes32 r"]
 	diagnostic [label="found contract 'foo'\nlevel Debug\ntests/contract_testcases/solana/expressions/bytes32_0_02.sol:2:9-14:10"]
-	diagnostic_42 [label="negative number cannot be converted to type 'bytes32'\nlevel Error\ntests/contract_testcases/solana/expressions/bytes32_0_02.sol:12:21-32"]
+	diagnostic_41 [label="negative number cannot be converted to type 'bytes32'\nlevel Error\ntests/contract_testcases/solana/expressions/bytes32_0_02.sol:12:21-32"]
 	contracts -> contract
 	contract -> var [label="variable"]
 	var -> number_literal [label="initializer"]
-	contract -> var_5 [label="variable"]
-	var_5 -> number_literal_6 [label="initializer"]
-	contract -> var_7 [label="variable"]
-	var_7 -> number_literal_8 [label="initializer"]
-	contract -> var_9 [label="variable"]
-	var_9 -> number_literal_10 [label="initializer"]
-	contract -> var_11 [label="variable"]
-	var_11 -> number_literal_12 [label="initializer"]
+	contract -> var_4 [label="variable"]
+	var_4 -> number_literal_5 [label="initializer"]
+	contract -> var_6 [label="variable"]
+	var_6 -> number_literal_7 [label="initializer"]
+	contract -> var_8 [label="variable"]
+	var_8 -> number_literal_9 [label="initializer"]
+	contract -> var_10 [label="variable"]
+	var_10 -> number_literal_11 [label="initializer"]
 	contract -> x [label="function"]
 	x -> returns [label="returns"]
 	x -> return [label="body"]
 	return -> storage_load [label="expr"]
 	storage_load -> storage_var [label="expr"]
 	contract -> y [label="function"]
-	y -> returns_19 [label="returns"]
-	y -> return_20 [label="body"]
-	return_20 -> storage_load_21 [label="expr"]
-	storage_load_21 -> storage_var_22 [label="expr"]
+	y -> returns_18 [label="returns"]
+	y -> return_19 [label="body"]
+	return_19 -> storage_load_20 [label="expr"]
+	storage_load_20 -> storage_var_21 [label="expr"]
 	contract -> z1 [label="function"]
-	z1 -> returns_24 [label="returns"]
-	z1 -> return_25 [label="body"]
-	return_25 -> storage_load_26 [label="expr"]
-	storage_load_26 -> storage_var_27 [label="expr"]
+	z1 -> returns_23 [label="returns"]
+	z1 -> return_24 [label="body"]
+	return_24 -> storage_load_25 [label="expr"]
+	storage_load_25 -> storage_var_26 [label="expr"]
 	contract -> z2 [label="function"]
-	z2 -> returns_29 [label="returns"]
-	z2 -> return_30 [label="body"]
-	return_30 -> storage_load_31 [label="expr"]
-	storage_load_31 -> storage_var_32 [label="expr"]
+	z2 -> returns_28 [label="returns"]
+	z2 -> return_29 [label="body"]
+	return_29 -> storage_load_30 [label="expr"]
+	storage_load_30 -> storage_var_31 [label="expr"]
 	contract -> z3 [label="function"]
-	z3 -> returns_34 [label="returns"]
-	z3 -> return_35 [label="body"]
-	return_35 -> storage_load_36 [label="expr"]
-	storage_load_36 -> storage_var_37 [label="expr"]
+	z3 -> returns_33 [label="returns"]
+	z3 -> return_34 [label="body"]
+	return_34 -> storage_load_35 [label="expr"]
+	storage_load_35 -> storage_var_36 [label="expr"]
 	contract -> b32 [label="function"]
-	b32 -> returns_39 [label="returns"]
+	b32 -> returns_38 [label="returns"]
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_42 [label="Error"]
+	diagnostics -> diagnostic_41 [label="Error"]
 }

+ 5 - 5
tests/contract_testcases/solana/expressions/const_in_type.dot

@@ -6,10 +6,10 @@ strict digraph "tests/contract_testcases/solana/expressions/const_in_type.sol" {
 	returns [label="returns\nuint256 "]
 	return [label="return\nimplicit"]
 	constant [label="constant variable\nx.Y\nuint256\nimplicit"]
-	node_9 [label="constructor \ncontract: x\ntests/contract_testcases/solana/expressions/const_in_type.sol:5:13-48\nsignature (bytes32[24])\nvisibility public\nmutability nonpayable"]
+	node_8 [label="constructor \ncontract: x\ntests/contract_testcases/solana/expressions/const_in_type.sol:5:13-48\nsignature (bytes32[24])\nvisibility public\nmutability nonpayable"]
 	parameters [label="parameters\nbytes32[24] foo"]
 	diagnostic [label="found contract 'x'\nlevel Debug\ntests/contract_testcases/solana/expressions/const_in_type.sol:2:9-6:10"]
-	diagnostic_13 [label="function parameter 'foo' has never been read\nlevel Warning\ntests/contract_testcases/solana/expressions/const_in_type.sol:5:43-46"]
+	diagnostic_12 [label="function parameter 'foo' has never been read\nlevel Warning\ntests/contract_testcases/solana/expressions/const_in_type.sol:5:43-46"]
 	contracts -> contract
 	contract -> var [label="variable"]
 	var -> number_literal [label="initializer"]
@@ -17,8 +17,8 @@ strict digraph "tests/contract_testcases/solana/expressions/const_in_type.sol" {
 	Y -> returns [label="returns"]
 	Y -> return [label="body"]
 	return -> constant [label="expr"]
-	contract -> node_9 [label="constructor"]
-	node_9 -> parameters [label="parameters"]
+	contract -> node_8 [label="constructor"]
+	node_8 -> parameters [label="parameters"]
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_13 [label="Warning"]
+	diagnostics -> diagnostic_12 [label="Warning"]
 }

+ 19 - 19
tests/contract_testcases/solana/expressions/contract_compare.dot

@@ -6,18 +6,18 @@ strict digraph "tests/contract_testcases/solana/expressions/contract_compare.sol
 	return [label="return\ntests/contract_testcases/solana/expressions/contract_compare.sol:4:3-22"]
 	less [label="less\ntests/contract_testcases/solana/expressions/contract_compare.sol:4:10-22"]
 	variable [label="variable: left\ncontract d\ntests/contract_testcases/solana/expressions/contract_compare.sol:4:10-14"]
-	variable_9 [label="variable: right\ncontract d\ntests/contract_testcases/solana/expressions/contract_compare.sol:4:17-22"]
-	cmp_10 [label="function cmp\ncontract: c\ntests/contract_testcases/solana/expressions/contract_compare.sol:7:2-53\nsignature cmp(bytes32,bytes32)\nvisibility public\nmutability nonpayable"]
-	parameters_11 [label="parameters\ncontract d left\ncontract e right"]
-	returns_12 [label="returns\nbool "]
-	contract_13 [label="contract d\ntests/contract_testcases/solana/expressions/contract_compare.sol:12:1-13:14"]
-	contract_14 [label="contract e\ntests/contract_testcases/solana/expressions/contract_compare.sol:13:14-14:14"]
+	variable_8 [label="variable: right\ncontract d\ntests/contract_testcases/solana/expressions/contract_compare.sol:4:17-22"]
+	cmp_9 [label="function cmp\ncontract: c\ntests/contract_testcases/solana/expressions/contract_compare.sol:7:2-53\nsignature cmp(bytes32,bytes32)\nvisibility public\nmutability nonpayable"]
+	parameters_10 [label="parameters\ncontract d left\ncontract e right"]
+	returns_11 [label="returns\nbool "]
+	contract_12 [label="contract d\ntests/contract_testcases/solana/expressions/contract_compare.sol:12:1-13:14"]
+	contract_13 [label="contract e\ntests/contract_testcases/solana/expressions/contract_compare.sol:13:14-14:14"]
 	diagnostic [label="found contract 'c'\nlevel Debug\ntests/contract_testcases/solana/expressions/contract_compare.sol:1:1-11:2"]
-	diagnostic_17 [label="function 'cmp' overrides function in same contract\nlevel Error\ntests/contract_testcases/solana/expressions/contract_compare.sol:7:2-53"]
+	diagnostic_16 [label="function 'cmp' overrides function in same contract\nlevel Error\ntests/contract_testcases/solana/expressions/contract_compare.sol:7:2-53"]
 	note [label="previous definition of 'cmp'\ntests/contract_testcases/solana/expressions/contract_compare.sol:3:2-53"]
-	diagnostic_19 [label="expression of type contract d not allowed\nlevel Error\ntests/contract_testcases/solana/expressions/contract_compare.sol:8:10-14"]
-	diagnostic_20 [label="found contract 'd'\nlevel Debug\ntests/contract_testcases/solana/expressions/contract_compare.sol:12:1-13:14"]
-	diagnostic_21 [label="found contract 'e'\nlevel Debug\ntests/contract_testcases/solana/expressions/contract_compare.sol:13:14-14:14"]
+	diagnostic_18 [label="expression of type contract d not allowed\nlevel Error\ntests/contract_testcases/solana/expressions/contract_compare.sol:8:10-14"]
+	diagnostic_19 [label="found contract 'd'\nlevel Debug\ntests/contract_testcases/solana/expressions/contract_compare.sol:12:1-13:14"]
+	diagnostic_20 [label="found contract 'e'\nlevel Debug\ntests/contract_testcases/solana/expressions/contract_compare.sol:13:14-14:14"]
 	contracts -> contract
 	contract -> cmp [label="function"]
 	cmp -> parameters [label="parameters"]
@@ -25,16 +25,16 @@ strict digraph "tests/contract_testcases/solana/expressions/contract_compare.sol
 	cmp -> return [label="body"]
 	return -> less [label="expr"]
 	less -> variable [label="left"]
-	less -> variable_9 [label="right"]
-	contract -> cmp_10 [label="function"]
-	cmp_10 -> parameters_11 [label="parameters"]
-	cmp_10 -> returns_12 [label="returns"]
+	less -> variable_8 [label="right"]
+	contract -> cmp_9 [label="function"]
+	cmp_9 -> parameters_10 [label="parameters"]
+	cmp_9 -> returns_11 [label="returns"]
+	contracts -> contract_12
 	contracts -> contract_13
-	contracts -> contract_14
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_17 [label="Error"]
-	diagnostic_17 -> note [label="note"]
-	diagnostics -> diagnostic_19 [label="Error"]
+	diagnostics -> diagnostic_16 [label="Error"]
+	diagnostic_16 -> note [label="note"]
+	diagnostics -> diagnostic_18 [label="Error"]
+	diagnostics -> diagnostic_19 [label="Debug"]
 	diagnostics -> diagnostic_20 [label="Debug"]
-	diagnostics -> diagnostic_21 [label="Debug"]
 }

+ 19 - 19
tests/contract_testcases/solana/expressions/contract_no_init.dot

@@ -6,28 +6,28 @@ strict digraph "tests/contract_testcases/solana/expressions/contract_no_init.sol
 	return [label="return\nimplicit"]
 	storage_load [label="storage load int256\nimplicit"]
 	storage_var [label="storage variable\nother.a\nint256 storage\nimplicit"]
-	contract_9 [label="contract testing\ntests/contract_testcases/solana/expressions/contract_no_init.sol:6:9-16:10"]
+	contract_8 [label="contract testing\ntests/contract_testcases/solana/expressions/contract_no_init.sol:6:9-16:10"]
 	test [label="function test\ncontract: testing\ntests/contract_testcases/solana/expressions/contract_no_init.sol:7:13-54\nsignature test(int256)\nvisibility public\nmutability nonpayable"]
 	parameters [label="parameters\nint256 x"]
-	returns_12 [label="returns\nint256 "]
+	returns_11 [label="returns\nint256 "]
 	var_decl [label="variable decl contract other o\ntests/contract_testcases/solana/expressions/contract_no_init.sol:8:17-24"]
 	dowhile [label="do while\ntests/contract_testcases/solana/expressions/contract_no_init.sol:9:17-12:30"]
 	expr [label="expression\ntests/contract_testcases/solana/expressions/contract_no_init.sol:10:21-24"]
 	post_decrement [label="post decrement\nint256\ntests/contract_testcases/solana/expressions/contract_no_init.sol:10:21-24"]
 	variable [label="variable: x\nint256\ntests/contract_testcases/solana/expressions/contract_no_init.sol:10:21-22"]
-	expr_18 [label="expression\ntests/contract_testcases/solana/expressions/contract_no_init.sol:11:21-36"]
+	expr_17 [label="expression\ntests/contract_testcases/solana/expressions/contract_no_init.sol:11:21-36"]
 	assign [label="assign\ncontract other\ntests/contract_testcases/solana/expressions/contract_no_init.sol:11:21-36"]
-	variable_20 [label="variable: o\ncontract other\ntests/contract_testcases/solana/expressions/contract_no_init.sol:11:21-22"]
+	variable_19 [label="variable: o\ncontract other\ntests/contract_testcases/solana/expressions/contract_no_init.sol:11:21-22"]
 	constructor [label="constructor contract other\ntests/contract_testcases/solana/expressions/contract_no_init.sol:11:25-36"]
 	more [label="more\ntests/contract_testcases/solana/expressions/contract_no_init.sol:12:24-29"]
-	variable_23 [label="variable: x\nint256\ntests/contract_testcases/solana/expressions/contract_no_init.sol:12:24-25"]
+	variable_22 [label="variable: x\nint256\ntests/contract_testcases/solana/expressions/contract_no_init.sol:12:24-25"]
 	number_literal [label="int256 literal: 0\ntests/contract_testcases/solana/expressions/contract_no_init.sol:12:28-29"]
-	return_25 [label="return\ntests/contract_testcases/solana/expressions/contract_no_init.sol:14:17-29"]
+	return_24 [label="return\ntests/contract_testcases/solana/expressions/contract_no_init.sol:14:17-29"]
 	call_external_function [label="call external function\ntests/contract_testcases/solana/expressions/contract_no_init.sol:14:24-29"]
 	external_function [label="function() external view returns (int256)\nother.a\ntests/contract_testcases/solana/expressions/contract_no_init.sol:14:24-29"]
-	variable_28 [label="variable: o\ncontract other\ntests/contract_testcases/solana/expressions/contract_no_init.sol:14:24-25"]
+	variable_27 [label="variable: o\ncontract other\ntests/contract_testcases/solana/expressions/contract_no_init.sol:14:24-25"]
 	diagnostic [label="found contract 'other'\nlevel Debug\ntests/contract_testcases/solana/expressions/contract_no_init.sol:2:9-4:10"]
-	diagnostic_31 [label="found contract 'testing'\nlevel Debug\ntests/contract_testcases/solana/expressions/contract_no_init.sol:6:9-16:10"]
+	diagnostic_30 [label="found contract 'testing'\nlevel Debug\ntests/contract_testcases/solana/expressions/contract_no_init.sol:6:9-16:10"]
 	contracts -> contract
 	contract -> var [label="variable"]
 	contract -> a [label="function"]
@@ -35,26 +35,26 @@ strict digraph "tests/contract_testcases/solana/expressions/contract_no_init.sol
 	a -> return [label="body"]
 	return -> storage_load [label="expr"]
 	storage_load -> storage_var [label="expr"]
-	contracts -> contract_9
-	contract_9 -> test [label="function"]
+	contracts -> contract_8
+	contract_8 -> test [label="function"]
 	test -> parameters [label="parameters"]
-	test -> returns_12 [label="returns"]
+	test -> returns_11 [label="returns"]
 	test -> var_decl [label="body"]
 	var_decl -> dowhile [label="next"]
 	dowhile -> expr [label="body"]
 	expr -> post_decrement [label="expr"]
 	post_decrement -> variable [label="expr"]
-	expr -> expr_18 [label="next"]
-	expr_18 -> assign [label="expr"]
-	assign -> variable_20 [label="left"]
+	expr -> expr_17 [label="next"]
+	expr_17 -> assign [label="expr"]
+	assign -> variable_19 [label="left"]
 	assign -> constructor [label="right"]
 	dowhile -> more [label="cond"]
-	more -> variable_23 [label="left"]
+	more -> variable_22 [label="left"]
 	more -> number_literal [label="right"]
-	dowhile -> return_25 [label="next"]
-	return_25 -> call_external_function [label="expr"]
+	dowhile -> return_24 [label="next"]
+	return_24 -> call_external_function [label="expr"]
 	call_external_function -> external_function [label="function"]
-	external_function -> variable_28 [label="address"]
+	external_function -> variable_27 [label="address"]
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_31 [label="Debug"]
+	diagnostics -> diagnostic_30 [label="Debug"]
 }

+ 2 - 2
tests/contract_testcases/solana/expressions/interfaceid.dot

@@ -3,10 +3,10 @@ strict digraph "tests/contract_testcases/solana/expressions/interfaceid.sol" {
 	get [label="function get\ncontract: foo\ntests/contract_testcases/solana/expressions/interfaceid.sol:3:13-51\nsignature get()\nvisibility public\nmutability nonpayable"]
 	returns [label="returns\nbytes4 "]
 	diagnostic [label="found contract 'foo'\nlevel Debug\ntests/contract_testcases/solana/expressions/interfaceid.sol:2:9-6:10"]
-	diagnostic_7 [label="type(…).interfaceId is permitted on interface, not contract foo\nlevel Error\ntests/contract_testcases/solana/expressions/interfaceid.sol:4:24-45"]
+	diagnostic_6 [label="type(…).interfaceId is permitted on interface, not contract foo\nlevel Error\ntests/contract_testcases/solana/expressions/interfaceid.sol:4:24-45"]
 	contracts -> contract
 	contract -> get [label="function"]
 	get -> returns [label="returns"]
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_7 [label="Error"]
+	diagnostics -> diagnostic_6 [label="Error"]
 }

+ 2 - 2
tests/contract_testcases/solana/expressions/pushpop.dot

@@ -2,9 +2,9 @@ strict digraph "tests/contract_testcases/solana/expressions/pushpop.sol" {
 	contract [label="contract foo\ntests/contract_testcases/solana/expressions/pushpop.sol:2:9-8:10"]
 	test [label="function test\ncontract: foo\ntests/contract_testcases/solana/expressions/pushpop.sol:3:13-35\nsignature test()\nvisibility public\nmutability nonpayable"]
 	diagnostic [label="found contract 'foo'\nlevel Debug\ntests/contract_testcases/solana/expressions/pushpop.sol:2:9-8:10"]
-	diagnostic_6 [label="'push()' not supported on 'bytes' on target solana\nlevel Error\ntests/contract_testcases/solana/expressions/pushpop.sol:6:19-23"]
+	diagnostic_5 [label="'push()' not supported on 'bytes' on target solana\nlevel Error\ntests/contract_testcases/solana/expressions/pushpop.sol:6:19-23"]
 	contracts -> contract
 	contract -> test [label="function"]
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_6 [label="Error"]
+	diagnostics -> diagnostic_5 [label="Error"]
 }

+ 2 - 2
tests/contract_testcases/solana/expressions/pushpop_01.dot

@@ -2,9 +2,9 @@ strict digraph "tests/contract_testcases/solana/expressions/pushpop_01.sol" {
 	contract [label="contract foo\ntests/contract_testcases/solana/expressions/pushpop_01.sol:2:9-8:10"]
 	test [label="function test\ncontract: foo\ntests/contract_testcases/solana/expressions/pushpop_01.sol:3:13-35\nsignature test()\nvisibility public\nmutability nonpayable"]
 	diagnostic [label="found contract 'foo'\nlevel Debug\ntests/contract_testcases/solana/expressions/pushpop_01.sol:2:9-8:10"]
-	diagnostic_6 [label="'pop()' not supported on 'bytes' on target solana\nlevel Error\ntests/contract_testcases/solana/expressions/pushpop_01.sol:6:19-22"]
+	diagnostic_5 [label="'pop()' not supported on 'bytes' on target solana\nlevel Error\ntests/contract_testcases/solana/expressions/pushpop_01.sol:6:19-22"]
 	contracts -> contract
 	contract -> test [label="function"]
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_6 [label="Error"]
+	diagnostics -> diagnostic_5 [label="Error"]
 }

+ 6 - 6
tests/contract_testcases/solana/expressions/selector_in_free_function.dot

@@ -7,10 +7,10 @@ strict digraph "tests/contract_testcases/solana/expressions/selector_in_free_fun
 	contract [label="contract I\ntests/contract_testcases/solana/expressions/selector_in_free_function.sol:2:9-4:10"]
 	X [label="function X\ncontract: I\ntests/contract_testcases/solana/expressions/selector_in_free_function.sol:3:13-39\nsignature X(bytes)\nvisibility external\nmutability nonpayable\nvirtual"]
 	parameters [label="parameters\nbytes "]
-	contract_11 [label="contract foo\ntests/contract_testcases/solana/expressions/selector_in_free_function.sol:10:9-24"]
+	contract_10 [label="contract foo\ntests/contract_testcases/solana/expressions/selector_in_free_function.sol:10:9-24"]
 	diagnostic [label="found interface 'I'\nlevel Debug\ntests/contract_testcases/solana/expressions/selector_in_free_function.sol:2:9-4:10"]
-	diagnostic_14 [label="function can be declared 'pure'\nlevel Warning\ntests/contract_testcases/solana/expressions/selector_in_free_function.sol:6:9-38"]
-	diagnostic_15 [label="found contract 'foo'\nlevel Debug\ntests/contract_testcases/solana/expressions/selector_in_free_function.sol:10:9-24"]
+	diagnostic_13 [label="function can be declared 'pure'\nlevel Warning\ntests/contract_testcases/solana/expressions/selector_in_free_function.sol:6:9-38"]
+	diagnostic_14 [label="found contract 'foo'\nlevel Debug\ntests/contract_testcases/solana/expressions/selector_in_free_function.sol:10:9-24"]
 	free_functions -> x [label="function"]
 	x -> returns [label="returns"]
 	x -> return [label="body"]
@@ -19,8 +19,8 @@ strict digraph "tests/contract_testcases/solana/expressions/selector_in_free_fun
 	contracts -> contract
 	contract -> X [label="function"]
 	X -> parameters [label="parameters"]
-	contracts -> contract_11
+	contracts -> contract_10
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_14 [label="Warning"]
-	diagnostics -> diagnostic_15 [label="Debug"]
+	diagnostics -> diagnostic_13 [label="Warning"]
+	diagnostics -> diagnostic_14 [label="Debug"]
 }

+ 10 - 10
tests/contract_testcases/solana/expressions/selector_in_free_function_01.dot

@@ -2,29 +2,29 @@ strict digraph "tests/contract_testcases/solana/expressions/selector_in_free_fun
 	contract [label="contract I\ntests/contract_testcases/solana/expressions/selector_in_free_function_01.sol:2:9-4:10"]
 	X [label="function X\ncontract: I\ntests/contract_testcases/solana/expressions/selector_in_free_function_01.sol:3:13-39\nsignature X(bytes)\nvisibility external\nmutability nonpayable\nvirtual"]
 	parameters [label="parameters\nbytes "]
-	contract_5 [label="contract X\ntests/contract_testcases/solana/expressions/selector_in_free_function_01.sol:6:9-10:10"]
+	contract_4 [label="contract X\ntests/contract_testcases/solana/expressions/selector_in_free_function_01.sol:6:9-10:10"]
 	x [label="function x\ncontract: X\ntests/contract_testcases/solana/expressions/selector_in_free_function_01.sol:7:13-49\nsignature x()\nvisibility public\nmutability nonpayable"]
 	returns [label="returns\nbytes4 "]
 	return [label="return\ntests/contract_testcases/solana/expressions/selector_in_free_function_01.sol:8:17-36"]
 	builtins [label="builtin FunctionSelector\ntests/contract_testcases/solana/expressions/selector_in_free_function_01.sol:8:24-27"]
 	internal_function [label="function(bytes) internal returns (void)\nI.X\ntests/contract_testcases/solana/expressions/selector_in_free_function_01.sol:8:24-25"]
 	diagnostic [label="found interface 'I'\nlevel Debug\ntests/contract_testcases/solana/expressions/selector_in_free_function_01.sol:2:9-4:10"]
-	diagnostic_13 [label="X is already defined as a contract name\nlevel Warning\ntests/contract_testcases/solana/expressions/selector_in_free_function_01.sol:3:22-23"]
+	diagnostic_12 [label="X is already defined as a contract name\nlevel Warning\ntests/contract_testcases/solana/expressions/selector_in_free_function_01.sol:3:22-23"]
 	note [label="location of previous definition\ntests/contract_testcases/solana/expressions/selector_in_free_function_01.sol:6:9-10:10"]
-	diagnostic_15 [label="found contract 'X'\nlevel Debug\ntests/contract_testcases/solana/expressions/selector_in_free_function_01.sol:6:9-10:10"]
-	diagnostic_16 [label="function can be declared 'pure'\nlevel Warning\ntests/contract_testcases/solana/expressions/selector_in_free_function_01.sol:7:13-49"]
+	diagnostic_14 [label="found contract 'X'\nlevel Debug\ntests/contract_testcases/solana/expressions/selector_in_free_function_01.sol:6:9-10:10"]
+	diagnostic_15 [label="function can be declared 'pure'\nlevel Warning\ntests/contract_testcases/solana/expressions/selector_in_free_function_01.sol:7:13-49"]
 	contracts -> contract
 	contract -> X [label="function"]
 	X -> parameters [label="parameters"]
-	contracts -> contract_5
-	contract_5 -> x [label="function"]
+	contracts -> contract_4
+	contract_4 -> x [label="function"]
 	x -> returns [label="returns"]
 	x -> return [label="body"]
 	return -> builtins [label="expr"]
 	builtins -> internal_function [label="arg #0"]
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_13 [label="Warning"]
-	diagnostic_13 -> note [label="note"]
-	diagnostics -> diagnostic_15 [label="Debug"]
-	diagnostics -> diagnostic_16 [label="Warning"]
+	diagnostics -> diagnostic_12 [label="Warning"]
+	diagnostic_12 -> note [label="note"]
+	diagnostics -> diagnostic_14 [label="Debug"]
+	diagnostics -> diagnostic_15 [label="Warning"]
 }

+ 10 - 10
tests/contract_testcases/solana/expressions/selector_in_free_function_02.dot

@@ -1,7 +1,7 @@
 strict digraph "tests/contract_testcases/solana/expressions/selector_in_free_function_02.sol" {
 	contract [label="contract I\ntests/contract_testcases/solana/expressions/selector_in_free_function_02.sol:2:9-4:10"]
 	X [label="function X\ncontract: I\ntests/contract_testcases/solana/expressions/selector_in_free_function_02.sol:3:13-34\nsignature X()\nvisibility external\nmutability nonpayable"]
-	contract_4 [label="contract foo\ntests/contract_testcases/solana/expressions/selector_in_free_function_02.sol:6:9-10:10"]
+	contract_3 [label="contract foo\ntests/contract_testcases/solana/expressions/selector_in_free_function_02.sol:6:9-10:10"]
 	f [label="function f\ncontract: foo\ntests/contract_testcases/solana/expressions/selector_in_free_function_02.sol:7:13-52\nsignature f(bytes32)\nvisibility public\nmutability nonpayable"]
 	parameters [label="parameters\ncontract I t"]
 	returns [label="returns\nbytes4 "]
@@ -10,14 +10,14 @@ strict digraph "tests/contract_testcases/solana/expressions/selector_in_free_fun
 	external_function [label="function() external\nI.X\ntests/contract_testcases/solana/expressions/selector_in_free_function_02.sol:8:26-27"]
 	variable [label="variable: t\ncontract I\ntests/contract_testcases/solana/expressions/selector_in_free_function_02.sol:8:24-25"]
 	diagnostic [label="found contract 'I'\nlevel Debug\ntests/contract_testcases/solana/expressions/selector_in_free_function_02.sol:2:9-4:10"]
-	diagnostic_14 [label="function can be declared 'pure'\nlevel Warning\ntests/contract_testcases/solana/expressions/selector_in_free_function_02.sol:3:13-34"]
-	diagnostic_15 [label="found contract 'foo'\nlevel Debug\ntests/contract_testcases/solana/expressions/selector_in_free_function_02.sol:6:9-10:10"]
-	diagnostic_16 [label="function can be declared 'pure'\nlevel Warning\ntests/contract_testcases/solana/expressions/selector_in_free_function_02.sol:7:13-52"]
-	diagnostic_17 [label="function parameter 't' has never been read\nlevel Warning\ntests/contract_testcases/solana/expressions/selector_in_free_function_02.sol:7:26-27"]
+	diagnostic_13 [label="function can be declared 'pure'\nlevel Warning\ntests/contract_testcases/solana/expressions/selector_in_free_function_02.sol:3:13-34"]
+	diagnostic_14 [label="found contract 'foo'\nlevel Debug\ntests/contract_testcases/solana/expressions/selector_in_free_function_02.sol:6:9-10:10"]
+	diagnostic_15 [label="function can be declared 'pure'\nlevel Warning\ntests/contract_testcases/solana/expressions/selector_in_free_function_02.sol:7:13-52"]
+	diagnostic_16 [label="function parameter 't' has never been read\nlevel Warning\ntests/contract_testcases/solana/expressions/selector_in_free_function_02.sol:7:26-27"]
 	contracts -> contract
 	contract -> X [label="function"]
-	contracts -> contract_4
-	contract_4 -> f [label="function"]
+	contracts -> contract_3
+	contract_3 -> f [label="function"]
 	f -> parameters [label="parameters"]
 	f -> returns [label="returns"]
 	f -> return [label="body"]
@@ -25,8 +25,8 @@ strict digraph "tests/contract_testcases/solana/expressions/selector_in_free_fun
 	builtins -> external_function [label="arg #0"]
 	external_function -> variable [label="address"]
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_14 [label="Warning"]
-	diagnostics -> diagnostic_15 [label="Debug"]
+	diagnostics -> diagnostic_13 [label="Warning"]
+	diagnostics -> diagnostic_14 [label="Debug"]
+	diagnostics -> diagnostic_15 [label="Warning"]
 	diagnostics -> diagnostic_16 [label="Warning"]
-	diagnostics -> diagnostic_17 [label="Warning"]
 }

+ 5 - 5
tests/contract_testcases/solana/expressions/slice.dot

@@ -3,14 +3,14 @@ strict digraph "tests/contract_testcases/solana/expressions/slice.sol" {
 	foo [label="function foo\ncontract: slice\ntests/contract_testcases/solana/expressions/slice.sol:3:5-35\nsignature foo(bytes)\nvisibility public\nmutability nonpayable"]
 	parameters [label="parameters\nbytes foo"]
 	diagnostic [label="found contract 'slice'\nlevel Debug\ntests/contract_testcases/solana/expressions/slice.sol:1:1-9:2"]
-	diagnostic_7 [label="declaration of 'foo' shadows function\nlevel Warning\ntests/contract_testcases/solana/expressions/slice.sol:3:24-27"]
+	diagnostic_6 [label="declaration of 'foo' shadows function\nlevel Warning\ntests/contract_testcases/solana/expressions/slice.sol:3:24-27"]
 	note [label="previous declaration of function\ntests/contract_testcases/solana/expressions/slice.sol:3:14-17"]
-	diagnostic_9 [label="slice not supported yet\nlevel Error\ntests/contract_testcases/solana/expressions/slice.sol:4:20-27"]
+	diagnostic_8 [label="slice not supported yet\nlevel Error\ntests/contract_testcases/solana/expressions/slice.sol:4:20-27"]
 	contracts -> contract
 	contract -> foo [label="function"]
 	foo -> parameters [label="parameters"]
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_7 [label="Warning"]
-	diagnostic_7 -> note [label="note"]
-	diagnostics -> diagnostic_9 [label="Error"]
+	diagnostics -> diagnostic_6 [label="Warning"]
+	diagnostic_6 -> note [label="note"]
+	diagnostics -> diagnostic_8 [label="Error"]
 }

+ 2 - 2
tests/contract_testcases/solana/expressions/tx.dot

@@ -3,10 +3,10 @@ strict digraph "tests/contract_testcases/solana/expressions/tx.sol" {
 	test [label="function test\ncontract: foo\ntests/contract_testcases/solana/expressions/tx.sol:3:13-58\nsignature test()\nvisibility public\nmutability pure"]
 	returns [label="returns\naddress "]
 	diagnostic [label="found contract 'foo'\nlevel Debug\ntests/contract_testcases/solana/expressions/tx.sol:2:9-6:10"]
-	diagnostic_7 [label="builtin 'tx.origin' does not exist\nlevel Error\ntests/contract_testcases/solana/expressions/tx.sol:4:24-26"]
+	diagnostic_6 [label="builtin 'tx.origin' does not exist\nlevel Error\ntests/contract_testcases/solana/expressions/tx.sol:4:24-26"]
 	contracts -> contract
 	contract -> test [label="function"]
 	test -> returns [label="returns"]
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_7 [label="Error"]
+	diagnostics -> diagnostic_6 [label="Error"]
 }

+ 2 - 2
tests/contract_testcases/solana/expressions/tx_01.dot

@@ -3,10 +3,10 @@ strict digraph "tests/contract_testcases/solana/expressions/tx_01.sol" {
 	test [label="function test\ncontract: foo\ntests/contract_testcases/solana/expressions/tx_01.sol:3:13-57\nsignature test()\nvisibility public\nmutability pure"]
 	returns [label="returns\nuint64 "]
 	diagnostic [label="found contract 'foo'\nlevel Debug\ntests/contract_testcases/solana/expressions/tx_01.sol:2:9-6:10"]
-	diagnostic_7 [label="builtin 'tx.gasprice' does not exist\nlevel Error\ntests/contract_testcases/solana/expressions/tx_01.sol:4:24-26"]
+	diagnostic_6 [label="builtin 'tx.gasprice' does not exist\nlevel Error\ntests/contract_testcases/solana/expressions/tx_01.sol:4:24-26"]
 	contracts -> contract
 	contract -> test [label="function"]
 	test -> returns [label="returns"]
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_7 [label="Error"]
+	diagnostics -> diagnostic_6 [label="Error"]
 }

+ 14 - 14
tests/contract_testcases/solana/for_if_no_else.dot

@@ -6,18 +6,18 @@ strict digraph "tests/contract_testcases/solana/for_if_no_else.sol" {
 	number_literal [label="int256 literal: 0\ntests/contract_testcases/solana/for_if_no_else.sol:2:13-14"]
 	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_9 [label="int256 literal: 10\ntests/contract_testcases/solana/for_if_no_else.sol:2:19-21"]
+	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_12 [label="variable: i\nint256\ntests/contract_testcases/solana/for_if_no_else.sol:2:23-24"]
+	variable_11 [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_15 [label="variable: i\nint256\ntests/contract_testcases/solana/for_if_no_else.sol:3:7-8"]
-	number_literal_16 [label="int256 literal: 0\ntests/contract_testcases/solana/for_if_no_else.sol:3:11-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"]
 	return [label="return\ntests/contract_testcases/solana/for_if_no_else.sol:4:4-12"]
-	number_literal_18 [label="int256 literal: 1\ntests/contract_testcases/solana/for_if_no_else.sol:4:11-12"]
-	return_19 [label="return\ntests/contract_testcases/solana/for_if_no_else.sol:6:2-10"]
-	number_literal_20 [label="int256 literal: 2\ntests/contract_testcases/solana/for_if_no_else.sol:6:9-10"]
+	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"]
 	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"]
@@ -26,17 +26,17 @@ strict digraph "tests/contract_testcases/solana/for_if_no_else.sol" {
 	var_decl -> number_literal [label="init"]
 	for -> less [label="cond"]
 	less -> variable [label="left"]
-	less -> number_literal_9 [label="right"]
+	less -> number_literal_8 [label="right"]
 	for -> expr [label="next"]
 	expr -> post_increment [label="expr"]
-	post_increment -> variable_12 [label="expr"]
+	post_increment -> variable_11 [label="expr"]
 	for -> if [label="body"]
 	if -> more [label="cond"]
-	more -> variable_15 [label="left"]
-	more -> number_literal_16 [label="right"]
+	more -> variable_14 [label="left"]
+	more -> number_literal_15 [label="right"]
 	if -> return [label="then"]
-	return -> number_literal_18 [label="expr"]
-	for -> return_19 [label="next"]
-	return_19 -> number_literal_20 [label="expr"]
+	return -> number_literal_17 [label="expr"]
+	for -> return_18 [label="next"]
+	return_18 -> number_literal_19 [label="expr"]
 	diagnostics -> diagnostic [label="Warning"]
 }

+ 19 - 19
tests/contract_testcases/solana/garbage_function_args.dot

@@ -2,33 +2,33 @@ strict digraph "tests/contract_testcases/solana/garbage_function_args.sol" {
 	contract [label="contract c\ntests/contract_testcases/solana/garbage_function_args.sol:1:1-17:2"]
 	g [label="function g\ncontract: c\ntests/contract_testcases/solana/garbage_function_args.sol:2:2-28\nsignature g(bytes32)\nvisibility public\nmutability nonpayable"]
 	parameters [label="parameters\naddress "]
-	g_5 [label="function g\ncontract: c\ntests/contract_testcases/solana/garbage_function_args.sol:5:2-28\nsignature g(bytes)\nvisibility public\nmutability nonpayable"]
-	parameters_6 [label="parameters\nbytes x"]
-	g_7 [label="function g\ncontract: c\ntests/contract_testcases/solana/garbage_function_args.sol:8:2-21\nsignature g()\nvisibility public\nmutability nonpayable"]
-	g_8 [label="function g\ncontract: c\ntests/contract_testcases/solana/garbage_function_args.sol:11:2-24\nsignature g(int256)\nvisibility public\nmutability nonpayable"]
-	parameters_9 [label="parameters\nint256 "]
-	g_10 [label="function g\ncontract: c\ntests/contract_testcases/solana/garbage_function_args.sol:14:2-25\nsignature g(bool)\nvisibility public\nmutability nonpayable"]
-	parameters_11 [label="parameters\nbool "]
+	g_4 [label="function g\ncontract: c\ntests/contract_testcases/solana/garbage_function_args.sol:5:2-28\nsignature g(bytes)\nvisibility public\nmutability nonpayable"]
+	parameters_5 [label="parameters\nbytes x"]
+	g_6 [label="function g\ncontract: c\ntests/contract_testcases/solana/garbage_function_args.sol:8:2-21\nsignature g()\nvisibility public\nmutability nonpayable"]
+	g_7 [label="function g\ncontract: c\ntests/contract_testcases/solana/garbage_function_args.sol:11:2-24\nsignature g(int256)\nvisibility public\nmutability nonpayable"]
+	parameters_8 [label="parameters\nint256 "]
+	g_9 [label="function g\ncontract: c\ntests/contract_testcases/solana/garbage_function_args.sol:14:2-25\nsignature g(bool)\nvisibility public\nmutability nonpayable"]
+	parameters_10 [label="parameters\nbool "]
 	diagnostic [label="found contract 'c'\nlevel Debug\ntests/contract_testcases/solana/garbage_function_args.sol:1:1-17:2"]
-	diagnostic_14 [label="'rubbish' not found\nlevel Error\ntests/contract_testcases/solana/garbage_function_args.sol:3:11-18"]
-	diagnostic_15 [label="'meh' not found\nlevel Error\ntests/contract_testcases/solana/garbage_function_args.sol:6:15-18"]
-	diagnostic_16 [label="'foo' not found\nlevel Error\ntests/contract_testcases/solana/garbage_function_args.sol:9:9-12"]
-	diagnostic_17 [label="'oo' not found\nlevel Error\ntests/contract_testcases/solana/garbage_function_args.sol:12:10-12"]
-	diagnostic_18 [label="'foo' not found\nlevel Error\ntests/contract_testcases/solana/garbage_function_args.sol:15:14-17"]
+	diagnostic_13 [label="'rubbish' not found\nlevel Error\ntests/contract_testcases/solana/garbage_function_args.sol:3:11-18"]
+	diagnostic_14 [label="'meh' not found\nlevel Error\ntests/contract_testcases/solana/garbage_function_args.sol:6:15-18"]
+	diagnostic_15 [label="'foo' not found\nlevel Error\ntests/contract_testcases/solana/garbage_function_args.sol:9:9-12"]
+	diagnostic_16 [label="'oo' not found\nlevel Error\ntests/contract_testcases/solana/garbage_function_args.sol:12:10-12"]
+	diagnostic_17 [label="'foo' not found\nlevel Error\ntests/contract_testcases/solana/garbage_function_args.sol:15:14-17"]
 	contracts -> contract
 	contract -> g [label="function"]
 	g -> parameters [label="parameters"]
-	contract -> g_5 [label="function"]
-	g_5 -> parameters_6 [label="parameters"]
+	contract -> g_4 [label="function"]
+	g_4 -> parameters_5 [label="parameters"]
+	contract -> g_6 [label="function"]
 	contract -> g_7 [label="function"]
-	contract -> g_8 [label="function"]
-	g_8 -> parameters_9 [label="parameters"]
-	contract -> g_10 [label="function"]
-	g_10 -> parameters_11 [label="parameters"]
+	g_7 -> parameters_8 [label="parameters"]
+	contract -> g_9 [label="function"]
+	g_9 -> parameters_10 [label="parameters"]
 	diagnostics -> diagnostic [label="Debug"]
+	diagnostics -> diagnostic_13 [label="Error"]
 	diagnostics -> diagnostic_14 [label="Error"]
 	diagnostics -> diagnostic_15 [label="Error"]
 	diagnostics -> diagnostic_16 [label="Error"]
 	diagnostics -> diagnostic_17 [label="Error"]
-	diagnostics -> diagnostic_18 [label="Error"]
 }

+ 2 - 2
tests/contract_testcases/solana/hash/constants_hash_tests.dot

@@ -2,9 +2,9 @@ strict digraph "tests/contract_testcases/solana/hash/constants_hash_tests.sol" {
 	contract [label="contract tester\ntests/contract_testcases/solana/hash/constants_hash_tests.sol:2:9-8:10"]
 	test [label="function test\ncontract: tester\ntests/contract_testcases/solana/hash/constants_hash_tests.sol:3:13-35\nsignature test()\nvisibility public\nmutability nonpayable"]
 	diagnostic [label="found contract 'tester'\nlevel Debug\ntests/contract_testcases/solana/hash/constants_hash_tests.sol:2:9-8:10"]
-	diagnostic_6 [label="unknown function or type 'blake2_256'\nlevel Error\ntests/contract_testcases/solana/hash/constants_hash_tests.sol:4:32-42"]
+	diagnostic_5 [label="unknown function or type 'blake2_256'\nlevel Error\ntests/contract_testcases/solana/hash/constants_hash_tests.sol:4:32-42"]
 	contracts -> contract
 	contract -> test [label="function"]
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_6 [label="Error"]
+	diagnostics -> diagnostic_5 [label="Error"]
 }

+ 2 - 2
tests/contract_testcases/solana/hash/constants_hash_tests_01.dot

@@ -2,9 +2,9 @@ strict digraph "tests/contract_testcases/solana/hash/constants_hash_tests_01.sol
 	contract [label="contract tester\ntests/contract_testcases/solana/hash/constants_hash_tests_01.sol:2:9-8:10"]
 	test [label="function test\ncontract: tester\ntests/contract_testcases/solana/hash/constants_hash_tests_01.sol:3:13-35\nsignature test()\nvisibility public\nmutability nonpayable"]
 	diagnostic [label="found contract 'tester'\nlevel Debug\ntests/contract_testcases/solana/hash/constants_hash_tests_01.sol:2:9-8:10"]
-	diagnostic_6 [label="unknown function or type 'blake2_128'\nlevel Error\ntests/contract_testcases/solana/hash/constants_hash_tests_01.sol:4:32-42"]
+	diagnostic_5 [label="unknown function or type 'blake2_128'\nlevel Error\ntests/contract_testcases/solana/hash/constants_hash_tests_01.sol:4:32-42"]
 	contracts -> contract
 	contract -> test [label="function"]
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_6 [label="Error"]
+	diagnostics -> diagnostic_5 [label="Error"]
 }

+ 4 - 4
tests/contract_testcases/solana/immutable_function.dot

@@ -1,10 +1,10 @@
 strict digraph "tests/contract_testcases/solana/immutable_function.sol" {
 	contract [label="contract t\ntests/contract_testcases/solana/immutable_function.sol:1:26-4:2"]
 	diagnostic [label="function cannot be declared 'immutable'\nlevel Error\ntests/contract_testcases/solana/immutable_function.sol:1:14-23"]
-	diagnostic_5 [label="found contract 't'\nlevel Debug\ntests/contract_testcases/solana/immutable_function.sol:1:26-4:2"]
-	diagnostic_6 [label="function cannot be declared 'immutable'\nlevel Error\ntests/contract_testcases/solana/immutable_function.sol:3:18-27"]
+	diagnostic_4 [label="found contract 't'\nlevel Debug\ntests/contract_testcases/solana/immutable_function.sol:1:26-4:2"]
+	diagnostic_5 [label="function cannot be declared 'immutable'\nlevel Error\ntests/contract_testcases/solana/immutable_function.sol:3:18-27"]
 	contracts -> contract
 	diagnostics -> diagnostic [label="Error"]
-	diagnostics -> diagnostic_5 [label="Debug"]
-	diagnostics -> diagnostic_6 [label="Error"]
+	diagnostics -> diagnostic_4 [label="Debug"]
+	diagnostics -> diagnostic_5 [label="Error"]
 }

+ 66 - 66
tests/contract_testcases/solana/immutable_function_type.dot

@@ -7,44 +7,44 @@ strict digraph "tests/contract_testcases/solana/immutable_function_type.sol" {
 	returns [label="returns\nuint256 "]
 	return [label="return\ntests/contract_testcases/solana/immutable_function_type.sol:3:49-57"]
 	number_literal [label="uint256 literal: 2\ntests/contract_testcases/solana/immutable_function_type.sol:3:56-57"]
-	contract_10 [label="contract d\ntests/contract_testcases/solana/immutable_function_type.sol:5:1-9:2"]
-	var_11 [label="variable f\nvisibility private\nimmutable\ntests/contract_testcases/solana/immutable_function_type.sol:7:5-63"]
-	cast_12 [label="cast function() internal returns (uint256)\ntests/contract_testcases/solana/immutable_function_type.sol:7:62-63"]
-	internal_function_13 [label="function() internal pure returns (uint256)\nd.g\ntests/contract_testcases/solana/immutable_function_type.sol:7:62-63"]
-	g_14 [label="function g\ncontract: d\ntests/contract_testcases/solana/immutable_function_type.sol:8:5-46\nsignature g()\nvisibility internal\nmutability pure"]
-	returns_15 [label="returns\nuint256 "]
-	return_16 [label="return\ntests/contract_testcases/solana/immutable_function_type.sol:8:49-57"]
-	number_literal_17 [label="uint256 literal: 2\ntests/contract_testcases/solana/immutable_function_type.sol:8:56-57"]
-	contract_18 [label="contract e\ntests/contract_testcases/solana/immutable_function_type.sol:10:1-14:2"]
-	var_19 [label="variable f\nvisibility private\nimmutable\ntests/contract_testcases/solana/immutable_function_type.sol:12:5-73"]
-	cast_20 [label="cast function() internal returns (uint256)\ntests/contract_testcases/solana/immutable_function_type.sol:12:72-73"]
-	internal_function_21 [label="function() internal pure returns (uint256)\ne.g\ntests/contract_testcases/solana/immutable_function_type.sol:12:72-73"]
-	g_22 [label="function g\ncontract: e\ntests/contract_testcases/solana/immutable_function_type.sol:13:5-46\nsignature g()\nvisibility internal\nmutability pure"]
-	returns_23 [label="returns\nuint256 "]
-	return_24 [label="return\ntests/contract_testcases/solana/immutable_function_type.sol:13:49-57"]
-	number_literal_25 [label="uint256 literal: 2\ntests/contract_testcases/solana/immutable_function_type.sol:13:56-57"]
-	contract_26 [label="contract b\ntests/contract_testcases/solana/immutable_function_type.sol:14:2-18:2"]
-	var_27 [label="variable f\nvisibility private\ntests/contract_testcases/solana/immutable_function_type.sol:16:5-63"]
-	cast_28 [label="cast function() internal returns (uint256)\ntests/contract_testcases/solana/immutable_function_type.sol:16:62-63"]
-	internal_function_29 [label="function() internal pure returns (uint256)\nb.g\ntests/contract_testcases/solana/immutable_function_type.sol:16:62-63"]
-	g_30 [label="function g\ncontract: b\ntests/contract_testcases/solana/immutable_function_type.sol:17:5-46\nsignature g()\nvisibility internal\nmutability pure"]
-	returns_31 [label="returns\nuint256 "]
-	return_32 [label="return\ntests/contract_testcases/solana/immutable_function_type.sol:17:49-57"]
-	number_literal_33 [label="uint256 literal: 2\ntests/contract_testcases/solana/immutable_function_type.sol:17:56-57"]
-	contract_34 [label="contract a\ntests/contract_testcases/solana/immutable_function_type.sol:19:1-27:2"]
+	contract_9 [label="contract d\ntests/contract_testcases/solana/immutable_function_type.sol:5:1-9:2"]
+	var_10 [label="variable f\nvisibility private\nimmutable\ntests/contract_testcases/solana/immutable_function_type.sol:7:5-63"]
+	cast_11 [label="cast function() internal returns (uint256)\ntests/contract_testcases/solana/immutable_function_type.sol:7:62-63"]
+	internal_function_12 [label="function() internal pure returns (uint256)\nd.g\ntests/contract_testcases/solana/immutable_function_type.sol:7:62-63"]
+	g_13 [label="function g\ncontract: d\ntests/contract_testcases/solana/immutable_function_type.sol:8:5-46\nsignature g()\nvisibility internal\nmutability pure"]
+	returns_14 [label="returns\nuint256 "]
+	return_15 [label="return\ntests/contract_testcases/solana/immutable_function_type.sol:8:49-57"]
+	number_literal_16 [label="uint256 literal: 2\ntests/contract_testcases/solana/immutable_function_type.sol:8:56-57"]
+	contract_17 [label="contract e\ntests/contract_testcases/solana/immutable_function_type.sol:10:1-14:2"]
+	var_18 [label="variable f\nvisibility private\nimmutable\ntests/contract_testcases/solana/immutable_function_type.sol:12:5-73"]
+	cast_19 [label="cast function() internal returns (uint256)\ntests/contract_testcases/solana/immutable_function_type.sol:12:72-73"]
+	internal_function_20 [label="function() internal pure returns (uint256)\ne.g\ntests/contract_testcases/solana/immutable_function_type.sol:12:72-73"]
+	g_21 [label="function g\ncontract: e\ntests/contract_testcases/solana/immutable_function_type.sol:13:5-46\nsignature g()\nvisibility internal\nmutability pure"]
+	returns_22 [label="returns\nuint256 "]
+	return_23 [label="return\ntests/contract_testcases/solana/immutable_function_type.sol:13:49-57"]
+	number_literal_24 [label="uint256 literal: 2\ntests/contract_testcases/solana/immutable_function_type.sol:13:56-57"]
+	contract_25 [label="contract b\ntests/contract_testcases/solana/immutable_function_type.sol:14:2-18:2"]
+	var_26 [label="variable f\nvisibility private\ntests/contract_testcases/solana/immutable_function_type.sol:16:5-63"]
+	cast_27 [label="cast function() internal returns (uint256)\ntests/contract_testcases/solana/immutable_function_type.sol:16:62-63"]
+	internal_function_28 [label="function() internal pure returns (uint256)\nb.g\ntests/contract_testcases/solana/immutable_function_type.sol:16:62-63"]
+	g_29 [label="function g\ncontract: b\ntests/contract_testcases/solana/immutable_function_type.sol:17:5-46\nsignature g()\nvisibility internal\nmutability pure"]
+	returns_30 [label="returns\nuint256 "]
+	return_31 [label="return\ntests/contract_testcases/solana/immutable_function_type.sol:17:49-57"]
+	number_literal_32 [label="uint256 literal: 2\ntests/contract_testcases/solana/immutable_function_type.sol:17:56-57"]
+	contract_33 [label="contract a\ntests/contract_testcases/solana/immutable_function_type.sol:19:1-27:2"]
 	x [label="function x\ncontract: a\ntests/contract_testcases/solana/immutable_function_type.sol:21:5-24\nsignature x()\nvisibility public\nmutability nonpayable"]
 	y [label="function y\ncontract: a\ntests/contract_testcases/solana/immutable_function_type.sol:24:5-24\nsignature y()\nvisibility public\nmutability nonpayable"]
 	diagnostic [label="found contract 'c'\nlevel Debug\ntests/contract_testcases/solana/immutable_function_type.sol:1:1-4:2"]
-	diagnostic_39 [label="found contract 'd'\nlevel Debug\ntests/contract_testcases/solana/immutable_function_type.sol:5:1-9:2"]
-	diagnostic_40 [label="found contract 'e'\nlevel Debug\ntests/contract_testcases/solana/immutable_function_type.sol:10:1-14:2"]
-	diagnostic_41 [label="duplicate 'immutable' attribute\nlevel Error\ntests/contract_testcases/solana/immutable_function_type.sol:12:48-57"]
+	diagnostic_38 [label="found contract 'd'\nlevel Debug\ntests/contract_testcases/solana/immutable_function_type.sol:5:1-9:2"]
+	diagnostic_39 [label="found contract 'e'\nlevel Debug\ntests/contract_testcases/solana/immutable_function_type.sol:10:1-14:2"]
+	diagnostic_40 [label="duplicate 'immutable' attribute\nlevel Error\ntests/contract_testcases/solana/immutable_function_type.sol:12:48-57"]
 	note [label="previous 'immutable' attribute\ntests/contract_testcases/solana/immutable_function_type.sol:12:58-67"]
-	diagnostic_43 [label="found contract 'b'\nlevel Debug\ntests/contract_testcases/solana/immutable_function_type.sol:14:2-18:2"]
-	diagnostic_44 [label="found contract 'a'\nlevel Debug\ntests/contract_testcases/solana/immutable_function_type.sol:19:1-27:2"]
-	diagnostic_45 [label="function type cannot have visibility 'private'\nlevel Error\ntests/contract_testcases/solana/immutable_function_type.sol:22:37-44"]
-	diagnostic_46 [label="function type cannot be 'immutable'\nlevel Error\ntests/contract_testcases/solana/immutable_function_type.sol:22:45-54"]
-	diagnostic_47 [label="function type cannot have visibility 'private'\nlevel Error\ntests/contract_testcases/solana/immutable_function_type.sol:25:22-29"]
-	diagnostic_48 [label="function type cannot be 'immutable'\nlevel Error\ntests/contract_testcases/solana/immutable_function_type.sol:25:30-39"]
+	diagnostic_42 [label="found contract 'b'\nlevel Debug\ntests/contract_testcases/solana/immutable_function_type.sol:14:2-18:2"]
+	diagnostic_43 [label="found contract 'a'\nlevel Debug\ntests/contract_testcases/solana/immutable_function_type.sol:19:1-27:2"]
+	diagnostic_44 [label="function type cannot have visibility 'private'\nlevel Error\ntests/contract_testcases/solana/immutable_function_type.sol:22:37-44"]
+	diagnostic_45 [label="function type cannot be 'immutable'\nlevel Error\ntests/contract_testcases/solana/immutable_function_type.sol:22:45-54"]
+	diagnostic_46 [label="function type cannot have visibility 'private'\nlevel Error\ntests/contract_testcases/solana/immutable_function_type.sol:25:22-29"]
+	diagnostic_47 [label="function type cannot be 'immutable'\nlevel Error\ntests/contract_testcases/solana/immutable_function_type.sol:25:30-39"]
 	contracts -> contract
 	contract -> var [label="variable"]
 	var -> cast [label="initializer"]
@@ -53,42 +53,42 @@ strict digraph "tests/contract_testcases/solana/immutable_function_type.sol" {
 	g -> returns [label="returns"]
 	g -> return [label="body"]
 	return -> number_literal [label="expr"]
-	contracts -> contract_10
-	contract_10 -> var_11 [label="variable"]
-	var_11 -> cast_12 [label="initializer"]
-	cast_12 -> internal_function_13 [label="expr"]
-	contract_10 -> g_14 [label="function"]
-	g_14 -> returns_15 [label="returns"]
-	g_14 -> return_16 [label="body"]
-	return_16 -> number_literal_17 [label="expr"]
-	contracts -> contract_18
-	contract_18 -> var_19 [label="variable"]
-	var_19 -> cast_20 [label="initializer"]
-	cast_20 -> internal_function_21 [label="expr"]
-	contract_18 -> g_22 [label="function"]
-	g_22 -> returns_23 [label="returns"]
-	g_22 -> return_24 [label="body"]
-	return_24 -> number_literal_25 [label="expr"]
-	contracts -> contract_26
-	contract_26 -> var_27 [label="variable"]
-	var_27 -> cast_28 [label="initializer"]
-	cast_28 -> internal_function_29 [label="expr"]
-	contract_26 -> g_30 [label="function"]
-	g_30 -> returns_31 [label="returns"]
-	g_30 -> return_32 [label="body"]
-	return_32 -> number_literal_33 [label="expr"]
-	contracts -> contract_34
-	contract_34 -> x [label="function"]
-	contract_34 -> y [label="function"]
+	contracts -> contract_9
+	contract_9 -> var_10 [label="variable"]
+	var_10 -> cast_11 [label="initializer"]
+	cast_11 -> internal_function_12 [label="expr"]
+	contract_9 -> g_13 [label="function"]
+	g_13 -> returns_14 [label="returns"]
+	g_13 -> return_15 [label="body"]
+	return_15 -> number_literal_16 [label="expr"]
+	contracts -> contract_17
+	contract_17 -> var_18 [label="variable"]
+	var_18 -> cast_19 [label="initializer"]
+	cast_19 -> internal_function_20 [label="expr"]
+	contract_17 -> g_21 [label="function"]
+	g_21 -> returns_22 [label="returns"]
+	g_21 -> return_23 [label="body"]
+	return_23 -> number_literal_24 [label="expr"]
+	contracts -> contract_25
+	contract_25 -> var_26 [label="variable"]
+	var_26 -> cast_27 [label="initializer"]
+	cast_27 -> internal_function_28 [label="expr"]
+	contract_25 -> g_29 [label="function"]
+	g_29 -> returns_30 [label="returns"]
+	g_29 -> return_31 [label="body"]
+	return_31 -> number_literal_32 [label="expr"]
+	contracts -> contract_33
+	contract_33 -> x [label="function"]
+	contract_33 -> y [label="function"]
 	diagnostics -> diagnostic [label="Debug"]
+	diagnostics -> diagnostic_38 [label="Debug"]
 	diagnostics -> diagnostic_39 [label="Debug"]
-	diagnostics -> diagnostic_40 [label="Debug"]
-	diagnostics -> diagnostic_41 [label="Error"]
-	diagnostic_41 -> note [label="note"]
+	diagnostics -> diagnostic_40 [label="Error"]
+	diagnostic_40 -> note [label="note"]
+	diagnostics -> diagnostic_42 [label="Debug"]
 	diagnostics -> diagnostic_43 [label="Debug"]
-	diagnostics -> diagnostic_44 [label="Debug"]
+	diagnostics -> diagnostic_44 [label="Error"]
 	diagnostics -> diagnostic_45 [label="Error"]
 	diagnostics -> diagnostic_46 [label="Error"]
 	diagnostics -> diagnostic_47 [label="Error"]
-	diagnostics -> diagnostic_48 [label="Error"]
 }

+ 46 - 46
tests/contract_testcases/solana/import_free_function.dot

@@ -6,37 +6,37 @@ strict digraph "tests/contract_testcases/solana/import_free_function.sol" {
 	number_literal [label="int256 literal: 0\ntests/contract_testcases/solana/for_if_no_else.sol:2:13-14"]
 	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_9 [label="int256 literal: 10\ntests/contract_testcases/solana/for_if_no_else.sol:2:19-21"]
+	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_12 [label="variable: i\nint256\ntests/contract_testcases/solana/for_if_no_else.sol:2:23-24"]
+	variable_11 [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_15 [label="variable: i\nint256\ntests/contract_testcases/solana/for_if_no_else.sol:3:7-8"]
-	number_literal_16 [label="int256 literal: 0\ntests/contract_testcases/solana/for_if_no_else.sol:3:11-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"]
 	return [label="return\ntests/contract_testcases/solana/for_if_no_else.sol:4:4-12"]
-	number_literal_18 [label="int256 literal: 1\ntests/contract_testcases/solana/for_if_no_else.sol:4:11-12"]
-	return_19 [label="return\ntests/contract_testcases/solana/for_if_no_else.sol:6:2-10"]
-	number_literal_20 [label="int256 literal: 2\ntests/contract_testcases/solana/for_if_no_else.sol:6:9-10"]
+	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"]
 	bar [label="function bar\ntests/contract_testcases/solana/import_free_function.sol:5:1-6:16\nsignature bar()\nvisibility internal\nmutability nonpayable"]
-	var_decl_22 [label="variable decl int256 x\ntests/contract_testcases/solana/import_free_function.sol:7:2-15"]
+	var_decl_21 [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_25 [label="expression\ntests/contract_testcases/solana/import_free_function.sol:8:2-19"]
+	expr_24 [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_27 [label="variable: x\nint256\ntests/contract_testcases/solana/import_free_function.sol:8:2-3"]
-	call_internal_function_28 [label="call internal function\ntests/contract_testcases/solana/import_free_function.sol:8:6-19"]
-	internal_function_29 [label="function() internal returns (int256)\nfree function foo\ntests/contract_testcases/solana/import_free_function.sol:8:6-19"]
-	expr_30 [label="expression\ntests/contract_testcases/solana/import_free_function.sol:9:2-13"]
-	assign_31 [label="assign\nint256\ntests/contract_testcases/solana/import_free_function.sol:9:2-13"]
-	variable_32 [label="variable: x\nint256\ntests/contract_testcases/solana/import_free_function.sol:9:2-3"]
-	call_internal_function_33 [label="call internal function\ntests/contract_testcases/solana/import_free_function.sol:9:6-13"]
-	internal_function_34 [label="function() internal returns (int256)\nfree function foo\ntests/contract_testcases/solana/import_free_function.sol:9:6-13"]
-	expr_35 [label="expression\ntests/contract_testcases/solana/import_free_function.sol:10:2-15"]
-	assign_36 [label="assign\nint256\ntests/contract_testcases/solana/import_free_function.sol:10:2-15"]
-	variable_37 [label="variable: x\nint256\ntests/contract_testcases/solana/import_free_function.sol:10:2-3"]
-	call_internal_function_38 [label="call internal function\ntests/contract_testcases/solana/import_free_function.sol:10:6-15"]
-	internal_function_39 [label="function() internal returns (int256)\nfree function foo\ntests/contract_testcases/solana/import_free_function.sol:10:6-15"]
+	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"]
 	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"]
@@ -45,36 +45,36 @@ strict digraph "tests/contract_testcases/solana/import_free_function.sol" {
 	var_decl -> number_literal [label="init"]
 	for -> less [label="cond"]
 	less -> variable [label="left"]
-	less -> number_literal_9 [label="right"]
+	less -> number_literal_8 [label="right"]
 	for -> expr [label="next"]
 	expr -> post_increment [label="expr"]
-	post_increment -> variable_12 [label="expr"]
+	post_increment -> variable_11 [label="expr"]
 	for -> if [label="body"]
 	if -> more [label="cond"]
-	more -> variable_15 [label="left"]
-	more -> number_literal_16 [label="right"]
+	more -> variable_14 [label="left"]
+	more -> number_literal_15 [label="right"]
 	if -> return [label="then"]
-	return -> number_literal_18 [label="expr"]
-	for -> return_19 [label="next"]
-	return_19 -> number_literal_20 [label="expr"]
+	return -> number_literal_17 [label="expr"]
+	for -> return_18 [label="next"]
+	return_18 -> number_literal_19 [label="expr"]
 	free_functions -> bar [label="function"]
-	bar -> var_decl_22 [label="body"]
-	var_decl_22 -> call_internal_function [label="init"]
+	bar -> var_decl_21 [label="body"]
+	var_decl_21 -> call_internal_function [label="init"]
 	call_internal_function -> internal_function [label="function"]
-	var_decl_22 -> expr_25 [label="next"]
-	expr_25 -> assign [label="expr"]
-	assign -> variable_27 [label="left"]
-	assign -> call_internal_function_28 [label="right"]
-	call_internal_function_28 -> internal_function_29 [label="function"]
-	expr_25 -> expr_30 [label="next"]
-	expr_30 -> assign_31 [label="expr"]
-	assign_31 -> variable_32 [label="left"]
-	assign_31 -> call_internal_function_33 [label="right"]
-	call_internal_function_33 -> internal_function_34 [label="function"]
-	expr_30 -> expr_35 [label="next"]
-	expr_35 -> assign_36 [label="expr"]
-	assign_36 -> variable_37 [label="left"]
-	assign_36 -> call_internal_function_38 [label="right"]
-	call_internal_function_38 -> internal_function_39 [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"]
 	diagnostics -> diagnostic [label="Warning"]
 }

+ 52 - 52
tests/contract_testcases/solana/import_free_function_chain.dot

@@ -6,41 +6,41 @@ strict digraph "tests/contract_testcases/solana/import_free_function_chain.sol"
 	number_literal [label="int256 literal: 0\ntests/contract_testcases/solana/for_if_no_else.sol:2:13-14"]
 	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_9 [label="int256 literal: 10\ntests/contract_testcases/solana/for_if_no_else.sol:2:19-21"]
+	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_12 [label="variable: i\nint256\ntests/contract_testcases/solana/for_if_no_else.sol:2:23-24"]
+	variable_11 [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_15 [label="variable: i\nint256\ntests/contract_testcases/solana/for_if_no_else.sol:3:7-8"]
-	number_literal_16 [label="int256 literal: 0\ntests/contract_testcases/solana/for_if_no_else.sol:3:11-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"]
 	return [label="return\ntests/contract_testcases/solana/for_if_no_else.sol:4:4-12"]
-	number_literal_18 [label="int256 literal: 1\ntests/contract_testcases/solana/for_if_no_else.sol:4:11-12"]
-	return_19 [label="return\ntests/contract_testcases/solana/for_if_no_else.sol:6:2-10"]
-	number_literal_20 [label="int256 literal: 2\ntests/contract_testcases/solana/for_if_no_else.sol:6:9-10"]
+	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"]
 	bar [label="function bar\ntests/contract_testcases/solana/import_free_function.sol:5:1-6:16\nsignature bar()\nvisibility internal\nmutability nonpayable"]
-	var_decl_22 [label="variable decl int256 x\ntests/contract_testcases/solana/import_free_function.sol:7:2-15"]
+	var_decl_21 [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_25 [label="expression\ntests/contract_testcases/solana/import_free_function.sol:8:2-19"]
+	expr_24 [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_27 [label="variable: x\nint256\ntests/contract_testcases/solana/import_free_function.sol:8:2-3"]
-	call_internal_function_28 [label="call internal function\ntests/contract_testcases/solana/import_free_function.sol:8:6-19"]
-	internal_function_29 [label="function() internal returns (int256)\nfree function foo\ntests/contract_testcases/solana/import_free_function.sol:8:6-19"]
-	expr_30 [label="expression\ntests/contract_testcases/solana/import_free_function.sol:9:2-13"]
-	assign_31 [label="assign\nint256\ntests/contract_testcases/solana/import_free_function.sol:9:2-13"]
-	variable_32 [label="variable: x\nint256\ntests/contract_testcases/solana/import_free_function.sol:9:2-3"]
-	call_internal_function_33 [label="call internal function\ntests/contract_testcases/solana/import_free_function.sol:9:6-13"]
-	internal_function_34 [label="function() internal returns (int256)\nfree function foo\ntests/contract_testcases/solana/import_free_function.sol:9:6-13"]
-	expr_35 [label="expression\ntests/contract_testcases/solana/import_free_function.sol:10:2-15"]
-	assign_36 [label="assign\nint256\ntests/contract_testcases/solana/import_free_function.sol:10:2-15"]
-	variable_37 [label="variable: x\nint256\ntests/contract_testcases/solana/import_free_function.sol:10:2-3"]
-	call_internal_function_38 [label="call internal function\ntests/contract_testcases/solana/import_free_function.sol:10:6-15"]
-	internal_function_39 [label="function() internal returns (int256)\nfree function foo\ntests/contract_testcases/solana/import_free_function.sol:10:6-15"]
+	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"]
 	baz [label="function baz\ntests/contract_testcases/solana/import_free_function_chain.sol:3:1-4:16\nsignature baz()\nvisibility internal\nmutability nonpayable"]
-	var_decl_41 [label="variable decl int256 x\ntests/contract_testcases/solana/import_free_function_chain.sol:5:2-19"]
-	call_internal_function_42 [label="call internal function\ntests/contract_testcases/solana/import_free_function_chain.sol:5:10-19"]
-	internal_function_43 [label="function() internal returns (int256)\nfree function foo\ntests/contract_testcases/solana/import_free_function_chain.sol:5:10-19"]
+	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"]
 	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"]
@@ -49,40 +49,40 @@ strict digraph "tests/contract_testcases/solana/import_free_function_chain.sol"
 	var_decl -> number_literal [label="init"]
 	for -> less [label="cond"]
 	less -> variable [label="left"]
-	less -> number_literal_9 [label="right"]
+	less -> number_literal_8 [label="right"]
 	for -> expr [label="next"]
 	expr -> post_increment [label="expr"]
-	post_increment -> variable_12 [label="expr"]
+	post_increment -> variable_11 [label="expr"]
 	for -> if [label="body"]
 	if -> more [label="cond"]
-	more -> variable_15 [label="left"]
-	more -> number_literal_16 [label="right"]
+	more -> variable_14 [label="left"]
+	more -> number_literal_15 [label="right"]
 	if -> return [label="then"]
-	return -> number_literal_18 [label="expr"]
-	for -> return_19 [label="next"]
-	return_19 -> number_literal_20 [label="expr"]
+	return -> number_literal_17 [label="expr"]
+	for -> return_18 [label="next"]
+	return_18 -> number_literal_19 [label="expr"]
 	free_functions -> bar [label="function"]
-	bar -> var_decl_22 [label="body"]
-	var_decl_22 -> call_internal_function [label="init"]
+	bar -> var_decl_21 [label="body"]
+	var_decl_21 -> call_internal_function [label="init"]
 	call_internal_function -> internal_function [label="function"]
-	var_decl_22 -> expr_25 [label="next"]
-	expr_25 -> assign [label="expr"]
-	assign -> variable_27 [label="left"]
-	assign -> call_internal_function_28 [label="right"]
-	call_internal_function_28 -> internal_function_29 [label="function"]
-	expr_25 -> expr_30 [label="next"]
-	expr_30 -> assign_31 [label="expr"]
-	assign_31 -> variable_32 [label="left"]
-	assign_31 -> call_internal_function_33 [label="right"]
-	call_internal_function_33 -> internal_function_34 [label="function"]
-	expr_30 -> expr_35 [label="next"]
-	expr_35 -> assign_36 [label="expr"]
-	assign_36 -> variable_37 [label="left"]
-	assign_36 -> call_internal_function_38 [label="right"]
-	call_internal_function_38 -> internal_function_39 [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"]
 	free_functions -> baz [label="function"]
-	baz -> var_decl_41 [label="body"]
-	var_decl_41 -> call_internal_function_42 [label="init"]
-	call_internal_function_42 -> internal_function_43 [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"]
 	diagnostics -> diagnostic [label="Warning"]
 }

+ 11 - 11
tests/contract_testcases/solana/large_exponent.dot

@@ -1,30 +1,30 @@
 strict digraph "tests/contract_testcases/solana/large_exponent.sol" {
 	contract [label="contract C\ntests/contract_testcases/solana/large_exponent.sol:1:1-16:2"]
 	var [label="variable a\nvisibility internal\nconstant\ntests/contract_testcases/solana/large_exponent.sol:2:6-31"]
-	var_4 [label="variable b\nvisibility internal\nconstant\ntests/contract_testcases/solana/large_exponent.sol:3:6-34"]
-	var_5 [label="variable c\nvisibility internal\nconstant\ntests/contract_testcases/solana/large_exponent.sol:4:6-33"]
+	var_3 [label="variable b\nvisibility internal\nconstant\ntests/contract_testcases/solana/large_exponent.sol:3:6-34"]
+	var_4 [label="variable c\nvisibility internal\nconstant\ntests/contract_testcases/solana/large_exponent.sol:4:6-33"]
 	f [label="function f\ncontract: C\ntests/contract_testcases/solana/large_exponent.sol:5:6-26\nsignature f()\nvisibility private\nmutability nonpayable"]
 	inline_assembly [label="inline assembly\ntests/contract_testcases/solana/large_exponent.sol:6:2-8:3"]
 	g [label="function g\ncontract: C\ntests/contract_testcases/solana/large_exponent.sol:10:6-26\nsignature g()\nvisibility private\nmutability nonpayable"]
-	inline_assembly_9 [label="inline assembly\ntests/contract_testcases/solana/large_exponent.sol:11:2-13:3"]
+	inline_assembly_8 [label="inline assembly\ntests/contract_testcases/solana/large_exponent.sol:11:2-13:3"]
 	diagnostic [label="found contract 'C'\nlevel Debug\ntests/contract_testcases/solana/large_exponent.sol:1:1-16:2"]
-	diagnostic_12 [label="literal 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 is too large to fit into type 'int256'\nlevel Error\ntests/contract_testcases/solana/large_exponent.sol:2:26-31"]
-	diagnostic_13 [label="exponent '-65535' too large\nlevel Error\ntests/contract_testcases/solana/large_exponent.sol:3:26-34"]
-	diagnostic_14 [label="exponent '65537' too large\nlevel Error\ntests/contract_testcases/solana/large_exponent.sol:4:26-33"]
-	diagnostic_15 [label="exponent '65537' too large\nlevel Error\ntests/contract_testcases/solana/large_exponent.sol:7:12-19"]
-	diagnostic_16 [label="rational numbers not permitted\nlevel Error\ntests/contract_testcases/solana/large_exponent.sol:12:12-16"]
+	diagnostic_11 [label="literal 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 is too large to fit into type 'int256'\nlevel Error\ntests/contract_testcases/solana/large_exponent.sol:2:26-31"]
+	diagnostic_12 [label="exponent '-65535' too large\nlevel Error\ntests/contract_testcases/solana/large_exponent.sol:3:26-34"]
+	diagnostic_13 [label="exponent '65537' too large\nlevel Error\ntests/contract_testcases/solana/large_exponent.sol:4:26-33"]
+	diagnostic_14 [label="exponent '65537' too large\nlevel Error\ntests/contract_testcases/solana/large_exponent.sol:7:12-19"]
+	diagnostic_15 [label="rational numbers not permitted\nlevel Error\ntests/contract_testcases/solana/large_exponent.sol:12:12-16"]
 	contracts -> contract
 	contract -> var [label="variable"]
+	contract -> var_3 [label="variable"]
 	contract -> var_4 [label="variable"]
-	contract -> var_5 [label="variable"]
 	contract -> f [label="function"]
 	f -> inline_assembly [label="body"]
 	contract -> g [label="function"]
-	g -> inline_assembly_9 [label="body"]
+	g -> inline_assembly_8 [label="body"]
 	diagnostics -> diagnostic [label="Debug"]
+	diagnostics -> diagnostic_11 [label="Error"]
 	diagnostics -> diagnostic_12 [label="Error"]
 	diagnostics -> diagnostic_13 [label="Error"]
 	diagnostics -> diagnostic_14 [label="Error"]
 	diagnostics -> diagnostic_15 [label="Error"]
-	diagnostics -> diagnostic_16 [label="Error"]
 }

+ 10 - 10
tests/contract_testcases/solana/multidimensional_array.dot

@@ -9,12 +9,12 @@ strict digraph "tests/contract_testcases/solana/multidimensional_array.sol" {
 	return [label="return\ntests/contract_testcases/solana/multidimensional_array.sol:6:9-29"]
 	load [label="load uint16\ntests/contract_testcases/solana/multidimensional_array.sol:6:9-29"]
 	subscript [label="subscript uint16[2]\ntests/contract_testcases/solana/multidimensional_array.sol:6:16-29"]
-	subscript_12 [label="subscript uint16[2][4]\ntests/contract_testcases/solana/multidimensional_array.sol:6:16-26"]
-	subscript_13 [label="subscript uint16[2][4][]\ntests/contract_testcases/solana/multidimensional_array.sol:6:16-23"]
+	subscript_11 [label="subscript uint16[2][4]\ntests/contract_testcases/solana/multidimensional_array.sol:6:16-26"]
+	subscript_12 [label="subscript uint16[2][4][]\ntests/contract_testcases/solana/multidimensional_array.sol:6:16-23"]
 	variable [label="variable: arr2\nuint16[2][4][]\ntests/contract_testcases/solana/multidimensional_array.sol:6:16-20"]
 	number_literal [label="uint32 literal: 1\ntests/contract_testcases/solana/multidimensional_array.sol:6:21-22"]
-	number_literal_16 [label="uint32 literal: 1\ntests/contract_testcases/solana/multidimensional_array.sol:6:24-25"]
-	number_literal_17 [label="uint32 literal: 1\ntests/contract_testcases/solana/multidimensional_array.sol:6:27-28"]
+	number_literal_15 [label="uint32 literal: 1\ntests/contract_testcases/solana/multidimensional_array.sol:6:24-25"]
+	number_literal_16 [label="uint32 literal: 1\ntests/contract_testcases/solana/multidimensional_array.sol:6:27-28"]
 	diagnostic [label="found contract 'Testing'\nlevel Debug\ntests/contract_testcases/solana/multidimensional_array.sol:1:1-8:2"]
 	contracts -> contract
 	contract -> var [label="variable"]
@@ -26,11 +26,11 @@ strict digraph "tests/contract_testcases/solana/multidimensional_array.sol" {
 	var_decl -> return [label="next"]
 	return -> load [label="expr"]
 	load -> subscript [label="expr"]
-	subscript -> subscript_12 [label="array"]
-	subscript_12 -> subscript_13 [label="array"]
-	subscript_13 -> variable [label="array"]
-	subscript_13 -> number_literal [label="index"]
-	subscript_12 -> number_literal_16 [label="index"]
-	subscript -> number_literal_17 [label="index"]
+	subscript -> subscript_11 [label="array"]
+	subscript_11 -> subscript_12 [label="array"]
+	subscript_12 -> variable [label="array"]
+	subscript_12 -> number_literal [label="index"]
+	subscript_11 -> number_literal_15 [label="index"]
+	subscript -> number_literal_16 [label="index"]
 	diagnostics -> diagnostic [label="Debug"]
 }

+ 15 - 15
tests/contract_testcases/solana/mutability.dot

@@ -4,33 +4,33 @@ strict digraph "tests/contract_testcases/solana/mutability.sol" {
 	parameters [label="parameters\nint256[] storage A\nint256[] storage B"]
 	returns [label="returns\nint256[] storage \nint256[] storage "]
 	var_decl [label="variable decl int256[] storage x\ntests/contract_testcases/solana/mutability.sol:7:9-27"]
-	var_decl_7 [label="variable decl int256[] storage y\ntests/contract_testcases/solana/mutability.sol:8:9-27"]
+	var_decl_6 [label="variable decl int256[] storage y\ntests/contract_testcases/solana/mutability.sol:8:9-27"]
 	destructure [label="destructure\ntests/contract_testcases/solana/mutability.sol:9:9-24"]
 	variable [label="variable: x\nint256[] storage\ntests/contract_testcases/solana/mutability.sol:9:10-11"]
-	variable_10 [label="variable: y\nint256[] storage\ntests/contract_testcases/solana/mutability.sol:9:13-14"]
+	variable_9 [label="variable: y\nint256[] storage\ntests/contract_testcases/solana/mutability.sol:9:13-14"]
 	list [label="list\ntests/contract_testcases/solana/mutability.sol:9:9-24"]
-	variable_12 [label="variable: A\nint256[] storage\ntests/contract_testcases/solana/mutability.sol:9:19-20"]
-	variable_13 [label="variable: B\nint256[] storage\ntests/contract_testcases/solana/mutability.sol:9:22-23"]
+	variable_11 [label="variable: A\nint256[] storage\ntests/contract_testcases/solana/mutability.sol:9:19-20"]
+	variable_12 [label="variable: B\nint256[] storage\ntests/contract_testcases/solana/mutability.sol:9:22-23"]
 	return [label="return\ntests/contract_testcases/solana/mutability.sol:10:9-22"]
-	list_15 [label="list\ntests/contract_testcases/solana/mutability.sol:10:9-22"]
-	variable_16 [label="variable: x\nint256[] storage\ntests/contract_testcases/solana/mutability.sol:10:17-18"]
-	variable_17 [label="variable: y\nint256[] storage\ntests/contract_testcases/solana/mutability.sol:10:20-21"]
+	list_14 [label="list\ntests/contract_testcases/solana/mutability.sol:10:9-22"]
+	variable_15 [label="variable: x\nint256[] storage\ntests/contract_testcases/solana/mutability.sol:10:17-18"]
+	variable_16 [label="variable: y\nint256[] storage\ntests/contract_testcases/solana/mutability.sol:10:20-21"]
 	diagnostic [label="found contract 'c'\nlevel Debug\ntests/contract_testcases/solana/mutability.sol:1:1-12:2"]
 	contracts -> contract
 	contract -> test2 [label="function"]
 	test2 -> parameters [label="parameters"]
 	test2 -> returns [label="returns"]
 	test2 -> var_decl [label="body"]
-	var_decl -> var_decl_7 [label="next"]
-	var_decl_7 -> destructure [label="next"]
+	var_decl -> var_decl_6 [label="next"]
+	var_decl_6 -> destructure [label="next"]
 	destructure -> variable [label="arg #0"]
-	destructure -> variable_10 [label="arg #1"]
+	destructure -> variable_9 [label="arg #1"]
 	destructure -> list [label="expr"]
-	list -> variable_12 [label="entry #0"]
-	list -> variable_13 [label="entry #1"]
+	list -> variable_11 [label="entry #0"]
+	list -> variable_12 [label="entry #1"]
 	destructure -> return [label="next"]
-	return -> list_15 [label="expr"]
-	list_15 -> variable_16 [label="entry #0"]
-	list_15 -> variable_17 [label="entry #1"]
+	return -> list_14 [label="expr"]
+	list_14 -> variable_15 [label="entry #0"]
+	list_14 -> variable_16 [label="entry #1"]
 	diagnostics -> diagnostic [label="Debug"]
 }

+ 13 - 13
tests/contract_testcases/solana/negative_exponent.dot

@@ -6,16 +6,16 @@ strict digraph "tests/contract_testcases/solana/negative_exponent.sol" {
 	cast [label="cast uint256\ntests/contract_testcases/solana/negative_exponent.sol:3:2-20"]
 	add [label="add\nrational\ntests/contract_testcases/solana/negative_exponent.sol:3:9-20"]
 	rational_literal [label="rational rational literal: 1/20\ntests/contract_testcases/solana/negative_exponent.sol:3:9-13"]
-	rational_literal_9 [label="rational rational literal: 39/20\ntests/contract_testcases/solana/negative_exponent.sol:3:16-20"]
+	rational_literal_8 [label="rational rational literal: 39/20\ntests/contract_testcases/solana/negative_exponent.sol:3:16-20"]
 	g [label="function g\ncontract: c\ntests/contract_testcases/solana/negative_exponent.sol:5:5-44\nsignature g()\nvisibility public\nmutability pure"]
-	returns_11 [label="returns\nuint256 "]
-	return_12 [label="return\ntests/contract_testcases/solana/negative_exponent.sol:6:9-26"]
+	returns_10 [label="returns\nuint256 "]
+	return_11 [label="return\ntests/contract_testcases/solana/negative_exponent.sol:6:9-26"]
 	number_literal [label="uint256 literal: 2\ntests/contract_testcases/solana/negative_exponent.sol:6:16-26"]
 	h [label="function h\ncontract: c\ntests/contract_testcases/solana/negative_exponent.sol:8:5-44\nsignature h()\nvisibility public\nmutability pure"]
-	returns_15 [label="returns\nuint256 "]
+	returns_14 [label="returns\nuint256 "]
 	diagnostic [label="found contract 'c'\nlevel Debug\ntests/contract_testcases/solana/negative_exponent.sol:1:1-11:2"]
-	diagnostic_18 [label="ethereum currency unit used while not targetting ethereum\nlevel Warning\ntests/contract_testcases/solana/negative_exponent.sol:6:23-26"]
-	diagnostic_19 [label="conversion to uint256 from rational not allowed\nlevel Error\ntests/contract_testcases/solana/negative_exponent.sol:9:2-20"]
+	diagnostic_17 [label="ethereum currency unit used while not targetting ethereum\nlevel Warning\ntests/contract_testcases/solana/negative_exponent.sol:6:23-26"]
+	diagnostic_18 [label="conversion to uint256 from rational not allowed\nlevel Error\ntests/contract_testcases/solana/negative_exponent.sol:9:2-20"]
 	contracts -> contract
 	contract -> f [label="function"]
 	f -> returns [label="returns"]
@@ -23,14 +23,14 @@ strict digraph "tests/contract_testcases/solana/negative_exponent.sol" {
 	return -> cast [label="expr"]
 	cast -> add [label="expr"]
 	add -> rational_literal [label="left"]
-	add -> rational_literal_9 [label="right"]
+	add -> rational_literal_8 [label="right"]
 	contract -> g [label="function"]
-	g -> returns_11 [label="returns"]
-	g -> return_12 [label="body"]
-	return_12 -> number_literal [label="expr"]
+	g -> returns_10 [label="returns"]
+	g -> return_11 [label="body"]
+	return_11 -> number_literal [label="expr"]
 	contract -> h [label="function"]
-	h -> returns_15 [label="returns"]
+	h -> returns_14 [label="returns"]
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_18 [label="Warning"]
-	diagnostics -> diagnostic_19 [label="Error"]
+	diagnostics -> diagnostic_17 [label="Warning"]
+	diagnostics -> diagnostic_18 [label="Error"]
 }

Some files were not shown because too many files changed in this diff