mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #4097 from ethereum/noPackedExceptForPacked
[BREAKING] call only takes a single argument and does not pad
This commit is contained in:
@@ -1745,35 +1745,6 @@ bool TypeChecker::visit(FunctionCall const& _functionCall)
|
||||
}
|
||||
}
|
||||
|
||||
if (functionType->takesSinglePackedBytesParameter())
|
||||
{
|
||||
if (
|
||||
(arguments.size() > 1) ||
|
||||
(arguments.size() == 1 && !type(*arguments.front())->isImplicitlyConvertibleTo(ArrayType(DataLocation::Memory)))
|
||||
)
|
||||
{
|
||||
string msg =
|
||||
"This function only accepts a single \"bytes\" argument. Please use "
|
||||
"\"abi.encodePacked(...)\" or a similar function to encode the data.";
|
||||
if (v050)
|
||||
m_errorReporter.typeError(_functionCall.location(), msg);
|
||||
else
|
||||
m_errorReporter.warning(_functionCall.location(), msg);
|
||||
}
|
||||
|
||||
if (arguments.size() == 1 && !type(*arguments.front())->isImplicitlyConvertibleTo(ArrayType(DataLocation::Memory)))
|
||||
{
|
||||
string msg =
|
||||
"The provided argument of type " +
|
||||
type(*arguments.front())->toString() +
|
||||
" is not implicitly convertible to expected type bytes memory.";
|
||||
if (v050)
|
||||
m_errorReporter.typeError(_functionCall.location(), msg);
|
||||
else
|
||||
m_errorReporter.warning(_functionCall.location(), msg);
|
||||
}
|
||||
}
|
||||
|
||||
if (functionType->takesArbitraryParameters() && arguments.size() < parameterTypes.size())
|
||||
{
|
||||
solAssert(_functionCall.annotation().kind == FunctionCallKind::FunctionCall, "");
|
||||
@@ -1805,6 +1776,26 @@ bool TypeChecker::visit(FunctionCall const& _functionCall)
|
||||
for (auto const& member: membersRemovedForStructConstructor)
|
||||
msg += " " + member;
|
||||
}
|
||||
else if (
|
||||
functionType->kind() == FunctionType::Kind::BareCall ||
|
||||
functionType->kind() == FunctionType::Kind::BareCallCode ||
|
||||
functionType->kind() == FunctionType::Kind::BareDelegateCall
|
||||
)
|
||||
{
|
||||
if (arguments.empty())
|
||||
msg += " This function requires a single bytes argument. Use \"\" as argument to provide empty calldata.";
|
||||
else
|
||||
msg += " This function requires a single bytes argument. If all your arguments are value types, you can use abi.encode(...) to properly generate it.";
|
||||
}
|
||||
else if (
|
||||
functionType->kind() == FunctionType::Kind::SHA3 ||
|
||||
functionType->kind() == FunctionType::Kind::SHA256 ||
|
||||
functionType->kind() == FunctionType::Kind::RIPEMD160
|
||||
)
|
||||
msg +=
|
||||
" This function requires a single bytes argument."
|
||||
" Use abi.encodePacked(...) to obtain the pre-0.5.0 behaviour"
|
||||
" or abi.encode(...) to use ABI encoding.";
|
||||
m_errorReporter.typeError(_functionCall.location(), msg);
|
||||
}
|
||||
else if (isPositionalCall)
|
||||
@@ -1841,15 +1832,31 @@ bool TypeChecker::visit(FunctionCall const& _functionCall)
|
||||
}
|
||||
}
|
||||
else if (!type(*arguments[i])->isImplicitlyConvertibleTo(*parameterTypes[i]))
|
||||
m_errorReporter.typeError(
|
||||
arguments[i]->location(),
|
||||
{
|
||||
string msg =
|
||||
"Invalid type for argument in function call. "
|
||||
"Invalid implicit conversion from " +
|
||||
type(*arguments[i])->toString() +
|
||||
" to " +
|
||||
parameterTypes[i]->toString() +
|
||||
" requested."
|
||||
);
|
||||
" requested.";
|
||||
if (
|
||||
functionType->kind() == FunctionType::Kind::BareCall ||
|
||||
functionType->kind() == FunctionType::Kind::BareCallCode ||
|
||||
functionType->kind() == FunctionType::Kind::BareDelegateCall
|
||||
)
|
||||
msg += " This function requires a single bytes argument. If all your arguments are value types, you can use abi.encode(...) to properly generate it.";
|
||||
else if (
|
||||
functionType->kind() == FunctionType::Kind::SHA3 ||
|
||||
functionType->kind() == FunctionType::Kind::SHA256 ||
|
||||
functionType->kind() == FunctionType::Kind::RIPEMD160
|
||||
)
|
||||
msg +=
|
||||
" This function requires a single bytes argument."
|
||||
" Use abi.encodePacked(...) to obtain the pre-0.5.0 behaviour"
|
||||
" or abi.encode(...) to use ABI encoding.";
|
||||
m_errorReporter.typeError(arguments[i]->location(), msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user