mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
analysis: allow some shadowings explicitly
This commit is contained in:
parent
bff76c1ca0
commit
42b6726173
@ -296,6 +296,14 @@ void NameAndTypeResolver::importInheritedScope(ContractDefinition const& _base)
|
||||
Declaration const* conflictingDeclaration = m_currentScope->conflictingDeclaration(*declaration);
|
||||
solAssert(conflictingDeclaration, "");
|
||||
|
||||
// Usual shadowing is not an error
|
||||
if (dynamic_cast<VariableDeclaration const*>(declaration) && dynamic_cast<VariableDeclaration const*>(conflictingDeclaration))
|
||||
continue;
|
||||
|
||||
// Usual shadowing is not an error
|
||||
if (dynamic_cast<ModifierDefinition const*>(declaration) && dynamic_cast<ModifierDefinition const*>(conflictingDeclaration))
|
||||
continue;
|
||||
|
||||
if (declaration->location().start < conflictingDeclaration->location().start)
|
||||
{
|
||||
firstDeclarationLocation = declaration->location();
|
||||
|
@ -4869,60 +4869,6 @@ BOOST_AUTO_TEST_CASE(proper_order_of_overwriting_of_attributes)
|
||||
BOOST_CHECK(callContractFunction("ok()") == encodeArgs(false));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(proper_overwriting_accessor_by_function)
|
||||
{
|
||||
// bug #1798
|
||||
char const* sourceCode = R"(
|
||||
contract attribute {
|
||||
bool ok = false;
|
||||
}
|
||||
contract func {
|
||||
function ok() returns (bool) { return true; }
|
||||
}
|
||||
|
||||
contract attr_func is attribute, func {
|
||||
function checkOk() returns (bool) { return ok(); }
|
||||
}
|
||||
contract func_attr is func, attribute {
|
||||
function checkOk() returns (bool) { return ok; }
|
||||
}
|
||||
)";
|
||||
compileAndRun(sourceCode, 0, "attr_func");
|
||||
BOOST_CHECK(callContractFunction("ok()") == encodeArgs(true));
|
||||
compileAndRun(sourceCode, 0, "func_attr");
|
||||
BOOST_CHECK(callContractFunction("checkOk()") == encodeArgs(false));
|
||||
}
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_CASE(overwriting_inheritance)
|
||||
{
|
||||
// bug #1798
|
||||
char const* sourceCode = R"(
|
||||
contract A {
|
||||
function ok() returns (uint) { return 1; }
|
||||
}
|
||||
contract B {
|
||||
function ok() returns (uint) { return 2; }
|
||||
}
|
||||
contract C {
|
||||
uint ok = 6;
|
||||
}
|
||||
contract AB is A, B {
|
||||
function ok() returns (uint) { return 4; }
|
||||
}
|
||||
contract reversedE is C, AB {
|
||||
function checkOk() returns (uint) { return ok(); }
|
||||
}
|
||||
contract E is AB, C {
|
||||
function checkOk() returns (uint) { return ok; }
|
||||
}
|
||||
)";
|
||||
compileAndRun(sourceCode, 0, "reversedE");
|
||||
BOOST_CHECK(callContractFunction("checkOk()") == encodeArgs(4));
|
||||
compileAndRun(sourceCode, 0, "E");
|
||||
BOOST_CHECK(callContractFunction("checkOk()") == encodeArgs(6));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(struct_assign_reference_to_struct)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
|
@ -1056,7 +1056,7 @@ BOOST_AUTO_TEST_CASE(modifier_overrides_function)
|
||||
contract A { modifier mod(uint a) { _; } }
|
||||
contract B is A { function mod(uint a) { } }
|
||||
)";
|
||||
CHECK_ERROR(text, TypeError, "");
|
||||
CHECK_ERROR(text, DeclarationError, "");
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(function_overrides_modifier)
|
||||
@ -1065,7 +1065,7 @@ BOOST_AUTO_TEST_CASE(function_overrides_modifier)
|
||||
contract A { function mod(uint a) { } }
|
||||
contract B is A { modifier mod(uint a) { _; } }
|
||||
)";
|
||||
CHECK_ERROR(text, TypeError, "");
|
||||
CHECK_ERROR(text, DeclarationError, "");
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(modifier_returns_value)
|
||||
@ -4304,6 +4304,25 @@ BOOST_AUTO_TEST_CASE(illegal_override_payable_nonpayable)
|
||||
CHECK_ERROR(text, TypeError, "");
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(function_variable_mixin)
|
||||
{
|
||||
// bug #1798 (cpp-ethereum), related to #1286 (solidity)
|
||||
char const* text = R"(
|
||||
contract attribute {
|
||||
bool ok = false;
|
||||
}
|
||||
contract func {
|
||||
function ok() returns (bool) { return true; }
|
||||
}
|
||||
|
||||
contract attr_func is attribute, func {
|
||||
function checkOk() returns (bool) { return ok(); }
|
||||
}
|
||||
)";
|
||||
CHECK_ERROR(text, DeclarationError, "");
|
||||
}
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_CASE(payable_constant_conflict)
|
||||
{
|
||||
char const* text = R"(
|
||||
|
Loading…
Reference in New Issue
Block a user