mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #2459 from ethereum/noComparisonForSomeTypes
No comparison for some types
This commit is contained in:
commit
9d201a086c
@ -19,6 +19,7 @@ Bugfixes:
|
|||||||
* Type Checker: Fix address literals not being treated as compile-time constants.
|
* Type Checker: Fix address literals not being treated as compile-time constants.
|
||||||
* Type Checker: Disallow invoking the same modifier multiple times.
|
* Type Checker: Disallow invoking the same modifier multiple times.
|
||||||
* Type Checker: Make UTF8-validation a bit more sloppy to include more valid sequences.
|
* Type Checker: Make UTF8-validation a bit more sloppy to include more valid sequences.
|
||||||
|
* Type Checker: Disallow comparisons between mapping and non-internal function types.
|
||||||
* Type Checker: Do not treat strings that look like addresses as addresses.
|
* Type Checker: Do not treat strings that look like addresses as addresses.
|
||||||
* Fixed crash concerning non-callable types.
|
* Fixed crash concerning non-callable types.
|
||||||
* Unused variable warnings no longer issued for variables used inside inline assembly.
|
* Unused variable warnings no longer issued for variables used inside inline assembly.
|
||||||
|
@ -2248,6 +2248,16 @@ TypePointer FunctionType::unaryOperatorResult(Token::Value _operator) const
|
|||||||
return TypePointer();
|
return TypePointer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TypePointer FunctionType::binaryOperatorResult(Token::Value _operator, TypePointer const& _other) const
|
||||||
|
{
|
||||||
|
if (_other->category() != category() || !(_operator == Token::Equal || _operator == Token::NotEqual))
|
||||||
|
return TypePointer();
|
||||||
|
FunctionType const& other = dynamic_cast<FunctionType const&>(*_other);
|
||||||
|
if (kind() == Kind::Internal && other.kind() == Kind::Internal && sizeOnStack() == 1 && other.sizeOnStack() == 1)
|
||||||
|
return commonType(shared_from_this(), _other);
|
||||||
|
return TypePointer();
|
||||||
|
}
|
||||||
|
|
||||||
string FunctionType::canonicalName(bool) const
|
string FunctionType::canonicalName(bool) const
|
||||||
{
|
{
|
||||||
solAssert(m_kind == Kind::External, "");
|
solAssert(m_kind == Kind::External, "");
|
||||||
|
@ -933,6 +933,7 @@ public:
|
|||||||
virtual bool operator==(Type const& _other) const override;
|
virtual bool operator==(Type const& _other) const override;
|
||||||
virtual bool isExplicitlyConvertibleTo(Type const& _convertTo) const override;
|
virtual bool isExplicitlyConvertibleTo(Type const& _convertTo) const override;
|
||||||
virtual TypePointer unaryOperatorResult(Token::Value _operator) const override;
|
virtual TypePointer unaryOperatorResult(Token::Value _operator) const override;
|
||||||
|
virtual TypePointer binaryOperatorResult(Token::Value, TypePointer const&) const override;
|
||||||
virtual std::string canonicalName(bool /*_addDataLocation*/) const override;
|
virtual std::string canonicalName(bool /*_addDataLocation*/) const override;
|
||||||
virtual std::string toString(bool _short) const override;
|
virtual std::string toString(bool _short) const override;
|
||||||
virtual unsigned calldataEncodedSize(bool _padded) const override;
|
virtual unsigned calldataEncodedSize(bool _padded) const override;
|
||||||
@ -1038,6 +1039,7 @@ public:
|
|||||||
virtual std::string toString(bool _short) const override;
|
virtual std::string toString(bool _short) const override;
|
||||||
virtual std::string canonicalName(bool _addDataLocation) const override;
|
virtual std::string canonicalName(bool _addDataLocation) const override;
|
||||||
virtual bool canLiveOutsideStorage() const override { return false; }
|
virtual bool canLiveOutsideStorage() const override { return false; }
|
||||||
|
virtual TypePointer binaryOperatorResult(Token::Value, TypePointer const&) const override { return TypePointer(); }
|
||||||
virtual TypePointer encodingType() const override
|
virtual TypePointer encodingType() const override
|
||||||
{
|
{
|
||||||
return std::make_shared<IntegerType>(256);
|
return std::make_shared<IntegerType>(256);
|
||||||
@ -1116,11 +1118,7 @@ public:
|
|||||||
|
|
||||||
explicit ModuleType(SourceUnit const& _source): m_sourceUnit(_source) {}
|
explicit ModuleType(SourceUnit const& _source): m_sourceUnit(_source) {}
|
||||||
|
|
||||||
virtual TypePointer binaryOperatorResult(Token::Value, TypePointer const&) const override
|
virtual TypePointer binaryOperatorResult(Token::Value, TypePointer const&) const override { return TypePointer(); }
|
||||||
{
|
|
||||||
return TypePointer();
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual std::string identifier() const override;
|
virtual std::string identifier() const override;
|
||||||
virtual bool operator==(Type const& _other) const override;
|
virtual bool operator==(Type const& _other) const override;
|
||||||
virtual bool canBeStored() const override { return false; }
|
virtual bool canBeStored() const override { return false; }
|
||||||
@ -1178,6 +1176,7 @@ public:
|
|||||||
virtual std::string identifier() const override { return "t_inaccessible"; }
|
virtual std::string identifier() const override { return "t_inaccessible"; }
|
||||||
virtual bool isImplicitlyConvertibleTo(Type const&) const override { return false; }
|
virtual bool isImplicitlyConvertibleTo(Type const&) const override { return false; }
|
||||||
virtual bool isExplicitlyConvertibleTo(Type const&) const override { return false; }
|
virtual bool isExplicitlyConvertibleTo(Type const&) const override { return false; }
|
||||||
|
virtual TypePointer binaryOperatorResult(Token::Value, TypePointer const&) const override { return TypePointer(); }
|
||||||
virtual unsigned calldataEncodedSize(bool _padded) const override { (void)_padded; return 32; }
|
virtual unsigned calldataEncodedSize(bool _padded) const override { (void)_padded; return 32; }
|
||||||
virtual bool canBeStored() const override { return false; }
|
virtual bool canBeStored() const override { return false; }
|
||||||
virtual bool canLiveOutsideStorage() const override { return false; }
|
virtual bool canLiveOutsideStorage() const override { return false; }
|
||||||
|
@ -1366,6 +1366,7 @@ void ExpressionCompiler::appendAndOrOperatorCode(BinaryOperation const& _binaryO
|
|||||||
|
|
||||||
void ExpressionCompiler::appendCompareOperatorCode(Token::Value _operator, Type const& _type)
|
void ExpressionCompiler::appendCompareOperatorCode(Token::Value _operator, Type const& _type)
|
||||||
{
|
{
|
||||||
|
solAssert(_type.sizeOnStack() == 1, "Comparison of multi-slot types.");
|
||||||
if (_operator == Token::Equal || _operator == Token::NotEqual)
|
if (_operator == Token::Equal || _operator == Token::NotEqual)
|
||||||
{
|
{
|
||||||
if (FunctionType const* funType = dynamic_cast<decltype(funType)>(&_type))
|
if (FunctionType const* funType = dynamic_cast<decltype(funType)>(&_type))
|
||||||
|
@ -554,6 +554,51 @@ BOOST_AUTO_TEST_CASE(comparison_bitop_precedence)
|
|||||||
CHECK_SUCCESS(text);
|
CHECK_SUCCESS(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(comparison_of_function_types)
|
||||||
|
{
|
||||||
|
char const* text = R"(
|
||||||
|
contract C {
|
||||||
|
function f() returns (bool ret) {
|
||||||
|
return this.f < this.f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
CHECK_ERROR(text, TypeError, "Operator < not compatible");
|
||||||
|
text = R"(
|
||||||
|
contract C {
|
||||||
|
function f() returns (bool ret) {
|
||||||
|
return f < f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
CHECK_ERROR(text, TypeError, "Operator < not compatible");
|
||||||
|
text = R"(
|
||||||
|
contract C {
|
||||||
|
function f() returns (bool ret) {
|
||||||
|
return f == f;
|
||||||
|
}
|
||||||
|
function g() returns (bool ret) {
|
||||||
|
return f != f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
CHECK_SUCCESS(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(comparison_of_mapping_types)
|
||||||
|
{
|
||||||
|
char const* text = R"(
|
||||||
|
contract C {
|
||||||
|
mapping(uint => uint) x;
|
||||||
|
function f() returns (bool ret) {
|
||||||
|
var y = x;
|
||||||
|
return x == y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
CHECK_ERROR(text, TypeError, "Operator == not compatible");
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(function_no_implementation)
|
BOOST_AUTO_TEST_CASE(function_no_implementation)
|
||||||
{
|
{
|
||||||
ASTPointer<SourceUnit> sourceUnit;
|
ASTPointer<SourceUnit> sourceUnit;
|
||||||
|
Loading…
Reference in New Issue
Block a user