mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Fix dependency tracking for abstract contracts for Yul codegen
This commit is contained in:
@@ -1521,7 +1521,7 @@ BOOST_AUTO_TEST_CASE(dependency_tracking_of_abstract_contract)
|
||||
"settings": {
|
||||
"outputSelection": {
|
||||
"BlockRewardAuRaCoins.sol": {
|
||||
"BlockRewardAuRaCoins": ["evm.bytecode.sourceMap"]
|
||||
"BlockRewardAuRaCoins": ["ir", "evm.bytecode.sourceMap"]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1540,11 +1540,61 @@ BOOST_AUTO_TEST_CASE(dependency_tracking_of_abstract_contract)
|
||||
BOOST_REQUIRE(result["contracts"]["BlockRewardAuRaCoins.sol"].size() == 1);
|
||||
BOOST_REQUIRE(result["contracts"]["BlockRewardAuRaCoins.sol"]["BlockRewardAuRaCoins"].isObject());
|
||||
BOOST_REQUIRE(result["contracts"]["BlockRewardAuRaCoins.sol"]["BlockRewardAuRaCoins"]["evm"].isObject());
|
||||
BOOST_REQUIRE(result["contracts"]["BlockRewardAuRaCoins.sol"]["BlockRewardAuRaCoins"]["ir"].isString());
|
||||
BOOST_REQUIRE(result["contracts"]["BlockRewardAuRaCoins.sol"]["BlockRewardAuRaCoins"]["evm"]["bytecode"].isObject());
|
||||
BOOST_REQUIRE(result["sources"].isObject());
|
||||
BOOST_REQUIRE(result["sources"].size() == 2);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(dependency_tracking_of_abstract_contract_yul)
|
||||
{
|
||||
char const* input = R"(
|
||||
{
|
||||
"language": "Solidity",
|
||||
"sources": {
|
||||
"A.sol": {
|
||||
"content": "contract A {} contract B {} contract C { constructor() { new B(); } } contract D {}"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"outputSelection": {
|
||||
"A.sol": {
|
||||
"C": ["ir"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
)";
|
||||
|
||||
Json::Value parsedInput;
|
||||
BOOST_REQUIRE(util::jsonParseStrict(input, parsedInput));
|
||||
|
||||
solidity::frontend::StandardCompiler compiler;
|
||||
Json::Value result = compiler.compile(parsedInput);
|
||||
|
||||
BOOST_REQUIRE(result["contracts"].isObject());
|
||||
BOOST_REQUIRE(result["contracts"].size() == 1);
|
||||
BOOST_REQUIRE(result["contracts"]["A.sol"].isObject());
|
||||
BOOST_REQUIRE(result["contracts"]["A.sol"].size() == 1);
|
||||
BOOST_REQUIRE(result["contracts"]["A.sol"]["C"].isObject());
|
||||
BOOST_REQUIRE(result["contracts"]["A.sol"]["C"]["ir"].isString());
|
||||
|
||||
const string& irCode = result["contracts"]["A.sol"]["C"]["ir"].asString();
|
||||
|
||||
// Make sure C and B contracts are deployed
|
||||
BOOST_REQUIRE(irCode.find("object \"C") != string::npos);
|
||||
BOOST_REQUIRE(irCode.find("object \"B") != string::npos);
|
||||
|
||||
// Make sure A and D are NOT deployed as they were not requested and are not
|
||||
// in any dependency
|
||||
BOOST_REQUIRE(irCode.find("object \"A") == string::npos);
|
||||
BOOST_REQUIRE(irCode.find("object \"D") == string::npos);
|
||||
|
||||
|
||||
BOOST_REQUIRE(result["sources"].isObject());
|
||||
BOOST_REQUIRE(result["sources"].size() == 1);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
||||
} // end namespaces
|
||||
|
||||
@@ -11,5 +11,7 @@ contract D {
|
||||
return test();
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: true
|
||||
// ----
|
||||
// f() -> true
|
||||
|
||||
@@ -11,5 +11,7 @@ contract D {
|
||||
return test();
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: true
|
||||
// ----
|
||||
// f() -> 2
|
||||
|
||||
Reference in New Issue
Block a user