Ver código fonte

Ensure that virtual functions in abstract contracts can be called

See https://github.com/hyperledger-labs/solang/issues/780.

This ensure that the contract can be parsed. However, there further
issues with compiling the contract in this issue.

Signed-off-by: Sean Young <sean@mess.org>
Sean Young 3 anos atrás
pai
commit
24b0f04422

+ 2 - 2
src/sema/contracts.rs

@@ -522,10 +522,10 @@ fn check_inheritance(contract_no: usize, ns: &mut ast::Namespace) {
                     continue;
                 }
 
-                // a function without body needs an override, if the contract is not an interface
+                // a function without body needs an override, if the contract is concrete
                 if previous_defs.is_empty()
                     && !cur.has_body
-                    && !ns.contracts[contract_no].is_interface()
+                    && ns.contracts[contract_no].is_concrete()
                 {
                     override_needed
                         .insert(signature.clone(), vec![(base_contract_no, function_no)]);

+ 28 - 0
tests/contract_testcases/solana/abstract_interface.dot

@@ -0,0 +1,28 @@
+strict digraph "tests/contract_testcases/solana/abstract_interface.sol" {
+	contract [label="contract A\ntests/contract_testcases/solana/abstract_interface.sol:1:1-21"]
+	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-4:12"]
+	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"]
+	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-21"]
+	diagnostic_15 [label="found contract 'C'\nlevel Debug\ntests/contract_testcases/solana/abstract_interface.sol:3:2-4:12"]
+	contracts -> contract
+	contract -> v [label="function"]
+	v -> parameters [label="parameters"]
+	contracts -> contract_5
+	contract_5 -> t [label="function"]
+	t -> parameters_7 [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"]
+}

+ 8 - 0
tests/contract_testcases/solana/abstract_interface.sol

@@ -0,0 +1,8 @@
+abstract contract A {
+	function v(int) public virtual;
+}
+contract C {
+	function t(A a) public {
+		a.v(1);
+	}
+}