Merge pull request #4413 from ethereum/dropConstantKeywordOnly

Drop constant keyword only
This commit is contained in:
chriseth 2018-07-03 20:17:01 +02:00 committed by GitHub
commit 58aeffb45b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 26 additions and 83 deletions

View File

@ -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()``.

View File

@ -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``.

View File

@ -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 |

View File

@ -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.

View File

@ -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>)``

View File

@ -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();

View File

@ -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();

View File

@ -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;

View File

@ -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"(

View File

@ -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".

View File

@ -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".

View File

@ -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.