Merge pull request #4379 from ethereum/constructorArgsTwice

Disallow constructor arguments given multiple times.
This commit is contained in:
chriseth 2018-07-03 22:49:02 +02:00 committed by GitHub
commit 533d5d4b1c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 20 additions and 44 deletions

View File

@ -30,6 +30,7 @@ Breaking Changes:
* Parser: Remove ``constant`` as function state mutability modifer.
* Type Checker: Disallow arithmetic operations for boolean variables.
* Type Checker: Disallow conversions between ``bytesX`` and ``uintY`` of different size.
* Type Checker: Disallow specifying base constructor arguments multiple times in the same inheritance hierarchy. This was already the case in the experimental 0.5.0 mode.
* Type Checker: Only accept a single ``bytes`` type for ``.call()`` (and family), ``keccak256()``, ``sha256()`` and ``ripemd160()``.
* Remove obsolete ``std`` directory from the Solidity repository. This means accessing ``https://github.com/ethereum/soldity/blob/develop/std/*.sol`` (or ``https://github.com/ethereum/solidity/std/*.sol`` in Remix) will not be possible.
* Syntax Checker: Named return values in function types are an error.

View File

@ -335,8 +335,6 @@ void TypeChecker::annotateBaseConstructorArguments(
ASTNode const* _argumentNode
)
{
bool const v050 = _currentContract.sourceUnit().annotation().experimentalFeatures.count(ExperimentalFeature::V050);
solAssert(_baseConstructor, "");
solAssert(_argumentNode, "");
@ -365,18 +363,11 @@ void TypeChecker::annotateBaseConstructorArguments(
ssl.append("Second constructor call is here: ", previousNode->location());
}
if (v050)
m_errorReporter.declarationError(
*mainLocation,
ssl,
"Base constructor arguments given twice."
);
else
m_errorReporter.warning(
*mainLocation,
"Base constructor arguments given twice.",
ssl
);
m_errorReporter.declarationError(
*mainLocation,
ssl,
"Base constructor arguments given twice."
);
}
}

View File

@ -2783,24 +2783,6 @@ BOOST_AUTO_TEST_CASE(virtual_function_usage_in_constructor_arguments)
ABI_CHECK(callContractFunction("getA()"), encodeArgs(2));
}
BOOST_AUTO_TEST_CASE(constructor_argument_overriding)
{
char const* sourceCode = R"(
contract BaseBase {
uint m_a;
constructor(uint a) {
m_a = a;
}
}
contract Base is BaseBase(2) { }
contract Derived is BaseBase(3), Base {
function getA() returns (uint r) { return m_a; }
}
)";
compileAndRun(sourceCode, 0, "Derived");
ABI_CHECK(callContractFunction("getA()"), encodeArgs(3));
}
BOOST_AUTO_TEST_CASE(internal_constructor)
{
char const* sourceCode = R"(
@ -5521,10 +5503,10 @@ BOOST_AUTO_TEST_CASE(pass_dynamic_arguments_to_the_base_base)
uint public m_i;
}
contract Base1 is Base {
constructor(uint k) Base(k*k) {}
constructor(uint k) Base(k) {}
}
contract Derived is Base, Base1 {
constructor(uint i) Base(i) Base1(i)
constructor(uint i) Base1(i)
{}
}
contract Final is Derived(4) {
@ -5544,9 +5526,11 @@ BOOST_AUTO_TEST_CASE(pass_dynamic_arguments_to_the_base_base_with_gap)
}
uint public m_i;
}
contract Base1 is Base(3) {}
contract Base1 is Base {
constructor(uint k) {}
}
contract Derived is Base, Base1 {
constructor(uint i) Base(i) {}
constructor(uint i) Base(i) Base1(7) {}
}
contract Final is Derived(4) {
}

View File

@ -6,4 +6,4 @@ contract Derived is Base, Base1 {
constructor(uint i) Base(i) public {}
}
// ----
// Warning: (138-145): Base constructor arguments given twice.
// DeclarationError: (138-145): Base constructor arguments given twice.

View File

@ -2,4 +2,4 @@ contract A { constructor(uint) public { } }
contract B is A(2) { constructor() public { } }
contract C is B { constructor() A(3) public { } }
// ----
// Warning: (125-129): Base constructor arguments given twice.
// DeclarationError: (125-129): Base constructor arguments given twice.

View File

@ -1,4 +1,4 @@
contract A { constructor(uint) public { } }
contract B is A(2) { constructor() A(3) public { } }
// ----
// Warning: (79-83): Base constructor arguments given twice.
// DeclarationError: (79-83): Base constructor arguments given twice.

View File

@ -3,5 +3,5 @@ contract A is C(2) {}
contract B is C(2) {}
contract D is A, B { constructor() C(3) public {} }
// ----
// Warning: (122-126): Base constructor arguments given twice.
// Warning: (122-126): Base constructor arguments given twice.
// DeclarationError: (122-126): Base constructor arguments given twice.
// DeclarationError: (122-126): Base constructor arguments given twice.

View File

@ -3,4 +3,4 @@ contract A is C(2) {}
contract B is C(2) {}
contract D is A, B {}
// ----
// Warning: (87-108): Base constructor arguments given twice.
// DeclarationError: (87-108): Base constructor arguments given twice.

View File

@ -3,4 +3,4 @@ contract A is C { constructor() C(2) public {} }
contract B is C { constructor() C(2) public {} }
contract D is A, B { }
// ----
// Warning: (141-163): Base constructor arguments given twice.
// DeclarationError: (141-163): Base constructor arguments given twice.

View File

@ -3,5 +3,5 @@ contract B is C {
constructor() C(2) C(2) public {}
}
// ----
// Warning: (81-85): Base constructor arguments given twice.
// DeclarationError: (81-85): Base constructor arguments given twice.
// DeclarationError: (86-90): Base constructor already provided.