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
This commit is contained in:
Yoichi Hirai 2016-11-11 16:18:03 +01:00 committed by GitHub
commit 6248e92d77
4 changed files with 21 additions and 6 deletions

View File

@ -2,6 +2,7 @@
Features: Features:
* Do-while loops: support for a C-style do{<block>}while(<expr>); control structure * 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) ### 0.4.4 (2016-10-31)

View File

@ -996,9 +996,9 @@ bool TypeChecker::visit(TupleExpression const& _tuple)
fatalTypeError(components[i]->location(), "Invalid mobile type."); fatalTypeError(components[i]->location(), "Invalid mobile type.");
if (i == 0) if (i == 0)
inlineArrayType = types[i]->mobileType(); inlineArrayType = types[i];
else if (inlineArrayType) else if (inlineArrayType)
inlineArrayType = Type::commonType(inlineArrayType, types[i]->mobileType()); inlineArrayType = Type::commonType(inlineArrayType, types[i]);
} }
} }
else else

View File

@ -200,10 +200,10 @@ TypePointer Type::commonType(TypePointer const& _a, TypePointer const& _b)
{ {
if (!_a || !_b) if (!_a || !_b)
return TypePointer(); return TypePointer();
else if (_b->isImplicitlyConvertibleTo(*_a)) else if (_b->isImplicitlyConvertibleTo(*_a->mobileType()))
return _a; return _a->mobileType();
else if (_a->isImplicitlyConvertibleTo(*_b)) else if (_a->isImplicitlyConvertibleTo(*_b->mobileType()))
return _b; return _b->mobileType();
else else
return TypePointer(); return TypePointer();
} }

View File

@ -6353,6 +6353,20 @@ BOOST_AUTO_TEST_CASE(decayed_tuple)
BOOST_CHECK(callContractFunction("f()") == encodeArgs(u256(2))); 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) BOOST_AUTO_TEST_CASE(destructuring_assignment)
{ {
char const* sourceCode = R"( char const* sourceCode = R"(