mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Adds an additional message to failing type conversions.
This commit is contained in:
parent
52ff3c9455
commit
b2afb8cdda
@ -6,6 +6,7 @@ Language Features:
|
|||||||
Compiler Features:
|
Compiler Features:
|
||||||
* Inline Assembly: Improve error messages around invalid function argument count.
|
* Inline Assembly: Improve error messages around invalid function argument count.
|
||||||
* Code Generator: Use binary search for dispatch function if more efficient. The size/speed tradeoff can be tuned using ``--optimize-runs``.
|
* Code Generator: Use binary search for dispatch function if more efficient. The size/speed tradeoff can be tuned using ``--optimize-runs``.
|
||||||
|
* Type Checker: Add an additional reason to be displayed when type conversion fails.
|
||||||
|
|
||||||
|
|
||||||
Bugfixes:
|
Bugfixes:
|
||||||
|
@ -1252,7 +1252,8 @@ void TypeChecker::endVisit(BinaryOperation const& _operation)
|
|||||||
{
|
{
|
||||||
TypePointer const& leftType = type(_operation.leftExpression());
|
TypePointer const& leftType = type(_operation.leftExpression());
|
||||||
TypePointer const& rightType = type(_operation.rightExpression());
|
TypePointer const& rightType = type(_operation.rightExpression());
|
||||||
TypePointer commonType = leftType->binaryOperatorResult(_operation.getOperator(), rightType);
|
TypeResult result = leftType->binaryOperatorResult(_operation.getOperator(), rightType);
|
||||||
|
TypePointer commonType = result.get();
|
||||||
if (!commonType)
|
if (!commonType)
|
||||||
{
|
{
|
||||||
m_errorReporter.typeError(
|
m_errorReporter.typeError(
|
||||||
@ -1262,7 +1263,8 @@ void TypeChecker::endVisit(BinaryOperation const& _operation)
|
|||||||
" not compatible with types " +
|
" not compatible with types " +
|
||||||
leftType->toString() +
|
leftType->toString() +
|
||||||
" and " +
|
" and " +
|
||||||
rightType->toString()
|
rightType->toString() +
|
||||||
|
(!result.message().empty() ? ". " + result.message() : "")
|
||||||
);
|
);
|
||||||
commonType = leftType;
|
commonType = leftType;
|
||||||
}
|
}
|
||||||
|
@ -512,9 +512,8 @@ TypeResult AddressType::unaryOperatorResult(Token _operator) const
|
|||||||
|
|
||||||
TypeResult AddressType::binaryOperatorResult(Token _operator, TypePointer const& _other) const
|
TypeResult AddressType::binaryOperatorResult(Token _operator, TypePointer const& _other) const
|
||||||
{
|
{
|
||||||
// Addresses can only be compared.
|
|
||||||
if (!TokenTraits::isCompareOp(_operator))
|
if (!TokenTraits::isCompareOp(_operator))
|
||||||
return TypePointer();
|
return TypeResult{"Addresses can only be compared"};
|
||||||
|
|
||||||
return Type::commonType(shared_from_this(), _other);
|
return Type::commonType(shared_from_this(), _other);
|
||||||
}
|
}
|
||||||
@ -678,9 +677,8 @@ TypeResult IntegerType::binaryOperatorResult(Token _operator, TypePointer const&
|
|||||||
return TypePointer();
|
return TypePointer();
|
||||||
if (auto intType = dynamic_pointer_cast<IntegerType const>(commonType))
|
if (auto intType = dynamic_pointer_cast<IntegerType const>(commonType))
|
||||||
{
|
{
|
||||||
// Signed EXP is not allowed
|
|
||||||
if (Token::Exp == _operator && intType->isSigned())
|
if (Token::Exp == _operator && intType->isSigned())
|
||||||
return TypePointer();
|
return TypeResult{"Signed exponentiation is not allowed"};
|
||||||
}
|
}
|
||||||
else if (auto fixType = dynamic_pointer_cast<FixedPointType const>(commonType))
|
else if (auto fixType = dynamic_pointer_cast<FixedPointType const>(commonType))
|
||||||
if (Token::Exp == _operator)
|
if (Token::Exp == _operator)
|
||||||
@ -1128,9 +1126,8 @@ TypeResult RationalNumberType::binaryOperatorResult(Token _operator, TypePointer
|
|||||||
|
|
||||||
uint32_t absExp = bigint(abs(exp)).convert_to<uint32_t>();
|
uint32_t absExp = bigint(abs(exp)).convert_to<uint32_t>();
|
||||||
|
|
||||||
// Limit size to 4096 bits
|
|
||||||
if (!fitsPrecisionExp(abs(m_value.numerator()), absExp) || !fitsPrecisionExp(abs(m_value.denominator()), absExp))
|
if (!fitsPrecisionExp(abs(m_value.numerator()), absExp) || !fitsPrecisionExp(abs(m_value.denominator()), absExp))
|
||||||
return TypePointer();
|
return TypeResult{"Precision is limited to 4096 bits"};
|
||||||
|
|
||||||
static auto const optimizedPow = [](bigint const& _base, uint32_t _exponent) -> bigint {
|
static auto const optimizedPow = [](bigint const& _base, uint32_t _exponent) -> bigint {
|
||||||
if (_base == 1)
|
if (_base == 1)
|
||||||
@ -1211,7 +1208,7 @@ TypeResult RationalNumberType::binaryOperatorResult(Token _operator, TypePointer
|
|||||||
|
|
||||||
// verify that numerator and denominator fit into 4096 bit after every operation
|
// verify that numerator and denominator fit into 4096 bit after every operation
|
||||||
if (value.numerator() != 0 && max(mostSignificantBit(abs(value.numerator())), mostSignificantBit(abs(value.denominator()))) > 4096)
|
if (value.numerator() != 0 && max(mostSignificantBit(abs(value.numerator())), mostSignificantBit(abs(value.denominator()))) > 4096)
|
||||||
return TypePointer();
|
return TypeResult{"Precision is limited to 4096 bits"};
|
||||||
|
|
||||||
return TypeResult(make_shared<RationalNumberType>(value));
|
return TypeResult(make_shared<RationalNumberType>(value));
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
contract test { function() external { int x = -3; int y = -4; x ** y; } }
|
contract test { function() external { int x = -3; int y = -4; x ** y; } }
|
||||||
// ----
|
// ----
|
||||||
// TypeError: (62-68): Operator ** not compatible with types int256 and int256
|
// TypeError: (62-68): Operator ** not compatible with types int256 and int256. Signed exponentiation is not allowed
|
||||||
|
@ -0,0 +1,15 @@
|
|||||||
|
contract C {
|
||||||
|
address a;
|
||||||
|
function f() public pure returns(bool) {
|
||||||
|
a = address(0) + address(0);
|
||||||
|
a = address(0) - address(0);
|
||||||
|
a = address(0) * address(0);
|
||||||
|
a = address(0) / address(0);
|
||||||
|
return address(0) == address(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ----
|
||||||
|
// TypeError: (85-108): Operator + not compatible with types address payable and address payable. Addresses can only be compared
|
||||||
|
// TypeError: (122-145): Operator - not compatible with types address payable and address payable. Addresses can only be compared
|
||||||
|
// TypeError: (159-182): Operator * not compatible with types address payable and address payable. Addresses can only be compared
|
||||||
|
// TypeError: (196-219): Operator / not compatible with types address payable and address payable. Addresses can only be compared
|
@ -5,5 +5,5 @@ contract c {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
// TypeError: (71-92): Operator / not compatible with types rational_const 1 / 5221...(1225 digits omitted)...5168 and int_const 5221...(1225 digits omitted)...5168
|
// TypeError: (71-92): Operator / not compatible with types rational_const 1 / 5221...(1225 digits omitted)...5168 and int_const 5221...(1225 digits omitted)...5168. Precision is limited to 4096 bits
|
||||||
// TypeError: (71-92): Type rational_const 1 / 5221...(1225 digits omitted)...5168 is not implicitly convertible to expected type int256. Try converting to type ufixed8x80 or use an explicit conversion.
|
// TypeError: (71-92): Type rational_const 1 / 5221...(1225 digits omitted)...5168 is not implicitly convertible to expected type int256. Try converting to type ufixed8x80 or use an explicit conversion.
|
||||||
|
@ -19,23 +19,23 @@ contract c {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
// TypeError: (71-102): Operator ** not compatible with types int_const 1797...(301 digits omitted)...7216 and int_const 4
|
// TypeError: (71-102): Operator ** not compatible with types int_const 1797...(301 digits omitted)...7216 and int_const 4. Precision is limited to 4096 bits
|
||||||
// TypeError: (71-102): Type int_const 1797...(301 digits omitted)...7216 is not implicitly convertible to expected type int256.
|
// TypeError: (71-102): Type int_const 1797...(301 digits omitted)...7216 is not implicitly convertible to expected type int256.
|
||||||
// TypeError: (116-148): Operator ** not compatible with types int_const 1797...(301 digits omitted)...7216 and int_const 4
|
// TypeError: (116-148): Operator ** not compatible with types int_const 1797...(301 digits omitted)...7216 and int_const 4. Precision is limited to 4096 bits
|
||||||
// TypeError: (116-153): Operator ** not compatible with types int_const 1797...(301 digits omitted)...7216 and int_const 4
|
// TypeError: (116-153): Operator ** not compatible with types int_const 1797...(301 digits omitted)...7216 and int_const 4. Precision is limited to 4096 bits
|
||||||
// TypeError: (116-153): Type int_const 1797...(301 digits omitted)...7216 is not implicitly convertible to expected type int256.
|
// TypeError: (116-153): Type int_const 1797...(301 digits omitted)...7216 is not implicitly convertible to expected type int256.
|
||||||
// TypeError: (167-203): Operator ** not compatible with types int_const 4 and int_const -179...(302 digits omitted)...7216
|
// TypeError: (167-203): Operator ** not compatible with types int_const 4 and int_const -179...(302 digits omitted)...7216
|
||||||
// TypeError: (217-228): Operator ** not compatible with types int_const 2 and int_const 1000...(1226 digits omitted)...0000
|
// TypeError: (217-228): Operator ** not compatible with types int_const 2 and int_const 1000...(1226 digits omitted)...0000
|
||||||
// TypeError: (242-254): Operator ** not compatible with types int_const -2 and int_const 1000...(1226 digits omitted)...0000
|
// TypeError: (242-254): Operator ** not compatible with types int_const -2 and int_const 1000...(1226 digits omitted)...0000
|
||||||
// TypeError: (268-280): Operator ** not compatible with types int_const 2 and int_const -100...(1227 digits omitted)...0000
|
// TypeError: (268-280): Operator ** not compatible with types int_const 2 and int_const -100...(1227 digits omitted)...0000
|
||||||
// TypeError: (294-307): Operator ** not compatible with types int_const -2 and int_const -100...(1227 digits omitted)...0000
|
// TypeError: (294-307): Operator ** not compatible with types int_const -2 and int_const -100...(1227 digits omitted)...0000
|
||||||
// TypeError: (321-332): Operator ** not compatible with types int_const 1000...(1226 digits omitted)...0000 and int_const 2
|
// TypeError: (321-332): Operator ** not compatible with types int_const 1000...(1226 digits omitted)...0000 and int_const 2. Precision is limited to 4096 bits
|
||||||
// TypeError: (321-332): Type int_const 1000...(1226 digits omitted)...0000 is not implicitly convertible to expected type int256.
|
// TypeError: (321-332): Type int_const 1000...(1226 digits omitted)...0000 is not implicitly convertible to expected type int256.
|
||||||
// TypeError: (346-358): Operator ** not compatible with types int_const -100...(1227 digits omitted)...0000 and int_const 2
|
// TypeError: (346-358): Operator ** not compatible with types int_const -100...(1227 digits omitted)...0000 and int_const 2. Precision is limited to 4096 bits
|
||||||
// TypeError: (346-358): Type int_const -100...(1227 digits omitted)...0000 is not implicitly convertible to expected type int256.
|
// TypeError: (346-358): Type int_const -100...(1227 digits omitted)...0000 is not implicitly convertible to expected type int256.
|
||||||
// TypeError: (372-384): Operator ** not compatible with types int_const 1000...(1226 digits omitted)...0000 and int_const -2
|
// TypeError: (372-384): Operator ** not compatible with types int_const 1000...(1226 digits omitted)...0000 and int_const -2. Precision is limited to 4096 bits
|
||||||
// TypeError: (372-384): Type int_const 1000...(1226 digits omitted)...0000 is not implicitly convertible to expected type int256.
|
// TypeError: (372-384): Type int_const 1000...(1226 digits omitted)...0000 is not implicitly convertible to expected type int256.
|
||||||
// TypeError: (398-411): Operator ** not compatible with types int_const -100...(1227 digits omitted)...0000 and int_const -2
|
// TypeError: (398-411): Operator ** not compatible with types int_const -100...(1227 digits omitted)...0000 and int_const -2. Precision is limited to 4096 bits
|
||||||
// TypeError: (398-411): Type int_const -100...(1227 digits omitted)...0000 is not implicitly convertible to expected type int256.
|
// TypeError: (398-411): Type int_const -100...(1227 digits omitted)...0000 is not implicitly convertible to expected type int256.
|
||||||
// TypeError: (425-441): Operator ** not compatible with types int_const 1000...(1226 digits omitted)...0000 and int_const 1000...(1226 digits omitted)...0000
|
// TypeError: (425-441): Operator ** not compatible with types int_const 1000...(1226 digits omitted)...0000 and int_const 1000...(1226 digits omitted)...0000
|
||||||
// TypeError: (425-441): Type int_const 1000...(1226 digits omitted)...0000 is not implicitly convertible to expected type int256.
|
// TypeError: (425-441): Type int_const 1000...(1226 digits omitted)...0000 is not implicitly convertible to expected type int256.
|
||||||
|
@ -5,5 +5,5 @@ contract c {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
// TypeError: (71-90): Operator * not compatible with types int_const 5221...(1225 digits omitted)...5168 and int_const 5221...(1225 digits omitted)...5168
|
// TypeError: (71-90): Operator * not compatible with types int_const 5221...(1225 digits omitted)...5168 and int_const 5221...(1225 digits omitted)...5168. Precision is limited to 4096 bits
|
||||||
// TypeError: (71-90): Type int_const 5221...(1225 digits omitted)...5168 is not implicitly convertible to expected type int256.
|
// TypeError: (71-90): Type int_const 5221...(1225 digits omitted)...5168 is not implicitly convertible to expected type int256.
|
||||||
|
Loading…
Reference in New Issue
Block a user