mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Look for experimental pragmas in the module containing the definition when generating code for modifiers and inherited functions
This commit is contained in:
+32
@@ -0,0 +1,32 @@
|
||||
==== Source: A ====
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
struct Data {
|
||||
uint a;
|
||||
uint[2] b;
|
||||
uint c;
|
||||
}
|
||||
|
||||
contract A {
|
||||
function get() public view returns (Data memory) {
|
||||
return Data(5, [uint(66), 77], 8);
|
||||
}
|
||||
}
|
||||
|
||||
contract B {
|
||||
function foo(A _a) public returns (uint) {
|
||||
return _a.get().b[1];
|
||||
}
|
||||
}
|
||||
==== Source: B ====
|
||||
import "A";
|
||||
|
||||
contract C is B {
|
||||
function test() public returns (uint) {
|
||||
return foo(new A());
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// test() -> 77
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
==== Source: A ====
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
struct Data {
|
||||
uint value;
|
||||
}
|
||||
|
||||
contract A {
|
||||
function get() public view returns (Data memory) {
|
||||
return Data(5);
|
||||
}
|
||||
}
|
||||
|
||||
contract B {
|
||||
uint x = 10;
|
||||
uint y = 10;
|
||||
|
||||
modifier updateStorage() {
|
||||
A a = new A();
|
||||
x = a.get().value;
|
||||
_;
|
||||
y = a.get().value;
|
||||
}
|
||||
}
|
||||
==== Source: B ====
|
||||
import "A";
|
||||
|
||||
contract C is B {
|
||||
function test()
|
||||
public
|
||||
updateStorage
|
||||
returns (uint, uint)
|
||||
{
|
||||
return (x, y);
|
||||
}
|
||||
}
|
||||
// ----
|
||||
// test() -> 5, 10
|
||||
@@ -0,0 +1,27 @@
|
||||
==== Source: A ====
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
struct Data {
|
||||
bool flag;
|
||||
}
|
||||
|
||||
contract A {
|
||||
function get() public view returns (Data memory) {}
|
||||
}
|
||||
|
||||
contract B {
|
||||
modifier validate() {
|
||||
A(0x00).get();
|
||||
_;
|
||||
}
|
||||
}
|
||||
==== Source: B ====
|
||||
import "A";
|
||||
|
||||
contract C is B {
|
||||
function foo()
|
||||
public
|
||||
validate()
|
||||
{}
|
||||
}
|
||||
// ----
|
||||
@@ -0,0 +1,33 @@
|
||||
==== Source: A ====
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
struct Data {
|
||||
bool flag;
|
||||
}
|
||||
|
||||
contract A {
|
||||
function get() public view returns (Data memory) {}
|
||||
}
|
||||
|
||||
contract B {
|
||||
constructor() validate {
|
||||
A(0x00).get();
|
||||
}
|
||||
|
||||
modifier validate() {
|
||||
A(0x00).get();
|
||||
_;
|
||||
}
|
||||
}
|
||||
|
||||
==== Source: B ====
|
||||
import "A";
|
||||
|
||||
contract C is B {}
|
||||
==== Source: C ====
|
||||
import "B";
|
||||
|
||||
contract D is C {
|
||||
constructor() validate B() validate C() validate {}
|
||||
}
|
||||
// ----
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
==== Source: A ====
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
struct Data {
|
||||
bool flag;
|
||||
}
|
||||
|
||||
contract A {
|
||||
function get() public view returns (Data memory) {}
|
||||
}
|
||||
|
||||
contract B {
|
||||
constructor() {
|
||||
A(0x00).get();
|
||||
}
|
||||
|
||||
function foo() public view {
|
||||
A(0x00).get();
|
||||
}
|
||||
}
|
||||
==== Source: B ====
|
||||
import "A";
|
||||
|
||||
contract C is B {}
|
||||
// ----
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
==== Source: A ====
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
struct Item {
|
||||
uint x;
|
||||
}
|
||||
|
||||
library L {
|
||||
event Ev(Item);
|
||||
}
|
||||
|
||||
contract C {
|
||||
function foo() public {
|
||||
emit L.Ev(Item(1));
|
||||
}
|
||||
}
|
||||
==== Source: B ====
|
||||
import "A";
|
||||
|
||||
contract D is C {}
|
||||
// ----
|
||||
@@ -0,0 +1,29 @@
|
||||
==== Source: A ====
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
struct Data {
|
||||
bool flag;
|
||||
}
|
||||
|
||||
contract A {
|
||||
function get() public view returns (Data memory) {}
|
||||
}
|
||||
|
||||
contract B {
|
||||
modifier validate() virtual {
|
||||
A(0x00).get();
|
||||
_;
|
||||
}
|
||||
}
|
||||
|
||||
==== Source: B ====
|
||||
import "A";
|
||||
|
||||
contract C is B {
|
||||
function foo() public pure validate {}
|
||||
|
||||
modifier validate() override {
|
||||
_;
|
||||
}
|
||||
}
|
||||
// ----
|
||||
@@ -0,0 +1,52 @@
|
||||
==== Source: C ====
|
||||
import "X";
|
||||
import "V1A";
|
||||
import "V2A";
|
||||
import "V1B";
|
||||
|
||||
contract C is V1A, V2A, V1B {
|
||||
function foo()
|
||||
public
|
||||
modV1A
|
||||
modV2A // There should be no error for modV2A (it uses ABIEncoderV2)
|
||||
modV1B
|
||||
{
|
||||
}
|
||||
}
|
||||
==== Source: V1A ====
|
||||
import "X";
|
||||
|
||||
contract V1A {
|
||||
modifier modV1A() {
|
||||
_;
|
||||
}
|
||||
}
|
||||
==== Source: V1B ====
|
||||
import "X";
|
||||
|
||||
contract V1B {
|
||||
modifier modV1B() {
|
||||
_;
|
||||
}
|
||||
}
|
||||
==== Source: V2A ====
|
||||
pragma experimental ABIEncoderV2;
|
||||
import "X";
|
||||
|
||||
contract V2A {
|
||||
modifier modV2A() {
|
||||
X(0x00).get();
|
||||
_;
|
||||
}
|
||||
}
|
||||
==== Source: X ====
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
struct Data {
|
||||
bool flag;
|
||||
}
|
||||
|
||||
contract X {
|
||||
function get() public view returns (Data memory) {}
|
||||
}
|
||||
// ----
|
||||
Reference in New Issue
Block a user