Sfoglia il codice sorgente

Substrate: concrete contracts must have public or external functions (#999)

* non abstract contracts without public or fallback functions are not allowed in substrate

Signed-off-by: Cyrill Leutwiler <bigcyrill@hotmail.com>
Signed-off-by: Sean Young <sean@mess.org>
Co-authored-by: Sean Young <sean@mess.org>
Co-authored-by: Lucas Steuernagel <38472950+LucasSte@users.noreply.github.com>
Cyrill Leutwiler 3 anni fa
parent
commit
5969d0e52d
100 ha cambiato i file con 271 aggiunte e 140 eliminazioni
  1. 3 3
      src/bin/solang.rs
  2. 2 2
      src/codegen/mod.rs
  3. 2 0
      src/codegen/yul/tests/expression.rs
  4. 1 1
      src/lib.rs
  5. 2 0
      src/sema/ast.rs
  6. 29 0
      src/sema/contracts.rs
  7. 2 2
      src/sema/expression.rs
  8. 1 1
      src/sema/statements.rs
  9. 4 3
      tests/codegen_testcases/solidity/llvm_type.sol
  10. 1 1
      tests/contract.rs
  11. 1 1
      tests/contract_testcases/substrate/arrays/array_dimensions.dot
  12. 1 1
      tests/contract_testcases/substrate/arrays/array_dimensions.sol
  13. 1 1
      tests/contract_testcases/substrate/arrays/array_dimensions_01.dot
  14. 1 1
      tests/contract_testcases/substrate/arrays/array_dimensions_01.sol
  15. 1 1
      tests/contract_testcases/substrate/arrays/array_dimensions_02.dot
  16. 1 1
      tests/contract_testcases/substrate/arrays/array_dimensions_02.sol
  17. 1 1
      tests/contract_testcases/substrate/arrays/array_dimensions_03.dot
  18. 1 1
      tests/contract_testcases/substrate/arrays/array_dimensions_03.sol
  19. 1 1
      tests/contract_testcases/substrate/arrays/array_dimensions_04.dot
  20. 1 1
      tests/contract_testcases/substrate/arrays/array_dimensions_04.sol
  21. 1 1
      tests/contract_testcases/substrate/arrays/data_locations.dot
  22. 1 1
      tests/contract_testcases/substrate/arrays/data_locations.sol
  23. 1 1
      tests/contract_testcases/substrate/contracts/contract_name_01.dot
  24. 1 1
      tests/contract_testcases/substrate/contracts/contract_name_01.sol
  25. 1 1
      tests/contract_testcases/substrate/contracts/contract_name_02.dot
  26. 1 1
      tests/contract_testcases/substrate/contracts/contract_name_02.sol
  27. 1 1
      tests/contract_testcases/substrate/contracts/contract_name_03.dot
  28. 1 1
      tests/contract_testcases/substrate/contracts/contract_name_03.sol
  29. 16 0
      tests/contract_testcases/substrate/contracts/contract_public_functions_01.dot
  30. 7 0
      tests/contract_testcases/substrate/contracts/contract_public_functions_01.sol
  31. 14 0
      tests/contract_testcases/substrate/contracts/contract_public_functions_02.dot
  32. 7 0
      tests/contract_testcases/substrate/contracts/contract_public_functions_02.sol
  33. 32 0
      tests/contract_testcases/substrate/contracts/contract_public_functions_03.dot
  34. 11 0
      tests/contract_testcases/substrate/contracts/contract_public_functions_03.sol
  35. 1 3
      tests/contract_testcases/substrate/events/event_decl.dot
  36. 1 1
      tests/contract_testcases/substrate/events/event_decl.sol
  37. 1 3
      tests/contract_testcases/substrate/events/event_decl_02.dot
  38. 1 1
      tests/contract_testcases/substrate/events/event_decl_02.sol
  39. 1 3
      tests/contract_testcases/substrate/events/event_decl_08.dot
  40. 1 1
      tests/contract_testcases/substrate/events/event_decl_08.sol
  41. 1 3
      tests/contract_testcases/substrate/events/event_decl_10.dot
  42. 1 1
      tests/contract_testcases/substrate/events/event_decl_10.sol
  43. 6 4
      tests/contract_testcases/substrate/events/inherited.dot
  44. 3 1
      tests/contract_testcases/substrate/events/inherited.sol
  45. 1 1
      tests/contract_testcases/substrate/functions/constructors.dot
  46. 1 1
      tests/contract_testcases/substrate/functions/constructors.sol
  47. 1 1
      tests/contract_testcases/substrate/functions/mutability_02.dot
  48. 1 1
      tests/contract_testcases/substrate/functions/mutability_02.sol
  49. 1 1
      tests/contract_testcases/substrate/functions/mutability_04.dot
  50. 1 1
      tests/contract_testcases/substrate/functions/mutability_04.sol
  51. 4 4
      tests/contract_testcases/substrate/functions/stray_semicolon_01.dot
  52. 1 1
      tests/contract_testcases/substrate/functions/stray_semicolon_01.sol
  53. 2 2
      tests/contract_testcases/substrate/inheritance/base_contract.dot
  54. 2 2
      tests/contract_testcases/substrate/inheritance/base_contract.sol
  55. 4 4
      tests/contract_testcases/substrate/inheritance/base_contract_on_constructor.dot
  56. 3 3
      tests/contract_testcases/substrate/inheritance/base_contract_on_constructor.sol
  57. 4 4
      tests/contract_testcases/substrate/inheritance/base_contract_on_constructor_01.dot
  58. 3 3
      tests/contract_testcases/substrate/inheritance/base_contract_on_constructor_01.sol
  59. 1 1
      tests/contract_testcases/substrate/inheritance/base_contract_on_constructor_02.dot
  60. 1 1
      tests/contract_testcases/substrate/inheritance/base_contract_on_constructor_02.sol
  61. 1 1
      tests/contract_testcases/substrate/inheritance/base_contract_on_constructor_03.dot
  62. 1 1
      tests/contract_testcases/substrate/inheritance/base_contract_on_constructor_03.sol
  63. 1 1
      tests/contract_testcases/substrate/inheritance/base_contract_on_constructor_04.dot
  64. 1 1
      tests/contract_testcases/substrate/inheritance/base_contract_on_constructor_04.sol
  65. 1 1
      tests/contract_testcases/substrate/inheritance/base_contract_on_constructor_05.dot
  66. 1 1
      tests/contract_testcases/substrate/inheritance/base_contract_on_constructor_05.sol
  67. 1 1
      tests/contract_testcases/substrate/inheritance/call_inherited_function.dot
  68. 1 1
      tests/contract_testcases/substrate/inheritance/call_inherited_function.sol
  69. 1 1
      tests/contract_testcases/substrate/inheritance/call_inherited_function_01.dot
  70. 1 1
      tests/contract_testcases/substrate/inheritance/call_inherited_function_01.sol
  71. 1 1
      tests/contract_testcases/substrate/inheritance/inherit_types.dot
  72. 1 1
      tests/contract_testcases/substrate/inheritance/inherit_types.sol
  73. 3 3
      tests/contract_testcases/substrate/inheritance/inherit_types_01.dot
  74. 2 2
      tests/contract_testcases/substrate/inheritance/inherit_types_01.sol
  75. 3 3
      tests/contract_testcases/substrate/inheritance/inherit_types_02.dot
  76. 2 2
      tests/contract_testcases/substrate/inheritance/inherit_types_02.sol
  77. 1 1
      tests/contract_testcases/substrate/inheritance/inherit_types_04.dot
  78. 1 1
      tests/contract_testcases/substrate/inheritance/inherit_types_04.sol
  79. 7 5
      tests/contract_testcases/substrate/inheritance/inherit_types_05.dot
  80. 1 1
      tests/contract_testcases/substrate/inheritance/inherit_variables.dot
  81. 1 1
      tests/contract_testcases/substrate/inheritance/inherit_variables.sol
  82. 1 1
      tests/contract_testcases/substrate/inheritance/inherit_variables_01.dot
  83. 1 1
      tests/contract_testcases/substrate/inheritance/inherit_variables_01.sol
  84. 3 3
      tests/contract_testcases/substrate/inheritance/inherit_variables_03.dot
  85. 2 2
      tests/contract_testcases/substrate/inheritance/inherit_variables_03.sol
  86. 1 1
      tests/contract_testcases/substrate/modifier/declare_05.dot
  87. 1 1
      tests/contract_testcases/substrate/modifier/declare_05.sol
  88. 1 1
      tests/contract_testcases/substrate/modifier/declare_06.dot
  89. 1 1
      tests/contract_testcases/substrate/modifier/declare_06.sol
  90. 7 5
      tests/contract_testcases/substrate/modifier/mutability_02.dot
  91. 3 1
      tests/contract_testcases/substrate/primitives/address.dot
  92. 3 1
      tests/contract_testcases/substrate/primitives/address_01.dot
  93. 3 1
      tests/contract_testcases/substrate/primitives/address_02.dot
  94. 3 1
      tests/contract_testcases/substrate/primitives/address_03.dot
  95. 3 1
      tests/contract_testcases/substrate/primitives/address_04.dot
  96. 1 1
      tests/contract_testcases/substrate/primitives/address_05.dot
  97. 1 1
      tests/contract_testcases/substrate/primitives/address_05.sol
  98. 1 1
      tests/contract_testcases/substrate/primitives/address_06.dot
  99. 1 1
      tests/contract_testcases/substrate/primitives/address_06.sol
  100. 1 1
      tests/contract_testcases/substrate/primitives/address_07.dot

+ 3 - 3
src/bin/solang.rs

@@ -427,7 +427,7 @@ fn compile(matches: &ArgMatches) {
                         .iter()
                         .flat_map(|ns| {
                             ns.contracts.iter().filter_map(|contract| {
-                                if contract.is_concrete() {
+                                if contract.instantiable {
                                     Some(contract.name.as_str())
                                 } else {
                                     None
@@ -455,7 +455,7 @@ fn compile(matches: &ArgMatches) {
                     for contract_no in 0..ns.contracts.len() {
                         let contract = &ns.contracts[contract_no];
 
-                        if !contract.is_concrete() {
+                        if !contract.instantiable {
                             continue;
                         }
 
@@ -557,7 +557,7 @@ fn process_file(
     for contract_no in 0..ns.contracts.len() {
         let resolved_contract = &ns.contracts[contract_no];
 
-        if !resolved_contract.is_concrete() {
+        if !resolved_contract.instantiable {
             continue;
         }
 

+ 2 - 2
src/codegen/mod.rs

@@ -121,7 +121,7 @@ pub fn codegen(ns: &mut Namespace, opt: &Options) {
                 continue;
             }
 
-            if !ns.contracts[contract_no].is_concrete() {
+            if !ns.contracts[contract_no].instantiable {
                 contracts_done[contract_no] = true;
                 continue;
             }
@@ -174,7 +174,7 @@ pub fn codegen(ns: &mut Namespace, opt: &Options) {
 }
 
 fn contract(contract_no: usize, ns: &mut Namespace, opt: &Options) {
-    if !ns.diagnostics.any_errors() && ns.contracts[contract_no].is_concrete() {
+    if !ns.diagnostics.any_errors() && ns.contracts[contract_no].instantiable {
         layout(contract_no, ns);
 
         let mut cfg_no = 0;

+ 2 - 0
src/codegen/yul/tests/expression.rs

@@ -135,6 +135,7 @@ fn contract_constant_variable() {
         default_constructor: None,
         cfg: vec![],
         code: vec![],
+        instantiable: true,
     };
     ns.contracts.push(contract);
 
@@ -253,6 +254,7 @@ fn slot_suffix() {
         default_constructor: None,
         cfg: vec![],
         code: vec![],
+        instantiable: true,
     };
     ns.contracts.push(contract);
 

+ 1 - 1
src/lib.rs

@@ -136,7 +136,7 @@ pub fn compile(
     );
 
     let results = (0..ns.contracts.len())
-        .filter(|c| ns.contracts[*c].is_concrete())
+        .filter(|c| ns.contracts[*c].instantiable)
         .map(|c| {
             // codegen has already happened
             assert!(!ns.contracts[c].code.is_empty());

+ 2 - 0
src/sema/ast.rs

@@ -597,6 +597,8 @@ pub struct Contract {
     pub default_constructor: Option<(Function, usize)>,
     pub cfg: Vec<ControlFlowGraph>,
     pub code: Vec<u8>,
+    // Can the contract be instantiated, i.e. not abstract, no errors, etc.
+    pub instantiable: bool,
 }
 
 impl Contract {

+ 29 - 0
src/sema/contracts.rs

@@ -25,6 +25,7 @@ use crate::sema::unused_variable::emit_warning_local_variable;
 impl ast::Contract {
     /// Create a new contract, abstract contract, interface or library
     pub fn new(name: &str, ty: pt::ContractTy, tags: Vec<ast::Tag>, loc: pt::Loc) -> Self {
+        let instantiable = matches!(ty, pt::ContractTy::Contract(_));
         ast::Contract {
             name: name.to_owned(),
             loc,
@@ -45,6 +46,7 @@ impl ast::Contract {
             default_constructor: None,
             cfg: Vec::new(),
             code: Vec::new(),
+            instantiable,
         }
     }
 
@@ -104,6 +106,8 @@ pub fn resolve(
     // Now we have all the declarations, we can handle base contracts
     for (contract_no, _) in contracts {
         check_inheritance(*contract_no, ns);
+
+        substrate_requires_public_functions(*contract_no, ns);
     }
 
     // Now we can resolve the initializers
@@ -694,6 +698,31 @@ fn check_inheritance(contract_no: usize, ns: &mut ast::Namespace) {
     ns.diagnostics.extend(diagnostics);
 }
 
+/// A contract on substrate requires at least one public message
+fn substrate_requires_public_functions(contract_no: usize, ns: &mut ast::Namespace) {
+    let contract = &mut ns.contracts[contract_no];
+
+    if ns.target.is_substrate()
+        && !ns.diagnostics.any_errors()
+        && contract.is_concrete()
+        && !contract.all_functions.keys().any(|func_no| {
+            let func = &ns.functions[*func_no];
+
+            match func.ty {
+                pt::FunctionTy::Function => func.is_public(),
+                pt::FunctionTy::Fallback | pt::FunctionTy::Receive => true,
+                _ => false,
+            }
+        })
+    {
+        let message = format!("contracts without public storage or functions are not allowed on Substrate. Consider declaring this contract abstract: 'abstract contract {}'", contract.name);
+        contract.instantiable = false;
+
+        ns.diagnostics
+            .push(ast::Diagnostic::error(contract.loc, message));
+    }
+}
+
 /// Generate diagnostics if function attributes are not compatible with base function
 fn base_function_compatible(
     base: &ast::Function,

+ 2 - 2
src/sema/expression.rs

@@ -3098,7 +3098,7 @@ fn constructor(
         }
     };
 
-    if !ns.contracts[no].is_concrete() {
+    if !ns.contracts[no].instantiable {
         diagnostics.push(Diagnostic::error(
             *loc,
             format!(
@@ -3296,7 +3296,7 @@ pub fn constructor_named_args(
         }
     };
 
-    if !ns.contracts[no].is_concrete() {
+    if !ns.contracts[no].instantiable {
         diagnostics.push(Diagnostic::error(
             *loc,
             format!(

+ 1 - 1
src/sema/statements.rs

@@ -133,7 +133,7 @@ pub fn resolve_function_body(
             }
         }
 
-        if all_ok && ns.contracts[contract_no].is_concrete() {
+        if all_ok && ns.contracts[contract_no].instantiable {
             for base in &ns.contracts[contract_no].bases {
                 // do we have constructor arguments
                 if base.constructor.is_some() || resolve_bases.contains_key(&base.contract_no) {

+ 4 - 3
tests/codegen_testcases/solidity/llvm_type.sol

@@ -1,8 +1,9 @@
 // RUN: --target substrate --emit cfg
-contract  Ownable  {
+contract Ownable {
+    uint256 public _ext;
 
-// BEGIN-CHECK: Ownable::Ownable::function::_msgData
-    function  _msgData()  internal  view  returns  (bytes  memory)  {
+    // BEGIN-CHECK: Ownable::Ownable::function::_msgData
+    function _msgData() internal view returns (bytes memory) {
         // CHECK: return (builtin Calldata ())
         return msg.data;
     }

+ 1 - 1
tests/contract.rs

@@ -92,7 +92,7 @@ fn parse_file(path: PathBuf, target: Target) -> io::Result<()> {
             }
             Target::Substrate { .. } => {
                 for contract in &ns.contracts {
-                    if contract.is_concrete() {
+                    if contract.instantiable {
                         solang::emit::binary::Binary::build(
                             &context,
                             contract,

+ 1 - 1
tests/contract_testcases/substrate/arrays/array_dimensions.dot

@@ -1,6 +1,6 @@
 strict digraph "tests/contract_testcases/substrate/arrays/array_dimensions.sol" {
 	contract [label="contract foo\ntests/contract_testcases/substrate/arrays/array_dimensions.sol:2:9-4:10"]
-	diagnostic [label="found contract 'foo'\nlevel Debug\ntests/contract_testcases/substrate/arrays/array_dimensions.sol:2:9-4:10"]
+	diagnostic [label="found abstract contract 'foo'\nlevel Debug\ntests/contract_testcases/substrate/arrays/array_dimensions.sol:2:9-4:10"]
 	diagnostic_4 [label="zero size array not permitted\nlevel Error\ntests/contract_testcases/substrate/arrays/array_dimensions.sol:3:18-25"]
 	contracts -> contract
 	diagnostics -> diagnostic [label="Debug"]

+ 1 - 1
tests/contract_testcases/substrate/arrays/array_dimensions.sol

@@ -1,4 +1,4 @@
 
-        contract foo {
+        abstract contract foo {
             bool[10 - 10] x;
         }

+ 1 - 1
tests/contract_testcases/substrate/arrays/array_dimensions_01.dot

@@ -1,6 +1,6 @@
 strict digraph "tests/contract_testcases/substrate/arrays/array_dimensions_01.sol" {
 	contract [label="contract foo\ntests/contract_testcases/substrate/arrays/array_dimensions_01.sol:2:9-4:10"]
-	diagnostic [label="found contract 'foo'\nlevel Debug\ntests/contract_testcases/substrate/arrays/array_dimensions_01.sol:2:9-4:10"]
+	diagnostic [label="found abstract contract 'foo'\nlevel Debug\ntests/contract_testcases/substrate/arrays/array_dimensions_01.sol:2:9-4:10"]
 	diagnostic_4 [label="negative literal -10 not allowed for unsigned type 'uint256'\nlevel Error\ntests/contract_testcases/substrate/arrays/array_dimensions_01.sol:3:18-21"]
 	contracts -> contract
 	diagnostics -> diagnostic [label="Debug"]

+ 1 - 1
tests/contract_testcases/substrate/arrays/array_dimensions_01.sol

@@ -1,4 +1,4 @@
 
-        contract foo {
+        abstract contract foo {
             bool[-10 + 10] x;
         }

+ 1 - 1
tests/contract_testcases/substrate/arrays/array_dimensions_02.dot

@@ -1,6 +1,6 @@
 strict digraph "tests/contract_testcases/substrate/arrays/array_dimensions_02.sol" {
 	contract [label="contract foo\ntests/contract_testcases/substrate/arrays/array_dimensions_02.sol:2:9-4:10"]
-	diagnostic [label="found contract 'foo'\nlevel Debug\ntests/contract_testcases/substrate/arrays/array_dimensions_02.sol:2:9-4:10"]
+	diagnostic [label="found abstract contract 'foo'\nlevel Debug\ntests/contract_testcases/substrate/arrays/array_dimensions_02.sol:2:9-4:10"]
 	diagnostic_4 [label="zero size array not permitted\nlevel Error\ntests/contract_testcases/substrate/arrays/array_dimensions_02.sol:3:18-24"]
 	contracts -> contract
 	diagnostics -> diagnostic [label="Debug"]

+ 1 - 1
tests/contract_testcases/substrate/arrays/array_dimensions_02.sol

@@ -1,4 +1,4 @@
 
-        contract foo {
+        abstract contract foo {
             bool[1 / 10] x;
         }

+ 1 - 1
tests/contract_testcases/substrate/arrays/array_dimensions_03.dot

@@ -1,7 +1,7 @@
 strict digraph "tests/contract_testcases/substrate/arrays/array_dimensions_03.sol" {
 	e [label="name: e\ncontract: foo\ntests/contract_testcases/substrate/arrays/array_dimensions_03.sol:3:13-34\nvalue: e1\nvalue: e2\nvalue: e3"]
 	contract [label="contract foo\ntests/contract_testcases/substrate/arrays/array_dimensions_03.sol:2:9-5:10"]
-	diagnostic [label="found contract 'foo'\nlevel Debug\ntests/contract_testcases/substrate/arrays/array_dimensions_03.sol:2:9-5:10"]
+	diagnostic [label="found abstract contract 'foo'\nlevel Debug\ntests/contract_testcases/substrate/arrays/array_dimensions_03.sol:2:9-5:10"]
 	diagnostic_6 [label="divide by zero\nlevel Error\ntests/contract_testcases/substrate/arrays/array_dimensions_03.sol:4:15-20"]
 	enums -> e
 	contracts -> contract

+ 1 - 1
tests/contract_testcases/substrate/arrays/array_dimensions_03.sol

@@ -1,5 +1,5 @@
 
-        contract foo {
+        abstract contract foo {
             enum e { e1, e2, e3 }
             e[1 / 0] x;
         }

+ 1 - 1
tests/contract_testcases/substrate/arrays/array_dimensions_04.dot

@@ -1,7 +1,7 @@
 strict digraph "tests/contract_testcases/substrate/arrays/array_dimensions_04.sol" {
 	bar [label="name:bar\ncontract: foo\ntests/contract_testcases/substrate/arrays/array_dimensions_04.sol:3:20-23\nfield name:x ty:int32"]
 	contract [label="contract foo\ntests/contract_testcases/substrate/arrays/array_dimensions_04.sol:2:9-7:10"]
-	diagnostic [label="found contract 'foo'\nlevel Debug\ntests/contract_testcases/substrate/arrays/array_dimensions_04.sol:2:9-7:10"]
+	diagnostic [label="found abstract contract 'foo'\nlevel Debug\ntests/contract_testcases/substrate/arrays/array_dimensions_04.sol:2:9-7:10"]
 	diagnostic_6 [label="divide by zero\nlevel Error\ntests/contract_testcases/substrate/arrays/array_dimensions_04.sol:6:17-22"]
 	structs -> bar
 	contracts -> contract

+ 1 - 1
tests/contract_testcases/substrate/arrays/array_dimensions_04.sol

@@ -1,5 +1,5 @@
 
-        contract foo {
+        abstract contract foo {
             struct bar {
                 int32 x;
             }

+ 1 - 1
tests/contract_testcases/substrate/arrays/data_locations.dot

@@ -1,6 +1,6 @@
 strict digraph "tests/contract_testcases/substrate/arrays/data_locations.sol" {
 	contract [label="contract foo\ntests/contract_testcases/substrate/arrays/data_locations.sol:2:9-5:10"]
-	diagnostic [label="found contract 'foo'\nlevel Debug\ntests/contract_testcases/substrate/arrays/data_locations.sol:2:9-5:10"]
+	diagnostic [label="found abstract contract 'foo'\nlevel Debug\ntests/contract_testcases/substrate/arrays/data_locations.sol:2:9-5:10"]
 	diagnostic_4 [label="data location 'storage' can only be specified for array, struct or mapping\nlevel Error\ntests/contract_testcases/substrate/arrays/data_locations.sol:3:31-38"]
 	contracts -> contract
 	diagnostics -> diagnostic [label="Debug"]

+ 1 - 1
tests/contract_testcases/substrate/arrays/data_locations.sol

@@ -1,5 +1,5 @@
 
-        contract foo {
+        abstract contract foo {
             function bar(uint storage) public returns () {
             }
         }

+ 1 - 1
tests/contract_testcases/substrate/contracts/contract_name_01.dot

@@ -1,7 +1,7 @@
 strict digraph "tests/contract_testcases/substrate/contracts/contract_name_01.sol" {
 	test [label="name: test\ncontract: test\ntests/contract_testcases/substrate/contracts/contract_name_01.sol:2:13-27\nvalue: a"]
 	contract [label="contract test\ntests/contract_testcases/substrate/contracts/contract_name_01.sol:1:1-3:10"]
-	diagnostic [label="found contract 'test'\nlevel Debug\ntests/contract_testcases/substrate/contracts/contract_name_01.sol:1:1-3:10"]
+	diagnostic [label="found abstract contract 'test'\nlevel Debug\ntests/contract_testcases/substrate/contracts/contract_name_01.sol:1:1-3:10"]
 	diagnostic_6 [label="test is already defined as a contract name\nlevel Warning\ntests/contract_testcases/substrate/contracts/contract_name_01.sol:2:18-22"]
 	note [label="location of previous definition\ntests/contract_testcases/substrate/contracts/contract_name_01.sol:1:1-3:10"]
 	enums -> test

+ 1 - 1
tests/contract_testcases/substrate/contracts/contract_name_01.sol

@@ -1,3 +1,3 @@
-contract test {
+abstract contract test {
             enum test { a}
         }

+ 1 - 1
tests/contract_testcases/substrate/contracts/contract_name_02.dot

@@ -1,7 +1,7 @@
 strict digraph "tests/contract_testcases/substrate/contracts/contract_name_02.sol" {
 	contract [label="contract test\ntests/contract_testcases/substrate/contracts/contract_name_02.sol:1:1-3:10"]
 	var [label="variable test\nvisibility internal\ntests/contract_testcases/substrate/contracts/contract_name_02.sol:2:13-22"]
-	diagnostic [label="found contract 'test'\nlevel Debug\ntests/contract_testcases/substrate/contracts/contract_name_02.sol:1:1-3:10"]
+	diagnostic [label="found abstract contract 'test'\nlevel Debug\ntests/contract_testcases/substrate/contracts/contract_name_02.sol:1:1-3:10"]
 	diagnostic_5 [label="storage variable 'test' has never been used\nlevel Warning\ntests/contract_testcases/substrate/contracts/contract_name_02.sol:2:13-22"]
 	diagnostic_6 [label="test is already defined as a contract name\nlevel Warning\ntests/contract_testcases/substrate/contracts/contract_name_02.sol:2:18-22"]
 	note [label="location of previous definition\ntests/contract_testcases/substrate/contracts/contract_name_02.sol:1:1-3:10"]

+ 1 - 1
tests/contract_testcases/substrate/contracts/contract_name_02.sol

@@ -1,3 +1,3 @@
-contract test {
+abstract contract test {
             bool test;
         }

+ 1 - 1
tests/contract_testcases/substrate/contracts/contract_name_03.dot

@@ -1,7 +1,7 @@
 strict digraph "tests/contract_testcases/substrate/contracts/contract_name_03.sol" {
 	test [label="name:test\ncontract: test\ntests/contract_testcases/substrate/contracts/contract_name_03.sol:2:20-24\nfield name:a ty:bool"]
 	contract [label="contract test\ntests/contract_testcases/substrate/contracts/contract_name_03.sol:1:1-3:10"]
-	diagnostic [label="found contract 'test'\nlevel Debug\ntests/contract_testcases/substrate/contracts/contract_name_03.sol:1:1-3:10"]
+	diagnostic [label="found abstract contract 'test'\nlevel Debug\ntests/contract_testcases/substrate/contracts/contract_name_03.sol:1:1-3:10"]
 	diagnostic_6 [label="test is already defined as a contract name\nlevel Warning\ntests/contract_testcases/substrate/contracts/contract_name_03.sol:2:20-24"]
 	note [label="location of previous definition\ntests/contract_testcases/substrate/contracts/contract_name_03.sol:1:1-3:10"]
 	structs -> test

+ 1 - 1
tests/contract_testcases/substrate/contracts/contract_name_03.sol

@@ -1,3 +1,3 @@
-contract test {
+abstract contract test {
             struct test { bool a; }
         }

+ 16 - 0
tests/contract_testcases/substrate/contracts/contract_public_functions_01.dot

@@ -0,0 +1,16 @@
+strict digraph "tests/contract_testcases/substrate/contracts/contract_public_functions_01.sol" {
+	contract [label="contract a\ntests/contract_testcases/substrate/contracts/contract_public_functions_01.sol:1:1-3:2"]
+	foo [label="function foo\ncontract: a\ntests/contract_testcases/substrate/contracts/contract_public_functions_01.sol:2:5-32\nsignature foo()\nvisibility private\nmutability pure"]
+	contract_3 [label="contract b\ntests/contract_testcases/substrate/contracts/contract_public_functions_01.sol:4:1-7:2"]
+	foo_4 [label="function foo\ncontract: b\ntests/contract_testcases/substrate/contracts/contract_public_functions_01.sol:6:5-32\nsignature foo()\nvisibility private\nmutability pure"]
+	diagnostic [label="found abstract contract 'a'\nlevel Debug\ntests/contract_testcases/substrate/contracts/contract_public_functions_01.sol:1:1-3:2"]
+	diagnostic_7 [label="found contract 'b'\nlevel Debug\ntests/contract_testcases/substrate/contracts/contract_public_functions_01.sol:4:1-7:2"]
+	diagnostic_8 [label="contracts without public storage or functions are not allowed on Substrate. Consider declaring this contract abstract: 'abstract contract b'\nlevel Error\ntests/contract_testcases/substrate/contracts/contract_public_functions_01.sol:4:1-7:2"]
+	contracts -> contract
+	contract -> foo [label="function"]
+	contracts -> contract_3
+	contract_3 -> foo_4 [label="function"]
+	diagnostics -> diagnostic [label="Debug"]
+	diagnostics -> diagnostic_7 [label="Debug"]
+	diagnostics -> diagnostic_8 [label="Error"]
+}

+ 7 - 0
tests/contract_testcases/substrate/contracts/contract_public_functions_01.sol

@@ -0,0 +1,7 @@
+abstract contract a {
+    function foo() private pure {}
+}
+
+contract b {
+    function foo() private pure {}
+}

+ 14 - 0
tests/contract_testcases/substrate/contracts/contract_public_functions_02.dot

@@ -0,0 +1,14 @@
+strict digraph "tests/contract_testcases/substrate/contracts/contract_public_functions_02.sol" {
+	contract [label="contract a\ntests/contract_testcases/substrate/contracts/contract_public_functions_02.sol:1:1-3:2"]
+	node_2 [label="fallback \ncontract: a\ntests/contract_testcases/substrate/contracts/contract_public_functions_02.sol:2:5-24\nmutability nonpayable"]
+	contract_3 [label="contract b\ntests/contract_testcases/substrate/contracts/contract_public_functions_02.sol:4:1-7:2"]
+	node_4 [label="receive \ncontract: b\ntests/contract_testcases/substrate/contracts/contract_public_functions_02.sol:6:5-31\nmutability payable"]
+	diagnostic [label="found contract 'a'\nlevel Debug\ntests/contract_testcases/substrate/contracts/contract_public_functions_02.sol:1:1-3:2"]
+	diagnostic_7 [label="found contract 'b'\nlevel Debug\ntests/contract_testcases/substrate/contracts/contract_public_functions_02.sol:4:1-7:2"]
+	contracts -> contract
+	contract -> node_2 [label="fallback"]
+	contracts -> contract_3
+	contract_3 -> node_4 [label="receive"]
+	diagnostics -> diagnostic [label="Debug"]
+	diagnostics -> diagnostic_7 [label="Debug"]
+}

+ 7 - 0
tests/contract_testcases/substrate/contracts/contract_public_functions_02.sol

@@ -0,0 +1,7 @@
+contract a {
+    fallback() external {}
+}
+
+contract b {
+    receive() external payable {}
+}

+ 32 - 0
tests/contract_testcases/substrate/contracts/contract_public_functions_03.dot

@@ -0,0 +1,32 @@
+strict digraph "tests/contract_testcases/substrate/contracts/contract_public_functions_03.sol" {
+	contract [label="contract a\ntests/contract_testcases/substrate/contracts/contract_public_functions_03.sol:1:1-3:2"]
+	var [label="variable foo\nvisibility private\ntests/contract_testcases/substrate/contracts/contract_public_functions_03.sol:2:5-24"]
+	contract_3 [label="contract b\ntests/contract_testcases/substrate/contracts/contract_public_functions_03.sol:4:1-7:2"]
+	var_4 [label="variable foo\nvisibility public\ntests/contract_testcases/substrate/contracts/contract_public_functions_03.sol:6:5-23"]
+	foo [label="function foo\ncontract: b\ntests/contract_testcases/substrate/contracts/contract_public_functions_03.sol:6:20-23\nsignature foo()\nvisibility public\nmutability view"]
+	returns [label="returns\nuint256 "]
+	return [label="return\nimplicit"]
+	storage_load [label="storage load uint256\nimplicit"]
+	storage_var [label="storage variable\nb.foo\nuint256 storage\nimplicit"]
+	contract_10 [label="contract c\ntests/contract_testcases/substrate/contracts/contract_public_functions_03.sol:8:1-11:2"]
+	var_11 [label="variable foo\nvisibility private\ntests/contract_testcases/substrate/contracts/contract_public_functions_03.sol:10:5-24"]
+	diagnostic [label="found abstract contract 'a'\nlevel Debug\ntests/contract_testcases/substrate/contracts/contract_public_functions_03.sol:1:1-3:2"]
+	diagnostic_14 [label="found contract 'b'\nlevel Debug\ntests/contract_testcases/substrate/contracts/contract_public_functions_03.sol:4:1-7:2"]
+	diagnostic_15 [label="found contract 'c'\nlevel Debug\ntests/contract_testcases/substrate/contracts/contract_public_functions_03.sol:8:1-11:2"]
+	diagnostic_16 [label="contracts without public storage or functions are not allowed on Substrate. Consider declaring this contract abstract: 'abstract contract c'\nlevel Error\ntests/contract_testcases/substrate/contracts/contract_public_functions_03.sol:8:1-11:2"]
+	contracts -> contract
+	contract -> var [label="variable"]
+	contracts -> contract_3
+	contract_3 -> var_4 [label="variable"]
+	contract_3 -> foo [label="function"]
+	foo -> returns [label="returns"]
+	foo -> return [label="body"]
+	return -> storage_load [label="expr"]
+	storage_load -> storage_var [label="expr"]
+	contracts -> contract_10
+	contract_10 -> var_11 [label="variable"]
+	diagnostics -> diagnostic [label="Debug"]
+	diagnostics -> diagnostic_14 [label="Debug"]
+	diagnostics -> diagnostic_15 [label="Debug"]
+	diagnostics -> diagnostic_16 [label="Error"]
+}

+ 11 - 0
tests/contract_testcases/substrate/contracts/contract_public_functions_03.sol

@@ -0,0 +1,11 @@
+abstract contract a {
+    uint256 private foo;
+}
+
+contract b {
+    uint256 public foo;
+}
+
+contract c {
+    uint256 private foo;
+}

+ 1 - 3
tests/contract_testcases/substrate/events/event_decl.dot

@@ -1,10 +1,8 @@
 strict digraph "tests/contract_testcases/substrate/events/event_decl.sol" {
 	foo [label="name:foo\ncontract: 0\ntests/contract_testcases/substrate/events/event_decl.sol:3:19-22"]
 	contract [label="contract c\ntests/contract_testcases/substrate/events/event_decl.sol:2:9-4:10"]
-	diagnostic [label="found contract 'c'\nlevel Debug\ntests/contract_testcases/substrate/events/event_decl.sol:2:9-4:10"]
-	diagnostic_6 [label="event 'foo' has never been emitted\nlevel Warning\ntests/contract_testcases/substrate/events/event_decl.sol:3:19-22"]
+	diagnostic [label="found abstract contract 'c'\nlevel Debug\ntests/contract_testcases/substrate/events/event_decl.sol:2:9-4:10"]
 	events -> foo
 	contracts -> contract
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_6 [label="Warning"]
 }

+ 1 - 1
tests/contract_testcases/substrate/events/event_decl.sol

@@ -1,4 +1,4 @@
 
-        contract c {
+        abstract contract c {
             event foo ();
         }

+ 1 - 3
tests/contract_testcases/substrate/events/event_decl_02.dot

@@ -2,15 +2,13 @@ strict digraph "tests/contract_testcases/substrate/events/event_decl_02.sol" {
 	e [label="name: e\ntests/contract_testcases/substrate/events/event_decl_02.sol:2:9-22\nvalue: a1"]
 	e_3 [label="name:e\ncontract: 0\ntests/contract_testcases/substrate/events/event_decl_02.sol:4:19-20"]
 	contract [label="contract c\ntests/contract_testcases/substrate/events/event_decl_02.sol:3:9-5:10"]
-	diagnostic [label="found contract 'c'\nlevel Debug\ntests/contract_testcases/substrate/events/event_decl_02.sol:3:9-5:10"]
+	diagnostic [label="found abstract contract 'c'\nlevel Debug\ntests/contract_testcases/substrate/events/event_decl_02.sol:3:9-5:10"]
 	diagnostic_8 [label="e is already defined as an enum\nlevel Warning\ntests/contract_testcases/substrate/events/event_decl_02.sol:4:19-20"]
 	note [label="location of previous definition\ntests/contract_testcases/substrate/events/event_decl_02.sol:2:14-15"]
-	diagnostic_10 [label="event 'e' has never been emitted\nlevel Warning\ntests/contract_testcases/substrate/events/event_decl_02.sol:4:19-20"]
 	enums -> e
 	events -> e_3
 	contracts -> contract
 	diagnostics -> diagnostic [label="Debug"]
 	diagnostics -> diagnostic_8 [label="Warning"]
 	diagnostic_8 -> note [label="note"]
-	diagnostics -> diagnostic_10 [label="Warning"]
 }

+ 1 - 1
tests/contract_testcases/substrate/events/event_decl_02.sol

@@ -1,5 +1,5 @@
 
         enum e { a1 }
-        contract c {
+        abstract contract c {
             event e();
         }

+ 1 - 3
tests/contract_testcases/substrate/events/event_decl_08.dot

@@ -1,10 +1,8 @@
 strict digraph "tests/contract_testcases/substrate/events/event_decl_08.sol" {
 	foo [label="name:foo\ncontract: 0\ntests/contract_testcases/substrate/events/event_decl_08.sol:3:19-22\nfield name:f1 ty:bool indexed:yes\nfield name:f2 ty:bool indexed:yes\nfield name:f3 ty:bool indexed:yes"]
 	contract [label="contract c\ntests/contract_testcases/substrate/events/event_decl_08.sol:2:9-4:10"]
-	diagnostic [label="found contract 'c'\nlevel Debug\ntests/contract_testcases/substrate/events/event_decl_08.sol:2:9-4:10"]
-	diagnostic_6 [label="event 'foo' has never been emitted\nlevel Warning\ntests/contract_testcases/substrate/events/event_decl_08.sol:3:19-22"]
+	diagnostic [label="found abstract contract 'c'\nlevel Debug\ntests/contract_testcases/substrate/events/event_decl_08.sol:2:9-4:10"]
 	events -> foo
 	contracts -> contract
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_6 [label="Warning"]
 }

+ 1 - 1
tests/contract_testcases/substrate/events/event_decl_08.sol

@@ -1,4 +1,4 @@
 
-        contract c {
+        abstract contract c {
             event foo (bool indexed f1, bool indexed f2, bool indexed f3);
         }

+ 1 - 3
tests/contract_testcases/substrate/events/event_decl_10.dot

@@ -1,10 +1,8 @@
 strict digraph "tests/contract_testcases/substrate/events/event_decl_10.sol" {
 	foo [label="name:foo\ncontract: 0\ntests/contract_testcases/substrate/events/event_decl_10.sol:3:19-22\nanonymous\nfield name:f1 ty:bool indexed:yes\nfield name:f2 ty:bool indexed:yes\nfield name:f3 ty:bool indexed:yes\nfield name:f4 ty:bool indexed:yes"]
 	contract [label="contract c\ntests/contract_testcases/substrate/events/event_decl_10.sol:2:9-4:10"]
-	diagnostic [label="found contract 'c'\nlevel Debug\ntests/contract_testcases/substrate/events/event_decl_10.sol:2:9-4:10"]
-	diagnostic_6 [label="event 'foo' has never been emitted\nlevel Warning\ntests/contract_testcases/substrate/events/event_decl_10.sol:3:19-22"]
+	diagnostic [label="found abstract contract 'c'\nlevel Debug\ntests/contract_testcases/substrate/events/event_decl_10.sol:2:9-4:10"]
 	events -> foo
 	contracts -> contract
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_6 [label="Warning"]
 }

+ 1 - 1
tests/contract_testcases/substrate/events/event_decl_10.sol

@@ -1,4 +1,4 @@
 
-        contract c {
+        abstract contract c {
             event foo (bool indexed f1, bool indexed f2, bool indexed f3, bool indexed f4) anonymous;
         }

+ 6 - 4
tests/contract_testcases/substrate/events/inherited.dot

@@ -1,14 +1,15 @@
 strict digraph "tests/contract_testcases/substrate/events/inherited.sol" {
 	foo [label="name:foo\ncontract: 0\ntests/contract_testcases/substrate/events/inherited.sol:3:19-22\nfield name:a ty:bool indexed:no\nfield name:b ty:int256 indexed:no"]
 	contract [label="contract base\ntests/contract_testcases/substrate/events/inherited.sol:2:9-4:10"]
-	contract_4 [label="contract c\ntests/contract_testcases/substrate/events/inherited.sol:6:9-10:10"]
+	contract_4 [label="contract c\ntests/contract_testcases/substrate/events/inherited.sol:6:9-12:10"]
 	base [label="base base\ntests/contract_testcases/substrate/events/inherited.sol:6:23-27"]
 	f [label="function f\ncontract: c\ntests/contract_testcases/substrate/events/inherited.sol:7:13-32\nsignature f()\nvisibility public\nmutability nonpayable"]
 	emit [label="emit\nevent base.foo\ntests/contract_testcases/substrate/events/inherited.sol:8:17-34"]
 	bool_literal [label="bool literal: true\ntests/contract_testcases/substrate/events/inherited.sol:8:26-30"]
 	number_literal [label="int256 literal: 1\ntests/contract_testcases/substrate/events/inherited.sol:8:32-33"]
-	diagnostic [label="found contract 'base'\nlevel Debug\ntests/contract_testcases/substrate/events/inherited.sol:2:9-4:10"]
-	diagnostic_12 [label="found contract 'c'\nlevel Debug\ntests/contract_testcases/substrate/events/inherited.sol:6:9-10:10"]
+	_ext [label="function _ext\ncontract: c\ntests/contract_testcases/substrate/events/inherited.sol:11:13-40\nsignature _ext()\nvisibility public\nmutability pure"]
+	diagnostic [label="found abstract contract 'base'\nlevel Debug\ntests/contract_testcases/substrate/events/inherited.sol:2:9-4:10"]
+	diagnostic_13 [label="found contract 'c'\nlevel Debug\ntests/contract_testcases/substrate/events/inherited.sol:6:9-12:10"]
 	events -> foo
 	contracts -> contract
 	contracts -> contract_4
@@ -17,6 +18,7 @@ strict digraph "tests/contract_testcases/substrate/events/inherited.sol" {
 	f -> emit [label="body"]
 	emit -> bool_literal [label="arg #0"]
 	emit -> number_literal [label="arg #1"]
+	contract_4 -> _ext [label="function"]
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_12 [label="Debug"]
+	diagnostics -> diagnostic_13 [label="Debug"]
 }

+ 3 - 1
tests/contract_testcases/substrate/events/inherited.sol

@@ -1,5 +1,5 @@
 
-        contract base {
+        abstract contract base {
             event foo(bool a, int b);
         }
 
@@ -7,4 +7,6 @@
             function f() public {
                 emit foo(true, 1);
             }
+
+            function _ext() public pure {}
         }

+ 1 - 1
tests/contract_testcases/substrate/functions/constructors.dot

@@ -1,7 +1,7 @@
 strict digraph "tests/contract_testcases/substrate/functions/constructors.sol" {
 	contract [label="contract test\ntests/contract_testcases/substrate/functions/constructors.sol:2:9-4:10"]
 	node_2 [label="constructor \ncontract: test\ntests/contract_testcases/substrate/functions/constructors.sol:3:13-35\nsignature ()\nvisibility public\nmutability nonpayable"]
-	diagnostic [label="found contract 'test'\nlevel Debug\ntests/contract_testcases/substrate/functions/constructors.sol:2:9-4:10"]
+	diagnostic [label="found abstract contract 'test'\nlevel Debug\ntests/contract_testcases/substrate/functions/constructors.sol:2:9-4:10"]
 	diagnostic_5 [label="'internal': visibility for constructors is ignored\nlevel Warning\ntests/contract_testcases/substrate/functions/constructors.sol:3:27-35"]
 	contracts -> contract
 	contract -> node_2 [label="constructor"]

+ 1 - 1
tests/contract_testcases/substrate/functions/constructors.sol

@@ -1,4 +1,4 @@
 
-        contract test {
+        abstract contract test {
             constructor() internal {}
         }

+ 1 - 1
tests/contract_testcases/substrate/functions/mutability_02.dot

@@ -8,7 +8,7 @@ strict digraph "tests/contract_testcases/substrate/functions/mutability_02.sol"
 	subscript [label="subscript int64[] storage\ntests/contract_testcases/substrate/functions/mutability_02.sol:3:24-30"]
 	variable [label="variable: foo\nint64[] storage\ntests/contract_testcases/substrate/functions/mutability_02.sol:3:24-27"]
 	number_literal [label="uint256 literal: 0\ntests/contract_testcases/substrate/functions/mutability_02.sol:3:28-29"]
-	diagnostic [label="found contract 'test'\nlevel Debug\ntests/contract_testcases/substrate/functions/mutability_02.sol:1:1-5:10"]
+	diagnostic [label="found abstract contract 'test'\nlevel Debug\ntests/contract_testcases/substrate/functions/mutability_02.sol:1:1-5:10"]
 	diagnostic_12 [label="function declared 'pure' but this expression reads from state\nlevel Error\ntests/contract_testcases/substrate/functions/mutability_02.sol:3:17-30"]
 	contracts -> contract
 	contract -> bar [label="function"]

+ 1 - 1
tests/contract_testcases/substrate/functions/mutability_02.sol

@@ -1,4 +1,4 @@
-contract test {
+abstract contract test {
             function bar(int64[] storage foo) private pure returns (int64) {
                 return foo[0];
             }

+ 1 - 1
tests/contract_testcases/substrate/functions/mutability_04.dot

@@ -8,7 +8,7 @@ strict digraph "tests/contract_testcases/substrate/functions/mutability_04.sol"
 	variable [label="variable: foo\nint256[] storage\ntests/contract_testcases/substrate/functions/mutability_04.sol:3:17-20"]
 	number_literal [label="uint256 literal: 0\ntests/contract_testcases/substrate/functions/mutability_04.sol:3:21-22"]
 	number_literal_9 [label="int256 literal: 102\ntests/contract_testcases/substrate/functions/mutability_04.sol:3:26-29"]
-	diagnostic [label="found contract 'test'\nlevel Debug\ntests/contract_testcases/substrate/functions/mutability_04.sol:1:1-5:10"]
+	diagnostic [label="found abstract contract 'test'\nlevel Debug\ntests/contract_testcases/substrate/functions/mutability_04.sol:1:1-5:10"]
 	diagnostic_12 [label="function parameter 'foo' has never been read\nlevel Warning\ntests/contract_testcases/substrate/functions/mutability_04.sol:2:40-43"]
 	diagnostic_13 [label="function declared 'view' but this expression writes to state\nlevel Error\ntests/contract_testcases/substrate/functions/mutability_04.sol:3:17-23"]
 	contracts -> contract

+ 1 - 1
tests/contract_testcases/substrate/functions/mutability_04.sol

@@ -1,4 +1,4 @@
-contract test {
+abstract contract test {
             function bar(int[] storage foo) internal view {
                 foo[0] = 102;
             }

+ 4 - 4
tests/contract_testcases/substrate/functions/stray_semicolon_01.dot

@@ -1,8 +1,8 @@
 strict digraph "tests/contract_testcases/substrate/functions/stray_semicolon_01.sol" {
-	a [label="name:a\ncontract: x\ntests/contract_testcases/substrate/functions/stray_semicolon_01.sol:1:21-22\nfield name:f1 ty:uint32"]
-	contract [label="contract x\ntests/contract_testcases/substrate/functions/stray_semicolon_01.sol:1:1-40"]
-	diagnostic [label="found contract 'x'\nlevel Debug\ntests/contract_testcases/substrate/functions/stray_semicolon_01.sol:1:1-40"]
-	diagnostic_6 [label="stray semicolon\nlevel Error\ntests/contract_testcases/substrate/functions/stray_semicolon_01.sol:1:37-38"]
+	a [label="name:a\ncontract: x\ntests/contract_testcases/substrate/functions/stray_semicolon_01.sol:1:30-31\nfield name:f1 ty:uint32"]
+	contract [label="contract x\ntests/contract_testcases/substrate/functions/stray_semicolon_01.sol:1:1-49"]
+	diagnostic [label="found abstract contract 'x'\nlevel Debug\ntests/contract_testcases/substrate/functions/stray_semicolon_01.sol:1:1-49"]
+	diagnostic_6 [label="stray semicolon\nlevel Error\ntests/contract_testcases/substrate/functions/stray_semicolon_01.sol:1:46-47"]
 	structs -> a
 	contracts -> contract
 	diagnostics -> diagnostic [label="Debug"]

+ 1 - 1
tests/contract_testcases/substrate/functions/stray_semicolon_01.sol

@@ -1 +1 @@
-contract x { struct a { uint32 f1; }; }
+abstract contract x { struct a { uint32 f1; }; }

+ 2 - 2
tests/contract_testcases/substrate/inheritance/base_contract.dot

@@ -5,14 +5,14 @@ strict digraph "tests/contract_testcases/substrate/inheritance/base_contract.sol
 	contract_4 [label="contract apex\ntests/contract_testcases/substrate/inheritance/base_contract.sol:6:9-11:10"]
 	base [label="base base\ntests/contract_testcases/substrate/inheritance/base_contract.sol:6:26-30"]
 	node_6 [label="constructor \ncontract: apex\ntests/contract_testcases/substrate/inheritance/base_contract.sol:7:13-27\nsignature ()\nvisibility public\nmutability nonpayable"]
-	foo [label="function foo\ncontract: apex\ntests/contract_testcases/substrate/inheritance/base_contract.sol:8:13-69\nsignature foo(uint64)\nvisibility internal\nmutability nonpayable\nvirtual"]
+	foo [label="function foo\ncontract: apex\ntests/contract_testcases/substrate/inheritance/base_contract.sol:8:13-69\nsignature foo(uint64)\nvisibility external\nmutability nonpayable\nvirtual"]
 	parameters_8 [label="parameters\nuint64 a"]
 	returns [label="returns\nuint64 "]
 	return [label="return\ntests/contract_testcases/substrate/inheritance/base_contract.sol:9:17-31"]
 	add [label="add\nuint64\ntests/contract_testcases/substrate/inheritance/base_contract.sol:9:24-31"]
 	variable [label="variable: a\nuint64\ntests/contract_testcases/substrate/inheritance/base_contract.sol:9:24-25"]
 	number_literal [label="uint64 literal: 102\ntests/contract_testcases/substrate/inheritance/base_contract.sol:9:28-31"]
-	diagnostic [label="found contract 'base'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/base_contract.sol:2:9-4:10"]
+	diagnostic [label="found abstract contract 'base'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/base_contract.sol:2:9-4:10"]
 	diagnostic_16 [label="function parameter 'a' has never been read\nlevel Warning\ntests/contract_testcases/substrate/inheritance/base_contract.sol:3:32-33"]
 	diagnostic_17 [label="found contract 'apex'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/base_contract.sol:6:9-11:10"]
 	diagnostic_18 [label="missing arguments to base contract 'base' constructor\nlevel Error\ntests/contract_testcases/substrate/inheritance/base_contract.sol:6:9-11:10"]

+ 2 - 2
tests/contract_testcases/substrate/inheritance/base_contract.sol

@@ -1,11 +1,11 @@
 
-        contract base {
+        abstract contract base {
             constructor(uint64 a) {}
         }
 
         contract apex is base {
             constructor() {}
-            function foo(uint64 a) virtual internal returns (uint64) {
+            function foo(uint64 a) virtual external returns (uint64) {
                 return a + 102;
             }
         }

+ 4 - 4
tests/contract_testcases/substrate/inheritance/base_contract_on_constructor.dot

@@ -4,11 +4,11 @@ strict digraph "tests/contract_testcases/substrate/inheritance/base_contract_on_
 	contract [label="contract base\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor.sol:2:9-4:10"]
 	contract_5 [label="contract b\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor.sol:6:9-8:10"]
 	contract_6 [label="contract apex\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor.sol:10:9-14:10"]
-	base [label="base base\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor.sol:10:26-30"]
+	base [label="base base\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor.sol:10:35-39"]
 	node_8 [label="constructor \ncontract: apex\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor.sol:11:13-35\nsignature ()\nvisibility public\nmutability nonpayable"]
-	diagnostic [label="found contract 'base'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor.sol:2:9-4:10"]
-	diagnostic_11 [label="found contract 'b'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor.sol:6:9-8:10"]
-	diagnostic_12 [label="found contract 'apex'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor.sol:10:9-14:10"]
+	diagnostic [label="found abstract contract 'base'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor.sol:2:9-4:10"]
+	diagnostic_11 [label="found abstract contract 'b'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor.sol:6:9-8:10"]
+	diagnostic_12 [label="found abstract contract 'apex'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor.sol:10:9-14:10"]
 	diagnostic_13 [label="'public': visibility for constructors is ignored\nlevel Warning\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor.sol:11:27-33"]
 	diagnostic_14 [label="contract 'b' is not a base contract of 'apex'\nlevel Error\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor.sol:11:34-35"]
 	structs -> s

+ 3 - 3
tests/contract_testcases/substrate/inheritance/base_contract_on_constructor.sol

@@ -1,13 +1,13 @@
 
-        contract base {
+        abstract contract base {
             struct s { uint32 f1; }
         }
 
-        contract b {
+        abstract contract b {
             struct s { uint32 f1; }
         }
 
-        contract apex is base {
+        abstract contract apex is base {
             constructor() public b {
 
             }

+ 4 - 4
tests/contract_testcases/substrate/inheritance/base_contract_on_constructor_01.dot

@@ -4,11 +4,11 @@ strict digraph "tests/contract_testcases/substrate/inheritance/base_contract_on_
 	contract [label="contract base\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_01.sol:2:9-4:10"]
 	contract_5 [label="contract b\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_01.sol:6:9-8:10"]
 	contract_6 [label="contract apex\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_01.sol:10:9-14:10"]
-	base [label="base base\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_01.sol:10:26-30"]
+	base [label="base base\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_01.sol:10:35-39"]
 	node_8 [label="constructor \ncontract: apex\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_01.sol:11:13-35\nsignature ()\nvisibility public\nmutability nonpayable"]
-	diagnostic [label="found contract 'base'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_01.sol:2:9-4:10"]
-	diagnostic_11 [label="found contract 'b'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_01.sol:6:9-8:10"]
-	diagnostic_12 [label="found contract 'apex'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_01.sol:10:9-14:10"]
+	diagnostic [label="found abstract contract 'base'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_01.sol:2:9-4:10"]
+	diagnostic_11 [label="found abstract contract 'b'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_01.sol:6:9-8:10"]
+	diagnostic_12 [label="found abstract contract 'apex'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_01.sol:10:9-14:10"]
 	diagnostic_13 [label="'public': visibility for constructors is ignored\nlevel Warning\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_01.sol:11:27-33"]
 	diagnostic_14 [label="contract 'b' is not a base contract of 'apex'\nlevel Error\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_01.sol:11:34-35"]
 	structs -> s

+ 3 - 3
tests/contract_testcases/substrate/inheritance/base_contract_on_constructor_01.sol

@@ -1,13 +1,13 @@
 
-        contract base {
+        abstract contract base {
             struct s { uint32 f1; }
         }
 
-        contract b {
+        abstract contract b {
             struct s { uint32 f1; }
         }
 
-        contract apex is base {
+        abstract contract apex is base {
             constructor() public b {
 
             }

+ 1 - 1
tests/contract_testcases/substrate/inheritance/base_contract_on_constructor_02.dot

@@ -1,7 +1,7 @@
 strict digraph "tests/contract_testcases/substrate/inheritance/base_contract_on_constructor_02.sol" {
 	contract [label="contract apex\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_02.sol:2:9-6:10"]
 	node_2 [label="constructor \ncontract: apex\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_02.sol:3:13-38\nsignature ()\nvisibility public\nmutability nonpayable"]
-	diagnostic [label="found contract 'apex'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_02.sol:2:9-6:10"]
+	diagnostic [label="found abstract contract 'apex'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_02.sol:2:9-6:10"]
 	diagnostic_5 [label="'public': visibility for constructors is ignored\nlevel Warning\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_02.sol:3:27-33"]
 	diagnostic_6 [label="contract 'apex' is not a base contract of 'apex'\nlevel Error\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_02.sol:3:34-38"]
 	contracts -> contract

+ 1 - 1
tests/contract_testcases/substrate/inheritance/base_contract_on_constructor_02.sol

@@ -1,5 +1,5 @@
 
-        contract apex {
+        abstract contract apex {
             constructor() public apex {
 
             }

+ 1 - 1
tests/contract_testcases/substrate/inheritance/base_contract_on_constructor_03.dot

@@ -1,7 +1,7 @@
 strict digraph "tests/contract_testcases/substrate/inheritance/base_contract_on_constructor_03.sol" {
 	contract [label="contract apex\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_03.sol:2:9-6:10"]
 	node_2 [label="constructor \ncontract: apex\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_03.sol:3:13-39\nsignature ()\nvisibility public\nmutability nonpayable"]
-	diagnostic [label="found contract 'apex'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_03.sol:2:9-6:10"]
+	diagnostic [label="found abstract contract 'apex'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_03.sol:2:9-6:10"]
 	diagnostic_5 [label="'oosda' not found\nlevel Error\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_03.sol:3:27-32"]
 	diagnostic_6 [label="'public': visibility for constructors is ignored\nlevel Warning\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_03.sol:3:33-39"]
 	contracts -> contract

+ 1 - 1
tests/contract_testcases/substrate/inheritance/base_contract_on_constructor_03.sol

@@ -1,5 +1,5 @@
 
-        contract apex {
+        abstract contract apex {
             constructor() oosda public {
 
             }

+ 1 - 1
tests/contract_testcases/substrate/inheritance/base_contract_on_constructor_04.dot

@@ -5,7 +5,7 @@ strict digraph "tests/contract_testcases/substrate/inheritance/base_contract_on_
 	contract_4 [label="contract apex\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_04.sol:6:9-8:10"]
 	base [label="base base\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_04.sol:6:26-30"]
 	foo [label="function foo\ncontract: apex\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_04.sol:7:17-43\nsignature foo()\nvisibility public\nmutability pure"]
-	diagnostic [label="found contract 'base'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_04.sol:2:9-4:10"]
+	diagnostic [label="found abstract contract 'base'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_04.sol:2:9-4:10"]
 	diagnostic_9 [label="function parameter 'x' has never been read\nlevel Warning\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_04.sol:3:30-31"]
 	diagnostic_10 [label="found contract 'apex'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_04.sol:6:9-8:10"]
 	diagnostic_11 [label="missing arguments to base contract 'base' constructor\nlevel Error\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_04.sol:6:9-8:10"]

+ 1 - 1
tests/contract_testcases/substrate/inheritance/base_contract_on_constructor_04.sol

@@ -1,5 +1,5 @@
 
-        contract base {
+        abstract contract base {
             constructor(bool x) {}
         }
 

+ 1 - 1
tests/contract_testcases/substrate/inheritance/base_contract_on_constructor_05.dot

@@ -8,7 +8,7 @@ strict digraph "tests/contract_testcases/substrate/inheritance/base_contract_on_
 	base_7 [label="base"]
 	bool_literal [label="bool literal: true\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_05.sol:7:32-36"]
 	foo [label="function foo\ncontract: apex\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_05.sol:8:13-39\nsignature foo()\nvisibility public\nmutability pure"]
-	diagnostic [label="found contract 'base'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_05.sol:2:9-4:10"]
+	diagnostic [label="found abstract contract 'base'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_05.sol:2:9-4:10"]
 	diagnostic_12 [label="function parameter 'x' has never been read\nlevel Warning\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_05.sol:3:30-31"]
 	diagnostic_13 [label="found contract 'apex'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_05.sol:6:9-9:10"]
 	diagnostic_14 [label="duplicate base contract 'base'\nlevel Error\ntests/contract_testcases/substrate/inheritance/base_contract_on_constructor_05.sol:7:38-49"]

+ 1 - 1
tests/contract_testcases/substrate/inheritance/base_contract_on_constructor_05.sol

@@ -1,5 +1,5 @@
 
-        contract base {
+        abstract contract base {
             constructor(bool x) {}
         }
 

+ 1 - 1
tests/contract_testcases/substrate/inheritance/call_inherited_function.dot

@@ -8,7 +8,7 @@ strict digraph "tests/contract_testcases/substrate/inheritance/call_inherited_fu
 	base [label="base base\ntests/contract_testcases/substrate/inheritance/call_inherited_function.sol:8:26-30"]
 	bar [label="function bar\ncontract: apex\ntests/contract_testcases/substrate/inheritance/call_inherited_function.sol:9:13-51\nsignature bar()\nvisibility public\nmutability nonpayable"]
 	returns_9 [label="returns\nuint64 "]
-	diagnostic [label="found contract 'base'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/call_inherited_function.sol:2:9-6:10"]
+	diagnostic [label="found abstract contract 'base'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/call_inherited_function.sol:2:9-6:10"]
 	diagnostic_12 [label="found contract 'apex'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/call_inherited_function.sol:8:9-12:10"]
 	diagnostic_13 [label="cannot call private function\nlevel Error\ntests/contract_testcases/substrate/inheritance/call_inherited_function.sol:10:24-29"]
 	note [label="declaration of function 'foo'\ntests/contract_testcases/substrate/inheritance/call_inherited_function.sol:3:13-52"]

+ 1 - 1
tests/contract_testcases/substrate/inheritance/call_inherited_function.sol

@@ -1,5 +1,5 @@
 
-        contract base {
+        abstract contract base {
             function foo() private returns (uint64) {
                 return 102;
             }

+ 1 - 1
tests/contract_testcases/substrate/inheritance/call_inherited_function_01.dot

@@ -11,7 +11,7 @@ strict digraph "tests/contract_testcases/substrate/inheritance/call_inherited_fu
 	base [label="base base\ntests/contract_testcases/substrate/inheritance/call_inherited_function_01.sol:8:26-30"]
 	bar [label="function bar\ncontract: apex\ntests/contract_testcases/substrate/inheritance/call_inherited_function_01.sol:9:13-51\nsignature bar()\nvisibility public\nmutability nonpayable"]
 	returns_12 [label="returns\nuint64 "]
-	diagnostic [label="found contract 'base'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/call_inherited_function_01.sol:2:9-6:10"]
+	diagnostic [label="found abstract contract 'base'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/call_inherited_function_01.sol:2:9-6:10"]
 	diagnostic_15 [label="found contract 'apex'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/call_inherited_function_01.sol:8:9-12:10"]
 	diagnostic_16 [label="cannot call private function\nlevel Error\ntests/contract_testcases/substrate/inheritance/call_inherited_function_01.sol:10:24-35"]
 	note [label="declaration of function 'foo'\ntests/contract_testcases/substrate/inheritance/call_inherited_function_01.sol:3:13-60"]

+ 1 - 1
tests/contract_testcases/substrate/inheritance/call_inherited_function_01.sol

@@ -1,5 +1,5 @@
 
-        contract base {
+        abstract contract base {
             function foo(uint64 a) private returns (uint64) {
                 return a + 102;
             }

+ 1 - 1
tests/contract_testcases/substrate/inheritance/inherit_types.dot

@@ -9,7 +9,7 @@ strict digraph "tests/contract_testcases/substrate/inheritance/inherit_types.sol
 	contract_9 [label="contract b\ntests/contract_testcases/substrate/inheritance/inherit_types.sol:8:9-10:10"]
 	diagnostic [label="found contract 'a'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/inherit_types.sol:2:9-6:10"]
 	diagnostic_12 [label="function can be declared 'pure'\nlevel Warning\ntests/contract_testcases/substrate/inheritance/inherit_types.sol:3:13-52"]
-	diagnostic_13 [label="found contract 'b'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/inherit_types.sol:8:9-10:10"]
+	diagnostic_13 [label="found abstract contract 'b'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/inherit_types.sol:8:9-10:10"]
 	enums -> enum_x
 	contracts -> contract
 	contract -> base [label="base"]

+ 1 - 1
tests/contract_testcases/substrate/inheritance/inherit_types.sol

@@ -5,7 +5,7 @@
             }
         }
 
-        contract b {
+        abstract contract b {
             enum enum_x { x1, x2 }
         }
         

+ 3 - 3
tests/contract_testcases/substrate/inheritance/inherit_types_01.dot

@@ -12,13 +12,13 @@ strict digraph "tests/contract_testcases/substrate/inheritance/inherit_types_01.
 	return_12 [label="return\ntests/contract_testcases/substrate/inheritance/inherit_types_01.sol:8:17-33"]
 	number_literal_13 [label="enum b.enum_y literal: 1\ntests/contract_testcases/substrate/inheritance/inherit_types_01.sol:8:24-33"]
 	contract_14 [label="contract b\ntests/contract_testcases/substrate/inheritance/inherit_types_01.sol:12:9-14:10"]
-	base_15 [label="base c\ntests/contract_testcases/substrate/inheritance/inherit_types_01.sol:12:23-24"]
+	base_15 [label="base c\ntests/contract_testcases/substrate/inheritance/inherit_types_01.sol:12:32-33"]
 	contract_16 [label="contract c\ntests/contract_testcases/substrate/inheritance/inherit_types_01.sol:16:9-18:10"]
 	diagnostic [label="found contract 'a'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/inherit_types_01.sol:2:9-10:10"]
 	diagnostic_19 [label="function can be declared 'pure'\nlevel Warning\ntests/contract_testcases/substrate/inheritance/inherit_types_01.sol:3:13-52"]
 	diagnostic_20 [label="function can be declared 'pure'\nlevel Warning\ntests/contract_testcases/substrate/inheritance/inherit_types_01.sol:7:13-53"]
-	diagnostic_21 [label="found contract 'b'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/inherit_types_01.sol:12:9-14:10"]
-	diagnostic_22 [label="found contract 'c'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/inherit_types_01.sol:16:9-18:10"]
+	diagnostic_21 [label="found abstract contract 'b'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/inherit_types_01.sol:12:9-14:10"]
+	diagnostic_22 [label="found abstract contract 'c'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/inherit_types_01.sol:16:9-18:10"]
 	enums -> enum_y
 	enums -> enum_x
 	contracts -> contract

+ 2 - 2
tests/contract_testcases/substrate/inheritance/inherit_types_01.sol

@@ -9,11 +9,11 @@
             }
         }
 
-        contract b is c {
+        abstract contract b is c {
             enum enum_y { y1, y2 }
         }
 
-        contract c {
+        abstract contract c {
             enum enum_x { x1, x2 }
         }
         

+ 3 - 3
tests/contract_testcases/substrate/inheritance/inherit_types_02.dot

@@ -13,13 +13,13 @@ strict digraph "tests/contract_testcases/substrate/inheritance/inherit_types_02.
 	return_13 [label="return\ntests/contract_testcases/substrate/inheritance/inherit_types_02.sol:8:17-33"]
 	number_literal_14 [label="enum b.enum_y literal: 1\ntests/contract_testcases/substrate/inheritance/inherit_types_02.sol:8:24-33"]
 	contract_15 [label="contract b\ntests/contract_testcases/substrate/inheritance/inherit_types_02.sol:12:9-14:10"]
-	base_16 [label="base c\ntests/contract_testcases/substrate/inheritance/inherit_types_02.sol:12:23-24"]
+	base_16 [label="base c\ntests/contract_testcases/substrate/inheritance/inherit_types_02.sol:12:32-33"]
 	contract_17 [label="contract c\ntests/contract_testcases/substrate/inheritance/inherit_types_02.sol:16:9-18:10"]
 	diagnostic [label="found contract 'a'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/inherit_types_02.sol:2:9-10:10"]
 	diagnostic_20 [label="function can be declared 'pure'\nlevel Warning\ntests/contract_testcases/substrate/inheritance/inherit_types_02.sol:3:13-52"]
 	diagnostic_21 [label="function can be declared 'pure'\nlevel Warning\ntests/contract_testcases/substrate/inheritance/inherit_types_02.sol:7:13-53"]
-	diagnostic_22 [label="found contract 'b'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/inherit_types_02.sol:12:9-14:10"]
-	diagnostic_23 [label="found contract 'c'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/inherit_types_02.sol:16:9-18:10"]
+	diagnostic_22 [label="found abstract contract 'b'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/inherit_types_02.sol:12:9-14:10"]
+	diagnostic_23 [label="found abstract contract 'c'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/inherit_types_02.sol:16:9-18:10"]
 	enums -> enum_y
 	enums -> enum_x
 	contracts -> contract

+ 2 - 2
tests/contract_testcases/substrate/inheritance/inherit_types_02.sol

@@ -9,11 +9,11 @@
             }
         }
 
-        contract b is c {
+        abstract contract b is c {
             enum enum_y { y1, y2 }
         }
 
-        contract c {
+        abstract contract c {
             enum enum_x { x1, x2 }
         }
         

+ 1 - 1
tests/contract_testcases/substrate/inheritance/inherit_types_04.dot

@@ -10,7 +10,7 @@ strict digraph "tests/contract_testcases/substrate/inheritance/inherit_types_04.
 	storage_var [label="storage variable\na.var1\nstruct b.foo storage\nimplicit"]
 	contract_11 [label="contract b\ntests/contract_testcases/substrate/inheritance/inherit_types_04.sol:6:9-11:10"]
 	diagnostic [label="found contract 'a'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/inherit_types_04.sol:2:9-4:10"]
-	diagnostic_14 [label="found contract 'b'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/inherit_types_04.sol:6:9-11:10"]
+	diagnostic_14 [label="found abstract contract 'b'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/inherit_types_04.sol:6:9-11:10"]
 	structs -> foo
 	contracts -> contract
 	contract -> base [label="base"]

+ 1 - 1
tests/contract_testcases/substrate/inheritance/inherit_types_04.sol

@@ -3,7 +3,7 @@
             foo public var1;
         }
 
-        contract b {
+        abstract contract b {
             struct foo {
                 uint32 f1;
                 uint32 f2;

+ 7 - 5
tests/contract_testcases/substrate/inheritance/inherit_types_05.dot

@@ -9,10 +9,11 @@ strict digraph "tests/contract_testcases/substrate/inheritance/inherit_types_05.
 	test [label="function test\ncontract: a\ntests/contract_testcases/substrate/inheritance/inherit_types_05.sol:14:13-40\nsignature test((uint32,uint32))\nvisibility public\nmutability nonpayable"]
 	parameters [label="parameters\nstruct b.foo x"]
 	diagnostic [label="found contract 'b'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/inherit_types_05.sol:2:9-7:10"]
-	diagnostic_14 [label="already defined 'foo'\nlevel Error\ntests/contract_testcases/substrate/inheritance/inherit_types_05.sol:3:20-23"]
+	diagnostic_14 [label="contracts without public storage or functions are not allowed on Substrate. Consider declaring this contract abstract: 'abstract contract b'\nlevel Error\ntests/contract_testcases/substrate/inheritance/inherit_types_05.sol:2:9-7:10"]
+	diagnostic_15 [label="already defined 'foo'\nlevel Error\ntests/contract_testcases/substrate/inheritance/inherit_types_05.sol:3:20-23"]
 	note [label="previous definition of 'foo'\ntests/contract_testcases/substrate/inheritance/inherit_types_05.sol:10:18-21"]
-	diagnostic_16 [label="found contract 'c'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/inherit_types_05.sol:9:9-11:10"]
-	diagnostic_17 [label="found contract 'a'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/inherit_types_05.sol:13:9-16:10"]
+	diagnostic_17 [label="found contract 'c'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/inherit_types_05.sol:9:9-11:10"]
+	diagnostic_18 [label="found contract 'a'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/inherit_types_05.sol:13:9-16:10"]
 	enums -> foo
 	structs -> foo_3
 	contracts -> contract
@@ -24,7 +25,8 @@ strict digraph "tests/contract_testcases/substrate/inheritance/inherit_types_05.
 	test -> parameters [label="parameters"]
 	diagnostics -> diagnostic [label="Debug"]
 	diagnostics -> diagnostic_14 [label="Error"]
-	diagnostic_14 -> note [label="note"]
-	diagnostics -> diagnostic_16 [label="Debug"]
+	diagnostics -> diagnostic_15 [label="Error"]
+	diagnostic_15 -> note [label="note"]
 	diagnostics -> diagnostic_17 [label="Debug"]
+	diagnostics -> diagnostic_18 [label="Debug"]
 }

+ 1 - 1
tests/contract_testcases/substrate/inheritance/inherit_variables.dot

@@ -8,7 +8,7 @@ strict digraph "tests/contract_testcases/substrate/inheritance/inherit_variables
 	return [label="return\ntests/contract_testcases/substrate/inheritance/inherit_variables.sol:8:17-27"]
 	storage_load [label="storage load int256\ntests/contract_testcases/substrate/inheritance/inherit_variables.sol:8:17-27"]
 	storage_var [label="storage variable\nb.foo\nint256 storage\ntests/contract_testcases/substrate/inheritance/inherit_variables.sol:8:24-27"]
-	diagnostic [label="found contract 'b'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/inherit_variables.sol:2:9-4:10"]
+	diagnostic [label="found abstract contract 'b'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/inherit_variables.sol:2:9-4:10"]
 	diagnostic_12 [label="found contract 'c'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/inherit_variables.sol:6:9-10:10"]
 	diagnostic_13 [label="function can be declared 'view'\nlevel Warning\ntests/contract_testcases/substrate/inheritance/inherit_variables.sol:7:13-51"]
 	contracts -> contract

+ 1 - 1
tests/contract_testcases/substrate/inheritance/inherit_variables.sol

@@ -1,5 +1,5 @@
 
-        contract b {
+        abstract contract b {
             int foo;
         }
 

+ 1 - 1
tests/contract_testcases/substrate/inheritance/inherit_variables_01.dot

@@ -5,7 +5,7 @@ strict digraph "tests/contract_testcases/substrate/inheritance/inherit_variables
 	base [label="base b\ntests/contract_testcases/substrate/inheritance/inherit_variables_01.sol:6:23-24"]
 	getFoo [label="function getFoo\ncontract: c\ntests/contract_testcases/substrate/inheritance/inherit_variables_01.sol:7:13-51\nsignature getFoo()\nvisibility public\nmutability nonpayable"]
 	returns [label="returns\nint256 "]
-	diagnostic [label="found contract 'b'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/inherit_variables_01.sol:2:9-4:10"]
+	diagnostic [label="found abstract contract 'b'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/inherit_variables_01.sol:2:9-4:10"]
 	diagnostic_9 [label="found contract 'c'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/inherit_variables_01.sol:6:9-10:10"]
 	diagnostic_10 [label="'foo' not found\nlevel Error\ntests/contract_testcases/substrate/inheritance/inherit_variables_01.sol:8:24-27"]
 	contracts -> contract

+ 1 - 1
tests/contract_testcases/substrate/inheritance/inherit_variables_01.sol

@@ -1,5 +1,5 @@
 
-        contract b {
+        abstract contract b {
             int private foo;
         }
 

+ 3 - 3
tests/contract_testcases/substrate/inheritance/inherit_variables_03.dot

@@ -2,7 +2,7 @@ strict digraph "tests/contract_testcases/substrate/inheritance/inherit_variables
 	contract [label="contract a\ntests/contract_testcases/substrate/inheritance/inherit_variables_03.sol:2:9-4:10"]
 	var [label="variable foo\nvisibility private\ntests/contract_testcases/substrate/inheritance/inherit_variables_03.sol:3:13-28"]
 	contract_3 [label="contract b\ntests/contract_testcases/substrate/inheritance/inherit_variables_03.sol:6:9-8:10"]
-	base [label="base a\ntests/contract_testcases/substrate/inheritance/inherit_variables_03.sol:6:23-24"]
+	base [label="base a\ntests/contract_testcases/substrate/inheritance/inherit_variables_03.sol:6:32-33"]
 	var_5 [label="variable foo\nvisibility public\ntests/contract_testcases/substrate/inheritance/inherit_variables_03.sol:7:13-27"]
 	foo [label="function foo\ncontract: b\ntests/contract_testcases/substrate/inheritance/inherit_variables_03.sol:7:24-27\nsignature foo()\nvisibility public\nmutability view"]
 	returns [label="returns\nint256 "]
@@ -16,9 +16,9 @@ strict digraph "tests/contract_testcases/substrate/inheritance/inherit_variables
 	return_15 [label="return\ntests/contract_testcases/substrate/inheritance/inherit_variables_03.sol:12:17-27"]
 	storage_load_16 [label="storage load int256\ntests/contract_testcases/substrate/inheritance/inherit_variables_03.sol:12:17-27"]
 	storage_var_17 [label="storage variable\nb.foo\nint256 storage\ntests/contract_testcases/substrate/inheritance/inherit_variables_03.sol:12:24-27"]
-	diagnostic [label="found contract 'a'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/inherit_variables_03.sol:2:9-4:10"]
+	diagnostic [label="found abstract contract 'a'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/inherit_variables_03.sol:2:9-4:10"]
 	diagnostic_20 [label="storage variable 'foo' has never been used\nlevel Warning\ntests/contract_testcases/substrate/inheritance/inherit_variables_03.sol:3:13-28"]
-	diagnostic_21 [label="found contract 'b'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/inherit_variables_03.sol:6:9-8:10"]
+	diagnostic_21 [label="found abstract contract 'b'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/inherit_variables_03.sol:6:9-8:10"]
 	diagnostic_22 [label="found contract 'c'\nlevel Debug\ntests/contract_testcases/substrate/inheritance/inherit_variables_03.sol:10:9-14:10"]
 	diagnostic_23 [label="function can be declared 'view'\nlevel Warning\ntests/contract_testcases/substrate/inheritance/inherit_variables_03.sol:11:13-51"]
 	contracts -> contract

+ 2 - 2
tests/contract_testcases/substrate/inheritance/inherit_variables_03.sol

@@ -1,9 +1,9 @@
 
-        contract a {
+        abstract contract a {
             int private foo;
         }
 
-        contract b is a {
+        abstract contract b is a {
             int public foo;
         }
 

+ 1 - 1
tests/contract_testcases/substrate/modifier/declare_05.dot

@@ -1,7 +1,7 @@
 strict digraph "tests/contract_testcases/substrate/modifier/declare_05.sol" {
 	contract [label="contract c\ntests/contract_testcases/substrate/modifier/declare_05.sol:2:9-4:10"]
 	foo [label="modifier foo\ncontract: c\ntests/contract_testcases/substrate/modifier/declare_05.sol:3:13-28\nmutability nonpayable"]
-	diagnostic [label="found contract 'c'\nlevel Debug\ntests/contract_testcases/substrate/modifier/declare_05.sol:2:9-4:10"]
+	diagnostic [label="found abstract contract 'c'\nlevel Debug\ntests/contract_testcases/substrate/modifier/declare_05.sol:2:9-4:10"]
 	diagnostic_5 [label="missing '_' in modifier\nlevel Error\ntests/contract_testcases/substrate/modifier/declare_05.sol:3:30"]
 	contracts -> contract
 	contract -> foo [label="modifier"]

+ 1 - 1
tests/contract_testcases/substrate/modifier/declare_05.sol

@@ -1,4 +1,4 @@
 
-        contract c {
+        abstract contract c {
             modifier foo() {}
         }

+ 1 - 1
tests/contract_testcases/substrate/modifier/declare_06.dot

@@ -7,7 +7,7 @@ strict digraph "tests/contract_testcases/substrate/modifier/declare_06.sol" {
 	while [label="while\ntests/contract_testcases/substrate/modifier/declare_06.sol:5:21-7:22"]
 	variable [label="variable: x\nbool\ntests/contract_testcases/substrate/modifier/declare_06.sol:5:28-29"]
 	underscore [label="undersore\ntests/contract_testcases/substrate/modifier/declare_06.sol:6:25-26"]
-	diagnostic [label="found contract 'c'\nlevel Debug\ntests/contract_testcases/substrate/modifier/declare_06.sol:2:9-10:10"]
+	diagnostic [label="found abstract contract 'c'\nlevel Debug\ntests/contract_testcases/substrate/modifier/declare_06.sol:2:9-10:10"]
 	contracts -> contract
 	contract -> foo [label="modifier"]
 	foo -> parameters [label="parameters"]

+ 1 - 1
tests/contract_testcases/substrate/modifier/declare_06.sol

@@ -1,5 +1,5 @@
 
-        contract c {
+        abstract contract c {
             modifier foo(bool x) {
                 if (true) {
                     while (x) {

+ 7 - 5
tests/contract_testcases/substrate/modifier/mutability_02.dot

@@ -6,8 +6,9 @@ strict digraph "tests/contract_testcases/substrate/modifier/mutability_02.sol" {
 	base [label="base base\ntests/contract_testcases/substrate/modifier/mutability_02.sol:8:26-30"]
 	foo_6 [label="function foo\ncontract: apex\ntests/contract_testcases/substrate/modifier/mutability_02.sol:9:13-43\nsignature foo()\nvisibility public\nmutability nonpayable\noverride"]
 	diagnostic [label="found contract 'base'\nlevel Debug\ntests/contract_testcases/substrate/modifier/mutability_02.sol:2:9-6:10"]
-	diagnostic_9 [label="found contract 'apex'\nlevel Debug\ntests/contract_testcases/substrate/modifier/mutability_02.sol:8:9-10:10"]
-	diagnostic_10 [label="function 'foo' overrides modifier\nlevel Error\ntests/contract_testcases/substrate/modifier/mutability_02.sol:9:13-43"]
+	diagnostic_9 [label="contracts without public storage or functions are not allowed on Substrate. Consider declaring this contract abstract: 'abstract contract base'\nlevel Error\ntests/contract_testcases/substrate/modifier/mutability_02.sol:2:9-6:10"]
+	diagnostic_10 [label="found contract 'apex'\nlevel Debug\ntests/contract_testcases/substrate/modifier/mutability_02.sol:8:9-10:10"]
+	diagnostic_11 [label="function 'foo' overrides modifier\nlevel Error\ntests/contract_testcases/substrate/modifier/mutability_02.sol:9:13-43"]
 	note [label="previous definition of 'foo'\ntests/contract_testcases/substrate/modifier/mutability_02.sol:3:13-35"]
 	contracts -> contract
 	contract -> foo [label="modifier"]
@@ -16,7 +17,8 @@ strict digraph "tests/contract_testcases/substrate/modifier/mutability_02.sol" {
 	contract_4 -> base [label="base"]
 	contract_4 -> foo_6 [label="function"]
 	diagnostics -> diagnostic [label="Debug"]
-	diagnostics -> diagnostic_9 [label="Debug"]
-	diagnostics -> diagnostic_10 [label="Error"]
-	diagnostic_10 -> note [label="note"]
+	diagnostics -> diagnostic_9 [label="Error"]
+	diagnostics -> diagnostic_10 [label="Debug"]
+	diagnostics -> diagnostic_11 [label="Error"]
+	diagnostic_11 -> note [label="note"]
 }

+ 3 - 1
tests/contract_testcases/substrate/primitives/address.dot

@@ -2,9 +2,11 @@ strict digraph "tests/contract_testcases/substrate/primitives/address.sol" {
 	contract [label="contract test\ntests/contract_testcases/substrate/primitives/address.sol:1:1-3:10"]
 	var [label="variable foo\nvisibility internal\ntests/contract_testcases/substrate/primitives/address.sol:2:13-51"]
 	diagnostic [label="found contract 'test'\nlevel Debug\ntests/contract_testcases/substrate/primitives/address.sol:1:1-3:10"]
-	diagnostic_5 [label="expected 'address', found integer\nlevel Error\ntests/contract_testcases/substrate/primitives/address.sol:2:28-51"]
+	diagnostic_5 [label="contracts without public storage or functions are not allowed on Substrate. Consider declaring this contract abstract: 'abstract contract test'\nlevel Error\ntests/contract_testcases/substrate/primitives/address.sol:1:1-3:10"]
+	diagnostic_6 [label="expected 'address', found integer\nlevel Error\ntests/contract_testcases/substrate/primitives/address.sol:2:28-51"]
 	contracts -> contract
 	contract -> var [label="variable"]
 	diagnostics -> diagnostic [label="Debug"]
 	diagnostics -> diagnostic_5 [label="Error"]
+	diagnostics -> diagnostic_6 [label="Error"]
 }

+ 3 - 1
tests/contract_testcases/substrate/primitives/address_01.dot

@@ -2,9 +2,11 @@ strict digraph "tests/contract_testcases/substrate/primitives/address_01.sol" {
 	contract [label="contract test\ntests/contract_testcases/substrate/primitives/address_01.sol:1:1-3:10"]
 	var [label="variable foo\nvisibility internal\ntests/contract_testcases/substrate/primitives/address_01.sol:2:13-93"]
 	diagnostic [label="found contract 'test'\nlevel Debug\ntests/contract_testcases/substrate/primitives/address_01.sol:1:1-3:10"]
-	diagnostic_5 [label="expected 'address', found integer\nlevel Error\ntests/contract_testcases/substrate/primitives/address_01.sol:2:27-93"]
+	diagnostic_5 [label="contracts without public storage or functions are not allowed on Substrate. Consider declaring this contract abstract: 'abstract contract test'\nlevel Error\ntests/contract_testcases/substrate/primitives/address_01.sol:1:1-3:10"]
+	diagnostic_6 [label="expected 'address', found integer\nlevel Error\ntests/contract_testcases/substrate/primitives/address_01.sol:2:27-93"]
 	contracts -> contract
 	contract -> var [label="variable"]
 	diagnostics -> diagnostic [label="Debug"]
 	diagnostics -> diagnostic_5 [label="Error"]
+	diagnostics -> diagnostic_6 [label="Error"]
 }

+ 3 - 1
tests/contract_testcases/substrate/primitives/address_02.dot

@@ -2,9 +2,11 @@ strict digraph "tests/contract_testcases/substrate/primitives/address_02.sol" {
 	contract [label="contract test\ntests/contract_testcases/substrate/primitives/address_02.sol:1:1-3:10"]
 	var [label="variable foo\nvisibility internal\ntests/contract_testcases/substrate/primitives/address_02.sol:2:13-83"]
 	diagnostic [label="found contract 'test'\nlevel Debug\ntests/contract_testcases/substrate/primitives/address_02.sol:1:1-3:10"]
-	diagnostic_5 [label="address literal 5GBWmgdFAMqm8ZgAHGobqDqX6tjLxJhv53ygjNtaaAn3sje incorrect length of 34\nlevel Error\ntests/contract_testcases/substrate/primitives/address_02.sol:2:27-83"]
+	diagnostic_5 [label="contracts without public storage or functions are not allowed on Substrate. Consider declaring this contract abstract: 'abstract contract test'\nlevel Error\ntests/contract_testcases/substrate/primitives/address_02.sol:1:1-3:10"]
+	diagnostic_6 [label="address literal 5GBWmgdFAMqm8ZgAHGobqDqX6tjLxJhv53ygjNtaaAn3sje incorrect length of 34\nlevel Error\ntests/contract_testcases/substrate/primitives/address_02.sol:2:27-83"]
 	contracts -> contract
 	contract -> var [label="variable"]
 	diagnostics -> diagnostic [label="Debug"]
 	diagnostics -> diagnostic_5 [label="Error"]
+	diagnostics -> diagnostic_6 [label="Error"]
 }

+ 3 - 1
tests/contract_testcases/substrate/primitives/address_03.dot

@@ -2,9 +2,11 @@ strict digraph "tests/contract_testcases/substrate/primitives/address_03.sol" {
 	contract [label="contract test\ntests/contract_testcases/substrate/primitives/address_03.sol:1:1-3:10"]
 	var [label="variable foo\nvisibility internal\ntests/contract_testcases/substrate/primitives/address_03.sol:2:13-84"]
 	diagnostic [label="found contract 'test'\nlevel Debug\ntests/contract_testcases/substrate/primitives/address_03.sol:1:1-3:10"]
-	diagnostic_5 [label="address literal 5GBWmgdFAMqm8ZgAHGobqDqX6tjLxJhv53ygjNtaaAn3sj%Z invalid character '%'\nlevel Error\ntests/contract_testcases/substrate/primitives/address_03.sol:2:73"]
+	diagnostic_5 [label="contracts without public storage or functions are not allowed on Substrate. Consider declaring this contract abstract: 'abstract contract test'\nlevel Error\ntests/contract_testcases/substrate/primitives/address_03.sol:1:1-3:10"]
+	diagnostic_6 [label="address literal 5GBWmgdFAMqm8ZgAHGobqDqX6tjLxJhv53ygjNtaaAn3sj%Z invalid character '%'\nlevel Error\ntests/contract_testcases/substrate/primitives/address_03.sol:2:73"]
 	contracts -> contract
 	contract -> var [label="variable"]
 	diagnostics -> diagnostic [label="Debug"]
 	diagnostics -> diagnostic_5 [label="Error"]
+	diagnostics -> diagnostic_6 [label="Error"]
 }

+ 3 - 1
tests/contract_testcases/substrate/primitives/address_04.dot

@@ -2,9 +2,11 @@ strict digraph "tests/contract_testcases/substrate/primitives/address_04.sol" {
 	contract [label="contract test\ntests/contract_testcases/substrate/primitives/address_04.sol:1:1-3:10"]
 	var [label="variable foo\nvisibility internal\ntests/contract_testcases/substrate/primitives/address_04.sol:2:13-84"]
 	diagnostic [label="found contract 'test'\nlevel Debug\ntests/contract_testcases/substrate/primitives/address_04.sol:1:1-3:10"]
-	diagnostic_5 [label="address literal 5GBWmgdFAMqm8ZgAHGobqDqX6tjLxJhv53ygjNtaaAn3sjZZ hash incorrect checksum\nlevel Error\ntests/contract_testcases/substrate/primitives/address_04.sol:2:27-84"]
+	diagnostic_5 [label="contracts without public storage or functions are not allowed on Substrate. Consider declaring this contract abstract: 'abstract contract test'\nlevel Error\ntests/contract_testcases/substrate/primitives/address_04.sol:1:1-3:10"]
+	diagnostic_6 [label="address literal 5GBWmgdFAMqm8ZgAHGobqDqX6tjLxJhv53ygjNtaaAn3sjZZ hash incorrect checksum\nlevel Error\ntests/contract_testcases/substrate/primitives/address_04.sol:2:27-84"]
 	contracts -> contract
 	contract -> var [label="variable"]
 	diagnostics -> diagnostic [label="Debug"]
 	diagnostics -> diagnostic_5 [label="Error"]
+	diagnostics -> diagnostic_6 [label="Error"]
 }

+ 1 - 1
tests/contract_testcases/substrate/primitives/address_05.dot

@@ -2,7 +2,7 @@ strict digraph "tests/contract_testcases/substrate/primitives/address_05.sol" {
 	contract [label="contract test\ntests/contract_testcases/substrate/primitives/address_05.sol:1:1-3:10"]
 	var [label="variable foo\nvisibility internal\ntests/contract_testcases/substrate/primitives/address_05.sol:2:13-84"]
 	number_literal [label="address literal: 82381599652983064627748031644048006099156261489258002493031233701766405061660\ntests/contract_testcases/substrate/primitives/address_05.sol:2:27-84"]
-	diagnostic [label="found contract 'test'\nlevel Debug\ntests/contract_testcases/substrate/primitives/address_05.sol:1:1-3:10"]
+	diagnostic [label="found abstract contract 'test'\nlevel Debug\ntests/contract_testcases/substrate/primitives/address_05.sol:1:1-3:10"]
 	diagnostic_6 [label="storage variable 'foo' has been assigned, but never read\nlevel Warning\ntests/contract_testcases/substrate/primitives/address_05.sol:2:13-84"]
 	contracts -> contract
 	contract -> var [label="variable"]

+ 1 - 1
tests/contract_testcases/substrate/primitives/address_05.sol

@@ -1,3 +1,3 @@
-contract test {
+abstract contract test {
             address foo = address"5GBWmgdFAMqm8ZgAHGobqDqX6tjLxJhv53ygjNtaaAn3sjeZ";
         }

+ 1 - 1
tests/contract_testcases/substrate/primitives/address_06.dot

@@ -9,7 +9,7 @@ strict digraph "tests/contract_testcases/substrate/primitives/address_06.sol" {
 	storage_load [label="storage load address\ntests/contract_testcases/substrate/primitives/address_06.sol:5:24-27"]
 	storage_var [label="storage variable\ntest.foo\naddress storage\ntests/contract_testcases/substrate/primitives/address_06.sol:5:24-27"]
 	number_literal_10 [label="address literal: 0\ntests/contract_testcases/substrate/primitives/address_06.sol:5:30-40"]
-	diagnostic [label="found contract 'test'\nlevel Debug\ntests/contract_testcases/substrate/primitives/address_06.sol:1:1-7:10"]
+	diagnostic [label="found abstract contract 'test'\nlevel Debug\ntests/contract_testcases/substrate/primitives/address_06.sol:1:1-7:10"]
 	diagnostic_13 [label="function can be declared 'view'\nlevel Warning\ntests/contract_testcases/substrate/primitives/address_06.sol:4:13-50"]
 	contracts -> contract
 	contract -> var [label="variable"]

+ 1 - 1
tests/contract_testcases/substrate/primitives/address_06.sol

@@ -1,4 +1,4 @@
-contract test {
+abstract contract test {
             address foo = address(0xA368dF6DFCD5Ba7b0BC108AF09e98E4655e35A2c3B2e2D5E3Eae6c6f7CD8D2D4);
 
             function bar() private returns (bool) {

+ 1 - 1
tests/contract_testcases/substrate/primitives/address_07.dot

@@ -4,7 +4,7 @@ strict digraph "tests/contract_testcases/substrate/primitives/address_07.sol" {
 	number_literal [label="address literal: 73912288468505514571274555706341599852387757617254816049584905325248786256596\ntests/contract_testcases/substrate/primitives/address_07.sol:2:27-102"]
 	bar [label="function bar\ncontract: test\ntests/contract_testcases/substrate/primitives/address_07.sol:4:13-53\nsignature bar()\nvisibility private\nmutability nonpayable"]
 	returns [label="returns\naddress "]
-	diagnostic [label="found contract 'test'\nlevel Debug\ntests/contract_testcases/substrate/primitives/address_07.sol:1:1-7:10"]
+	diagnostic [label="found abstract contract 'test'\nlevel Debug\ntests/contract_testcases/substrate/primitives/address_07.sol:1:1-7:10"]
 	diagnostic_8 [label="expression of type address not allowed\nlevel Error\ntests/contract_testcases/substrate/primitives/address_07.sol:5:24-27"]
 	contracts -> contract
 	contract -> var [label="variable"]

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