mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #4413 from ethereum/dropConstantKeywordOnly
Drop constant keyword only
This commit is contained in:
commit
58aeffb45b
@ -27,6 +27,7 @@ Breaking Changes:
|
|||||||
* General: C99-style scoping rules are enforced now. This was already the case in the experimental 0.5.0 mode.
|
* General: C99-style scoping rules are enforced now. This was already the case in the experimental 0.5.0 mode.
|
||||||
* Optimizer: Remove the no-op ``PUSH1 0 NOT AND`` sequence.
|
* Optimizer: Remove the no-op ``PUSH1 0 NOT AND`` sequence.
|
||||||
* Parser: Disallow trailing dots that are not followed by a number.
|
* Parser: Disallow trailing dots that are not followed by a number.
|
||||||
|
* Parser: Remove ``constant`` as function state mutability modifer.
|
||||||
* Type Checker: Disallow arithmetic operations for boolean variables.
|
* Type Checker: Disallow arithmetic operations for boolean variables.
|
||||||
* Type Checker: Disallow conversions between ``bytesX`` and ``uintY`` of different size.
|
* Type Checker: Disallow conversions between ``bytesX`` and ``uintY`` of different size.
|
||||||
* Type Checker: Only accept a single ``bytes`` type for ``.call()`` (and family), ``keccak256()``, ``sha256()`` and ``ripemd160()``.
|
* Type Checker: Only accept a single ``bytes`` type for ``.call()`` (and family), ``keccak256()``, ``sha256()`` and ``ripemd160()``.
|
||||||
|
@ -473,7 +473,7 @@ The following statements are considered modifying the state:
|
|||||||
}
|
}
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
``constant`` on functions is an alias to ``view``, but this is deprecated and will be dropped in version 0.5.0.
|
``constant`` on functions used to be an alias to ``view``, but this was dropped in version 0.5.0.
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
Getter methods are marked ``view``.
|
Getter methods are marked ``view``.
|
||||||
|
@ -58,7 +58,7 @@ ArrayTypeName = TypeName '[' Expression? ']'
|
|||||||
FunctionTypeName = 'function' FunctionTypeParameterList ( 'internal' | 'external' | StateMutability )*
|
FunctionTypeName = 'function' FunctionTypeParameterList ( 'internal' | 'external' | StateMutability )*
|
||||||
( 'returns' FunctionTypeParameterList )?
|
( 'returns' FunctionTypeParameterList )?
|
||||||
StorageLocation = 'memory' | 'storage' | 'calldata'
|
StorageLocation = 'memory' | 'storage' | 'calldata'
|
||||||
StateMutability = 'pure' | 'constant' | 'view' | 'payable'
|
StateMutability = 'pure' | 'view' | 'payable'
|
||||||
|
|
||||||
Block = '{' Statement* '}'
|
Block = '{' Statement* '}'
|
||||||
Statement = IfStatement | WhileStatement | ForStatement | Block | InlineAssemblyStatement |
|
Statement = IfStatement | WhileStatement | ForStatement | Block | InlineAssemblyStatement |
|
||||||
|
@ -401,7 +401,6 @@ Modifiers
|
|||||||
- ``view`` for functions: Disallows modification of state - this is not enforced yet.
|
- ``view`` for functions: Disallows modification of state - this is not enforced yet.
|
||||||
- ``payable`` for functions: Allows them to receive Ether together with a call.
|
- ``payable`` for functions: Allows them to receive Ether together with a call.
|
||||||
- ``constant`` for state variables: Disallows assignment (except initialisation), does not occupy storage slot.
|
- ``constant`` for state variables: Disallows assignment (except initialisation), does not occupy storage slot.
|
||||||
- ``constant`` for functions: Same as ``view``.
|
|
||||||
- ``anonymous`` for events: Does not store event signature as topic.
|
- ``anonymous`` for events: Does not store event signature as topic.
|
||||||
- ``indexed`` for event parameters: Stores the parameter as topic.
|
- ``indexed`` for event parameters: Stores the parameter as topic.
|
||||||
|
|
||||||
|
@ -376,7 +376,7 @@ be passed via and returned from external function calls.
|
|||||||
|
|
||||||
Function types are notated as follows::
|
Function types are notated as follows::
|
||||||
|
|
||||||
function (<parameter types>) {internal|external} [pure|constant|view|payable] [returns (<return types>)]
|
function (<parameter types>) {internal|external} [pure|view|payable] [returns (<return types>)]
|
||||||
|
|
||||||
In contrast to the parameter types, the return types cannot be empty - if the
|
In contrast to the parameter types, the return types cannot be empty - if the
|
||||||
function type should not return anything, the whole ``returns (<return types>)``
|
function type should not return anything, the whole ``returns (<return types>)``
|
||||||
|
@ -322,11 +322,18 @@ StateMutability Parser::parseStateMutability(Token::Value _token)
|
|||||||
StateMutability stateMutability(StateMutability::NonPayable);
|
StateMutability stateMutability(StateMutability::NonPayable);
|
||||||
if (_token == Token::Payable)
|
if (_token == Token::Payable)
|
||||||
stateMutability = StateMutability::Payable;
|
stateMutability = StateMutability::Payable;
|
||||||
// FIXME: constant should be removed at the next breaking release
|
else if (_token == Token::View)
|
||||||
else if (_token == Token::View || _token == Token::Constant)
|
|
||||||
stateMutability = StateMutability::View;
|
stateMutability = StateMutability::View;
|
||||||
else if (_token == Token::Pure)
|
else if (_token == Token::Pure)
|
||||||
stateMutability = StateMutability::Pure;
|
stateMutability = StateMutability::Pure;
|
||||||
|
else if (_token == Token::Constant)
|
||||||
|
{
|
||||||
|
stateMutability = StateMutability::View;
|
||||||
|
parserError(
|
||||||
|
"The state mutability modifier \"constant\" was removed in version 0.5.0. "
|
||||||
|
"Use \"view\" or \"pure\" instead."
|
||||||
|
);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
solAssert(false, "Invalid state mutability specifier.");
|
solAssert(false, "Invalid state mutability specifier.");
|
||||||
m_scanner->next();
|
m_scanner->next();
|
||||||
|
@ -252,7 +252,7 @@ BOOST_AUTO_TEST_CASE(function_type)
|
|||||||
CompilerStack c;
|
CompilerStack c;
|
||||||
c.addSource("a",
|
c.addSource("a",
|
||||||
"contract C { function f(function() external payable returns (uint) x) "
|
"contract C { function f(function() external payable returns (uint) x) "
|
||||||
"returns (function() external constant returns (uint)) {} }"
|
"returns (function() external view returns (uint)) {} }"
|
||||||
);
|
);
|
||||||
c.setEVMVersion(dev::test::Options::get().evmVersion());
|
c.setEVMVersion(dev::test::Options::get().evmVersion());
|
||||||
c.parseAndAnalyze();
|
c.parseAndAnalyze();
|
||||||
|
@ -316,7 +316,7 @@ BOOST_AUTO_TEST_CASE(complex_control_flow)
|
|||||||
// we previously considered. This of course reduces accuracy.
|
// we previously considered. This of course reduces accuracy.
|
||||||
char const* sourceCode = R"(
|
char const* sourceCode = R"(
|
||||||
contract log {
|
contract log {
|
||||||
function ln(int128 x) constant returns (int128 result) {
|
function ln(int128 x) pure returns (int128 result) {
|
||||||
int128 t = x / 256;
|
int128 t = x / 256;
|
||||||
int128 y = 5545177;
|
int128 y = 5545177;
|
||||||
x = t;
|
x = t;
|
||||||
|
@ -306,62 +306,6 @@ BOOST_AUTO_TEST_CASE(view_function)
|
|||||||
checkInterface(sourceCode, interface);
|
checkInterface(sourceCode, interface);
|
||||||
}
|
}
|
||||||
|
|
||||||
// constant is an alias to view above
|
|
||||||
BOOST_AUTO_TEST_CASE(constant_function)
|
|
||||||
{
|
|
||||||
char const* sourceCode = R"(
|
|
||||||
contract test {
|
|
||||||
function foo(uint a, uint b) returns(uint d) { return a + b; }
|
|
||||||
function boo(uint32 a) constant returns(uint b) { return a * 4; }
|
|
||||||
}
|
|
||||||
)";
|
|
||||||
|
|
||||||
char const* interface = R"([
|
|
||||||
{
|
|
||||||
"name": "foo",
|
|
||||||
"constant": false,
|
|
||||||
"payable" : false,
|
|
||||||
"stateMutability": "nonpayable",
|
|
||||||
"type": "function",
|
|
||||||
"inputs": [
|
|
||||||
{
|
|
||||||
"name": "a",
|
|
||||||
"type": "uint256"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "b",
|
|
||||||
"type": "uint256"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"name": "d",
|
|
||||||
"type": "uint256"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "boo",
|
|
||||||
"constant": true,
|
|
||||||
"payable" : false,
|
|
||||||
"stateMutability": "view",
|
|
||||||
"type": "function",
|
|
||||||
"inputs": [{
|
|
||||||
"name": "a",
|
|
||||||
"type": "uint32"
|
|
||||||
}],
|
|
||||||
"outputs": [
|
|
||||||
{
|
|
||||||
"name": "b",
|
|
||||||
"type": "uint256"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
])";
|
|
||||||
|
|
||||||
checkInterface(sourceCode, interface);
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(pure_function)
|
BOOST_AUTO_TEST_CASE(pure_function)
|
||||||
{
|
{
|
||||||
char const* sourceCode = R"(
|
char const* sourceCode = R"(
|
||||||
|
@ -1,13 +1,9 @@
|
|||||||
contract test1 {
|
contract test1 {
|
||||||
constructor() constant {}
|
|
||||||
}
|
|
||||||
contract test2 {
|
|
||||||
constructor() view {}
|
constructor() view {}
|
||||||
}
|
}
|
||||||
contract test3 {
|
contract test2 {
|
||||||
constructor() pure {}
|
constructor() pure {}
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
// TypeError: (19-44): Constructor must be payable or non-payable, but is "view".
|
// TypeError: (19-40): Constructor must be payable or non-payable, but is "view".
|
||||||
// TypeError: (66-87): Constructor must be payable or non-payable, but is "view".
|
// TypeError: (62-83): Constructor must be payable or non-payable, but is "pure".
|
||||||
// TypeError: (109-130): Constructor must be payable or non-payable, but is "pure".
|
|
||||||
|
@ -1,16 +1,11 @@
|
|||||||
contract test1 {
|
contract test1 {
|
||||||
function test1() constant {}
|
function test1() view {}
|
||||||
}
|
}
|
||||||
contract test2 {
|
contract test2 {
|
||||||
function test2() view {}
|
function test2() pure {}
|
||||||
}
|
|
||||||
contract test3 {
|
|
||||||
function test3() pure {}
|
|
||||||
}
|
}
|
||||||
// ----
|
// ----
|
||||||
// Warning: (21-49): Defining constructors as functions with the same name as the contract is deprecated. Use "constructor(...) { ... }" instead.
|
// Warning: (21-45): Defining constructors as functions with the same name as the contract is deprecated. Use "constructor(...) { ... }" instead.
|
||||||
// Warning: (73-97): Defining constructors as functions with the same name as the contract is deprecated. Use "constructor(...) { ... }" instead.
|
// Warning: (69-93): Defining constructors as functions with the same name as the contract is deprecated. Use "constructor(...) { ... }" instead.
|
||||||
// Warning: (121-145): Defining constructors as functions with the same name as the contract is deprecated. Use "constructor(...) { ... }" instead.
|
// TypeError: (21-45): Constructor must be payable or non-payable, but is "view".
|
||||||
// TypeError: (21-49): Constructor must be payable or non-payable, but is "view".
|
// TypeError: (69-93): Constructor must be payable or non-payable, but is "pure".
|
||||||
// TypeError: (73-97): Constructor must be payable or non-payable, but is "view".
|
|
||||||
// TypeError: (121-145): Constructor must be payable or non-payable, but is "pure".
|
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
contract C {
|
contract C {
|
||||||
uint s;
|
uint s;
|
||||||
// this test should fail starting from 0.5.0
|
|
||||||
function f() public constant returns (uint) {
|
function f() public constant returns (uint) {
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// ----
|
||||||
|
// ParserError: (43-51): The state mutability modifier "constant" was removed in version 0.5.0. Use "view" or "pure" instead.
|
||||||
|
Loading…
Reference in New Issue
Block a user