diff --git a/Changelog.md b/Changelog.md index eb428c1ed..cdc3ac010 100644 --- a/Changelog.md +++ b/Changelog.md @@ -7,6 +7,7 @@ Compiler Features: Bugfixes: + * Type Checker: Disallow ``virtual`` and ``override`` for constructors. diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp index 76e805c27..30842a117 100644 --- a/libsolidity/analysis/TypeChecker.cpp +++ b/libsolidity/analysis/TypeChecker.cpp @@ -1796,6 +1796,10 @@ void TypeChecker::typeCheckReceiveFunction(FunctionDefinition const& _function) void TypeChecker::typeCheckConstructor(FunctionDefinition const& _function) { solAssert(_function.isConstructor(), ""); + if (_function.markedVirtual()) + m_errorReporter.typeError(_function.location(), "Constructors cannot be virtual."); + if (_function.overrides()) + m_errorReporter.typeError(_function.location(), "Constructors cannot override."); if (!_function.returnParameters().empty()) m_errorReporter.typeError(_function.returnParameterList()->location(), "Non-empty \"returns\" directive for constructor."); if (_function.stateMutability() != StateMutability::NonPayable && _function.stateMutability() != StateMutability::Payable) diff --git a/test/libsolidity/syntaxTests/constructor/constructor_override.sol b/test/libsolidity/syntaxTests/constructor/constructor_override.sol new file mode 100644 index 000000000..48203a27d --- /dev/null +++ b/test/libsolidity/syntaxTests/constructor/constructor_override.sol @@ -0,0 +1,5 @@ +contract C { + constructor() override public {} +} +// ---- +// TypeError: (17-49): Constructors cannot override. diff --git a/test/libsolidity/syntaxTests/constructor/constructor_virtual.sol b/test/libsolidity/syntaxTests/constructor/constructor_virtual.sol new file mode 100644 index 000000000..cd692dbcd --- /dev/null +++ b/test/libsolidity/syntaxTests/constructor/constructor_virtual.sol @@ -0,0 +1,5 @@ +contract C { + constructor() virtual public {} +} +// ---- +// TypeError: (17-48): Constructors cannot be virtual.