mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #1988 from LianaHus/sol_Check_ref_problems_for_structs
Check: Reference problems concerning structs
This commit is contained in:
commit
e5a4a8fca4
@ -4023,6 +4023,92 @@ BOOST_AUTO_TEST_CASE(overwriting_inheritance)
|
||||
BOOST_CHECK(callContractFunction("checkOk()") == encodeArgs(6));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(struct_assign_reference_to_struct)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
contract test {
|
||||
struct testStruct
|
||||
{
|
||||
uint m_value;
|
||||
}
|
||||
testStruct data1;
|
||||
testStruct data2;
|
||||
testStruct data3;
|
||||
function test()
|
||||
{
|
||||
data1.m_value = 2;
|
||||
}
|
||||
function assign() returns (uint ret_local, uint ret_global, uint ret_global3, uint ret_global1)
|
||||
{
|
||||
testStruct x = data1; //x is a reference data1.m_value == 2 as well as x.m_value = 2
|
||||
data2 = data1; // should copy data. data2.m_value == 2
|
||||
|
||||
ret_local = x.m_value; // = 2
|
||||
ret_global = data2.m_value; // = 2
|
||||
|
||||
x.m_value = 3;
|
||||
data3 = x; //should copy the data. data3.m_value == 3
|
||||
ret_global3 = data3.m_value; // = 3
|
||||
ret_global1 = data1.m_value; // = 3. Changed due to the assignment to x.m_value
|
||||
}
|
||||
}
|
||||
)";
|
||||
compileAndRun(sourceCode, 0, "test");
|
||||
BOOST_CHECK(callContractFunction("assign()") == encodeArgs(2, 2, 3, 3));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(struct_delete_member)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
contract test {
|
||||
struct testStruct
|
||||
{
|
||||
uint m_value;
|
||||
}
|
||||
testStruct data1;
|
||||
function test()
|
||||
{
|
||||
data1.m_value = 2;
|
||||
}
|
||||
function deleteMember() returns (uint ret_value)
|
||||
{
|
||||
testStruct x = data1; //should not copy the data. data1.m_value == 2 but x.m_value = 0
|
||||
x.m_value = 4;
|
||||
delete x.m_value;
|
||||
ret_value = data1.m_value;
|
||||
}
|
||||
}
|
||||
)";
|
||||
compileAndRun(sourceCode, 0, "test");
|
||||
auto res = callContractFunction("deleteMember()");
|
||||
BOOST_CHECK(callContractFunction("deleteMember()") == encodeArgs(0));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(struct_delete_struct_in_mapping)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
contract test {
|
||||
struct testStruct
|
||||
{
|
||||
uint m_value;
|
||||
}
|
||||
mapping (uint => testStruct) campaigns;
|
||||
|
||||
function test()
|
||||
{
|
||||
campaigns[0].m_value = 2;
|
||||
}
|
||||
function deleteIt() returns (uint)
|
||||
{
|
||||
delete campaigns[0];
|
||||
return campaigns[0].m_value;
|
||||
}
|
||||
}
|
||||
)";
|
||||
compileAndRun(sourceCode, 0, "test");
|
||||
auto res = callContractFunction("deleteIt()");
|
||||
BOOST_CHECK(callContractFunction("deleteIt()") == encodeArgs(0));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user