diff options
author | Yoichi Hirai <i@yoichihirai.com> | 2016-11-11 23:18:03 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-11-11 23:18:03 +0800 |
commit | 6248e92d77673eaf2c851b9dd0b1811248a24b58 (patch) | |
tree | 174bed458bfe9d1e1dd9e4a7a45387cbcf5d262d | |
parent | a40dcfef1257c4b159eb8248ecb0f837b42d8ead (diff) | |
parent | 41170d55075fc056a688dc8fb29021e23b645cc0 (diff) | |
download | dexon-solidity-6248e92d77673eaf2c851b9dd0b1811248a24b58.tar.gz dexon-solidity-6248e92d77673eaf2c851b9dd0b1811248a24b58.tar.zst dexon-solidity-6248e92d77673eaf2c851b9dd0b1811248a24b58.zip |
Merge pull request #1293 from ethereum/common_type_of_rational_type
tolerant type checking for inline arrays, by computing the common type in a more tolerant way
-rw-r--r-- | Changelog.md | 1 | ||||
-rw-r--r-- | libsolidity/analysis/TypeChecker.cpp | 4 | ||||
-rw-r--r-- | libsolidity/ast/Types.cpp | 8 | ||||
-rw-r--r-- | test/libsolidity/SolidityEndToEndTest.cpp | 14 |
4 files changed, 21 insertions, 6 deletions
diff --git a/Changelog.md b/Changelog.md index 1ae2f57e..d76303ab 100644 --- a/Changelog.md +++ b/Changelog.md @@ -2,6 +2,7 @@ Features: * Do-while loops: support for a C-style do{<block>}while(<expr>); control structure + * Type checker: now more eagerly searches for a common type of an inline array with mixed types ### 0.4.4 (2016-10-31) diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp index 46f4f7f6..f934b2c8 100644 --- a/libsolidity/analysis/TypeChecker.cpp +++ b/libsolidity/analysis/TypeChecker.cpp @@ -996,9 +996,9 @@ bool TypeChecker::visit(TupleExpression const& _tuple) fatalTypeError(components[i]->location(), "Invalid mobile type."); if (i == 0) - inlineArrayType = types[i]->mobileType(); + inlineArrayType = types[i]; else if (inlineArrayType) - inlineArrayType = Type::commonType(inlineArrayType, types[i]->mobileType()); + inlineArrayType = Type::commonType(inlineArrayType, types[i]); } } else diff --git a/libsolidity/ast/Types.cpp b/libsolidity/ast/Types.cpp index 7fe97fa7..0e077b32 100644 --- a/libsolidity/ast/Types.cpp +++ b/libsolidity/ast/Types.cpp @@ -200,10 +200,10 @@ TypePointer Type::commonType(TypePointer const& _a, TypePointer const& _b) { if (!_a || !_b) return TypePointer(); - else if (_b->isImplicitlyConvertibleTo(*_a)) - return _a; - else if (_a->isImplicitlyConvertibleTo(*_b)) - return _b; + else if (_b->isImplicitlyConvertibleTo(*_a->mobileType())) + return _a->mobileType(); + else if (_a->isImplicitlyConvertibleTo(*_b->mobileType())) + return _b->mobileType(); else return TypePointer(); } diff --git a/test/libsolidity/SolidityEndToEndTest.cpp b/test/libsolidity/SolidityEndToEndTest.cpp index a1430b02..bab54fab 100644 --- a/test/libsolidity/SolidityEndToEndTest.cpp +++ b/test/libsolidity/SolidityEndToEndTest.cpp @@ -6353,6 +6353,20 @@ BOOST_AUTO_TEST_CASE(decayed_tuple) BOOST_CHECK(callContractFunction("f()") == encodeArgs(u256(2))); } +BOOST_AUTO_TEST_CASE(inline_tuple_with_rational_numbers) +{ + char const* sourceCode = R"( + contract c { + function f() returns (int8) { + int8[5] memory foo3 = [int8(1), -1, 0, 0, 0]; + return foo3[0]; + } + } + )"; + compileAndRun(sourceCode); + BOOST_CHECK(callContractFunction("f()") == encodeArgs(u256(1))); +} + BOOST_AUTO_TEST_CASE(destructuring_assignment) { char const* sourceCode = R"( |