aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Changelog.md2
-rw-r--r--docs/contracts.rst8
-rw-r--r--docs/frequently-asked-questions.rst9
-rw-r--r--docs/grammar.txt7
-rw-r--r--docs/miscellaneous.rst3
-rw-r--r--docs/security-considerations.rst3
-rw-r--r--docs/types.rst33
-rw-r--r--libsolidity/analysis/SyntaxChecker.cpp7
-rw-r--r--libsolidity/parsing/Parser.cpp11
-rwxr-xr-xscripts/tests.sh9
-rw-r--r--test/RPCSession.cpp4
-rw-r--r--test/libsolidity/ASTLegacyJSON.cpp2
-rw-r--r--test/libsolidity/GasMeter.cpp2
-rw-r--r--test/libsolidity/SolidityABIJSON.cpp56
-rw-r--r--test/libsolidity/syntaxTests/constructor/constructor_state_mutability_new.sol10
-rw-r--r--test/libsolidity/syntaxTests/constructor/constructor_state_mutability_old.sol17
-rw-r--r--test/libsolidity/syntaxTests/parsing/constant_state_modifier.sol3
17 files changed, 51 insertions, 135 deletions
diff --git a/Changelog.md b/Changelog.md
index baa98389..b2351822 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -15,6 +15,7 @@ Breaking Changes:
* General: ``continue`` in a ``do...while`` loop jumps to the condition (it used to jump to the loop body). Warning: this may silently change the semantics of existing code.
* General: Disallow declaring empty structs.
* General: Disallow raw ``callcode`` (was already deprecated in 0.4.12). It is still possible to use it via inline assembly.
+ * General: Disallow ``var`` keyword.
* General: Disallow ``sha3`` and ``suicide`` aliases.
* General: Disallow the ``years`` unit denomination (was already deprecated in 0.4.24)
* General: Introduce ``emit`` as a keyword instead of parsing it as identifier.
@@ -26,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.
* Optimizer: Remove the no-op ``PUSH1 0 NOT AND`` sequence.
* 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 conversions between ``bytesX`` and ``uintY`` of different size.
* Type Checker: Only accept a single ``bytes`` type for ``.call()`` (and family), ``keccak256()``, ``sha256()`` and ``ripemd160()``.
diff --git a/docs/contracts.rst b/docs/contracts.rst
index 86cdb3c4..41240a9c 100644
--- a/docs/contracts.rst
+++ b/docs/contracts.rst
@@ -473,7 +473,7 @@ The following statements are considered modifying the state:
}
.. 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::
Getter methods are marked ``view``.
@@ -1328,9 +1328,9 @@ custom types without the overhead of external function calls:
using BigInt for BigInt.bigint;
function f() public pure {
- var x = BigInt.fromUint(7);
- var y = BigInt.fromUint(uint(-1));
- var z = x.add(y);
+ BigInt.bigint memory x = BigInt.fromUint(7);
+ BigInt.bigint memory y = BigInt.fromUint(uint(-1));
+ BigInt.bigint memory z = x.add(y);
}
}
diff --git a/docs/frequently-asked-questions.rst b/docs/frequently-asked-questions.rst
index bb00441c..0d6fa033 100644
--- a/docs/frequently-asked-questions.rst
+++ b/docs/frequently-asked-questions.rst
@@ -136,14 +136,9 @@ See `struct_and_for_loop_tester.sol <https://github.com/fivedogit/solidity-baby-
How do for loops work?
======================
-Very similar to JavaScript. There is one point to watch out for, though:
+Very similar to JavaScript. Such as the following example:
-If you use ``for (var i = 0; i < a.length; i ++) { a[i] = i; }``, then
-the type of ``i`` will be inferred only from ``0``, whose type is ``uint8``.
-This means that if ``a`` has more than ``255`` elements, your loop will
-not terminate because ``i`` can only hold values up to ``255``.
-
-Better use ``for (uint i = 0; i < a.length...``
+``for (uint i = 0; i < a.length; i ++) { a[i] = i; }``
See `struct_and_for_loop_tester.sol <https://github.com/fivedogit/solidity-baby-steps/blob/master/contracts/65_struct_and_for_loop_tester.sol>`_.
diff --git a/docs/grammar.txt b/docs/grammar.txt
index 5d977827..7b29fc62 100644
--- a/docs/grammar.txt
+++ b/docs/grammar.txt
@@ -58,7 +58,7 @@ ArrayTypeName = TypeName '[' Expression? ']'
FunctionTypeName = 'function' FunctionTypeParameterList ( 'internal' | 'external' | StateMutability )*
( 'returns' FunctionTypeParameterList )?
StorageLocation = 'memory' | 'storage' | 'calldata'
-StateMutability = 'pure' | 'constant' | 'view' | 'payable'
+StateMutability = 'pure' | 'view' | 'payable'
Block = '{' Statement* '}'
Statement = IfStatement | WhileStatement | ForStatement | Block | InlineAssemblyStatement |
@@ -78,7 +78,7 @@ Break = 'break'
Return = 'return' Expression?
Throw = 'throw'
EmitStatement = 'emit' FunctionCall
-VariableDefinition = ('var' IdentifierList | VariableDeclaration | '(' VariableDeclaration? (',' VariableDeclaration? )* ')' ) ( '=' Expression )?
+VariableDefinition = (VariableDeclaration | '(' VariableDeclaration? (',' VariableDeclaration? )* ')' ) ( '=' Expression )?
IdentifierList = '(' ( Identifier? ',' )* Identifier? ')'
// Precedence by order (see github.com/ethereum/solidity/pull/732)
@@ -140,8 +140,7 @@ TupleExpression = '(' ( Expression? ( ',' Expression? )* )? ')'
ElementaryTypeNameExpression = ElementaryTypeName
-ElementaryTypeName = 'address' | 'bool' | 'string' | 'var'
- | Int | Uint | Byte | Fixed | Ufixed
+ElementaryTypeName = 'address' | 'bool' | 'string' | Int | Uint | Byte | Fixed | Ufixed
Int = 'int' | 'int8' | 'int16' | 'int24' | 'int32' | 'int40' | 'int48' | 'int56' | 'int64' | 'int72' | 'int80' | 'int88' | 'int96' | 'int104' | 'int112' | 'int120' | 'int128' | 'int136' | 'int144' | 'int152' | 'int160' | 'int168' | 'int176' | 'int184' | 'int192' | 'int200' | 'int208' | 'int216' | 'int224' | 'int232' | 'int240' | 'int248' | 'int256'
diff --git a/docs/miscellaneous.rst b/docs/miscellaneous.rst
index 30ece7e1..c19c8c59 100644
--- a/docs/miscellaneous.rst
+++ b/docs/miscellaneous.rst
@@ -157,7 +157,7 @@ These steps are applied to each basic block and the newly generated code is used
::
- var x = 7;
+ uint x = 7;
data[7] = 9;
if (data[x] != x + 2)
return 2;
@@ -401,7 +401,6 @@ Modifiers
- ``view`` for functions: Disallows modification of state - this is not enforced yet.
- ``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 functions: Same as ``view``.
- ``anonymous`` for events: Does not store event signature as topic.
- ``indexed`` for event parameters: Stores the parameter as topic.
diff --git a/docs/security-considerations.rst b/docs/security-considerations.rst
index c8d8c30b..afdecb98 100644
--- a/docs/security-considerations.rst
+++ b/docs/security-considerations.rst
@@ -103,7 +103,7 @@ outlined further below:
mapping(address => uint) shares;
/// Withdraw your share.
function withdraw() public {
- var share = shares[msg.sender];
+ uint share = shares[msg.sender];
shares[msg.sender] = 0;
msg.sender.transfer(share);
}
@@ -224,7 +224,6 @@ If your wallet had checked ``msg.sender`` for authorization, it would get the ad
Minor Details
=============
-- In ``for (var i = 0; i < arrayName.length; i++) { ... }``, the type of ``i`` will be ``uint8``, because this is the smallest type that is required to hold the value ``0``. If the array has more than 255 elements, the loop will not terminate.
- Types that do not occupy the full 32 bytes might contain "dirty higher order bits".
This is especially important if you access ``msg.data`` - it poses a malleability risk:
You can craft transactions that call a function ``f(uint8 x)`` with a raw byte argument
diff --git a/docs/types.rst b/docs/types.rst
index 528807d9..217a2273 100644
--- a/docs/types.rst
+++ b/docs/types.rst
@@ -7,10 +7,8 @@ Types
*****
Solidity is a statically typed language, which means that the type of each
-variable (state and local) needs to be specified (or at least known -
-see :ref:`type-deduction` below) at
-compile-time. Solidity provides several elementary types which can be combined
-to form complex types.
+variable (state and local) needs to be specified.
+Solidity provides several elementary types which can be combined to form complex types.
In addition, types can interact with each other in expressions containing
operators. For a quick reference of the various operators, see :ref:`order`.
@@ -378,7 +376,7 @@ be passed via and returned from external function calls.
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
function type should not return anything, the whole ``returns (<return types>)``
@@ -548,7 +546,7 @@ memory-stored reference type do not create a copy.
// the data location of memoryArray is memory
function f(uint[] memoryArray) public {
x = memoryArray; // works, copies the whole array to storage
- var y = x; // works, assigns a pointer, data location of y is storage
+ uint[] storage y = x; // works, assigns a pointer, data location of y is storage
y[7]; // fine, returns the 8th element
y.length = 2; // fine, modifies x through y
delete x; // fine, clears the array, also modifies y
@@ -986,26 +984,3 @@ converted to a matching size. This makes alignment and padding explicit::
bytes32(uint256(x)); // pad on the left
bytes32(bytes2(x)); // pad on the right
-.. index:: ! type;deduction, ! var
-
-.. _type-deduction:
-
-Type Deduction
-==============
-
-For convenience, it is not always necessary to explicitly specify the type of a
-variable, the compiler automatically infers it from the type of the first
-expression that is assigned to the variable::
-
- uint24 x = 0x123;
- var y = x;
-
-Here, the type of ``y`` will be ``uint24``. Using ``var`` is not possible for function
-parameters or return parameters.
-
-.. warning::
- The type is only deduced from the first assignment, so
- the loop in the following snippet is infinite, as ``i`` will have the type
- ``uint8`` and the highest value of this type is smaller than ``2000``.
- ``for (var i = 0; i < 2000; i++) { ... }``
-
diff --git a/libsolidity/analysis/SyntaxChecker.cpp b/libsolidity/analysis/SyntaxChecker.cpp
index c408b393..cd0dc2a4 100644
--- a/libsolidity/analysis/SyntaxChecker.cpp
+++ b/libsolidity/analysis/SyntaxChecker.cpp
@@ -262,14 +262,9 @@ bool SyntaxChecker::visit(FunctionTypeName const& _node)
bool SyntaxChecker::visit(VariableDeclaration const& _declaration)
{
- bool const v050 = m_sourceUnit->annotation().experimentalFeatures.count(ExperimentalFeature::V050);
-
if (!_declaration.typeName())
{
- if (v050)
- m_errorReporter.syntaxError(_declaration.location(), "Use of the \"var\" keyword is deprecated.");
- else
- m_errorReporter.warning(_declaration.location(), "Use of the \"var\" keyword is deprecated.");
+ m_errorReporter.syntaxError(_declaration.location(), "Use of the \"var\" keyword is disallowed.");
}
return true;
}
diff --git a/libsolidity/parsing/Parser.cpp b/libsolidity/parsing/Parser.cpp
index e9810fe3..e2bd6fb4 100644
--- a/libsolidity/parsing/Parser.cpp
+++ b/libsolidity/parsing/Parser.cpp
@@ -322,11 +322,18 @@ StateMutability Parser::parseStateMutability(Token::Value _token)
StateMutability stateMutability(StateMutability::NonPayable);
if (_token == Token::Payable)
stateMutability = StateMutability::Payable;
- // FIXME: constant should be removed at the next breaking release
- else if (_token == Token::View || _token == Token::Constant)
+ else if (_token == Token::View)
stateMutability = StateMutability::View;
else if (_token == Token::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
solAssert(false, "Invalid state mutability specifier.");
m_scanner->next();
diff --git a/scripts/tests.sh b/scripts/tests.sh
index ffb5e7ef..7fb260bc 100755
--- a/scripts/tests.sh
+++ b/scripts/tests.sh
@@ -109,9 +109,18 @@ function run_eth()
sleep 2
}
+function check_eth() {
+ printTask "Running IPC tests with $ETH_PATH..."
+ if ! hash $ETH_PATH 2>/dev/null; then
+ printError "$ETH_PATH not found"
+ exit 1
+ fi
+}
+
if [ "$IPC_ENABLED" = true ];
then
download_eth
+ check_eth
ETH_PID=$(run_eth /tmp/test)
fi
diff --git a/test/RPCSession.cpp b/test/RPCSession.cpp
index 9a253794..b9b19b2f 100644
--- a/test/RPCSession.cpp
+++ b/test/RPCSession.cpp
@@ -255,8 +255,8 @@ void RPCSession::test_setChainParams(vector<string> const& _accounts)
"gasLimit": "0x1000000000000",
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"nonce": "0x0000000000000042",
- "difficulty": "1"
- },
+ "difficulty": "131072"
+ },
"accounts": {
"0000000000000000000000000000000000000001": { "wei": "1", "precompiled": { "name": "ecrecover", "linear": { "base": 3000, "word": 0 } } },
"0000000000000000000000000000000000000002": { "wei": "1", "precompiled": { "name": "sha256", "linear": { "base": 60, "word": 12 } } },
diff --git a/test/libsolidity/ASTLegacyJSON.cpp b/test/libsolidity/ASTLegacyJSON.cpp
index 13148682..cd8384ea 100644
--- a/test/libsolidity/ASTLegacyJSON.cpp
+++ b/test/libsolidity/ASTLegacyJSON.cpp
@@ -252,7 +252,7 @@ BOOST_AUTO_TEST_CASE(function_type)
CompilerStack c;
c.addSource("a",
"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.parseAndAnalyze();
diff --git a/test/libsolidity/GasMeter.cpp b/test/libsolidity/GasMeter.cpp
index d8954f83..a404c072 100644
--- a/test/libsolidity/GasMeter.cpp
+++ b/test/libsolidity/GasMeter.cpp
@@ -316,7 +316,7 @@ BOOST_AUTO_TEST_CASE(complex_control_flow)
// we previously considered. This of course reduces accuracy.
char const* sourceCode = R"(
contract log {
- function ln(int128 x) constant returns (int128 result) {
+ function ln(int128 x) pure returns (int128 result) {
int128 t = x / 256;
int128 y = 5545177;
x = t;
diff --git a/test/libsolidity/SolidityABIJSON.cpp b/test/libsolidity/SolidityABIJSON.cpp
index a3ebd139..6994a290 100644
--- a/test/libsolidity/SolidityABIJSON.cpp
+++ b/test/libsolidity/SolidityABIJSON.cpp
@@ -306,62 +306,6 @@ BOOST_AUTO_TEST_CASE(view_function)
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)
{
char const* sourceCode = R"(
diff --git a/test/libsolidity/syntaxTests/constructor/constructor_state_mutability_new.sol b/test/libsolidity/syntaxTests/constructor/constructor_state_mutability_new.sol
index 15ed0e1e..78272c98 100644
--- a/test/libsolidity/syntaxTests/constructor/constructor_state_mutability_new.sol
+++ b/test/libsolidity/syntaxTests/constructor/constructor_state_mutability_new.sol
@@ -1,13 +1,9 @@
contract test1 {
- constructor() constant {}
-}
-contract test2 {
constructor() view {}
}
-contract test3 {
+contract test2 {
constructor() pure {}
}
// ----
-// TypeError: (19-44): Constructor must be payable or non-payable, but is "view".
-// TypeError: (66-87): Constructor must be payable or non-payable, but is "view".
-// TypeError: (109-130): Constructor must be payable or non-payable, but is "pure".
+// TypeError: (19-40): Constructor must be payable or non-payable, but is "view".
+// TypeError: (62-83): Constructor must be payable or non-payable, but is "pure".
diff --git a/test/libsolidity/syntaxTests/constructor/constructor_state_mutability_old.sol b/test/libsolidity/syntaxTests/constructor/constructor_state_mutability_old.sol
index 6dbcbc97..1ceaffee 100644
--- a/test/libsolidity/syntaxTests/constructor/constructor_state_mutability_old.sol
+++ b/test/libsolidity/syntaxTests/constructor/constructor_state_mutability_old.sol
@@ -1,16 +1,11 @@
contract test1 {
- function test1() constant {}
+ function test1() view {}
}
contract test2 {
- function test2() view {}
-}
-contract test3 {
- function test3() pure {}
+ function test2() pure {}
}
// ----
-// Warning: (21-49): 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: (121-145): Defining constructors as functions with the same name as the contract is deprecated. Use "constructor(...) { ... }" instead.
-// TypeError: (21-49): Constructor must be payable or non-payable, but is "view".
-// 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".
+// Warning: (21-45): 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.
+// TypeError: (21-45): Constructor must be payable or non-payable, but is "view".
+// TypeError: (69-93): Constructor must be payable or non-payable, but is "pure".
diff --git a/test/libsolidity/syntaxTests/parsing/constant_state_modifier.sol b/test/libsolidity/syntaxTests/parsing/constant_state_modifier.sol
index da068351..8fddc988 100644
--- a/test/libsolidity/syntaxTests/parsing/constant_state_modifier.sol
+++ b/test/libsolidity/syntaxTests/parsing/constant_state_modifier.sol
@@ -1,7 +1,8 @@
contract C {
uint s;
- // this test should fail starting from 0.5.0
function f() public constant returns (uint) {
return s;
}
}
+// ----
+// ParserError: (43-51): The state mutability modifier "constant" was removed in version 0.5.0. Use "view" or "pure" instead.