diff options
author | chriseth <chris@ethereum.org> | 2018-06-29 06:18:22 +0800 |
---|---|---|
committer | Alex Beregszaszi <alex@rtfs.hu> | 2018-08-01 19:28:27 +0800 |
commit | 061ea0cfc6b8a7a0950e9764876733391eac6b81 (patch) | |
tree | 06abd44acaab66882c32b189562e9c1cd6182b63 | |
parent | 7e5406dd8953cb819c397221fa55e6fa390108ee (diff) | |
download | dexon-solidity-061ea0cfc6b8a7a0950e9764876733391eac6b81.tar.gz dexon-solidity-061ea0cfc6b8a7a0950e9764876733391eac6b81.tar.zst dexon-solidity-061ea0cfc6b8a7a0950e9764876733391eac6b81.zip |
Correctly determine whether base constructor is called without parentheses.
-rw-r--r-- | libsolidity/analysis/TypeChecker.cpp | 22 | ||||
-rw-r--r-- | test/libsolidity/syntaxTests/inheritance/modifiers_in_constructor_context.sol | 9 |
2 files changed, 20 insertions, 11 deletions
diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp index 9e10b9b2..97033b0d 100644 --- a/libsolidity/analysis/TypeChecker.cpp +++ b/libsolidity/analysis/TypeChecker.cpp @@ -286,19 +286,19 @@ void TypeChecker::checkContractBaseConstructorArguments(ContractDefinition const { if (FunctionDefinition const* constructor = contract->constructor()) for (auto const& modifier: constructor->modifiers()) - { - auto baseContract = dynamic_cast<ContractDefinition const*>(&dereference(*modifier->name())); - if (modifier->arguments()) + if (auto baseContract = dynamic_cast<ContractDefinition const*>(&dereference(*modifier->name()))) { - if (baseContract && baseContract->constructor()) - annotateBaseConstructorArguments(_contract, baseContract->constructor(), modifier.get()); + if (modifier->arguments()) + { + if (baseContract->constructor()) + annotateBaseConstructorArguments(_contract, baseContract->constructor(), modifier.get()); + } + else + m_errorReporter.declarationError( + modifier->location(), + "Modifier-style base constructor call without arguments." + ); } - else - m_errorReporter.declarationError( - modifier->location(), - "Modifier-style base constructor call without arguments." - ); - } for (ASTPointer<InheritanceSpecifier> const& base: contract->baseContracts()) { diff --git a/test/libsolidity/syntaxTests/inheritance/modifiers_in_constructor_context.sol b/test/libsolidity/syntaxTests/inheritance/modifiers_in_constructor_context.sol new file mode 100644 index 00000000..d8ce0e48 --- /dev/null +++ b/test/libsolidity/syntaxTests/inheritance/modifiers_in_constructor_context.sol @@ -0,0 +1,9 @@ +// This generated an invalid warning on m1 in some compiler versions. +contract A { + constructor() m1 public { } + modifier m1 { _; } +} +contract B is A { + modifier m2 { _; } + constructor() A() m1 m2 public { } +} |