Merge pull request #9549 from ethereum/yul-reserved

[BREAKING] Disallow using reserved identifiers in Yul
This commit is contained in:
chriseth
2020-12-10 18:49:44 +01:00
committed by GitHub
15 changed files with 122 additions and 8 deletions
-6
View File
@@ -359,12 +359,6 @@ BOOST_AUTO_TEST_CASE(shift_constantinople_warning)
CHECK_PARSE_WARNING("{ sar(10, 32) }", TypeError, "The \"sar\" instruction is only available for Constantinople-compatible VMs");
}
BOOST_AUTO_TEST_CASE(jump_error)
{
CHECK_PARSE_WARNING("{ jump(44) }", DeclarationError, "Function not found.");
CHECK_PARSE_WARNING("{ jumpi(44, 2) }", DeclarationError, "Function not found.");
}
BOOST_AUTO_TEST_SUITE_END() // }}}
BOOST_AUTO_TEST_SUITE_END()
@@ -8,3 +8,4 @@ contract C {
}
}
// ----
// DeclarationError 5017: (63-90): The identifier "linkersymbol" is reserved and can not be used.
@@ -0,0 +1,13 @@
contract C {
function f() public pure {
assembly {
let linkersymbol := 1
let datacopy := 1
let swap16 := 1
}
}
}
// ----
// DeclarationError 5017: (67-79): The identifier "linkersymbol" is reserved and can not be used.
// DeclarationError 5017: (95-103): The identifier "datacopy" is reserved and can not be used.
// DeclarationError 5017: (119-125): The identifier "swap16" is reserved and can not be used.
@@ -0,0 +1,16 @@
contract C {
function f() public pure {
assembly {
let shl := 1
}
assembly {
pop(shl(1, 2))
}
}
}
// ====
// EVMVersion: =byzantium
// ----
// DeclarationError 5017: (67-70): The identifier "shl" is reserved and can not be used.
// TypeError 6612: (107-110): The "shl" instruction is only available for Constantinople-compatible VMs (you are currently compiling for "byzantium").
// TypeError 3950: (107-116): Expected expression to evaluate to one value, but got 0 values instead.
@@ -0,0 +1,14 @@
contract C {
function f() public pure {
assembly {
let shl := 1
}
assembly {
pop(shl(1, 2))
}
}
}
// ====
// EVMVersion: >=constantinople
// ----
// ParserError 5568: (67-70): Cannot use builtin function name "shl" as identifier name.
@@ -0,0 +1,32 @@
{
function g_(x) -> z_ {
if calldataload(1) { z_ := g_(x) }
sstore(z_, calldataload(add(x, 1)))
}
function datasize_(x) -> linkersymbol_ {
if calldataload(0) { linkersymbol_ := datasize_(x) }
sstore(linkersymbol_, calldataload(linkersymbol_))
}
let dataoffset_ := datasize_(7)
let x_ := g_(9)
sstore(dataoffset_, x_)
}
// ----
// step: fullSuite
//
// {
// {
// let dataoffset_ := datasize_(7)
// sstore(dataoffset_, g(9))
// }
// function g(x) -> z
// {
// if calldataload(1) { z := g(x) }
// sstore(z, calldataload(add(x, 1)))
// }
// function datasize_(x) -> linkersymbol_
// {
// if calldataload(linkersymbol_) { linkersymbol_ := datasize_(x) }
// sstore(linkersymbol_, calldataload(linkersymbol_))
// }
// }
@@ -1,6 +1,8 @@
{
let addr:u256 := linkersymbol("contract/library.sol:L")
function linkersymbol(x) {}
}
// ====
// dialect: evmTyped
// ----
// ParserError 5568: (75-87): Cannot use builtin function name "linkersymbol" as identifier name.
@@ -6,3 +6,4 @@
let s := ""
datacopy(x, "11", s)
}
// ----