mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
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:
commit
6248e92d77
@ -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)
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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"(
|
||||||
|
Loading…
Reference in New Issue
Block a user