mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Fix #10155 - remove warning about free fucntion shadowing of interface function
This commit is contained in:
parent
dc7cda18f0
commit
35fb4990dd
@ -123,7 +123,11 @@ bool DeclarationContainer::registerDeclaration(
|
|||||||
if (conflictingDeclaration(_declaration, _name))
|
if (conflictingDeclaration(_declaration, _name))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (m_enclosingContainer && _declaration.isVisibleAsUnqualifiedName())
|
if (
|
||||||
|
m_enclosingContainer &&
|
||||||
|
_declaration.isVisibleAsUnqualifiedName() &&
|
||||||
|
!_declaration.isParentInterface()
|
||||||
|
)
|
||||||
m_homonymCandidates.emplace_back(*_name, _location ? _location : &_declaration.location());
|
m_homonymCandidates.emplace_back(*_name, _location ? _location : &_declaration.location());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,6 +114,9 @@ public:
|
|||||||
///@todo make this const-safe by providing a different way to access the annotation
|
///@todo make this const-safe by providing a different way to access the annotation
|
||||||
virtual ASTAnnotation& annotation() const;
|
virtual ASTAnnotation& annotation() const;
|
||||||
|
|
||||||
|
/// Whether this node is a child of Interface contract.
|
||||||
|
virtual bool isParentInterface() const { return false; }
|
||||||
|
|
||||||
///@{
|
///@{
|
||||||
///@name equality operators
|
///@name equality operators
|
||||||
/// Equality relies on the fact that nodes cannot be copied.
|
/// Equality relies on the fact that nodes cannot be copied.
|
||||||
@ -956,7 +959,8 @@ public:
|
|||||||
ASTPointer<ParameterList> const& _parameters,
|
ASTPointer<ParameterList> const& _parameters,
|
||||||
std::vector<ASTPointer<ModifierInvocation>> _modifiers,
|
std::vector<ASTPointer<ModifierInvocation>> _modifiers,
|
||||||
ASTPointer<ParameterList> const& _returnParameters,
|
ASTPointer<ParameterList> const& _returnParameters,
|
||||||
ASTPointer<Block> const& _body
|
ASTPointer<Block> const& _body,
|
||||||
|
bool _isParentInterface
|
||||||
):
|
):
|
||||||
CallableDeclaration(_id, _location, _name, _nameLocation, _visibility, _parameters, _isVirtual, _overrides, _returnParameters),
|
CallableDeclaration(_id, _location, _name, _nameLocation, _visibility, _parameters, _isVirtual, _overrides, _returnParameters),
|
||||||
StructurallyDocumented(_documentation),
|
StructurallyDocumented(_documentation),
|
||||||
@ -965,7 +969,8 @@ public:
|
|||||||
m_free(_free),
|
m_free(_free),
|
||||||
m_kind(_kind),
|
m_kind(_kind),
|
||||||
m_functionModifiers(std::move(_modifiers)),
|
m_functionModifiers(std::move(_modifiers)),
|
||||||
m_body(_body)
|
m_body(_body),
|
||||||
|
m_isParentInterface(_isParentInterface)
|
||||||
{
|
{
|
||||||
solAssert(_kind == Token::Constructor || _kind == Token::Function || _kind == Token::Fallback || _kind == Token::Receive, "");
|
solAssert(_kind == Token::Constructor || _kind == Token::Function || _kind == Token::Fallback || _kind == Token::Receive, "");
|
||||||
solAssert(isOrdinary() == !name().empty(), "");
|
solAssert(isOrdinary() == !name().empty(), "");
|
||||||
@ -1026,12 +1031,16 @@ public:
|
|||||||
ContractDefinition const* _searchStart = nullptr
|
ContractDefinition const* _searchStart = nullptr
|
||||||
) const override;
|
) const override;
|
||||||
|
|
||||||
|
/// Whether this node is a child of Interface contract.
|
||||||
|
bool isParentInterface() const override { return m_isParentInterface; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
StateMutability m_stateMutability;
|
StateMutability m_stateMutability;
|
||||||
bool m_free;
|
bool m_free;
|
||||||
Token const m_kind;
|
Token const m_kind;
|
||||||
std::vector<ASTPointer<ModifierInvocation>> m_functionModifiers;
|
std::vector<ASTPointer<ModifierInvocation>> m_functionModifiers;
|
||||||
ASTPointer<Block> m_body;
|
ASTPointer<Block> m_body;
|
||||||
|
bool m_isParentInterface;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -132,16 +132,17 @@ SourceLocation ASTJsonImporter::createValueNameSourceLocation(Json::Value const&
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
ASTPointer<T> ASTJsonImporter::convertJsonToASTNode(Json::Value const& _node)
|
ASTPointer<T> ASTJsonImporter::convertJsonToASTNode(Json::Value const& _node, bool _isParentInterface)
|
||||||
{
|
{
|
||||||
ASTPointer<T> ret = dynamic_pointer_cast<T>(convertJsonToASTNode(_node));
|
ASTPointer<T> ret = dynamic_pointer_cast<T>(convertJsonToASTNode(_node, _isParentInterface));
|
||||||
astAssert(ret, "cast of converted json-node must not be nullptr");
|
astAssert(ret, "cast of converted json-node must not be nullptr");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ASTPointer<ASTNode> ASTJsonImporter::convertJsonToASTNode(
|
||||||
ASTPointer<ASTNode> ASTJsonImporter::convertJsonToASTNode(Json::Value const& _json)
|
Json::Value const& _json,
|
||||||
{
|
bool _isParentInterface
|
||||||
|
) {
|
||||||
astAssert(_json["nodeType"].isString() && _json.isMember("id"), "JSON-Node needs to have 'nodeType' and 'id' fields.");
|
astAssert(_json["nodeType"].isString() && _json.isMember("id"), "JSON-Node needs to have 'nodeType' and 'id' fields.");
|
||||||
string nodeType = _json["nodeType"].asString();
|
string nodeType = _json["nodeType"].asString();
|
||||||
if (nodeType == "PragmaDirective")
|
if (nodeType == "PragmaDirective")
|
||||||
@ -169,7 +170,7 @@ ASTPointer<ASTNode> ASTJsonImporter::convertJsonToASTNode(Json::Value const& _js
|
|||||||
if (nodeType == "OverrideSpecifier")
|
if (nodeType == "OverrideSpecifier")
|
||||||
return createOverrideSpecifier(_json);
|
return createOverrideSpecifier(_json);
|
||||||
if (nodeType == "FunctionDefinition")
|
if (nodeType == "FunctionDefinition")
|
||||||
return createFunctionDefinition(_json);
|
return createFunctionDefinition(_json, _isParentInterface);
|
||||||
if (nodeType == "VariableDeclaration")
|
if (nodeType == "VariableDeclaration")
|
||||||
return createVariableDeclaration(_json);
|
return createVariableDeclaration(_json);
|
||||||
if (nodeType == "ModifierDefinition")
|
if (nodeType == "ModifierDefinition")
|
||||||
@ -337,9 +338,10 @@ ASTPointer<ContractDefinition> ASTJsonImporter::createContractDefinition(Json::V
|
|||||||
baseContracts.push_back(createInheritanceSpecifier(base));
|
baseContracts.push_back(createInheritanceSpecifier(base));
|
||||||
|
|
||||||
std::vector<ASTPointer<ASTNode>> subNodes;
|
std::vector<ASTPointer<ASTNode>> subNodes;
|
||||||
|
bool isInterface = (contractKind(_node) == ContractKind::Interface);
|
||||||
|
|
||||||
for (auto& subnode: _node["nodes"])
|
for (auto& subnode: _node["nodes"])
|
||||||
subNodes.push_back(convertJsonToASTNode(subnode));
|
subNodes.push_back(convertJsonToASTNode(subnode, isInterface));
|
||||||
|
|
||||||
return createASTNode<ContractDefinition>(
|
return createASTNode<ContractDefinition>(
|
||||||
_node,
|
_node,
|
||||||
@ -514,8 +516,10 @@ ASTPointer<OverrideSpecifier> ASTJsonImporter::createOverrideSpecifier(Json::Val
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTPointer<FunctionDefinition> ASTJsonImporter::createFunctionDefinition(Json::Value const& _node)
|
ASTPointer<FunctionDefinition> ASTJsonImporter::createFunctionDefinition(
|
||||||
{
|
Json::Value const& _node,
|
||||||
|
bool _isParentInterface
|
||||||
|
) {
|
||||||
astAssert(_node["kind"].isString(), "Expected 'kind' to be a string!");
|
astAssert(_node["kind"].isString(), "Expected 'kind' to be a string!");
|
||||||
|
|
||||||
Token kind;
|
Token kind;
|
||||||
@ -562,7 +566,8 @@ ASTPointer<FunctionDefinition> ASTJsonImporter::createFunctionDefinition(Json::V
|
|||||||
createParameterList(member(_node, "parameters")),
|
createParameterList(member(_node, "parameters")),
|
||||||
modifiers,
|
modifiers,
|
||||||
createParameterList(member(_node, "returnParameters")),
|
createParameterList(member(_node, "returnParameters")),
|
||||||
memberAsBool(_node, "implemented") ? createBlock(member(_node, "body"), false) : nullptr
|
memberAsBool(_node, "implemented") ? createBlock(member(_node, "body"), false) : nullptr,
|
||||||
|
_isParentInterface
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,11 +62,11 @@ private:
|
|||||||
std::optional<std::vector<langutil::SourceLocation>> createSourceLocations(Json::Value const& _node) const;
|
std::optional<std::vector<langutil::SourceLocation>> createSourceLocations(Json::Value const& _node) const;
|
||||||
/// Creates an ASTNode for a given JSON-ast of unknown type
|
/// Creates an ASTNode for a given JSON-ast of unknown type
|
||||||
/// @returns Pointer to a new created ASTNode
|
/// @returns Pointer to a new created ASTNode
|
||||||
ASTPointer<ASTNode> convertJsonToASTNode(Json::Value const& _ast);
|
ASTPointer<ASTNode> convertJsonToASTNode(Json::Value const& _ast, bool _isParentInterface = false);
|
||||||
/// @returns a pointer to the more specific subclass of ASTNode
|
/// @returns a pointer to the more specific subclass of ASTNode
|
||||||
/// as indicated by the nodeType field of the json
|
/// as indicated by the nodeType field of the json
|
||||||
template<class T>
|
template<class T>
|
||||||
ASTPointer<T> convertJsonToASTNode(Json::Value const& _node);
|
ASTPointer<T> convertJsonToASTNode(Json::Value const& _node, bool _isParentInterface = false);
|
||||||
|
|
||||||
langutil::SourceLocation createNameSourceLocation(Json::Value const& _node);
|
langutil::SourceLocation createNameSourceLocation(Json::Value const& _node);
|
||||||
/// @returns source location of a mapping key name
|
/// @returns source location of a mapping key name
|
||||||
@ -89,7 +89,7 @@ private:
|
|||||||
ASTPointer<UserDefinedValueTypeDefinition> createUserDefinedValueTypeDefinition(Json::Value const& _node);
|
ASTPointer<UserDefinedValueTypeDefinition> createUserDefinedValueTypeDefinition(Json::Value const& _node);
|
||||||
ASTPointer<ParameterList> createParameterList(Json::Value const& _node);
|
ASTPointer<ParameterList> createParameterList(Json::Value const& _node);
|
||||||
ASTPointer<OverrideSpecifier> createOverrideSpecifier(Json::Value const& _node);
|
ASTPointer<OverrideSpecifier> createOverrideSpecifier(Json::Value const& _node);
|
||||||
ASTPointer<FunctionDefinition> createFunctionDefinition(Json::Value const& _node);
|
ASTPointer<FunctionDefinition> createFunctionDefinition(Json::Value const& _node, bool _isParentInterface);
|
||||||
ASTPointer<VariableDeclaration> createVariableDeclaration(Json::Value const& _node);
|
ASTPointer<VariableDeclaration> createVariableDeclaration(Json::Value const& _node);
|
||||||
ASTPointer<ModifierDefinition> createModifierDefinition(Json::Value const& _node);
|
ASTPointer<ModifierDefinition> createModifierDefinition(Json::Value const& _node);
|
||||||
ASTPointer<ModifierInvocation> createModifierInvocation(Json::Value const& _node);
|
ASTPointer<ModifierInvocation> createModifierInvocation(Json::Value const& _node);
|
||||||
|
@ -368,6 +368,7 @@ ASTPointer<ContractDefinition> Parser::parseContractDefinition()
|
|||||||
{
|
{
|
||||||
documentation = parseStructuredDocumentation();
|
documentation = parseStructuredDocumentation();
|
||||||
contractKind = parseContractKind();
|
contractKind = parseContractKind();
|
||||||
|
bool isInterfaceContract = (contractKind.first == ContractKind::Interface);
|
||||||
tie(name, nameLocation) = expectIdentifierWithLocation();
|
tie(name, nameLocation) = expectIdentifierWithLocation();
|
||||||
if (m_scanner->currentToken() == Token::Is)
|
if (m_scanner->currentToken() == Token::Is)
|
||||||
do
|
do
|
||||||
@ -388,7 +389,7 @@ ASTPointer<ContractDefinition> Parser::parseContractDefinition()
|
|||||||
currentTokenValue == Token::Receive ||
|
currentTokenValue == Token::Receive ||
|
||||||
currentTokenValue == Token::Fallback
|
currentTokenValue == Token::Fallback
|
||||||
)
|
)
|
||||||
subNodes.push_back(parseFunctionDefinition());
|
subNodes.push_back(parseFunctionDefinition(false, isInterfaceContract));
|
||||||
else if (currentTokenValue == Token::Struct)
|
else if (currentTokenValue == Token::Struct)
|
||||||
subNodes.push_back(parseStructDefinition());
|
subNodes.push_back(parseStructDefinition());
|
||||||
else if (currentTokenValue == Token::Enum)
|
else if (currentTokenValue == Token::Enum)
|
||||||
@ -618,7 +619,7 @@ Parser::FunctionHeaderParserResult Parser::parseFunctionHeader(bool _isStateVari
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTPointer<ASTNode> Parser::parseFunctionDefinition(bool _freeFunction)
|
ASTPointer<ASTNode> Parser::parseFunctionDefinition(bool _freeFunction, bool _isParentInterface)
|
||||||
{
|
{
|
||||||
RecursionGuard recursionGuard(*this);
|
RecursionGuard recursionGuard(*this);
|
||||||
ASTNodeFactory nodeFactory(*this);
|
ASTNodeFactory nodeFactory(*this);
|
||||||
@ -688,7 +689,8 @@ ASTPointer<ASTNode> Parser::parseFunctionDefinition(bool _freeFunction)
|
|||||||
header.parameters,
|
header.parameters,
|
||||||
header.modifiers,
|
header.modifiers,
|
||||||
header.returnParameters,
|
header.returnParameters,
|
||||||
block
|
block,
|
||||||
|
_isParentInterface
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,7 +100,7 @@ private:
|
|||||||
ASTPointer<OverrideSpecifier> parseOverrideSpecifier();
|
ASTPointer<OverrideSpecifier> parseOverrideSpecifier();
|
||||||
StateMutability parseStateMutability();
|
StateMutability parseStateMutability();
|
||||||
FunctionHeaderParserResult parseFunctionHeader(bool _isStateVariable);
|
FunctionHeaderParserResult parseFunctionHeader(bool _isStateVariable);
|
||||||
ASTPointer<ASTNode> parseFunctionDefinition(bool _freeFunction = false);
|
ASTPointer<ASTNode> parseFunctionDefinition(bool _freeFunction = false, bool isParentInterface = false);
|
||||||
ASTPointer<StructDefinition> parseStructDefinition();
|
ASTPointer<StructDefinition> parseStructDefinition();
|
||||||
ASTPointer<EnumDefinition> parseEnumDefinition();
|
ASTPointer<EnumDefinition> parseEnumDefinition();
|
||||||
ASTPointer<UserDefinedValueTypeDefinition> parseUserDefinedValueTypeDefinition();
|
ASTPointer<UserDefinedValueTypeDefinition> parseUserDefinedValueTypeDefinition();
|
||||||
|
@ -0,0 +1 @@
|
|||||||
|
--import-ast
|
@ -0,0 +1,7 @@
|
|||||||
|
Warning: Source file does not specify required compiler version!
|
||||||
|
--> A
|
||||||
|
|
||||||
|
Warning: This declaration shadows an existing declaration.
|
||||||
|
--> A:1:481:
|
||||||
|
Note: The shadowed declaration is here:
|
||||||
|
--> A:1:335:
|
@ -0,0 +1 @@
|
|||||||
|
0
|
@ -0,0 +1,694 @@
|
|||||||
|
{
|
||||||
|
"language": "SolidityAST",
|
||||||
|
"sources": {
|
||||||
|
"A": {
|
||||||
|
"ast": {
|
||||||
|
"absolutePath": "<stdin>",
|
||||||
|
"exportedSymbols":
|
||||||
|
{
|
||||||
|
"C":
|
||||||
|
[
|
||||||
|
51
|
||||||
|
],
|
||||||
|
"I":
|
||||||
|
[
|
||||||
|
22
|
||||||
|
],
|
||||||
|
"f":
|
||||||
|
[
|
||||||
|
30
|
||||||
|
],
|
||||||
|
"h":
|
||||||
|
[
|
||||||
|
38
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"id": 52,
|
||||||
|
"nodeType": "SourceUnit",
|
||||||
|
"nodes":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"abstract": false,
|
||||||
|
"baseContracts": [],
|
||||||
|
"canonicalName": "I",
|
||||||
|
"contractDependencies": [],
|
||||||
|
"contractKind": "interface",
|
||||||
|
"fullyImplemented": false,
|
||||||
|
"id": 22,
|
||||||
|
"linearizedBaseContracts":
|
||||||
|
[
|
||||||
|
22
|
||||||
|
],
|
||||||
|
"name": "I",
|
||||||
|
"nameLocation": "10:1:0",
|
||||||
|
"nodeType": "ContractDefinition",
|
||||||
|
"nodes":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"functionSelector": "b3de648b",
|
||||||
|
"id": 7,
|
||||||
|
"implemented": false,
|
||||||
|
"kind": "function",
|
||||||
|
"modifiers": [],
|
||||||
|
"name": "f",
|
||||||
|
"nameLocation": "27:1:0",
|
||||||
|
"nodeType": "FunctionDefinition",
|
||||||
|
"parameters":
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"nodeType": "ParameterList",
|
||||||
|
"parameters":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"constant": false,
|
||||||
|
"id": 2,
|
||||||
|
"mutability": "mutable",
|
||||||
|
"name": "",
|
||||||
|
"nameLocation": "-1:-1:-1",
|
||||||
|
"nodeType": "VariableDeclaration",
|
||||||
|
"scope": 7,
|
||||||
|
"src": "29:4:0",
|
||||||
|
"stateVariable": false,
|
||||||
|
"storageLocation": "default",
|
||||||
|
"typeDescriptions":
|
||||||
|
{
|
||||||
|
"typeIdentifier": "t_uint256",
|
||||||
|
"typeString": "uint256"
|
||||||
|
},
|
||||||
|
"typeName":
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"name": "uint",
|
||||||
|
"nodeType": "ElementaryTypeName",
|
||||||
|
"src": "29:4:0",
|
||||||
|
"typeDescriptions":
|
||||||
|
{
|
||||||
|
"typeIdentifier": "t_uint256",
|
||||||
|
"typeString": "uint256"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"visibility": "internal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"src": "28:6:0"
|
||||||
|
},
|
||||||
|
"returnParameters":
|
||||||
|
{
|
||||||
|
"id": 6,
|
||||||
|
"nodeType": "ParameterList",
|
||||||
|
"parameters":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"constant": false,
|
||||||
|
"id": 5,
|
||||||
|
"mutability": "mutable",
|
||||||
|
"name": "",
|
||||||
|
"nameLocation": "-1:-1:-1",
|
||||||
|
"nodeType": "VariableDeclaration",
|
||||||
|
"scope": 7,
|
||||||
|
"src": "53:4:0",
|
||||||
|
"stateVariable": false,
|
||||||
|
"storageLocation": "default",
|
||||||
|
"typeDescriptions":
|
||||||
|
{
|
||||||
|
"typeIdentifier": "t_uint256",
|
||||||
|
"typeString": "uint256"
|
||||||
|
},
|
||||||
|
"typeName":
|
||||||
|
{
|
||||||
|
"id": 4,
|
||||||
|
"name": "uint",
|
||||||
|
"nodeType": "ElementaryTypeName",
|
||||||
|
"src": "53:4:0",
|
||||||
|
"typeDescriptions":
|
||||||
|
{
|
||||||
|
"typeIdentifier": "t_uint256",
|
||||||
|
"typeString": "uint256"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"visibility": "internal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"src": "52:6:0"
|
||||||
|
},
|
||||||
|
"scope": 22,
|
||||||
|
"src": "18:41:0",
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"virtual": false,
|
||||||
|
"visibility": "external"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"functionSelector": "e420264a",
|
||||||
|
"id": 14,
|
||||||
|
"implemented": false,
|
||||||
|
"kind": "function",
|
||||||
|
"modifiers": [],
|
||||||
|
"name": "g",
|
||||||
|
"nameLocation": "109:1:0",
|
||||||
|
"nodeType": "FunctionDefinition",
|
||||||
|
"parameters":
|
||||||
|
{
|
||||||
|
"id": 10,
|
||||||
|
"nodeType": "ParameterList",
|
||||||
|
"parameters":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"constant": false,
|
||||||
|
"id": 9,
|
||||||
|
"mutability": "mutable",
|
||||||
|
"name": "",
|
||||||
|
"nameLocation": "-1:-1:-1",
|
||||||
|
"nodeType": "VariableDeclaration",
|
||||||
|
"scope": 14,
|
||||||
|
"src": "111:4:0",
|
||||||
|
"stateVariable": false,
|
||||||
|
"storageLocation": "default",
|
||||||
|
"typeDescriptions":
|
||||||
|
{
|
||||||
|
"typeIdentifier": "t_uint256",
|
||||||
|
"typeString": "uint256"
|
||||||
|
},
|
||||||
|
"typeName":
|
||||||
|
{
|
||||||
|
"id": 8,
|
||||||
|
"name": "uint",
|
||||||
|
"nodeType": "ElementaryTypeName",
|
||||||
|
"src": "111:4:0",
|
||||||
|
"typeDescriptions":
|
||||||
|
{
|
||||||
|
"typeIdentifier": "t_uint256",
|
||||||
|
"typeString": "uint256"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"visibility": "internal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"src": "110:6:0"
|
||||||
|
},
|
||||||
|
"returnParameters":
|
||||||
|
{
|
||||||
|
"id": 13,
|
||||||
|
"nodeType": "ParameterList",
|
||||||
|
"parameters":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"constant": false,
|
||||||
|
"id": 12,
|
||||||
|
"mutability": "mutable",
|
||||||
|
"name": "",
|
||||||
|
"nameLocation": "-1:-1:-1",
|
||||||
|
"nodeType": "VariableDeclaration",
|
||||||
|
"scope": 14,
|
||||||
|
"src": "135:4:0",
|
||||||
|
"stateVariable": false,
|
||||||
|
"storageLocation": "default",
|
||||||
|
"typeDescriptions":
|
||||||
|
{
|
||||||
|
"typeIdentifier": "t_uint256",
|
||||||
|
"typeString": "uint256"
|
||||||
|
},
|
||||||
|
"typeName":
|
||||||
|
{
|
||||||
|
"id": 11,
|
||||||
|
"name": "uint",
|
||||||
|
"nodeType": "ElementaryTypeName",
|
||||||
|
"src": "135:4:0",
|
||||||
|
"typeDescriptions":
|
||||||
|
{
|
||||||
|
"typeIdentifier": "t_uint256",
|
||||||
|
"typeString": "uint256"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"visibility": "internal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"src": "134:6:0"
|
||||||
|
},
|
||||||
|
"scope": 22,
|
||||||
|
"src": "100:41:0",
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"virtual": false,
|
||||||
|
"visibility": "external"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"functionSelector": "cb97492a",
|
||||||
|
"id": 21,
|
||||||
|
"implemented": false,
|
||||||
|
"kind": "function",
|
||||||
|
"modifiers": [],
|
||||||
|
"name": "h",
|
||||||
|
"nameLocation": "191:1:0",
|
||||||
|
"nodeType": "FunctionDefinition",
|
||||||
|
"parameters":
|
||||||
|
{
|
||||||
|
"id": 17,
|
||||||
|
"nodeType": "ParameterList",
|
||||||
|
"parameters":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"constant": false,
|
||||||
|
"id": 16,
|
||||||
|
"mutability": "mutable",
|
||||||
|
"name": "",
|
||||||
|
"nameLocation": "-1:-1:-1",
|
||||||
|
"nodeType": "VariableDeclaration",
|
||||||
|
"scope": 21,
|
||||||
|
"src": "193:4:0",
|
||||||
|
"stateVariable": false,
|
||||||
|
"storageLocation": "default",
|
||||||
|
"typeDescriptions":
|
||||||
|
{
|
||||||
|
"typeIdentifier": "t_uint256",
|
||||||
|
"typeString": "uint256"
|
||||||
|
},
|
||||||
|
"typeName":
|
||||||
|
{
|
||||||
|
"id": 15,
|
||||||
|
"name": "uint",
|
||||||
|
"nodeType": "ElementaryTypeName",
|
||||||
|
"src": "193:4:0",
|
||||||
|
"typeDescriptions":
|
||||||
|
{
|
||||||
|
"typeIdentifier": "t_uint256",
|
||||||
|
"typeString": "uint256"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"visibility": "internal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"src": "192:6:0"
|
||||||
|
},
|
||||||
|
"returnParameters":
|
||||||
|
{
|
||||||
|
"id": 20,
|
||||||
|
"nodeType": "ParameterList",
|
||||||
|
"parameters":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"constant": false,
|
||||||
|
"id": 19,
|
||||||
|
"mutability": "mutable",
|
||||||
|
"name": "",
|
||||||
|
"nameLocation": "-1:-1:-1",
|
||||||
|
"nodeType": "VariableDeclaration",
|
||||||
|
"scope": 21,
|
||||||
|
"src": "217:4:0",
|
||||||
|
"stateVariable": false,
|
||||||
|
"storageLocation": "default",
|
||||||
|
"typeDescriptions":
|
||||||
|
{
|
||||||
|
"typeIdentifier": "t_uint256",
|
||||||
|
"typeString": "uint256"
|
||||||
|
},
|
||||||
|
"typeName":
|
||||||
|
{
|
||||||
|
"id": 18,
|
||||||
|
"name": "uint",
|
||||||
|
"nodeType": "ElementaryTypeName",
|
||||||
|
"src": "217:4:0",
|
||||||
|
"typeDescriptions":
|
||||||
|
{
|
||||||
|
"typeIdentifier": "t_uint256",
|
||||||
|
"typeString": "uint256"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"visibility": "internal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"src": "216:6:0"
|
||||||
|
},
|
||||||
|
"scope": 22,
|
||||||
|
"src": "182:41:0",
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"virtual": false,
|
||||||
|
"visibility": "external"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"scope": 52,
|
||||||
|
"src": "0:261:0",
|
||||||
|
"usedErrors": [],
|
||||||
|
"usedEvents": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"body":
|
||||||
|
{
|
||||||
|
"id": 29,
|
||||||
|
"nodeType": "Block",
|
||||||
|
"src": "295:2:0",
|
||||||
|
"statements": []
|
||||||
|
},
|
||||||
|
"id": 30,
|
||||||
|
"implemented": true,
|
||||||
|
"kind": "freeFunction",
|
||||||
|
"modifiers": [],
|
||||||
|
"name": "f",
|
||||||
|
"nameLocation": "272:1:0",
|
||||||
|
"nodeType": "FunctionDefinition",
|
||||||
|
"parameters":
|
||||||
|
{
|
||||||
|
"id": 25,
|
||||||
|
"nodeType": "ParameterList",
|
||||||
|
"parameters":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"constant": false,
|
||||||
|
"id": 24,
|
||||||
|
"mutability": "mutable",
|
||||||
|
"name": "",
|
||||||
|
"nameLocation": "-1:-1:-1",
|
||||||
|
"nodeType": "VariableDeclaration",
|
||||||
|
"scope": 30,
|
||||||
|
"src": "274:4:0",
|
||||||
|
"stateVariable": false,
|
||||||
|
"storageLocation": "default",
|
||||||
|
"typeDescriptions":
|
||||||
|
{
|
||||||
|
"typeIdentifier": "t_uint256",
|
||||||
|
"typeString": "uint256"
|
||||||
|
},
|
||||||
|
"typeName":
|
||||||
|
{
|
||||||
|
"id": 23,
|
||||||
|
"name": "uint",
|
||||||
|
"nodeType": "ElementaryTypeName",
|
||||||
|
"src": "274:4:0",
|
||||||
|
"typeDescriptions":
|
||||||
|
{
|
||||||
|
"typeIdentifier": "t_uint256",
|
||||||
|
"typeString": "uint256"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"visibility": "internal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"src": "273:6:0"
|
||||||
|
},
|
||||||
|
"returnParameters":
|
||||||
|
{
|
||||||
|
"id": 28,
|
||||||
|
"nodeType": "ParameterList",
|
||||||
|
"parameters":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"constant": false,
|
||||||
|
"id": 27,
|
||||||
|
"mutability": "mutable",
|
||||||
|
"name": "",
|
||||||
|
"nameLocation": "-1:-1:-1",
|
||||||
|
"nodeType": "VariableDeclaration",
|
||||||
|
"scope": 30,
|
||||||
|
"src": "289:4:0",
|
||||||
|
"stateVariable": false,
|
||||||
|
"storageLocation": "default",
|
||||||
|
"typeDescriptions":
|
||||||
|
{
|
||||||
|
"typeIdentifier": "t_uint256",
|
||||||
|
"typeString": "uint256"
|
||||||
|
},
|
||||||
|
"typeName":
|
||||||
|
{
|
||||||
|
"id": 26,
|
||||||
|
"name": "uint",
|
||||||
|
"nodeType": "ElementaryTypeName",
|
||||||
|
"src": "289:4:0",
|
||||||
|
"typeDescriptions":
|
||||||
|
{
|
||||||
|
"typeIdentifier": "t_uint256",
|
||||||
|
"typeString": "uint256"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"visibility": "internal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"src": "288:6:0"
|
||||||
|
},
|
||||||
|
"scope": 52,
|
||||||
|
"src": "263:34:0",
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"virtual": false,
|
||||||
|
"visibility": "internal"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"body":
|
||||||
|
{
|
||||||
|
"id": 37,
|
||||||
|
"nodeType": "Block",
|
||||||
|
"src": "366:2:0",
|
||||||
|
"statements": []
|
||||||
|
},
|
||||||
|
"id": 38,
|
||||||
|
"implemented": true,
|
||||||
|
"kind": "freeFunction",
|
||||||
|
"modifiers": [],
|
||||||
|
"name": "h",
|
||||||
|
"nameLocation": "343:1:0",
|
||||||
|
"nodeType": "FunctionDefinition",
|
||||||
|
"parameters":
|
||||||
|
{
|
||||||
|
"id": 33,
|
||||||
|
"nodeType": "ParameterList",
|
||||||
|
"parameters":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"constant": false,
|
||||||
|
"id": 32,
|
||||||
|
"mutability": "mutable",
|
||||||
|
"name": "",
|
||||||
|
"nameLocation": "-1:-1:-1",
|
||||||
|
"nodeType": "VariableDeclaration",
|
||||||
|
"scope": 38,
|
||||||
|
"src": "345:4:0",
|
||||||
|
"stateVariable": false,
|
||||||
|
"storageLocation": "default",
|
||||||
|
"typeDescriptions":
|
||||||
|
{
|
||||||
|
"typeIdentifier": "t_uint256",
|
||||||
|
"typeString": "uint256"
|
||||||
|
},
|
||||||
|
"typeName":
|
||||||
|
{
|
||||||
|
"id": 31,
|
||||||
|
"name": "uint",
|
||||||
|
"nodeType": "ElementaryTypeName",
|
||||||
|
"src": "345:4:0",
|
||||||
|
"typeDescriptions":
|
||||||
|
{
|
||||||
|
"typeIdentifier": "t_uint256",
|
||||||
|
"typeString": "uint256"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"visibility": "internal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"src": "344:6:0"
|
||||||
|
},
|
||||||
|
"returnParameters":
|
||||||
|
{
|
||||||
|
"id": 36,
|
||||||
|
"nodeType": "ParameterList",
|
||||||
|
"parameters":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"constant": false,
|
||||||
|
"id": 35,
|
||||||
|
"mutability": "mutable",
|
||||||
|
"name": "",
|
||||||
|
"nameLocation": "-1:-1:-1",
|
||||||
|
"nodeType": "VariableDeclaration",
|
||||||
|
"scope": 38,
|
||||||
|
"src": "360:4:0",
|
||||||
|
"stateVariable": false,
|
||||||
|
"storageLocation": "default",
|
||||||
|
"typeDescriptions":
|
||||||
|
{
|
||||||
|
"typeIdentifier": "t_uint256",
|
||||||
|
"typeString": "uint256"
|
||||||
|
},
|
||||||
|
"typeName":
|
||||||
|
{
|
||||||
|
"id": 34,
|
||||||
|
"name": "uint",
|
||||||
|
"nodeType": "ElementaryTypeName",
|
||||||
|
"src": "360:4:0",
|
||||||
|
"typeDescriptions":
|
||||||
|
{
|
||||||
|
"typeIdentifier": "t_uint256",
|
||||||
|
"typeString": "uint256"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"visibility": "internal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"src": "359:6:0"
|
||||||
|
},
|
||||||
|
"scope": 52,
|
||||||
|
"src": "334:34:0",
|
||||||
|
"stateMutability": "nonpayable",
|
||||||
|
"virtual": false,
|
||||||
|
"visibility": "internal"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"abstract": false,
|
||||||
|
"baseContracts": [],
|
||||||
|
"canonicalName": "C",
|
||||||
|
"contractDependencies": [],
|
||||||
|
"contractKind": "contract",
|
||||||
|
"fullyImplemented": true,
|
||||||
|
"id": 51,
|
||||||
|
"linearizedBaseContracts":
|
||||||
|
[
|
||||||
|
51
|
||||||
|
],
|
||||||
|
"name": "C",
|
||||||
|
"nameLocation": "400:1:0",
|
||||||
|
"nodeType": "ContractDefinition",
|
||||||
|
"nodes":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"body":
|
||||||
|
{
|
||||||
|
"id": 43,
|
||||||
|
"nodeType": "Block",
|
||||||
|
"src": "437:2:0",
|
||||||
|
"statements": []
|
||||||
|
},
|
||||||
|
"functionSelector": "e420264a",
|
||||||
|
"id": 44,
|
||||||
|
"implemented": true,
|
||||||
|
"kind": "function",
|
||||||
|
"modifiers": [],
|
||||||
|
"name": "g",
|
||||||
|
"nameLocation": "417:1:0",
|
||||||
|
"nodeType": "FunctionDefinition",
|
||||||
|
"parameters":
|
||||||
|
{
|
||||||
|
"id": 41,
|
||||||
|
"nodeType": "ParameterList",
|
||||||
|
"parameters":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"constant": false,
|
||||||
|
"id": 40,
|
||||||
|
"mutability": "mutable",
|
||||||
|
"name": "",
|
||||||
|
"nameLocation": "-1:-1:-1",
|
||||||
|
"nodeType": "VariableDeclaration",
|
||||||
|
"scope": 44,
|
||||||
|
"src": "419:4:0",
|
||||||
|
"stateVariable": false,
|
||||||
|
"storageLocation": "default",
|
||||||
|
"typeDescriptions":
|
||||||
|
{
|
||||||
|
"typeIdentifier": "t_uint256",
|
||||||
|
"typeString": "uint256"
|
||||||
|
},
|
||||||
|
"typeName":
|
||||||
|
{
|
||||||
|
"id": 39,
|
||||||
|
"name": "uint",
|
||||||
|
"nodeType": "ElementaryTypeName",
|
||||||
|
"src": "419:4:0",
|
||||||
|
"typeDescriptions":
|
||||||
|
{
|
||||||
|
"typeIdentifier": "t_uint256",
|
||||||
|
"typeString": "uint256"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"visibility": "internal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"src": "418:6:0"
|
||||||
|
},
|
||||||
|
"returnParameters":
|
||||||
|
{
|
||||||
|
"id": 42,
|
||||||
|
"nodeType": "ParameterList",
|
||||||
|
"parameters": [],
|
||||||
|
"src": "437:0:0"
|
||||||
|
},
|
||||||
|
"scope": 51,
|
||||||
|
"src": "408:31:0",
|
||||||
|
"stateMutability": "pure",
|
||||||
|
"virtual": false,
|
||||||
|
"visibility": "public"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"body":
|
||||||
|
{
|
||||||
|
"id": 49,
|
||||||
|
"nodeType": "Block",
|
||||||
|
"src": "509:2:0",
|
||||||
|
"statements": []
|
||||||
|
},
|
||||||
|
"functionSelector": "cb97492a",
|
||||||
|
"id": 50,
|
||||||
|
"implemented": true,
|
||||||
|
"kind": "function",
|
||||||
|
"modifiers": [],
|
||||||
|
"name": "h",
|
||||||
|
"nameLocation": "489:1:0",
|
||||||
|
"nodeType": "FunctionDefinition",
|
||||||
|
"parameters":
|
||||||
|
{
|
||||||
|
"id": 47,
|
||||||
|
"nodeType": "ParameterList",
|
||||||
|
"parameters":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"constant": false,
|
||||||
|
"id": 46,
|
||||||
|
"mutability": "mutable",
|
||||||
|
"name": "",
|
||||||
|
"nameLocation": "-1:-1:-1",
|
||||||
|
"nodeType": "VariableDeclaration",
|
||||||
|
"scope": 50,
|
||||||
|
"src": "491:4:0",
|
||||||
|
"stateVariable": false,
|
||||||
|
"storageLocation": "default",
|
||||||
|
"typeDescriptions":
|
||||||
|
{
|
||||||
|
"typeIdentifier": "t_uint256",
|
||||||
|
"typeString": "uint256"
|
||||||
|
},
|
||||||
|
"typeName":
|
||||||
|
{
|
||||||
|
"id": 45,
|
||||||
|
"name": "uint",
|
||||||
|
"nodeType": "ElementaryTypeName",
|
||||||
|
"src": "491:4:0",
|
||||||
|
"typeDescriptions":
|
||||||
|
{
|
||||||
|
"typeIdentifier": "t_uint256",
|
||||||
|
"typeString": "uint256"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"visibility": "internal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"src": "490:6:0"
|
||||||
|
},
|
||||||
|
"returnParameters":
|
||||||
|
{
|
||||||
|
"id": 48,
|
||||||
|
"nodeType": "ParameterList",
|
||||||
|
"parameters": [],
|
||||||
|
"src": "509:0:0"
|
||||||
|
},
|
||||||
|
"scope": 51,
|
||||||
|
"src": "480:31:0",
|
||||||
|
"stateMutability": "pure",
|
||||||
|
"virtual": false,
|
||||||
|
"visibility": "public"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"scope": 52,
|
||||||
|
"src": "391:146:0",
|
||||||
|
"usedErrors": [],
|
||||||
|
"usedEvents": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"src": "0:538:0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
interface I {
|
||||||
|
function f(uint) external returns (uint); // Should not shadow or be shadowed
|
||||||
|
function g(uint) external returns (uint); // Should not shadow or be shadowed
|
||||||
|
function h(uint) external returns (uint); // Should not shadow or be shadowed
|
||||||
|
}
|
||||||
|
|
||||||
|
function f(uint) returns (uint) {} // Should not shadow or be shadowed
|
||||||
|
function h(uint) returns (uint) {} // Shadowed by C.h()
|
||||||
|
|
||||||
|
contract C {
|
||||||
|
function g(uint) public pure {} // Should not shadow or be shadowed
|
||||||
|
function h(uint) public pure {} // Shadows the free h()
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// Warning 2519: (480-511): This declaration shadows an existing declaration.
|
Loading…
Reference in New Issue
Block a user