aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2019-01-10 19:11:55 +0800
committerchriseth <chris@ethereum.org>2019-01-18 03:36:48 +0800
commit44237211d1032c739636ab60a558521d60023b88 (patch)
treec308b23d77514733c9e2e35591411557a1924451
parent6de10cb9da3a81befb050ba9b883bfd4b0524cf6 (diff)
downloaddexon-solidity-44237211d1032c739636ab60a558521d60023b88.tar.gz
dexon-solidity-44237211d1032c739636ab60a558521d60023b88.tar.zst
dexon-solidity-44237211d1032c739636ab60a558521d60023b88.zip
Tests.
-rw-r--r--test/libsolidity/SolidityEndToEndTest.cpp64
-rw-r--r--test/libsolidity/syntaxTests/metaTypes/codeAccess.sol12
-rw-r--r--test/libsolidity/syntaxTests/metaTypes/codeAccessAbstractCreation.sol10
-rw-r--r--test/libsolidity/syntaxTests/metaTypes/codeAccessAbstractRuntime.sol10
-rw-r--r--test/libsolidity/syntaxTests/metaTypes/codeAccessBase.sol22
-rw-r--r--test/libsolidity/syntaxTests/metaTypes/codeAccessCyclic.sol12
-rw-r--r--test/libsolidity/syntaxTests/metaTypes/codeAccessIsConstant.sol7
-rw-r--r--test/libsolidity/syntaxTests/metaTypes/codeAccessLibrary.sol12
-rw-r--r--test/libsolidity/syntaxTests/metaTypes/codeIsNoLValue.sol10
-rw-r--r--test/libsolidity/syntaxTests/metaTypes/noArgForType.sol7
-rw-r--r--test/libsolidity/syntaxTests/metaTypes/tooManyArgsForType.sol7
-rw-r--r--test/libsolidity/syntaxTests/metaTypes/typeNotRegularIdentifierContractName.sol3
-rw-r--r--test/libsolidity/syntaxTests/metaTypes/typeNotRegularIdentifierFunction.sol6
-rw-r--r--test/libsolidity/syntaxTests/metaTypes/typeNotRegularIdentifierParameter.sol6
-rw-r--r--test/libsolidity/syntaxTests/metaTypes/typeNotRegularIdentifierStateVariable.sol5
-rw-r--r--test/libsolidity/syntaxTests/metaTypes/typeNotRegularIdentifierVariable.sol7
-rw-r--r--test/libsolidity/syntaxTests/metaTypes/typeOfContract.sol6
-rw-r--r--test/libsolidity/syntaxTests/metaTypes/typeRecursive.sol8
-rw-r--r--test/libsolidity/syntaxTests/metaTypes/unsupportedArgForType.sol9
19 files changed, 223 insertions, 0 deletions
diff --git a/test/libsolidity/SolidityEndToEndTest.cpp b/test/libsolidity/SolidityEndToEndTest.cpp
index 8d219d16..6f420466 100644
--- a/test/libsolidity/SolidityEndToEndTest.cpp
+++ b/test/libsolidity/SolidityEndToEndTest.cpp
@@ -14234,6 +14234,70 @@ BOOST_AUTO_TEST_CASE(base_access_to_function_type_variables)
ABI_CHECK(callContractFunction("h()"), encodeArgs(2));
}
+BOOST_AUTO_TEST_CASE(code_access)
+{
+ char const* sourceCode = R"(
+ contract C {
+ function lengths() public pure returns (bool) {
+ uint crLen = type(D).creationCode.length;
+ uint runLen = type(D).runtimeCode.length;
+ require(runLen < crLen);
+ require(crLen >= 0x95 && crLen < 0xd0);
+ require(runLen >= 0x7a && runLen < 0xb0);
+ return true;
+ }
+ function creation() public pure returns (bytes memory) {
+ return type(D).creationCode;
+ }
+ function runtime() public pure returns (bytes memory) {
+ return type(D).runtimeCode;
+ }
+ function runtimeAllocCheck() public pure returns (bytes memory) {
+ uint[] memory a = new uint[](2);
+ bytes memory c = type(D).runtimeCode;
+ uint[] memory b = new uint[](2);
+ a[0] = 0x1111;
+ a[1] = 0x2222;
+ b[0] = 0x3333;
+ b[1] = 0x4444;
+ return c;
+ }
+ }
+ contract D {
+ function f() public pure returns (uint) { return 7; }
+ }
+ )";
+ compileAndRun(sourceCode, 0, "C");
+ ABI_CHECK(callContractFunction("lengths()"), encodeArgs(true));
+ bytes codeCreation = callContractFunction("creation()");
+ bytes codeRuntime1 = callContractFunction("runtime()");
+ bytes codeRuntime2 = callContractFunction("runtimeAllocCheck()");
+ ABI_CHECK(codeRuntime1, codeRuntime2);
+}
+
+BOOST_AUTO_TEST_CASE(code_access_create)
+{
+ char const* sourceCode = R"(
+ contract C {
+ function test() public returns (uint) {
+ bytes memory c = type(D).creationCode;
+ D d;
+ assembly {
+ d := create(0, add(c, 0x20), mload(c))
+ }
+ return d.f();
+ }
+ }
+ contract D {
+ uint x;
+ constructor() public { x = 7; }
+ function f() public view returns (uint) { return x; }
+ }
+ )";
+ compileAndRun(sourceCode, 0, "C");
+ ABI_CHECK(callContractFunction("test()"), encodeArgs(7));
+}
+
BOOST_AUTO_TEST_SUITE_END()
}
diff --git a/test/libsolidity/syntaxTests/metaTypes/codeAccess.sol b/test/libsolidity/syntaxTests/metaTypes/codeAccess.sol
new file mode 100644
index 00000000..e90443e1
--- /dev/null
+++ b/test/libsolidity/syntaxTests/metaTypes/codeAccess.sol
@@ -0,0 +1,12 @@
+contract Test {
+ function creationOther() public pure returns (bytes memory) {
+ return type(Other).creationCode;
+ }
+ function runtimeOther() public pure returns (bytes memory) {
+ return type(Other).runtimeCode;
+ }
+}
+contract Other {
+ function f(uint) public pure returns (uint) {}
+}
+// ----
diff --git a/test/libsolidity/syntaxTests/metaTypes/codeAccessAbstractCreation.sol b/test/libsolidity/syntaxTests/metaTypes/codeAccessAbstractCreation.sol
new file mode 100644
index 00000000..bae137c5
--- /dev/null
+++ b/test/libsolidity/syntaxTests/metaTypes/codeAccessAbstractCreation.sol
@@ -0,0 +1,10 @@
+contract Test {
+ function creationOther() public pure returns (bytes memory) {
+ return type(Other).creationCode;
+ }
+}
+contract Other {
+ function f(uint) public returns (uint);
+}
+// ----
+// TypeError: (97-121): Member "creationCode" not found or not visible after argument-dependent lookup in type(contract Other).
diff --git a/test/libsolidity/syntaxTests/metaTypes/codeAccessAbstractRuntime.sol b/test/libsolidity/syntaxTests/metaTypes/codeAccessAbstractRuntime.sol
new file mode 100644
index 00000000..186d2714
--- /dev/null
+++ b/test/libsolidity/syntaxTests/metaTypes/codeAccessAbstractRuntime.sol
@@ -0,0 +1,10 @@
+contract Test {
+ function runtime() public pure returns (bytes memory) {
+ return type(Other).runtimeCode;
+ }
+}
+contract Other {
+ function f(uint) public returns (uint);
+}
+// ----
+// TypeError: (91-114): Member "runtimeCode" not found or not visible after argument-dependent lookup in type(contract Other).
diff --git a/test/libsolidity/syntaxTests/metaTypes/codeAccessBase.sol b/test/libsolidity/syntaxTests/metaTypes/codeAccessBase.sol
new file mode 100644
index 00000000..33dbfd7c
--- /dev/null
+++ b/test/libsolidity/syntaxTests/metaTypes/codeAccessBase.sol
@@ -0,0 +1,22 @@
+contract Base {
+ function f() public pure returns (uint) {}
+}
+contract Test is Base {
+ function creation() public pure returns (bytes memory) {
+ return type(Test).creationCode;
+ }
+ function runtime() public pure returns (bytes memory) {
+ return type(Test).runtimeCode;
+ }
+ function creationBase() public pure returns (bytes memory) {
+ return type(Base).creationCode;
+ }
+ function runtimeBase() public pure returns (bytes memory) {
+ return type(Base).runtimeCode;
+ }
+}
+// ----
+// TypeError: (165-188): Circular reference for contract code access.
+// TypeError: (271-293): Circular reference for contract code access.
+// TypeError: (381-404): Circular reference for contract code access.
+// TypeError: (491-513): Circular reference for contract code access.
diff --git a/test/libsolidity/syntaxTests/metaTypes/codeAccessCyclic.sol b/test/libsolidity/syntaxTests/metaTypes/codeAccessCyclic.sol
new file mode 100644
index 00000000..d5723df6
--- /dev/null
+++ b/test/libsolidity/syntaxTests/metaTypes/codeAccessCyclic.sol
@@ -0,0 +1,12 @@
+contract A {
+ function f() public pure {
+ type(B).runtimeCode;
+ }
+}
+contract B {
+ function f() public pure {
+ type(A).runtimeCode;
+ }
+}
+// ----
+// TypeError: (133-152): Circular reference for contract code access.
diff --git a/test/libsolidity/syntaxTests/metaTypes/codeAccessIsConstant.sol b/test/libsolidity/syntaxTests/metaTypes/codeAccessIsConstant.sol
new file mode 100644
index 00000000..cda5d5c3
--- /dev/null
+++ b/test/libsolidity/syntaxTests/metaTypes/codeAccessIsConstant.sol
@@ -0,0 +1,7 @@
+contract Test {
+ bytes constant c = type(B).creationCode;
+ bytes constant r = type(B).runtimeCode;
+
+}
+contract B { function f() public pure {} }
+// ----
diff --git a/test/libsolidity/syntaxTests/metaTypes/codeAccessLibrary.sol b/test/libsolidity/syntaxTests/metaTypes/codeAccessLibrary.sol
new file mode 100644
index 00000000..f746dc35
--- /dev/null
+++ b/test/libsolidity/syntaxTests/metaTypes/codeAccessLibrary.sol
@@ -0,0 +1,12 @@
+contract Test {
+ function creationOther() public pure returns (bytes memory) {
+ return type(Library).creationCode;
+ }
+ function runtime() public pure returns (bytes memory) {
+ return type(Library).runtimeCode;
+ }
+}
+contract Library {
+ function f(uint) public pure returns (uint) {}
+}
+// ----
diff --git a/test/libsolidity/syntaxTests/metaTypes/codeIsNoLValue.sol b/test/libsolidity/syntaxTests/metaTypes/codeIsNoLValue.sol
new file mode 100644
index 00000000..022e4d6f
--- /dev/null
+++ b/test/libsolidity/syntaxTests/metaTypes/codeIsNoLValue.sol
@@ -0,0 +1,10 @@
+contract Test {
+ function f() public pure {
+ type(C).creationCode = new bytes(6);
+ type(C).runtimeCode = new bytes(6);
+ }
+}
+contract C {}
+// ----
+// TypeError: (55-75): Expression has to be an lvalue.
+// TypeError: (100-119): Expression has to be an lvalue.
diff --git a/test/libsolidity/syntaxTests/metaTypes/noArgForType.sol b/test/libsolidity/syntaxTests/metaTypes/noArgForType.sol
new file mode 100644
index 00000000..542aaf53
--- /dev/null
+++ b/test/libsolidity/syntaxTests/metaTypes/noArgForType.sol
@@ -0,0 +1,7 @@
+contract Test {
+ function creation() public pure returns (bytes memory) {
+ type();
+ }
+}
+// ----
+// TypeError: (85-91): This function takes one argument, but 0 were provided.
diff --git a/test/libsolidity/syntaxTests/metaTypes/tooManyArgsForType.sol b/test/libsolidity/syntaxTests/metaTypes/tooManyArgsForType.sol
new file mode 100644
index 00000000..61c2b779
--- /dev/null
+++ b/test/libsolidity/syntaxTests/metaTypes/tooManyArgsForType.sol
@@ -0,0 +1,7 @@
+contract Test {
+ function creation() public pure returns (bytes memory) {
+ type(1, 2);
+ }
+}
+// ----
+// TypeError: (85-95): This function takes one argument, but 2 were provided.
diff --git a/test/libsolidity/syntaxTests/metaTypes/typeNotRegularIdentifierContractName.sol b/test/libsolidity/syntaxTests/metaTypes/typeNotRegularIdentifierContractName.sol
new file mode 100644
index 00000000..144ca1c3
--- /dev/null
+++ b/test/libsolidity/syntaxTests/metaTypes/typeNotRegularIdentifierContractName.sol
@@ -0,0 +1,3 @@
+contract type { }
+// ----
+// ParserError: (9-13): Expected identifier but got 'type'
diff --git a/test/libsolidity/syntaxTests/metaTypes/typeNotRegularIdentifierFunction.sol b/test/libsolidity/syntaxTests/metaTypes/typeNotRegularIdentifierFunction.sol
new file mode 100644
index 00000000..b7881f15
--- /dev/null
+++ b/test/libsolidity/syntaxTests/metaTypes/typeNotRegularIdentifierFunction.sol
@@ -0,0 +1,6 @@
+contract Test {
+ function type() public pure {
+ }
+}
+// ----
+// ParserError: (29-33): Expected identifier but got 'type'
diff --git a/test/libsolidity/syntaxTests/metaTypes/typeNotRegularIdentifierParameter.sol b/test/libsolidity/syntaxTests/metaTypes/typeNotRegularIdentifierParameter.sol
new file mode 100644
index 00000000..001ba840
--- /dev/null
+++ b/test/libsolidity/syntaxTests/metaTypes/typeNotRegularIdentifierParameter.sol
@@ -0,0 +1,6 @@
+contract Test {
+ function f(uint type) public pure {
+ }
+}
+// ----
+// ParserError: (36-40): Expected ',' but got 'type'
diff --git a/test/libsolidity/syntaxTests/metaTypes/typeNotRegularIdentifierStateVariable.sol b/test/libsolidity/syntaxTests/metaTypes/typeNotRegularIdentifierStateVariable.sol
new file mode 100644
index 00000000..fa827a33
--- /dev/null
+++ b/test/libsolidity/syntaxTests/metaTypes/typeNotRegularIdentifierStateVariable.sol
@@ -0,0 +1,5 @@
+contract Test {
+ uint type;
+}
+// ----
+// ParserError: (25-29): Expected identifier but got 'type'
diff --git a/test/libsolidity/syntaxTests/metaTypes/typeNotRegularIdentifierVariable.sol b/test/libsolidity/syntaxTests/metaTypes/typeNotRegularIdentifierVariable.sol
new file mode 100644
index 00000000..fa57698d
--- /dev/null
+++ b/test/libsolidity/syntaxTests/metaTypes/typeNotRegularIdentifierVariable.sol
@@ -0,0 +1,7 @@
+contract Test {
+ function f() public pure {
+ uint type;
+ }
+}
+// ----
+// ParserError: (60-64): Expected ';' but got 'type'
diff --git a/test/libsolidity/syntaxTests/metaTypes/typeOfContract.sol b/test/libsolidity/syntaxTests/metaTypes/typeOfContract.sol
new file mode 100644
index 00000000..036c36e8
--- /dev/null
+++ b/test/libsolidity/syntaxTests/metaTypes/typeOfContract.sol
@@ -0,0 +1,6 @@
+contract Test {
+ function f() public pure returns (bytes memory) {
+ type(Test);
+ }
+}
+// ----
diff --git a/test/libsolidity/syntaxTests/metaTypes/typeRecursive.sol b/test/libsolidity/syntaxTests/metaTypes/typeRecursive.sol
new file mode 100644
index 00000000..0ce06786
--- /dev/null
+++ b/test/libsolidity/syntaxTests/metaTypes/typeRecursive.sol
@@ -0,0 +1,8 @@
+contract Test {
+ function f() public pure {
+ type(type(type(Test)));
+ }
+}
+// ----
+// TypeError: (65-75): Invalid type for argument in function call. Contract type required, but type(contract Test) provided.
+// TypeError: (60-76): Invalid type for argument in function call. Contract type required, but tuple() provided.
diff --git a/test/libsolidity/syntaxTests/metaTypes/unsupportedArgForType.sol b/test/libsolidity/syntaxTests/metaTypes/unsupportedArgForType.sol
new file mode 100644
index 00000000..5c27d42f
--- /dev/null
+++ b/test/libsolidity/syntaxTests/metaTypes/unsupportedArgForType.sol
@@ -0,0 +1,9 @@
+contract Test {
+ struct S { uint x; }
+ function f() public pure {
+ // Unsupported for now, but might be supported in the future
+ type(S);
+ }
+}
+// ----
+// TypeError: (154-155): Invalid type for argument in function call. Contract type required, but type(struct Test.S) provided.