Merge pull request #10336 from ethereum/enablecoderv2bydefault

[BREAKING] Enable ABI coder v2 by default.
This commit is contained in:
chriseth
2020-12-09 18:05:07 +01:00
committed by GitHub
70 changed files with 253 additions and 198 deletions
+1 -1
View File
@@ -98,7 +98,7 @@ CommonOptions::CommonOptions(std::string _caption):
("no-smt", po::bool_switch(&disableSMT), "disable SMT checker")
("optimize", po::bool_switch(&optimize), "enables optimization")
("enforce-via-yul", po::bool_switch(&enforceViaYul), "Enforce compiling all tests via yul to see if additional tests can be activated.")
("abiencoderv2", po::bool_switch(&useABIEncoderV2), "enables abi encoder v2")
("abiencoderv1", po::bool_switch(&useABIEncoderV1), "enables abi encoder v1")
("show-messages", po::bool_switch(&showMessages), "enables message output")
("show-metadata", po::bool_switch(&showMetadata), "enables metadata output");
}
+1 -1
View File
@@ -57,7 +57,7 @@ struct CommonOptions: boost::noncopyable
bool optimize = false;
bool enforceViaYul = false;
bool disableSMT = false;
bool useABIEncoderV2 = false;
bool useABIEncoderV1 = false;
bool showMessages = false;
bool showMetadata = false;
@@ -1 +1 @@
{"contracts":{"a.sol":{"A":{"evm":{"deployedBytecode":{"immutableReferences":{"6":[{"length":32,"start":77}]}}}}}},"sources":{"a.sol":{"id":0}}}
{"contracts":{"a.sol":{"A":{"evm":{"deployedBytecode":{"immutableReferences":{"6":[{"length":32,"start":75}]}}}}}},"sources":{"a.sol":{"id":0}}}
+1 -1
View File
@@ -468,7 +468,7 @@ BOOST_AUTO_TEST_CASE(creation)
{
deployWallet(200);
BOOST_REQUIRE(callContractFunction("isOwner(address)", m_sender) == encodeArgs(true));
bool v2 = solidity::test::CommonOptions::get().useABIEncoderV2;
bool v2 = !solidity::test::CommonOptions::get().useABIEncoderV1;
BOOST_REQUIRE(callContractFunction("isOwner(address)", h256(~0)) == (v2 ? encodeArgs() : encodeArgs(false)));
}
+1 -12
View File
@@ -37,17 +37,6 @@ namespace solidity::frontend::test
BOOST_FIXTURE_TEST_SUITE(ABIDecoderTest, SolidityExecutionFramework)
BOOST_AUTO_TEST_CASE(both_encoders_macro)
{
// This tests that the "both decoders macro" at least runs twice and
// modifies the source.
string sourceCode;
int runs = 0;
BOTH_ENCODERS(runs++;)
BOOST_CHECK(sourceCode == NewEncoderPragma);
BOOST_CHECK_EQUAL(runs, 2);
}
BOOST_AUTO_TEST_CASE(value_types)
{
string sourceCode = R"(
@@ -334,7 +323,7 @@ BOOST_AUTO_TEST_CASE(validation_function_type)
function i(function () external[] calldata a) external pure returns (uint r) { a[0]; r = 4; }
}
)";
bool newDecoder = solidity::test::CommonOptions::get().useABIEncoderV2;
bool newDecoder = false;
string validFun{"01234567890123456789abcd"};
string invalidFun{"01234567890123456789abcdX"};
BOTH_ENCODERS(
+6 -15
View File
@@ -48,17 +48,6 @@ namespace solidity::frontend::test
BOOST_FIXTURE_TEST_SUITE(ABIEncoderTest, SolidityExecutionFramework)
BOOST_AUTO_TEST_CASE(both_encoders_macro)
{
// This tests that the "both encoders macro" at least runs twice and
// modifies the source.
string sourceCode;
int runs = 0;
BOTH_ENCODERS(runs++;)
BOOST_CHECK(sourceCode == NewEncoderPragma);
BOOST_CHECK_EQUAL(runs, 2);
}
BOOST_AUTO_TEST_CASE(value_types)
{
string sourceCode = R"(
@@ -166,7 +155,7 @@ BOOST_AUTO_TEST_CASE(memory_array_one_dim)
}
)";
if (!solidity::test::CommonOptions::get().useABIEncoderV2)
if (solidity::test::CommonOptions::get().useABIEncoderV1)
{
compileAndRun(sourceCode);
callContractFunction("f()");
@@ -174,9 +163,11 @@ BOOST_AUTO_TEST_CASE(memory_array_one_dim)
REQUIRE_LOG_DATA(encodeArgs(10, 0x60, 11, 3, u256("0xfffffffe"), u256("0xffffffff"), u256("0x100000000")));
}
compileAndRun(NewEncoderPragma + sourceCode);
callContractFunction("f()");
REQUIRE_LOG_DATA(encodeArgs(10, 0x60, 11, 3, u256(-2), u256(-1), u256(0)));
NEW_ENCODER(
compileAndRun(sourceCode);
callContractFunction("f()");
REQUIRE_LOG_DATA(encodeArgs(10, 0x60, 11, 3, u256(-2), u256(-1), u256(0)));
)
}
BOOST_AUTO_TEST_CASE(memory_array_two_dim)
+12 -4
View File
@@ -21,17 +21,25 @@
namespace solidity::frontend::test
{
static std::string const NewEncoderPragma = "pragma experimental ABIEncoderV2;\n";
#define NEW_ENCODER(CODE) \
{ \
sourceCode = NewEncoderPragma + sourceCode; \
string sourceCodeTmp = sourceCode; \
sourceCode = "pragma abicoder v2;\n" + sourceCode; \
{ CODE } \
sourceCode = sourceCodeTmp; \
}
#define OLD_ENCODER(CODE) \
{ \
string sourceCodeTmp = sourceCode; \
sourceCode = "pragma abicoder v1;\n" + sourceCode; \
{ CODE } \
sourceCode = sourceCodeTmp; \
}
#define BOTH_ENCODERS(CODE) \
{ \
{ CODE } \
OLD_ENCODER(CODE) \
NEW_ENCODER(CODE) \
}
+12 -10
View File
@@ -158,6 +158,7 @@ BOOST_AUTO_TEST_SUITE(Assembly)
BOOST_AUTO_TEST_CASE(location_test)
{
auto sourceCode = make_shared<CharStream>(R"(
pragma abicoder v1;
contract test {
function f() public returns (uint256 a) {
return 16;
@@ -172,18 +173,18 @@ BOOST_AUTO_TEST_CASE(location_test)
vector<SourceLocation> locations;
if (solidity::test::CommonOptions::get().optimize)
locations =
vector<SourceLocation>(31, SourceLocation{2, 82, sourceCode}) +
vector<SourceLocation>(21, SourceLocation{20, 79, sourceCode}) +
vector<SourceLocation>(1, SourceLocation{72, 74, sourceCode}) +
vector<SourceLocation>(2, SourceLocation{20, 79, sourceCode});
vector<SourceLocation>(31, SourceLocation{23, 103, sourceCode}) +
vector<SourceLocation>(21, SourceLocation{41, 100, sourceCode}) +
vector<SourceLocation>(1, SourceLocation{93, 95, sourceCode}) +
vector<SourceLocation>(2, SourceLocation{41, 100, sourceCode});
else
locations =
vector<SourceLocation>(hasShifts ? 31 : 32, SourceLocation{2, 82, sourceCode}) +
vector<SourceLocation>(24, SourceLocation{20, 79, sourceCode}) +
vector<SourceLocation>(1, SourceLocation{49, 58, sourceCode}) +
vector<SourceLocation>(1, SourceLocation{72, 74, sourceCode}) +
vector<SourceLocation>(2, SourceLocation{65, 74, sourceCode}) +
vector<SourceLocation>(2, SourceLocation{20, 79, sourceCode});
vector<SourceLocation>(hasShifts ? 31 : 32, SourceLocation{23, 103, sourceCode}) +
vector<SourceLocation>(24, SourceLocation{41, 100, sourceCode}) +
vector<SourceLocation>(1, SourceLocation{70, 79, sourceCode}) +
vector<SourceLocation>(1, SourceLocation{93, 95, sourceCode}) +
vector<SourceLocation>(2, SourceLocation{86, 95, sourceCode}) +
vector<SourceLocation>(2, SourceLocation{41, 100, sourceCode});
checkAssemblyLocations(items, locations);
}
@@ -191,6 +192,7 @@ BOOST_AUTO_TEST_CASE(location_test)
BOOST_AUTO_TEST_CASE(jump_type)
{
auto sourceCode = make_shared<CharStream>(R"(
pragma abicoder v1;
contract C {
function f(uint a) public pure returns (uint t) {
assembly {
+9 -4
View File
@@ -97,9 +97,14 @@ BOOST_AUTO_TEST_CASE(string_storage)
auto evmVersion = solidity::test::CommonOptions::get().evmVersion();
if (evmVersion <= EVMVersion::byzantium())
CHECK_DEPLOY_GAS(133045, 129731, evmVersion);
{
if (CommonOptions::get().useABIEncoderV1)
CHECK_DEPLOY_GAS(133045, 129731, evmVersion);
else
CHECK_DEPLOY_GAS(152657, 135201, evmVersion);
}
// This is only correct on >=Constantinople.
else if (CommonOptions::get().useABIEncoderV2)
else if (!CommonOptions::get().useABIEncoderV1)
{
if (CommonOptions::get().optimize)
{
@@ -126,9 +131,9 @@ BOOST_AUTO_TEST_CASE(string_storage)
{
callContractFunction("f()");
if (evmVersion == EVMVersion::byzantium())
CHECK_GAS(21545, 21526, 20);
CHECK_GAS(21712, 21555, 20);
// This is only correct on >=Constantinople.
else if (CommonOptions::get().useABIEncoderV2)
else if (!CommonOptions::get().useABIEncoderV1)
{
if (CommonOptions::get().optimize)
{
+4 -4
View File
@@ -62,9 +62,9 @@ public:
// costs for transaction
gas += gasForTransaction(m_compiler.object(m_compiler.lastContractName()).bytecode, true);
// Skip the tests when we force ABIEncoderV2.
// Skip the tests when we use ABIEncoderV2.
// TODO: We should enable this again once the yul optimizer is activated.
if (!solidity::test::CommonOptions::get().useABIEncoderV2)
if (solidity::test::CommonOptions::get().useABIEncoderV1)
{
BOOST_REQUIRE(!gas.isInfinite);
BOOST_CHECK_LE(m_gasUsed, gas.value);
@@ -91,9 +91,9 @@ public:
*m_compiler.runtimeAssemblyItems(m_compiler.lastContractName()),
_sig
);
// Skip the tests when we force ABIEncoderV2.
// Skip the tests when we use ABIEncoderV2.
// TODO: We should enable this again once the yul optimizer is activated.
if (!solidity::test::CommonOptions::get().useABIEncoderV2)
if (solidity::test::CommonOptions::get().useABIEncoderV1)
{
BOOST_REQUIRE(!gas.isInfinite);
BOOST_CHECK_LE(m_gasUsed, gas.value);
+1 -1
View File
@@ -88,7 +88,7 @@ SemanticTest::SemanticTest(string const& _filename, langutil::EVMVersion _evmVer
m_runWithEwasm = false;
m_runWithABIEncoderV1Only = m_reader.boolSetting("ABIEncoderV1Only", false);
if (m_runWithABIEncoderV1Only && solidity::test::CommonOptions::get().useABIEncoderV2)
if (m_runWithABIEncoderV1Only && !solidity::test::CommonOptions::get().useABIEncoderV1)
m_shouldRun = false;
auto revertStrings = revertStringsFromString(m_reader.stringSetting("revertStrings", "default"));
@@ -136,10 +136,10 @@ string SolidityExecutionFramework::addPreamble(string const& _sourceCode)
// Silence compiler version warning
string preamble = "pragma solidity >=0.0;\n// SPDX-License-Identifier: unlicensed\n";
if (
solidity::test::CommonOptions::get().useABIEncoderV2 &&
solidity::test::CommonOptions::get().useABIEncoderV1 &&
_sourceCode.find("pragma experimental ABIEncoderV2;") == string::npos &&
_sourceCode.find("pragma abicoder") == string::npos
)
preamble += "pragma abicoder v2;\n";
preamble += "pragma abicoder v1;\n";
return preamble + _sourceCode;
}
@@ -69,8 +69,8 @@ public:
std::map<std::string, solidity::test::Address> const& _libraryAddresses = {}
);
/// Returns @param _sourceCode prefixed with the version pragma and the ABIEncoderV2 pragma,
/// the latter only if it is required.
/// Returns @param _sourceCode prefixed with the version pragma and the abi coder v1 pragma,
/// the latter only if it is forced.
static std::string addPreamble(std::string const& _sourceCode);
protected:
+4 -4
View File
@@ -13,8 +13,8 @@ contract C {
}
// ----
// creation:
// codeDepositCost: 257000
// executionCost: 300
// totalCost: 257300
// codeDepositCost: 376800
// executionCost: 411
// totalCost: 377211
// external:
// f(): 252
// f(): 399
+25 -25
View File
@@ -24,29 +24,29 @@ contract Large {
}
// ----
// creation:
// codeDepositCost: 961600
// executionCost: 1001
// totalCost: 962601
// codeDepositCost: 913400
// executionCost: 948
// totalCost: 914348
// external:
// a(): 1051
// b(uint256): 2046
// f0(uint256): 427
// f1(uint256): 41352
// f2(uint256): 21293
// f3(uint256): 21381
// f4(uint256): 21359
// f5(uint256): 21337
// f6(uint256): 21360
// f7(uint256): 21272
// f8(uint256): 21272
// f9(uint256): 21294
// g0(uint256): 313
// g1(uint256): 41307
// g2(uint256): 21270
// g3(uint256): 21358
// g4(uint256): 21336
// g5(uint256): 21292
// g6(uint256): 21315
// g7(uint256): 21314
// g8(uint256): 21292
// g9(uint256): 21249
// a(): 1175
// b(uint256): infinite
// f0(uint256): infinite
// f1(uint256): infinite
// f2(uint256): infinite
// f3(uint256): infinite
// f4(uint256): infinite
// f5(uint256): infinite
// f6(uint256): infinite
// f7(uint256): infinite
// f8(uint256): infinite
// f9(uint256): infinite
// g0(uint256): infinite
// g1(uint256): infinite
// g2(uint256): infinite
// g3(uint256): infinite
// g4(uint256): infinite
// g5(uint256): infinite
// g6(uint256): infinite
// g7(uint256): infinite
// g8(uint256): infinite
// g9(uint256): infinite
@@ -27,29 +27,29 @@ contract Large {
// optimize-runs: 2
// ----
// creation:
// codeDepositCost: 301200
// executionCost: 343
// totalCost: 301543
// codeDepositCost: 270600
// executionCost: 312
// totalCost: 270912
// external:
// a(): 998
// b(uint256): 2305
// f0(uint256): 334
// f1(uint256): 41474
// f2(uint256): 21540
// f3(uint256): 21628
// f4(uint256): 21606
// f5(uint256): 21584
// f6(uint256): 21496
// f7(uint256): 21276
// f8(uint256): 21408
// f9(uint256): 21430
// g0(uint256): 574
// g1(uint256): 41186
// g2(uint256): 21274
// g3(uint256): 21362
// g4(uint256): 21340
// g5(uint256): 21428
// g6(uint256): 21208
// g7(uint256): 21318
// g8(uint256): 21296
// g9(uint256): 21142
// a(): 1028
// b(uint256): 2370
// f0(uint256): 399
// f1(uint256): 41539
// f2(uint256): 21605
// f3(uint256): 21693
// f4(uint256): 21671
// f5(uint256): 21649
// f6(uint256): 21561
// f7(uint256): 21341
// f8(uint256): 21473
// f9(uint256): 21495
// g0(uint256): 639
// g1(uint256): 41251
// g2(uint256): 21339
// g3(uint256): 21427
// g4(uint256): 21405
// g5(uint256): 21493
// g6(uint256): 21273
// g7(uint256): 21383
// g8(uint256): 21361
// g9(uint256): 21207
+11 -11
View File
@@ -11,16 +11,16 @@ contract Medium {
}
// ----
// creation:
// codeDepositCost: 361800
// codeDepositCost: 360400
// executionCost: 399
// totalCost: 362199
// totalCost: 360799
// external:
// a(): 1028
// b(uint256): 2046
// f1(uint256): 41263
// f2(uint256): 21293
// f3(uint256): 21337
// g0(uint256): 313
// g7(uint256): 21292
// g8(uint256): 21270
// g9(uint256): 21226
// a(): 1152
// b(uint256): infinite
// f1(uint256): infinite
// f2(uint256): infinite
// f3(uint256): infinite
// g0(uint256): infinite
// g7(uint256): infinite
// g8(uint256): infinite
// g9(uint256): infinite
@@ -14,16 +14,16 @@ contract Medium {
// optimize-runs: 2
// ----
// creation:
// codeDepositCost: 169600
// executionCost: 214
// totalCost: 169814
// codeDepositCost: 161000
// executionCost: 208
// totalCost: 161208
// external:
// a(): 998
// b(uint256): 2063
// f1(uint256): 41254
// f2(uint256): 21298
// f3(uint256): 21342
// g0(uint256): 332
// g7(uint256): 21208
// g8(uint256): 21186
// g9(uint256): 21142
// a(): 1028
// b(uint256): 2128
// f1(uint256): 41319
// f2(uint256): 21363
// f3(uint256): 21407
// g0(uint256): 397
// g7(uint256): 21273
// g8(uint256): 21251
// g9(uint256): 21207
+6 -6
View File
@@ -6,11 +6,11 @@ contract Small {
}
// ----
// creation:
// codeDepositCost: 103400
// executionCost: 153
// totalCost: 103553
// codeDepositCost: 123600
// executionCost: 171
// totalCost: 123771
// external:
// fallback: 129
// a(): 983
// b(uint256): 2002
// f1(uint256): 41263
// a(): 1107
// b(uint256): infinite
// f1(uint256): infinite
@@ -9,11 +9,11 @@ contract Small {
// optimize-runs: 2
// ----
// creation:
// codeDepositCost: 72800
// codeDepositCost: 76200
// executionCost: 123
// totalCost: 72923
// totalCost: 76323
// external:
// fallback: 118
// a(): 976
// b(uint256): 1953
// f1(uint256): 41188
// a(): 1006
// b(uint256): 2018
// f1(uint256): 41253
@@ -1,3 +1,4 @@
pragma abicoder v1;
struct Item {
uint x;
uint y;
@@ -1,3 +1,4 @@
pragma abicoder v1;
struct Item {
uint x;
uint y;
@@ -13,5 +14,5 @@ contract D {
}
}
// ----
// TypeError 7364: (202-240): Different number of components on the left hand side (1) than on the right hand side (2).
// TypeError 9574: (202-240): Type uint256 is not implicitly convertible to expected type struct Item memory.
// TypeError 7364: (222-260): Different number of components on the left hand side (1) than on the right hand side (2).
// TypeError 9574: (222-260): Type uint256 is not implicitly convertible to expected type struct Item memory.
@@ -9,6 +9,7 @@ library L {
function set(Item storage _item) external view {}
}
==== Source: B ====
pragma abicoder v1;
import "A";
contract Test {
@@ -9,6 +9,7 @@ contract C {
constructor(Item memory _item) {}
}
==== Source: B ====
pragma abicoder v1;
import "A";
contract Test {
@@ -17,4 +18,4 @@ contract Test {
}
}
// ----
// TypeError 2443: (B:71-80): The type of this parameter, struct C.Item, is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
// TypeError 2443: (B:91-100): The type of this parameter, struct C.Item, is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
@@ -9,6 +9,7 @@ contract C {
function set(uint _x, string memory _y, Item memory _item, bool _z) external view {}
}
==== Source: B ====
pragma abicoder v1;
import "A";
contract Test {
@@ -17,4 +18,4 @@ contract Test {
}
}
// ----
// TypeError 2443: (B:99-109): The type of this parameter, struct C.Item, is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
// TypeError 2443: (B:119-129): The type of this parameter, struct C.Item, is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
@@ -9,6 +9,7 @@ contract C {
function get(Item memory _item) external {}
}
==== Source: B ====
pragma abicoder v1;
import "A";
contract Test {
@@ -19,4 +20,4 @@ contract Test {
}
}
// ----
// TypeError 2443: (B:146-155): The type of this parameter, struct C.Item, is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
// TypeError 2443: (B:166-175): The type of this parameter, struct C.Item, is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
@@ -5,6 +5,7 @@ contract C {
function f() external view returns (string[] memory) {}
}
==== Source: B ====
pragma abicoder v1;
import "A";
contract D {
@@ -13,4 +14,4 @@ contract D {
}
}
// ----
// TypeError 2428: (B:65-85): The type of return parameter 1, string[], is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
// TypeError 2428: (B:85-105): The type of return parameter 1, string[], is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
@@ -9,6 +9,7 @@ contract C {
function get() external view returns(Item memory) {}
}
==== Source: B ====
pragma abicoder v1;
import "A";
contract Test {
@@ -17,4 +18,4 @@ contract Test {
}
}
// ----
// TypeError 2428: (B:70-92): The type of return parameter 1, struct C.Item, is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
// TypeError 2428: (B:90-112): The type of return parameter 1, struct C.Item, is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
@@ -9,6 +9,7 @@ contract C {
function get() external view returns(Item memory) {}
}
==== Source: B ====
pragma abicoder v1;
import "A";
contract Test {
@@ -17,4 +18,4 @@ contract Test {
}
}
// ----
// TypeError 2428: (B:70-92): The type of return parameter 1, struct C.Item, is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
// TypeError 2428: (B:90-112): The type of return parameter 1, struct C.Item, is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
@@ -8,6 +8,7 @@ library L {
event E(Item _value);
}
==== Source: B ====
pragma abicoder v1;
import "A";
contract Test {
@@ -16,4 +17,4 @@ contract Test {
}
}
// ----
// TypeError 2443: (B:74-84): The type of this parameter, struct L.Item, is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
// TypeError 2443: (B:94-104): The type of this parameter, struct L.Item, is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
@@ -9,6 +9,7 @@ library L {
function f(uint) external view returns (Item memory) {}
}
==== Source: B ====
pragma abicoder v1;
import "A";
contract D {
@@ -19,4 +20,4 @@ contract D {
}
}
// ----
// TypeError 2428: (B:86-97): The type of return parameter 1, struct L.Item, is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
// TypeError 2428: (B:106-117): The type of return parameter 1, struct L.Item, is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
@@ -9,6 +9,7 @@ library L {
function get(Item storage _item) external view {}
}
==== Source: B ====
pragma abicoder v1;
import "A";
contract Test {
@@ -9,6 +9,7 @@ library L {
function get() external view returns(Item memory) {}
}
==== Source: B ====
pragma abicoder v1;
import "A";
contract Test {
@@ -17,4 +18,4 @@ contract Test {
}
}
// ----
// TypeError 2428: (B:70-77): The type of return parameter 1, struct L.Item, is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
// TypeError 2428: (B:90-97): The type of return parameter 1, struct L.Item, is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
@@ -16,6 +16,7 @@ contract B {
}
}
==== Source: B ====
pragma abicoder v1;
import "A";
contract C is B {
@@ -21,10 +21,12 @@ contract B {
}
==== Source: B ====
pragma abicoder v1;
import "A";
contract C is B {}
==== Source: C ====
pragma abicoder v1;
import "B";
contract D is C {
@@ -19,6 +19,7 @@ contract B {
}
}
==== Source: B ====
pragma abicoder v1;
import "A";
contract C is B {}
@@ -9,6 +9,7 @@ contract C {
event Ev(Item);
}
==== Source: B ====
pragma abicoder v1;
import "A";
contract D is C {}
@@ -9,8 +9,9 @@ contract C {
function get(Item memory) external view {}
}
==== Source: B ====
pragma abicoder v1;
import "A";
contract D is C {}
// ----
// TypeError 6594: (B:13-31): Contract "D" does not use ABI coder v2 but wants to inherit from a contract which uses types that require it. Use "pragma abicoder v2;" for the inheriting contract as well to enable the feature.
// TypeError 6594: (B:33-51): Contract "D" does not use ABI coder v2 but wants to inherit from a contract which uses types that require it. Use "pragma abicoder v2;" for the inheriting contract as well to enable the feature.
@@ -9,8 +9,9 @@ contract C {
function get() external view returns(Item memory) {}
}
==== Source: B ====
pragma abicoder v1;
import "A";
contract D is C {}
// ----
// TypeError 6594: (B:13-31): Contract "D" does not use ABI coder v2 but wants to inherit from a contract which uses types that require it. Use "pragma abicoder v2;" for the inheriting contract as well to enable the feature.
// TypeError 6594: (B:33-51): Contract "D" does not use ABI coder v2 but wants to inherit from a contract which uses types that require it. Use "pragma abicoder v2;" for the inheriting contract as well to enable the feature.
@@ -15,6 +15,7 @@ contract C {
}
}
==== Source: B ====
pragma abicoder v1;
import "A";
contract D is C {}
@@ -17,6 +17,7 @@ contract B {
}
==== Source: B ====
pragma abicoder v1;
import "A";
contract C is B {
@@ -1,4 +1,5 @@
==== Source: C ====
pragma abicoder v1;
import "X";
import "V1A";
import "V2A";
@@ -14,6 +15,7 @@ contract C is V1A, V2A, V1B {
}
}
==== Source: V1A ====
pragma abicoder v1;
import "X";
contract V1A {
@@ -22,6 +24,7 @@ contract V1A {
}
}
==== Source: V1B ====
pragma abicoder v1;
import "X";
contract V1B {
@@ -9,6 +9,7 @@ contract A {
function get() public view returns (Data memory) {}
}
==== Source: B ====
pragma abicoder v1;
import "A";
contract B {
@@ -18,6 +19,7 @@ contract B {
}
}
==== Source: C ====
pragma abicoder v1;
import "B";
contract C is B {
@@ -27,4 +29,4 @@ contract C is B {
{}
}
// ----
// TypeError 2428: (B:60-82): The type of return parameter 1, struct Data, is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
// TypeError 2428: (B:80-102): The type of return parameter 1, struct Data, is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
@@ -9,6 +9,7 @@ contract A {
function get() public view returns (Data memory) {}
}
==== Source: B ====
pragma abicoder v1;
import "A";
contract B {
@@ -29,4 +30,4 @@ contract C is B {
{}
}
// ----
// TypeError 2428: (B:60-82): The type of return parameter 1, struct Data, is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
// TypeError 2428: (B:80-102): The type of return parameter 1, struct Data, is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
@@ -1,7 +1,8 @@
pragma abicoder v1;
contract Test {
function f(uint[][] calldata) external { }
function g(uint[][1] calldata) external { }
}
// ----
// TypeError 4957: (31-48): This type is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
// TypeError 4957: (78-96): This type is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
// TypeError 4957: (51-68): This type is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
// TypeError 4957: (98-116): This type is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
@@ -1,5 +1,6 @@
pragma abicoder v1;
contract C {
constructor(uint[][][] memory t) {}
}
// ----
// TypeError 4957: (26-45): This type is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature. Alternatively, make the contract abstract and supply the constructor arguments from a derived contract.
// TypeError 4957: (46-65): This type is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature. Alternatively, make the contract abstract and supply the constructor arguments from a derived contract.
@@ -1,3 +1,4 @@
pragma abicoder v1;
abstract contract C {
constructor(uint[][][] memory t) {}
}
@@ -1,5 +1,6 @@
pragma abicoder v1;
contract c {
event E(uint[][]);
}
// ----
// TypeError 3061: (25-33): This type is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
// TypeError 3061: (45-53): This type is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
@@ -1,6 +1,7 @@
pragma abicoder v1;
contract c {
struct S { uint x; uint[][] arr; }
event E(S);
}
// ----
// TypeError 3061: (61-62): This type is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
// TypeError 3061: (81-82): This type is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
@@ -1,6 +1,7 @@
pragma abicoder v1;
contract c {
struct S { uint a ; }
event E(S);
}
// ----
// TypeError 3061: (51-52): This type is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
// TypeError 3061: (71-72): This type is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
@@ -1,6 +1,7 @@
pragma abicoder v1;
contract c {
struct S { uint a ; }
event E(S indexed);
}
// ----
// TypeError 3061: (51-60): This type is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
// TypeError 3061: (71-80): This type is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
@@ -1,3 +1,4 @@
pragma abicoder v1;
contract C {
struct Y {
uint b;
@@ -8,4 +9,4 @@ contract C {
mapping(uint256 => X) public m;
}
// ----
// TypeError 2763: (88-118): The following types are only supported for getters in ABI coder v2: struct C.Y memory. Either remove "public" or use "pragma abicoder v2;" to enable the feature.
// TypeError 2763: (108-138): The following types are only supported for getters in ABI coder v2: struct C.Y memory. Either remove "public" or use "pragma abicoder v2;" to enable the feature.
@@ -13,7 +13,8 @@ pragma abicoder v2;
import "./A.sol";
contract B is A { }
==== Source: C.sol ====
pragma abicoder v1;
import "./B.sol";
contract C is B { }
// ----
// TypeError 6594: (C.sol:18-37): Contract "C" does not use ABI coder v2 but wants to inherit from a contract which uses types that require it. Use "pragma abicoder v2;" for the inheriting contract as well to enable the feature.
// TypeError 6594: (C.sol:38-57): Contract "C" does not use ABI coder v2 but wants to inherit from a contract which uses types that require it. Use "pragma abicoder v2;" for the inheriting contract as well to enable the feature.
@@ -8,10 +8,12 @@ contract A
function f(S memory _s) public returns (S memory,S memory) { }
}
==== Source: B.sol ====
pragma abicoder v1;
import "./A.sol";
contract B is A { }
==== Source: C.sol ====
pragma abicoder v1;
import "./B.sol";
contract C is B { }
// ----
// TypeError 6594: (B.sol:18-37): Contract "B" does not use ABI coder v2 but wants to inherit from a contract which uses types that require it. Use "pragma abicoder v2;" for the inheriting contract as well to enable the feature.
// TypeError 6594: (B.sol:38-57): Contract "B" does not use ABI coder v2 but wants to inherit from a contract which uses types that require it. Use "pragma abicoder v2;" for the inheriting contract as well to enable the feature.
@@ -1,5 +1,6 @@
pragma abicoder v1;
contract C {
function f() public pure returns (string[][] memory) {}
}
// ----
// TypeError 4957: (51-68): This type is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
// TypeError 4957: (71-88): This type is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
@@ -1,5 +1,6 @@
pragma abicoder v1;
contract C {
function f() public pure returns (uint[][2] memory) {}
}
// ----
// TypeError 4957: (51-67): This type is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
// TypeError 4957: (71-87): This type is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
@@ -1,6 +1,7 @@
pragma abicoder v1;
contract C {
struct S { string[] s; }
function f() public pure returns (S memory x) {}
}
// ----
// TypeError 4957: (80-90): This type is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
// TypeError 4957: (100-110): This type is only supported in ABI coder v2. Use "pragma abicoder v2;" to enable the feature.
@@ -1,3 +1,4 @@
pragma abicoder v1;
contract C {
struct s { uint a; uint b; }
function f() pure public {
@@ -5,4 +6,4 @@ contract C {
}
}
// ----
// TypeError 9611: (98-99): Decoding type struct C.s memory not supported.
// TypeError 9611: (118-119): Decoding type struct C.s memory not supported.
@@ -6,7 +6,7 @@ contract A {
}
}
// ----
// UnimplementedFeatureError: Not yet implemented - FixedPointType.
// UnimplementedFeatureError: Fixed point types not implemented.
// Warning 5667: (52-60): Unused function parameter. Remove or comment out the variable name to silence this warning.
// Warning 5667: (62-74): Unused function parameter. Remove or comment out the variable name to silence this warning.
// Warning 2072: (93-104): Unused local variable.
@@ -1,7 +1,8 @@
pragma abicoder v1;
contract C {
function f() public pure {
abi.encodePacked([new uint[](5), new uint[](7)]);
}
}
// ----
// TypeError 9578: (69-99): Type not supported in packed mode.
// TypeError 9578: (89-119): Type not supported in packed mode.
@@ -1,7 +1,8 @@
pragma abicoder v1;
contract C {
function test() public pure {
abi.encode([new uint[](5), new uint[](7)]);
}
}
// ----
// TypeError 2056: (66-96): This type cannot be encoded.
// TypeError 2056: (86-116): This type cannot be encoded.
@@ -1,3 +1,4 @@
pragma abicoder v1;
contract C {
struct S { uint x; }
S s;
@@ -11,7 +12,7 @@ contract C {
}
}
// ----
// TypeError 2056: (131-132): This type cannot be encoded.
// TypeError 2056: (134-135): This type cannot be encoded.
// TypeError 9578: (200-201): Type not supported in packed mode.
// TypeError 9578: (203-204): Type not supported in packed mode.
// TypeError 2056: (151-152): This type cannot be encoded.
// TypeError 2056: (154-155): This type cannot be encoded.
// TypeError 9578: (220-221): Type not supported in packed mode.
// TypeError 9578: (223-224): Type not supported in packed mode.
@@ -1,7 +1,8 @@
pragma abicoder v1;
contract C {
function f() public pure {
abi.decode("1234", (uint[][3]));
}
}
// ----
// TypeError 9611: (72-81): Decoding type uint256[] memory[3] memory not supported.
// TypeError 9611: (92-101): Decoding type uint256[] memory[3] memory not supported.
@@ -1,3 +1,4 @@
pragma abicoder v1;
struct S {
uint x;
}
@@ -8,4 +9,4 @@ contract C {
}
}
// ----
// TypeError 9611: (98-99): Decoding type struct S memory not supported.
// TypeError 9611: (118-119): Decoding type struct S memory not supported.