hyperledger-solang/solang

Override error during sema phase

Opened this issue · 0 comments

The following code is a simplified/minimized version of OpenZeppelin's ERC721 contract:

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.19;

interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

abstract contract ERC165 is IERC165 {
    function supportsInterface(
        bytes4 interfaceId
    ) public view virtual returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

abstract contract ERC721 is ERC165 {
    function supportsInterface(
        bytes4 interfaceId
    ) public view virtual override(ERC165) returns (bool) {
        return interfaceId == interfaceId;
    }
}

This compiles with solc:

$ solc testcase/override_errors/ERC721.sol 
Compiler run successful. No output generated.

but solang_parser fails to parse it:

$ solang_parser testcase/override_errors/ERC721.sol 

=====  Error: testcase/override_errors/ERC721.sol  =====
error: function 'supportsInterface' missing overrides 'IERC165', specify 'override(IERC165,ERC165)'
   ┌─ testcase/override_errors/ERC721.sol:21:27
   │
21 │     ) public view virtual override(ERC165) returns (bool) {
   │                           ^^^^^^^^^^^^^^^^

Further, solang_parser suggests the fix, which I have stored in
testcase/override_errors/ERC721_suggested_fix.sol. solc failes to compile this:

$ solc testcase/override_errors/ERC721_suggested_fix.sol 
Error: Invalid contract specified in override list: "IERC165".
  --> testcase/override_errors/ERC721_suggested_fix.sol:21:27:
   |
21 |     ) public view virtual override(IERC165, ERC165) returns (bool) {
   |                           ^^^^^^^^^^^^^^^^^^^^^^^^^
Note: This contract: 
 --> testcase/override_errors/ERC721_suggested_fix.sol:6:1:
  |
6 | interface IERC165 {
  | ^ (Relevant source part starts here and spans across multiple lines).

but solang_parser successfully parses it.