mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Fix segmentation fault with constant function parameters
This commit is contained in:
parent
26ea9ce07c
commit
0f8ad1d68f
@ -16,6 +16,7 @@ Bugfixes:
|
||||
* Fixed crash concerning non-callable types.
|
||||
* Unused variable warnings no longer issued for variables used inside inline assembly.
|
||||
* Inline Assembly: Enforce function arguments when parsing functional instructions.
|
||||
* Fixed segfault with constant function parameters
|
||||
|
||||
### 0.4.11 (2017-05-03)
|
||||
|
||||
|
@ -463,6 +463,8 @@ bool TypeChecker::visit(FunctionDefinition const& _function)
|
||||
m_errorReporter.typeError(var->location(), "Type is required to live outside storage.");
|
||||
if (_function.visibility() >= FunctionDefinition::Visibility::Public && !(type(*var)->interfaceType(isLibraryFunction)))
|
||||
m_errorReporter.fatalTypeError(var->location(), "Internal type is not allowed for public or external functions.");
|
||||
|
||||
var->accept(*this);
|
||||
}
|
||||
for (ASTPointer<ModifierInvocation> const& modifier: _function.modifiers())
|
||||
visitManually(
|
||||
@ -487,7 +489,12 @@ bool TypeChecker::visit(FunctionDefinition const& _function)
|
||||
|
||||
bool TypeChecker::visit(VariableDeclaration const& _variable)
|
||||
{
|
||||
if (m_scope->contractKind() == ContractDefinition::ContractKind::Interface)
|
||||
// Forbid any variable declarations inside interfaces unless they are part of
|
||||
// a function's input/output parameters.
|
||||
if (
|
||||
m_scope->contractKind() == ContractDefinition::ContractKind::Interface
|
||||
&& !_variable.isCallableParameter()
|
||||
)
|
||||
m_errorReporter.typeError(_variable.location(), "Variables cannot be declared in interfaces.");
|
||||
|
||||
// Variables can be declared without type (with "var"), in which case the first assignment
|
||||
|
@ -1597,6 +1597,16 @@ BOOST_AUTO_TEST_CASE(empty_name_input_parameter)
|
||||
CHECK_SUCCESS(text);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(constant_input_parameter)
|
||||
{
|
||||
char const* text = R"(
|
||||
contract test {
|
||||
function f(uint[] constant a) { }
|
||||
}
|
||||
)";
|
||||
CHECK_ERROR_ALLOW_MULTI(text, TypeError, "Illegal use of \"constant\" specifier.");
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(empty_name_return_parameter)
|
||||
{
|
||||
char const* text = R"(
|
||||
@ -5582,6 +5592,16 @@ BOOST_AUTO_TEST_CASE(interface_variables)
|
||||
CHECK_ERROR(text, TypeError, "Variables cannot be declared in interfaces");
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(interface_function_parameters)
|
||||
{
|
||||
char const* text = R"(
|
||||
interface I {
|
||||
function f(uint a) returns(bool);
|
||||
}
|
||||
)";
|
||||
success(text);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(interface_enums)
|
||||
{
|
||||
char const* text = R"(
|
||||
|
Loading…
Reference in New Issue
Block a user