Check partial function parameters if rest is arbitrary.

This commit is contained in:
chriseth 2018-03-21 19:07:15 +01:00
parent c4a6a63f36
commit 7343c40283
2 changed files with 27 additions and 3 deletions

View File

@ -1688,7 +1688,19 @@ bool TypeChecker::visit(FunctionCall const& _functionCall)
} }
} }
if (!functionType->takesArbitraryParameters() && parameterTypes.size() != arguments.size()) if (functionType->takesArbitraryParameters() && arguments.size() < parameterTypes.size())
{
solAssert(_functionCall.annotation().kind == FunctionCallKind::FunctionCall, "");
m_errorReporter.typeError(
_functionCall.location(),
"Need at least " +
toString(parameterTypes.size()) +
" arguments for function call, but provided only " +
toString(arguments.size()) +
"."
);
}
else if (!functionType->takesArbitraryParameters() && parameterTypes.size() != arguments.size())
{ {
bool isStructConstructorCall = _functionCall.annotation().kind == FunctionCallKind::StructConstructorCall; bool isStructConstructorCall = _functionCall.annotation().kind == FunctionCallKind::StructConstructorCall;
@ -1711,11 +1723,10 @@ bool TypeChecker::visit(FunctionCall const& _functionCall)
} }
else if (isPositionalCall) else if (isPositionalCall)
{ {
// call by positional arguments
for (size_t i = 0; i < arguments.size(); ++i) for (size_t i = 0; i < arguments.size(); ++i)
{ {
auto const& argType = type(*arguments[i]); auto const& argType = type(*arguments[i]);
if (functionType->takesArbitraryParameters()) if (functionType->takesArbitraryParameters() && i >= parameterTypes.size())
{ {
bool errored = false; bool errored = false;
if (auto t = dynamic_cast<RationalNumberType const*>(argType.get())) if (auto t = dynamic_cast<RationalNumberType const*>(argType.get()))

View File

@ -0,0 +1,13 @@
contract C {
function f() pure public {
abi.encodeWithSelector();
abi.encodeWithSignature();
abi.encodeWithSelector(uint(2), 2);
abi.encodeWithSignature(uint(2), 2);
}
}
// ----
// TypeError: (52-76): Need at least 1 arguments for function call, but provided only 0.
// TypeError: (86-111): Need at least 1 arguments for function call, but provided only 0.
// TypeError: (144-151): Invalid type for argument in function call. Invalid implicit conversion from uint256 to bytes4 requested.
// TypeError: (189-196): Invalid type for argument in function call. Invalid implicit conversion from uint256 to string memory requested.