aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rwxr-xr-xtest/cmdlineTests.sh26
-rw-r--r--test/compilationTests/MultiSigWallet/MultiSigWallet.sol8
-rw-r--r--test/compilationTests/MultiSigWallet/MultiSigWalletWithDailyLimit.sol5
-rw-r--r--test/compilationTests/milestonetracker/MilestoneTracker.sol4
-rw-r--r--test/compilationTests/zeppelin/MultisigWallet.sol10
-rw-r--r--test/compilationTests/zeppelin/token/VestedToken.sol4
-rw-r--r--test/libdevcore/UTF8.cpp8
-rw-r--r--test/libsolidity/SolidityEndToEndTest.cpp295
-rw-r--r--test/libsolidity/SolidityNameAndTypeResolution.cpp55
-rw-r--r--test/libsolidity/SolidityNatspecJSON.cpp4
-rw-r--r--test/libsolidity/ViewPureChecker.cpp3
-rw-r--r--test/libsolidity/syntaxTests/controlFlow/mappingReturn/unnamed_err.sol2
-rw-r--r--test/libsolidity/syntaxTests/controlFlow/storageReturn/assembly_err.sol2
-rw-r--r--test/libsolidity/syntaxTests/controlFlow/storageReturn/modifier_err.sol4
-rw-r--r--test/libsolidity/syntaxTests/dataLocations/data_location_in_function_type_fail.sol4
-rw-r--r--test/libsolidity/syntaxTests/dataLocations/externalFunction/function_argument_location_specifier_test_external_memory.sol2
-rw-r--r--test/libsolidity/syntaxTests/dataLocations/externalFunction/function_argument_location_specifier_test_external_storage.sol2
-rw-r--r--test/libsolidity/syntaxTests/dataLocations/function_argument_location_specifier_test_non_reference_type.sol2
-rw-r--r--test/libsolidity/syntaxTests/dataLocations/internalFunction/function_argument_location_specifier_test_internal_calldata.sol2
-rw-r--r--test/libsolidity/syntaxTests/dataLocations/libraryExternalFunction/function_argument_location_specifier_test_external_memory.sol2
-rw-r--r--test/libsolidity/syntaxTests/dataLocations/libraryInternalFunction/function_argument_location_specifier_test_internal_calldata.sol2
-rw-r--r--test/libsolidity/syntaxTests/dataLocations/publicFunction/function_argument_location_specifier_test_public_calldata.sol2
-rw-r--r--test/libsolidity/syntaxTests/dataLocations/publicFunction/function_argument_location_specifier_test_public_storage.sol2
-rw-r--r--test/libsolidity/syntaxTests/events/event_array_indexed_v2.sol2
-rw-r--r--test/libsolidity/syntaxTests/events/event_nested_array_indexed_v2.sol2
-rw-r--r--test/libsolidity/syntaxTests/events/event_struct_indexed.sol2
-rw-r--r--test/libsolidity/syntaxTests/events/event_struct_indexed_v2.sol2
-rw-r--r--test/libsolidity/syntaxTests/globalFunctions/call_with_wrong_arg_count.sol20
-rw-r--r--test/libsolidity/syntaxTests/globalFunctions/callcode_with_wrong_arg_count.sol15
-rw-r--r--test/libsolidity/syntaxTests/globalFunctions/delegatecall_with_wrong_arg_count.sol15
-rw-r--r--test/libsolidity/syntaxTests/memberLookup/msg_value_modifier_payable.sol4
-rw-r--r--test/libsolidity/syntaxTests/memberLookup/msg_value_modifier_pure.sol6
-rw-r--r--test/libsolidity/syntaxTests/memberLookup/msg_value_modifier_view.sol6
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/041_functions_with_stucts_of_non_external_types_in_interface.sol2
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/042_functions_with_stucts_of_non_external_types_in_interface_2.sol2
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/043_functions_with_stucts_of_non_external_types_in_interface_nested.sol2
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/045_returning_multi_dimensional_arrays.sol2
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/046_returning_multi_dimensional_static_arrays.sol2
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/397_warns_msg_value_in_non_payable_public_function.sol2
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/413_address_methods.sol6
-rw-r--r--test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_empty.sol7
-rw-r--r--test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_single_return.sol5
-rw-r--r--test/libsolidity/syntaxTests/specialFunctions/types_with_unspecified_encoding_special_types.sol16
-rw-r--r--test/libsolidity/syntaxTests/structs/recursion/return_recursive_structs.sol2
-rw-r--r--test/libsolidity/syntaxTests/structs/recursion/return_recursive_structs2.sol2
-rw-r--r--test/libsolidity/syntaxTests/types/mapping/argument_external.sol2
-rw-r--r--test/libsolidity/syntaxTests/types/mapping/argument_public.sol2
-rw-r--r--test/libsolidity/syntaxTests/types/mapping/array_argument_external.sol2
-rw-r--r--test/libsolidity/syntaxTests/types/mapping/array_argument_public.sol2
-rw-r--r--test/libsolidity/syntaxTests/types/mapping/function_type_argument_external.sol4
-rw-r--r--test/libsolidity/syntaxTests/types/mapping/function_type_return_external.sol4
-rw-r--r--test/libsolidity/syntaxTests/types/mapping/library_argument_external.sol2
-rw-r--r--test/libsolidity/syntaxTests/types/mapping/library_argument_public.sol2
-rw-r--r--test/libsolidity/syntaxTests/types/mapping/library_array_argument_external.sol2
-rw-r--r--test/libsolidity/syntaxTests/types/mapping/library_array_argument_public.sol2
-rw-r--r--test/libsolidity/syntaxTests/types/mapping/library_return_external.sol2
-rw-r--r--test/libsolidity/syntaxTests/types/mapping/library_return_public.sol2
-rw-r--r--test/libsolidity/syntaxTests/types/mapping/mapping_array_data_location_function_param_external.sol4
-rw-r--r--test/libsolidity/syntaxTests/types/mapping/mapping_data_location_function_param_external.sol4
-rw-r--r--test/libsolidity/syntaxTests/types/mapping/mapping_data_location_function_param_public.sol4
-rw-r--r--test/libsolidity/syntaxTests/variableDeclaration/do_while.sol12
-rw-r--r--test/libsolidity/syntaxTests/variableDeclaration/else.sol13
-rw-r--r--test/libsolidity/syntaxTests/variableDeclaration/for.sol11
-rw-r--r--test/libsolidity/syntaxTests/variableDeclaration/if.sol11
-rw-r--r--test/libsolidity/syntaxTests/variableDeclaration/while.sol11
-rw-r--r--test/libsolidity/syntaxTests/viewPureChecker/builtin_functions.sol6
-rw-r--r--test/libsolidity/syntaxTests/viewPureChecker/builtin_functions_view_fail.sol10
-rw-r--r--test/libsolidity/syntaxTests/viewPureChecker/msg_value_modifier.sol6
-rw-r--r--test/libsolidity/syntaxTests/viewPureChecker/msg_value_modifier_view.sol6
69 files changed, 525 insertions, 175 deletions
diff --git a/test/cmdlineTests.sh b/test/cmdlineTests.sh
index c9acb99a..6f8a8ac1 100755
--- a/test/cmdlineTests.sh
+++ b/test/cmdlineTests.sh
@@ -172,12 +172,12 @@ done
)
printTask "Compiling all examples from the documentation..."
-TMPDIR=$(mktemp -d)
+SOLTMPDIR=$(mktemp -d)
(
set -e
cd "$REPO_ROOT"
REPO_ROOT=$(pwd) # make it absolute
- cd "$TMPDIR"
+ cd "$SOLTMPDIR"
"$REPO_ROOT"/scripts/isolate_tests.py "$REPO_ROOT"/docs/ docs
for f in *.sol
do
@@ -199,10 +199,10 @@ TMPDIR=$(mktemp -d)
then
opts="$opts -w"
fi
- compileFull $opts "$TMPDIR/$f"
+ compileFull $opts "$SOLTMPDIR/$f"
done
)
-rm -rf "$TMPDIR"
+rm -rf "$SOLTMPDIR"
echo "Done."
printTask "Testing library checksum..."
@@ -213,17 +213,17 @@ printTask "Testing long library names..."
echo '' | "$SOLC" - --link --libraries aveeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeerylonglibraryname:0x90f20564390eAe531E810af625A22f51385Cd222 >/dev/null
printTask "Testing overwriting files..."
-TMPDIR=$(mktemp -d)
+SOLTMPDIR=$(mktemp -d)
(
set -e
# First time it works
- echo 'contract C {} ' | "$SOLC" - --bin -o "$TMPDIR/non-existing-stuff-to-create" 2>/dev/null
+ echo 'contract C {} ' | "$SOLC" - --bin -o "$SOLTMPDIR/non-existing-stuff-to-create" 2>/dev/null
# Second time it fails
- ! echo 'contract C {} ' | "$SOLC" - --bin -o "$TMPDIR/non-existing-stuff-to-create" 2>/dev/null
+ ! echo 'contract C {} ' | "$SOLC" - --bin -o "$SOLTMPDIR/non-existing-stuff-to-create" 2>/dev/null
# Unless we force
- echo 'contract C {} ' | "$SOLC" - --overwrite --bin -o "$TMPDIR/non-existing-stuff-to-create" 2>/dev/null
+ echo 'contract C {} ' | "$SOLC" - --overwrite --bin -o "$SOLTMPDIR/non-existing-stuff-to-create" 2>/dev/null
)
-rm -rf "$TMPDIR"
+rm -rf "$SOLTMPDIR"
printTask "Testing assemble, yul, strict-assembly..."
echo '{}' | "$SOLC" - --assemble &>/dev/null
@@ -231,7 +231,7 @@ echo '{}' | "$SOLC" - --yul &>/dev/null
echo '{}' | "$SOLC" - --strict-assembly &>/dev/null
printTask "Testing standard input..."
-TMPDIR=$(mktemp -d)
+SOLTMPDIR=$(mktemp -d)
(
set +e
output=$("$SOLC" --bin 2>&1)
@@ -256,12 +256,12 @@ TMPDIR=$(mktemp -d)
)
printTask "Testing soljson via the fuzzer..."
-TMPDIR=$(mktemp -d)
+SOLTMPDIR=$(mktemp -d)
(
set -e
cd "$REPO_ROOT"
REPO_ROOT=$(pwd) # make it absolute
- cd "$TMPDIR"
+ cd "$SOLTMPDIR"
"$REPO_ROOT"/scripts/isolate_tests.py "$REPO_ROOT"/test/
"$REPO_ROOT"/scripts/isolate_tests.py "$REPO_ROOT"/docs/ docs
for f in *.sol
@@ -283,5 +283,5 @@ TMPDIR=$(mktemp -d)
set -e
done
)
-rm -rf "$TMPDIR"
+rm -rf "$SOLTMPDIR"
echo "Commandline tests successful."
diff --git a/test/compilationTests/MultiSigWallet/MultiSigWallet.sol b/test/compilationTests/MultiSigWallet/MultiSigWallet.sol
index 35f6208b..dc6e98e4 100644
--- a/test/compilationTests/MultiSigWallet/MultiSigWallet.sol
+++ b/test/compilationTests/MultiSigWallet/MultiSigWallet.sol
@@ -226,13 +226,11 @@ contract MultiSigWallet {
{
if (isConfirmed(transactionId)) {
Transaction storage tx = transactions[transactionId];
- tx.executed = true;
- if (tx.destination.call.value(tx.value)(tx.data))
+ (tx.executed,) = tx.destination.call.value(tx.value)(tx.data);
+ if (tx.executed)
emit Execution(transactionId);
- else {
+ else
emit ExecutionFailure(transactionId);
- tx.executed = false;
- }
}
}
diff --git a/test/compilationTests/MultiSigWallet/MultiSigWalletWithDailyLimit.sol b/test/compilationTests/MultiSigWallet/MultiSigWalletWithDailyLimit.sol
index 69e94fd5..df2a1400 100644
--- a/test/compilationTests/MultiSigWallet/MultiSigWalletWithDailyLimit.sol
+++ b/test/compilationTests/MultiSigWallet/MultiSigWalletWithDailyLimit.sol
@@ -45,14 +45,13 @@ contract MultiSigWalletWithDailyLimit is MultiSigWallet {
Transaction storage tx = transactions[transactionId];
bool confirmed = isConfirmed(transactionId);
if (confirmed || tx.data.length == 0 && isUnderLimit(tx.value)) {
- tx.executed = true;
if (!confirmed)
spentToday += tx.value;
- if (tx.destination.call.value(tx.value)(tx.data))
+ (tx.executed,) = tx.destination.call.value(tx.value)(tx.data);
+ if (tx.executed)
emit Execution(transactionId);
else {
emit ExecutionFailure(transactionId);
- tx.executed = false;
if (!confirmed)
spentToday -= tx.value;
}
diff --git a/test/compilationTests/milestonetracker/MilestoneTracker.sol b/test/compilationTests/milestonetracker/MilestoneTracker.sol
index 856fb1a5..41fa7404 100644
--- a/test/compilationTests/milestonetracker/MilestoneTracker.sol
+++ b/test/compilationTests/milestonetracker/MilestoneTracker.sol
@@ -360,8 +360,8 @@ contract MilestoneTracker {
// Recheck again to not pay twice
if (milestone.status == MilestoneStatus.AuthorizedForPayment) revert();
milestone.status = MilestoneStatus.AuthorizedForPayment;
- if (!milestone.paymentSource.call.value(0)(milestone.payData))
- revert();
+ (bool success,) = milestone.paymentSource.call.value(0)(milestone.payData);
+ require(success);
emit ProposalStatusChanged(_idMilestone, milestone.status);
}
}
diff --git a/test/compilationTests/zeppelin/MultisigWallet.sol b/test/compilationTests/zeppelin/MultisigWallet.sol
index 9aac5c53..abad0a01 100644
--- a/test/compilationTests/zeppelin/MultisigWallet.sol
+++ b/test/compilationTests/zeppelin/MultisigWallet.sol
@@ -60,9 +60,8 @@ contract MultisigWallet is Multisig, Shareable, DayLimit {
if (underLimit(_value)) {
emit SingleTransact(msg.sender, _value, _to, _data);
// yes - just execute the call.
- if (!_to.call.value(_value)(_data)) {
- revert();
- }
+ (bool success,) = _to.call.value(_value)(_data);
+ require(success);
return 0;
}
// determine our operation hash.
@@ -82,9 +81,8 @@ contract MultisigWallet is Multisig, Shareable, DayLimit {
*/
function confirm(bytes32 _h) onlymanyowners(_h) public returns (bool) {
if (txs[_h].to != address(0)) {
- if (!txs[_h].to.call.value(txs[_h].value)(txs[_h].data)) {
- revert();
- }
+ (bool success,) = txs[_h].to.call.value(txs[_h].value)(txs[_h].data);
+ require(success);
emit MultiTransact(msg.sender, _h, txs[_h].value, txs[_h].to, txs[_h].data);
delete txs[_h];
return true;
diff --git a/test/compilationTests/zeppelin/token/VestedToken.sol b/test/compilationTests/zeppelin/token/VestedToken.sol
index 7edc7d16..2cd607bc 100644
--- a/test/compilationTests/zeppelin/token/VestedToken.sol
+++ b/test/compilationTests/zeppelin/token/VestedToken.sol
@@ -53,7 +53,7 @@ contract VestedToken is StandardToken, LimitedTransferToken {
uint256 count = grants[_to].push(
TokenGrant(
- _revokable ? msg.sender : 0, // avoid storing an extra 20 bytes when it is non-revokable
+ _revokable ? msg.sender : 0x0000000000000000000000000000000000000000, // avoid storing an extra 20 bytes when it is non-revokable
_value,
_cliff,
_vesting,
@@ -84,7 +84,7 @@ contract VestedToken is StandardToken, LimitedTransferToken {
revert();
}
- address receiver = grant.burnsOnRevoke ? 0xdead : msg.sender;
+ address receiver = grant.burnsOnRevoke ? 0x000000000000000000000000000000000000dEaD : msg.sender;
uint256 nonVested = nonVestedTokens(grant, uint64(now));
diff --git a/test/libdevcore/UTF8.cpp b/test/libdevcore/UTF8.cpp
index 6de4570f..daf47bb0 100644
--- a/test/libdevcore/UTF8.cpp
+++ b/test/libdevcore/UTF8.cpp
@@ -148,7 +148,7 @@ hélló
Ḕ ḕ Ḗ ḗ Ḙ ḙ Ḛ
-ἐ ἑ ἒ ἓ ἔ ἕ
+ἐ ἑ ἒ ἓ ἔ ἕ
₠ ₡ ₢ ₣ ₤ ₥
@@ -164,9 +164,9 @@ hélló
␀ ␁ ␂ ␃ ␄ ␅
-⑀ ⑁ ⑂ ⑃ ⑄
+⑀ ⑁ ⑂ ⑃ ⑄
-① ② ③ ④ ⑤
+① ② ③ ④ ⑤
╘ ╙ ╚ ╛ ╜ ╝
@@ -200,7 +200,7 @@ hélló
שּׁ שּׂ אַ אָ אּ
-ﮄ ﮅ ﮆ ﮇ ﮈ ﮉ
+ﮄ ﮅ ﮆ ﮇ ﮈ ﮉ
ﺵ ﺶ ﺷ ﺸ
diff --git a/test/libsolidity/SolidityEndToEndTest.cpp b/test/libsolidity/SolidityEndToEndTest.cpp
index 2bf20126..85582ece 100644
--- a/test/libsolidity/SolidityEndToEndTest.cpp
+++ b/test/libsolidity/SolidityEndToEndTest.cpp
@@ -3586,7 +3586,8 @@ BOOST_AUTO_TEST_CASE(default_fallback_throws)
char const* sourceCode = R"YY(
contract A {
function f() public returns (bool) {
- return address(this).call("");
+ (bool success,) = address(this).call("");
+ return success;
}
}
)YY";
@@ -3598,7 +3599,9 @@ BOOST_AUTO_TEST_CASE(default_fallback_throws)
char const* sourceCode = R"YY(
contract A {
function f() public returns (bool) {
- return address(this).staticcall("");
+ (bool success, bytes memory data) = address(this).staticcall("");
+ assert(data.length == 0);
+ return success;
}
}
)YY";
@@ -4408,7 +4411,8 @@ BOOST_AUTO_TEST_CASE(generic_delegatecall)
function doSend(address rec) public payable
{
bytes4 signature = bytes4(bytes32(keccak256("receive(uint256)")));
- if (rec.delegatecall(abi.encodeWithSelector(signature, 23))) {}
+ (bool success,) = rec.delegatecall(abi.encodeWithSelector(signature, 23));
+ success;
}
}
)**";
@@ -4445,19 +4449,19 @@ BOOST_AUTO_TEST_CASE(generic_staticcall)
function assertFunction(uint256 p) public view returns (uint256) { assert(x == p); return x; }
}
contract C {
- function f(address a) public view returns (bool)
+ function f(address a) public view returns (bool, bytes memory)
{
return a.staticcall(abi.encodeWithSignature("pureFunction(uint256)", 23));
}
- function g(address a) public view returns (bool)
+ function g(address a) public view returns (bool, bytes memory)
{
return a.staticcall(abi.encodeWithSignature("viewFunction(uint256)", 23));
}
- function h(address a) public view returns (bool)
+ function h(address a) public view returns (bool, bytes memory)
{
return a.staticcall(abi.encodeWithSignature("nonpayableFunction(uint256)", 23));
}
- function i(address a, uint256 v) public view returns (bool)
+ function i(address a, uint256 v) public view returns (bool, bytes memory)
{
return a.staticcall(abi.encodeWithSignature("assertFunction(uint256)", v));
}
@@ -4466,11 +4470,11 @@ BOOST_AUTO_TEST_CASE(generic_staticcall)
compileAndRun(sourceCode, 0, "A");
u160 const c_addressA = m_contractAddress;
compileAndRun(sourceCode, 0, "C");
- ABI_CHECK(callContractFunction("f(address)", c_addressA), encodeArgs(true));
- ABI_CHECK(callContractFunction("g(address)", c_addressA), encodeArgs(true));
- ABI_CHECK(callContractFunction("h(address)", c_addressA), encodeArgs(false));
- ABI_CHECK(callContractFunction("i(address,uint256)", c_addressA, 42), encodeArgs(true));
- ABI_CHECK(callContractFunction("i(address,uint256)", c_addressA, 23), encodeArgs(false));
+ ABI_CHECK(callContractFunction("f(address)", c_addressA), encodeArgs(true, 0x40, 0x20, 23));
+ ABI_CHECK(callContractFunction("g(address)", c_addressA), encodeArgs(true, 0x40, 0x20, 23 + 42));
+ ABI_CHECK(callContractFunction("h(address)", c_addressA), encodeArgs(false, 0x40, 0x00));
+ ABI_CHECK(callContractFunction("i(address,uint256)", c_addressA, 42), encodeArgs(true, 0x40, 0x20, 42));
+ ABI_CHECK(callContractFunction("i(address,uint256)", c_addressA, 23), encodeArgs(false, 0x40, 0x00));
}
}
@@ -4570,7 +4574,7 @@ BOOST_AUTO_TEST_CASE(call_forward_bytes)
contract sender {
constructor() public { rec = new receiver(); }
function() external { savedData = msg.data; }
- function forward() public returns (bool) { !address(rec).call(savedData); return true; }
+ function forward() public returns (bool) { address(rec).call(savedData); return true; }
function clear() public returns (bool) { delete savedData; return true; }
function val() public returns (uint) { return rec.received(); }
receiver rec;
@@ -4599,18 +4603,21 @@ BOOST_AUTO_TEST_CASE(call_forward_bytes_length)
receiver rec;
constructor() public { rec = new receiver(); }
function viaCalldata() public returns (uint) {
- require(address(rec).call(msg.data));
+ (bool success,) = address(rec).call(msg.data);
+ require(success);
return rec.calledLength();
}
function viaMemory() public returns (uint) {
bytes memory x = msg.data;
- require(address(rec).call(x));
+ (bool success,) = address(rec).call(x);
+ require(success);
return rec.calledLength();
}
bytes s;
function viaStorage() public returns (uint) {
s = msg.data;
- require(address(rec).call(s));
+ (bool success,) = address(rec).call(s);
+ require(success);
return rec.calledLength();
}
}
@@ -10336,7 +10343,8 @@ BOOST_AUTO_TEST_CASE(mutex)
// NOTE: It is very bad practice to write this function this way.
// Please refer to the documentation of how to do this properly.
if (amount > shares) revert();
- if (!msg.sender.call.value(amount)("")) revert();
+ (bool success,) = msg.sender.call.value(amount)("");
+ require(success);
shares -= amount;
return shares;
}
@@ -10344,7 +10352,8 @@ BOOST_AUTO_TEST_CASE(mutex)
// NOTE: It is very bad practice to write this function this way.
// Please refer to the documentation of how to do this properly.
if (amount > shares) revert();
- if (!msg.sender.call.value(amount)("")) revert();
+ (bool success,) = msg.sender.call.value(amount)("");
+ require(success);
shares -= amount;
return shares;
}
@@ -10528,11 +10537,18 @@ BOOST_AUTO_TEST_CASE(non_payable_throw)
contract C {
uint public a;
function f() public returns (uint) {
+ return msgvalue();
+ }
+ function msgvalue() internal returns (uint) {
return msg.value;
}
function() external {
+ update();
+ }
+ function update() internal {
a = msg.value + 1;
}
+
}
)";
compileAndRun(sourceCode, 0, "C");
@@ -10555,6 +10571,9 @@ BOOST_AUTO_TEST_CASE(no_nonpayable_circumvention_by_modifier)
if (false) _; // avoid the function, we should still not accept ether
}
function f() tryCircumvent public returns (uint) {
+ return msgvalue();
+ }
+ function msgvalue() internal returns (uint) {
return msg.value;
}
}
@@ -12465,10 +12484,12 @@ BOOST_AUTO_TEST_CASE(bare_call_invalid_address)
contract C {
/// Calling into non-existant account is successful (creates the account)
function f() external returns (bool) {
- return address(0x4242).call("");
+ (bool success,) = address(0x4242).call("");
+ return success;
}
function h() external returns (bool) {
- return address(0x4242).delegatecall("");
+ (bool success,) = address(0x4242).delegatecall("");
+ return success;
}
}
)YY";
@@ -12480,50 +12501,217 @@ BOOST_AUTO_TEST_CASE(bare_call_invalid_address)
{
char const* sourceCode = R"YY(
contract C {
- function f() external returns (bool) {
+ function f() external returns (bool, bytes memory) {
return address(0x4242).staticcall("");
}
}
)YY";
compileAndRun(sourceCode, 0, "C");
- ABI_CHECK(callContractFunction("f()"), encodeArgs(u256(1)));
+ ABI_CHECK(callContractFunction("f()"), encodeArgs(u256(1), 0x40, 0x00));
+ }
+}
+
+BOOST_AUTO_TEST_CASE(bare_call_return_data)
+{
+ if (dev::test::Options::get().evmVersion().supportsReturndata())
+ {
+ vector<string> calltypes = {"call", "delegatecall"};
+ if (dev::test::Options::get().evmVersion().hasStaticCall())
+ calltypes.emplace_back("staticcall");
+ for (string const& calltype: calltypes)
+ {
+ string sourceCode = R"DELIMITER(
+ contract A {
+ constructor() public {
+ }
+ function return_bool() public pure returns(bool) {
+ return true;
+ }
+ function return_int32() public pure returns(int32) {
+ return -32;
+ }
+ function return_uint32() public pure returns(uint32) {
+ return 0x3232;
+ }
+ function return_int256() public pure returns(int256) {
+ return -256;
+ }
+ function return_uint256() public pure returns(uint256) {
+ return 0x256256;
+ }
+ function return_bytes4() public pure returns(bytes4) {
+ return 0xabcd0012;
+ }
+ function return_multi() public pure returns(bool, uint32, bytes4) {
+ return (false, 0x3232, 0xabcd0012);
+ }
+ function return_bytes() public pure returns(bytes memory b) {
+ b = new bytes(2);
+ b[0] = 0x42;
+ b[1] = 0x21;
+ }
+ }
+ contract C {
+ A addr;
+ constructor() public {
+ addr = new A();
+ }
+ function f(string memory signature) public returns (bool, bytes memory) {
+ return address(addr).)DELIMITER" + calltype + R"DELIMITER((abi.encodeWithSignature(signature));
+ }
+ function check_bool() external returns (bool) {
+ (bool success, bytes memory data) = f("return_bool()");
+ assert(success);
+ bool a = abi.decode(data, (bool));
+ assert(a);
+ return true;
+ }
+ function check_int32() external returns (bool) {
+ (bool success, bytes memory data) = f("return_int32()");
+ assert(success);
+ int32 a = abi.decode(data, (int32));
+ assert(a == -32);
+ return true;
+ }
+ function check_uint32() external returns (bool) {
+ (bool success, bytes memory data) = f("return_uint32()");
+ assert(success);
+ uint32 a = abi.decode(data, (uint32));
+ assert(a == 0x3232);
+ return true;
+ }
+ function check_int256() external returns (bool) {
+ (bool success, bytes memory data) = f("return_int256()");
+ assert(success);
+ int256 a = abi.decode(data, (int256));
+ assert(a == -256);
+ return true;
+ }
+ function check_uint256() external returns (bool) {
+ (bool success, bytes memory data) = f("return_uint256()");
+ assert(success);
+ uint256 a = abi.decode(data, (uint256));
+ assert(a == 0x256256);
+ return true;
+ }
+ function check_bytes4() external returns (bool) {
+ (bool success, bytes memory data) = f("return_bytes4()");
+ assert(success);
+ bytes4 a = abi.decode(data, (bytes4));
+ assert(a == 0xabcd0012);
+ return true;
+ }
+ function check_multi() external returns (bool) {
+ (bool success, bytes memory data) = f("return_multi()");
+ assert(success);
+ (bool a, uint32 b, bytes4 c) = abi.decode(data, (bool, uint32, bytes4));
+ assert(a == false && b == 0x3232 && c == 0xabcd0012);
+ return true;
+ }
+ function check_bytes() external returns (bool) {
+ (bool success, bytes memory data) = f("return_bytes()");
+ assert(success);
+ (bytes memory d) = abi.decode(data, (bytes));
+ assert(d.length == 2 && d[0] == 0x42 && d[1] == 0x21);
+ return true;
+ }
+ }
+ )DELIMITER";
+ compileAndRun(sourceCode, 0, "C");
+ ABI_CHECK(callContractFunction("f(string)", encodeDyn(string("return_bool()"))), encodeArgs(true, 0x40, 0x20, true));
+ ABI_CHECK(callContractFunction("f(string)", encodeDyn(string("return_int32()"))), encodeArgs(true, 0x40, 0x20, u256(-32)));
+ ABI_CHECK(callContractFunction("f(string)", encodeDyn(string("return_uint32()"))), encodeArgs(true, 0x40, 0x20, u256(0x3232)));
+ ABI_CHECK(callContractFunction("f(string)", encodeDyn(string("return_int256()"))), encodeArgs(true, 0x40, 0x20, u256(-256)));
+ ABI_CHECK(callContractFunction("f(string)", encodeDyn(string("return_uint256()"))), encodeArgs(true, 0x40, 0x20, u256(0x256256)));
+ ABI_CHECK(callContractFunction("f(string)", encodeDyn(string("return_bytes4()"))), encodeArgs(true, 0x40, 0x20, u256(0xabcd0012) << (28*8)));
+ ABI_CHECK(callContractFunction("f(string)", encodeDyn(string("return_multi()"))), encodeArgs(true, 0x40, 0x60, false, u256(0x3232), u256(0xabcd0012) << (28*8)));
+ ABI_CHECK(callContractFunction("f(string)", encodeDyn(string("return_bytes()"))), encodeArgs(true, 0x40, 0x60, 0x20, 0x02, encode(bytes{0x42,0x21}, false)));
+ ABI_CHECK(callContractFunction("check_bool()"), encodeArgs(true));
+ ABI_CHECK(callContractFunction("check_int32()"), encodeArgs(true));
+ ABI_CHECK(callContractFunction("check_uint32()"), encodeArgs(true));
+ ABI_CHECK(callContractFunction("check_int256()"), encodeArgs(true));
+ ABI_CHECK(callContractFunction("check_uint256()"), encodeArgs(true));
+ ABI_CHECK(callContractFunction("check_bytes4()"), encodeArgs(true));
+ ABI_CHECK(callContractFunction("check_multi()"), encodeArgs(true));
+ ABI_CHECK(callContractFunction("check_bytes()"), encodeArgs(true));
+ }
}
}
BOOST_AUTO_TEST_CASE(delegatecall_return_value)
{
- char const* sourceCode = R"DELIMITER(
- contract C {
- uint value;
- function set(uint _value) external {
- value = _value;
- }
- function get() external view returns (uint) {
- return value;
- }
- function get_delegated() external returns (bool) {
- return address(this).delegatecall(abi.encodeWithSignature("get()"));
- }
- function assert0() external view {
- assert(value == 0);
+ if (dev::test::Options::get().evmVersion().supportsReturndata())
+ {
+ char const* sourceCode = R"DELIMITER(
+ contract C {
+ uint value;
+ function set(uint _value) external {
+ value = _value;
+ }
+ function get() external view returns (uint) {
+ return value;
+ }
+ function get_delegated() external returns (bool, bytes memory) {
+ return address(this).delegatecall(abi.encodeWithSignature("get()"));
+ }
+ function assert0() external view {
+ assert(value == 0);
+ }
+ function assert0_delegated() external returns (bool, bytes memory) {
+ return address(this).delegatecall(abi.encodeWithSignature("assert0()"));
+ }
}
- function assert0_delegated() external returns (bool) {
- return address(this).delegatecall(abi.encodeWithSignature("assert0()"));
+ )DELIMITER";
+ compileAndRun(sourceCode, 0, "C");
+ ABI_CHECK(callContractFunction("get()"), encodeArgs(u256(0)));
+ ABI_CHECK(callContractFunction("assert0_delegated()"), encodeArgs(u256(1), 0x40, 0x00));
+ ABI_CHECK(callContractFunction("get_delegated()"), encodeArgs(u256(1), 0x40, 0x20, 0x00));
+ ABI_CHECK(callContractFunction("set(uint256)", u256(1)), encodeArgs());
+ ABI_CHECK(callContractFunction("get()"), encodeArgs(u256(1)));
+ ABI_CHECK(callContractFunction("assert0_delegated()"), encodeArgs(u256(0), 0x40, 0x00));
+ ABI_CHECK(callContractFunction("get_delegated()"), encodeArgs(u256(1), 0x40, 0x20, 1));
+ ABI_CHECK(callContractFunction("set(uint256)", u256(42)), encodeArgs());
+ ABI_CHECK(callContractFunction("get()"), encodeArgs(u256(42)));
+ ABI_CHECK(callContractFunction("assert0_delegated()"), encodeArgs(u256(0), 0x40, 0x00));
+ ABI_CHECK(callContractFunction("get_delegated()"), encodeArgs(u256(1), 0x40, 0x20, 42));
+ }
+ else
+ {
+ char const* sourceCode = R"DELIMITER(
+ contract C {
+ uint value;
+ function set(uint _value) external {
+ value = _value;
+ }
+ function get() external view returns (uint) {
+ return value;
+ }
+ function get_delegated() external returns (bool) {
+ (bool success,) = address(this).delegatecall(abi.encodeWithSignature("get()"));
+ return success;
+ }
+ function assert0() external view {
+ assert(value == 0);
+ }
+ function assert0_delegated() external returns (bool) {
+ (bool success,) = address(this).delegatecall(abi.encodeWithSignature("assert0()"));
+ return success;
+ }
}
- }
- )DELIMITER";
- compileAndRun(sourceCode, 0, "C");
- ABI_CHECK(callContractFunction("get()"), encodeArgs(u256(0)));
- ABI_CHECK(callContractFunction("assert0_delegated()"), encodeArgs(u256(1)));
- ABI_CHECK(callContractFunction("get_delegated()"), encodeArgs(u256(1)));
- ABI_CHECK(callContractFunction("set(uint256)", u256(1)), encodeArgs());
- ABI_CHECK(callContractFunction("get()"), encodeArgs(u256(1)));
- ABI_CHECK(callContractFunction("assert0_delegated()"), encodeArgs(u256(0)));
- ABI_CHECK(callContractFunction("get_delegated()"), encodeArgs(u256(1)));
- ABI_CHECK(callContractFunction("set(uint256)", u256(42)), encodeArgs());
- ABI_CHECK(callContractFunction("get()"), encodeArgs(u256(42)));
- ABI_CHECK(callContractFunction("assert0_delegated()"), encodeArgs(u256(0)));
- ABI_CHECK(callContractFunction("get_delegated()"), encodeArgs(u256(1)));
+ )DELIMITER";
+ compileAndRun(sourceCode, 0, "C");
+ ABI_CHECK(callContractFunction("get()"), encodeArgs(u256(0)));
+ ABI_CHECK(callContractFunction("assert0_delegated()"), encodeArgs(u256(1)));
+ ABI_CHECK(callContractFunction("get_delegated()"), encodeArgs(u256(1)));
+ ABI_CHECK(callContractFunction("set(uint256)", u256(1)), encodeArgs());
+ ABI_CHECK(callContractFunction("get()"), encodeArgs(u256(1)));
+ ABI_CHECK(callContractFunction("assert0_delegated()"), encodeArgs(u256(0)));
+ ABI_CHECK(callContractFunction("get_delegated()"), encodeArgs(u256(1)));
+ ABI_CHECK(callContractFunction("set(uint256)", u256(42)), encodeArgs());
+ ABI_CHECK(callContractFunction("get()"), encodeArgs(u256(42)));
+ ABI_CHECK(callContractFunction("assert0_delegated()"), encodeArgs(u256(0)));
+ ABI_CHECK(callContractFunction("get_delegated()"), encodeArgs(u256(1)));
+ }
}
BOOST_AUTO_TEST_CASE(function_types_sig)
@@ -13292,7 +13480,8 @@ BOOST_AUTO_TEST_CASE(abi_encode_call)
uint[] memory b = new uint[](2);
b[0] = 6;
b[1] = 7;
- require(address(this).call(abi.encodeWithSignature("c(uint256,uint256[])", a, b)));
+ (bool success,) = address(this).call(abi.encodeWithSignature("c(uint256,uint256[])", a, b));
+ require(success);
return x;
}
}
diff --git a/test/libsolidity/SolidityNameAndTypeResolution.cpp b/test/libsolidity/SolidityNameAndTypeResolution.cpp
index 387505a5..af8465fc 100644
--- a/test/libsolidity/SolidityNameAndTypeResolution.cpp
+++ b/test/libsolidity/SolidityNameAndTypeResolution.cpp
@@ -438,7 +438,8 @@ BOOST_AUTO_TEST_CASE(address_staticcall)
char const* sourceCode = R"(
contract C {
function f() public view returns(bool) {
- return address(0x4242).staticcall("");
+ (bool success,) = address(0x4242).staticcall("");
+ return success;
}
}
)";
@@ -464,6 +465,58 @@ BOOST_AUTO_TEST_CASE(address_staticcall_value)
}
}
+BOOST_AUTO_TEST_CASE(address_call_full_return_type)
+{
+ char const* sourceCode = R"(
+ contract C {
+ function f() public {
+ (bool success, bytes memory m) = address(0x4242).call("");
+ success; m;
+ }
+ }
+ )";
+
+ if (dev::test::Options::get().evmVersion().supportsReturndata())
+ CHECK_SUCCESS_NO_WARNINGS(sourceCode);
+ else
+ CHECK_ERROR(sourceCode, TypeError, "Type inaccessible dynamic type is not implicitly convertible to expected type bytes memory.");
+}
+
+BOOST_AUTO_TEST_CASE(address_delegatecall_full_return_type)
+{
+ char const* sourceCode = R"(
+ contract C {
+ function f() public {
+ (bool success, bytes memory m) = address(0x4242).delegatecall("");
+ success; m;
+ }
+ }
+ )";
+
+ if (dev::test::Options::get().evmVersion().supportsReturndata())
+ CHECK_SUCCESS_NO_WARNINGS(sourceCode);
+ else
+ CHECK_ERROR(sourceCode, TypeError, "Type inaccessible dynamic type is not implicitly convertible to expected type bytes memory.");
+}
+
+
+BOOST_AUTO_TEST_CASE(address_staticcall_full_return_type)
+{
+ if (dev::test::Options::get().evmVersion().hasStaticCall())
+ {
+ char const* sourceCode = R"(
+ contract C {
+ function f() public view {
+ (bool success, bytes memory m) = address(0x4242).staticcall("");
+ success; m;
+ }
+ }
+ )";
+
+ CHECK_SUCCESS_NO_WARNINGS(sourceCode);
+ }
+}
+
BOOST_AUTO_TEST_SUITE_END()
}
diff --git a/test/libsolidity/SolidityNatspecJSON.cpp b/test/libsolidity/SolidityNatspecJSON.cpp
index b97df972..d77050cb 100644
--- a/test/libsolidity/SolidityNatspecJSON.cpp
+++ b/test/libsolidity/SolidityNatspecJSON.cpp
@@ -647,7 +647,7 @@ BOOST_AUTO_TEST_CASE(dev_documenting_no_paramname)
contract test {
/// @dev Multiplies a number by 7 and adds second parameter
/// @param a Documentation for the first parameter
- /// @param
+ /// @param
function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; }
}
)";
@@ -675,7 +675,7 @@ BOOST_AUTO_TEST_CASE(dev_documenting_no_param_description)
contract test {
/// @dev Multiplies a number by 7 and adds second parameter
/// @param a Documentation for the first parameter
- /// @param second
+ /// @param second
function mul(uint a, uint second) public returns (uint d) { return a * 7 + second; }
}
)";
diff --git a/test/libsolidity/ViewPureChecker.cpp b/test/libsolidity/ViewPureChecker.cpp
index d993b92e..b7ea1efc 100644
--- a/test/libsolidity/ViewPureChecker.cpp
+++ b/test/libsolidity/ViewPureChecker.cpp
@@ -103,7 +103,8 @@ BOOST_AUTO_TEST_CASE(address_staticcall)
string text = R"(
contract C {
function i() view public returns (bool) {
- return address(0x4242).staticcall("");
+ (bool success,) = address(0x4242).staticcall("");
+ return success;
}
}
)";
diff --git a/test/libsolidity/syntaxTests/controlFlow/mappingReturn/unnamed_err.sol b/test/libsolidity/syntaxTests/controlFlow/mappingReturn/unnamed_err.sol
index 7e8c4501..52a8b3d7 100644
--- a/test/libsolidity/syntaxTests/controlFlow/mappingReturn/unnamed_err.sol
+++ b/test/libsolidity/syntaxTests/controlFlow/mappingReturn/unnamed_err.sol
@@ -2,4 +2,4 @@ contract C {
function f() internal pure returns (mapping(uint=>uint) storage) {}
}
// ----
-// TypeError: (53-72): This variable is of storage pointer type and might be returned without assignment and could be used uninitialized. Assign the variable (potentially from itself) to fix this error.
+// TypeError: (53-80): This variable is of storage pointer type and might be returned without assignment and could be used uninitialized. Assign the variable (potentially from itself) to fix this error.
diff --git a/test/libsolidity/syntaxTests/controlFlow/storageReturn/assembly_err.sol b/test/libsolidity/syntaxTests/controlFlow/storageReturn/assembly_err.sol
index 5fde497c..cad9b8e8 100644
--- a/test/libsolidity/syntaxTests/controlFlow/storageReturn/assembly_err.sol
+++ b/test/libsolidity/syntaxTests/controlFlow/storageReturn/assembly_err.sol
@@ -7,4 +7,4 @@ contract C {
}
}
// ----
-// TypeError: (87-88): This variable is of storage pointer type and might be returned without assignment and could be used uninitialized. Assign the variable (potentially from itself) to fix this error.
+// TypeError: (87-96): This variable is of storage pointer type and might be returned without assignment and could be used uninitialized. Assign the variable (potentially from itself) to fix this error.
diff --git a/test/libsolidity/syntaxTests/controlFlow/storageReturn/modifier_err.sol b/test/libsolidity/syntaxTests/controlFlow/storageReturn/modifier_err.sol
index a0047782..42342979 100644
--- a/test/libsolidity/syntaxTests/controlFlow/storageReturn/modifier_err.sol
+++ b/test/libsolidity/syntaxTests/controlFlow/storageReturn/modifier_err.sol
@@ -18,5 +18,5 @@ contract C {
}
}
// ----
-// TypeError: (249-250): This variable is of storage pointer type and might be returned without assignment and could be used uninitialized. Assign the variable (potentially from itself) to fix this error.
-// TypeError: (367-368): This variable is of storage pointer type and might be returned without assignment and could be used uninitialized. Assign the variable (potentially from itself) to fix this error.
+// TypeError: (249-258): This variable is of storage pointer type and might be returned without assignment and could be used uninitialized. Assign the variable (potentially from itself) to fix this error.
+// TypeError: (367-376): This variable is of storage pointer type and might be returned without assignment and could be used uninitialized. Assign the variable (potentially from itself) to fix this error.
diff --git a/test/libsolidity/syntaxTests/dataLocations/data_location_in_function_type_fail.sol b/test/libsolidity/syntaxTests/dataLocations/data_location_in_function_type_fail.sol
index e1ea6989..b80849ce 100644
--- a/test/libsolidity/syntaxTests/dataLocations/data_location_in_function_type_fail.sol
+++ b/test/libsolidity/syntaxTests/dataLocations/data_location_in_function_type_fail.sol
@@ -5,5 +5,5 @@ library L {
}
// ----
-// TypeError: (66-72): Data location must be "memory" for parameter in function, but "calldata" was given.
-// TypeError: (159-165): Data location must be "memory" for parameter in function, but "storage" was given.
+// TypeError: (66-81): Data location must be "memory" for parameter in function, but "calldata" was given.
+// TypeError: (159-173): Data location must be "memory" for parameter in function, but "storage" was given.
diff --git a/test/libsolidity/syntaxTests/dataLocations/externalFunction/function_argument_location_specifier_test_external_memory.sol b/test/libsolidity/syntaxTests/dataLocations/externalFunction/function_argument_location_specifier_test_external_memory.sol
index d914fa5b..d30bde3f 100644
--- a/test/libsolidity/syntaxTests/dataLocations/externalFunction/function_argument_location_specifier_test_external_memory.sol
+++ b/test/libsolidity/syntaxTests/dataLocations/externalFunction/function_argument_location_specifier_test_external_memory.sol
@@ -2,4 +2,4 @@ contract test {
function f(bytes memory) external;
}
// ----
-// TypeError: (31-36): Data location must be "calldata" for parameter in external function, but "memory" was given.
+// TypeError: (31-43): Data location must be "calldata" for parameter in external function, but "memory" was given.
diff --git a/test/libsolidity/syntaxTests/dataLocations/externalFunction/function_argument_location_specifier_test_external_storage.sol b/test/libsolidity/syntaxTests/dataLocations/externalFunction/function_argument_location_specifier_test_external_storage.sol
index adb7e52e..7dc5ba6d 100644
--- a/test/libsolidity/syntaxTests/dataLocations/externalFunction/function_argument_location_specifier_test_external_storage.sol
+++ b/test/libsolidity/syntaxTests/dataLocations/externalFunction/function_argument_location_specifier_test_external_storage.sol
@@ -2,4 +2,4 @@ contract test {
function f(bytes storage) external;
}
// ----
-// TypeError: (31-36): Data location must be "calldata" for parameter in external function, but "storage" was given.
+// TypeError: (31-44): Data location must be "calldata" for parameter in external function, but "storage" was given.
diff --git a/test/libsolidity/syntaxTests/dataLocations/function_argument_location_specifier_test_non_reference_type.sol b/test/libsolidity/syntaxTests/dataLocations/function_argument_location_specifier_test_non_reference_type.sol
index 71756ebb..bc14aa1f 100644
--- a/test/libsolidity/syntaxTests/dataLocations/function_argument_location_specifier_test_non_reference_type.sol
+++ b/test/libsolidity/syntaxTests/dataLocations/function_argument_location_specifier_test_non_reference_type.sol
@@ -2,4 +2,4 @@ contract test {
function f(bytes4 memory) public;
}
// ----
-// TypeError: (31-37): Data location can only be specified for array, struct or mapping types, but "memory" was given.
+// TypeError: (31-44): Data location can only be specified for array, struct or mapping types, but "memory" was given.
diff --git a/test/libsolidity/syntaxTests/dataLocations/internalFunction/function_argument_location_specifier_test_internal_calldata.sol b/test/libsolidity/syntaxTests/dataLocations/internalFunction/function_argument_location_specifier_test_internal_calldata.sol
index 771f1525..da3abff4 100644
--- a/test/libsolidity/syntaxTests/dataLocations/internalFunction/function_argument_location_specifier_test_internal_calldata.sol
+++ b/test/libsolidity/syntaxTests/dataLocations/internalFunction/function_argument_location_specifier_test_internal_calldata.sol
@@ -2,4 +2,4 @@ contract test {
function f(bytes calldata) internal;
}
// ----
-// TypeError: (31-36): Data location must be "storage" or "memory" for parameter in function, but "calldata" was given.
+// TypeError: (31-45): Data location must be "storage" or "memory" for parameter in function, but "calldata" was given.
diff --git a/test/libsolidity/syntaxTests/dataLocations/libraryExternalFunction/function_argument_location_specifier_test_external_memory.sol b/test/libsolidity/syntaxTests/dataLocations/libraryExternalFunction/function_argument_location_specifier_test_external_memory.sol
index 9a6b8b7c..2de0082a 100644
--- a/test/libsolidity/syntaxTests/dataLocations/libraryExternalFunction/function_argument_location_specifier_test_external_memory.sol
+++ b/test/libsolidity/syntaxTests/dataLocations/libraryExternalFunction/function_argument_location_specifier_test_external_memory.sol
@@ -2,4 +2,4 @@ library test {
function f(bytes memory) external;
}
// ----
-// TypeError: (30-35): Data location must be "storage" or "calldata" for parameter in external function, but "memory" was given.
+// TypeError: (30-42): Data location must be "storage" or "calldata" for parameter in external function, but "memory" was given.
diff --git a/test/libsolidity/syntaxTests/dataLocations/libraryInternalFunction/function_argument_location_specifier_test_internal_calldata.sol b/test/libsolidity/syntaxTests/dataLocations/libraryInternalFunction/function_argument_location_specifier_test_internal_calldata.sol
index 99b89dfc..c4b81f98 100644
--- a/test/libsolidity/syntaxTests/dataLocations/libraryInternalFunction/function_argument_location_specifier_test_internal_calldata.sol
+++ b/test/libsolidity/syntaxTests/dataLocations/libraryInternalFunction/function_argument_location_specifier_test_internal_calldata.sol
@@ -2,4 +2,4 @@ library test {
function f(bytes calldata) internal pure {}
}
// ----
-// TypeError: (30-35): Data location must be "storage" or "memory" for parameter in function, but "calldata" was given.
+// TypeError: (30-44): Data location must be "storage" or "memory" for parameter in function, but "calldata" was given.
diff --git a/test/libsolidity/syntaxTests/dataLocations/publicFunction/function_argument_location_specifier_test_public_calldata.sol b/test/libsolidity/syntaxTests/dataLocations/publicFunction/function_argument_location_specifier_test_public_calldata.sol
index efc92cf3..3aba870f 100644
--- a/test/libsolidity/syntaxTests/dataLocations/publicFunction/function_argument_location_specifier_test_public_calldata.sol
+++ b/test/libsolidity/syntaxTests/dataLocations/publicFunction/function_argument_location_specifier_test_public_calldata.sol
@@ -2,4 +2,4 @@ contract test {
function f(bytes calldata) public;
}
// ----
-// TypeError: (31-36): Data location must be "memory" for parameter in function, but "calldata" was given.
+// TypeError: (31-45): Data location must be "memory" for parameter in function, but "calldata" was given.
diff --git a/test/libsolidity/syntaxTests/dataLocations/publicFunction/function_argument_location_specifier_test_public_storage.sol b/test/libsolidity/syntaxTests/dataLocations/publicFunction/function_argument_location_specifier_test_public_storage.sol
index b954ea78..1c033a69 100644
--- a/test/libsolidity/syntaxTests/dataLocations/publicFunction/function_argument_location_specifier_test_public_storage.sol
+++ b/test/libsolidity/syntaxTests/dataLocations/publicFunction/function_argument_location_specifier_test_public_storage.sol
@@ -2,4 +2,4 @@ contract test {
function f(bytes storage) public;
}
// ----
-// TypeError: (31-36): Data location must be "memory" for parameter in function, but "storage" was given.
+// TypeError: (31-44): Data location must be "memory" for parameter in function, but "storage" was given.
diff --git a/test/libsolidity/syntaxTests/events/event_array_indexed_v2.sol b/test/libsolidity/syntaxTests/events/event_array_indexed_v2.sol
index aaf6028a..3f729a6a 100644
--- a/test/libsolidity/syntaxTests/events/event_array_indexed_v2.sol
+++ b/test/libsolidity/syntaxTests/events/event_array_indexed_v2.sol
@@ -4,4 +4,4 @@ contract c {
}
// ----
// Warning: (0-33): Experimental features are turned on. Do not use experimental features on live deployments.
-// TypeError: (59-65): Indexed reference types cannot yet be used with ABIEncoderV2.
+// TypeError: (59-73): Indexed reference types cannot yet be used with ABIEncoderV2.
diff --git a/test/libsolidity/syntaxTests/events/event_nested_array_indexed_v2.sol b/test/libsolidity/syntaxTests/events/event_nested_array_indexed_v2.sol
index ffae5b9c..f05b884e 100644
--- a/test/libsolidity/syntaxTests/events/event_nested_array_indexed_v2.sol
+++ b/test/libsolidity/syntaxTests/events/event_nested_array_indexed_v2.sol
@@ -4,4 +4,4 @@ contract c {
}
// ----
// Warning: (0-33): Experimental features are turned on. Do not use experimental features on live deployments.
-// TypeError: (59-67): Indexed reference types cannot yet be used with ABIEncoderV2.
+// TypeError: (59-75): Indexed reference types cannot yet be used with ABIEncoderV2.
diff --git a/test/libsolidity/syntaxTests/events/event_struct_indexed.sol b/test/libsolidity/syntaxTests/events/event_struct_indexed.sol
index 69ee5017..7332cb3b 100644
--- a/test/libsolidity/syntaxTests/events/event_struct_indexed.sol
+++ b/test/libsolidity/syntaxTests/events/event_struct_indexed.sol
@@ -3,4 +3,4 @@ contract c {
event E(S indexed);
}
// ----
-// TypeError: (51-52): This type is only supported in the new experimental ABI encoder. Use "pragma experimental ABIEncoderV2;" to enable the feature.
+// TypeError: (51-60): This type is only supported in the new experimental ABI encoder. Use "pragma experimental ABIEncoderV2;" to enable the feature.
diff --git a/test/libsolidity/syntaxTests/events/event_struct_indexed_v2.sol b/test/libsolidity/syntaxTests/events/event_struct_indexed_v2.sol
index a8e0837f..a1d8cf04 100644
--- a/test/libsolidity/syntaxTests/events/event_struct_indexed_v2.sol
+++ b/test/libsolidity/syntaxTests/events/event_struct_indexed_v2.sol
@@ -5,4 +5,4 @@ contract c {
}
// ----
// Warning: (0-33): Experimental features are turned on. Do not use experimental features on live deployments.
-// TypeError: (85-86): Indexed reference types cannot yet be used with ABIEncoderV2.
+// TypeError: (85-94): Indexed reference types cannot yet be used with ABIEncoderV2.
diff --git a/test/libsolidity/syntaxTests/globalFunctions/call_with_wrong_arg_count.sol b/test/libsolidity/syntaxTests/globalFunctions/call_with_wrong_arg_count.sol
index e8134539..92ec4eb7 100644
--- a/test/libsolidity/syntaxTests/globalFunctions/call_with_wrong_arg_count.sol
+++ b/test/libsolidity/syntaxTests/globalFunctions/call_with_wrong_arg_count.sol
@@ -1,13 +1,17 @@
contract C {
function f() public {
- require(address(this).call());
- require(address(this).call(bytes4(0x12345678)));
- require(address(this).call(uint(1)));
- require(address(this).call(uint(1), uint(2)));
+ (bool success,) = address(this).call();
+ require(success);
+ (success,) = address(this).call(bytes4(0x12345678));
+ require(success);
+ (success,) = address(this).call(uint(1));
+ require(success);
+ (success,) = address(this).call(uint(1), uint(2));
+ require(success);
}
}
// ----
-// TypeError: (55-75): Wrong argument count for function call: 0 arguments given but expected 1. This function requires a single bytes argument. Use "" as argument to provide empty calldata.
-// TypeError: (113-131): Invalid type for argument in function call. Invalid implicit conversion from bytes4 to bytes memory requested. This function requires a single bytes argument. If all your arguments are value types, you can use abi.encode(...) to properly generate it.
-// TypeError: (170-177): Invalid type for argument in function call. Invalid implicit conversion from uint256 to bytes memory requested. This function requires a single bytes argument. If all your arguments are value types, you can use abi.encode(...) to properly generate it.
-// TypeError: (197-233): Wrong argument count for function call: 2 arguments given but expected 1. This function requires a single bytes argument. If all your arguments are value types, you can use abi.encode(...) to properly generate it.
+// TypeError: (65-85): Wrong argument count for function call: 0 arguments given but expected 1. This function requires a single bytes argument. Use "" as argument to provide empty calldata.
+// TypeError: (153-171): Invalid type for argument in function call. Invalid implicit conversion from bytes4 to bytes memory requested. This function requires a single bytes argument. If all your arguments are value types, you can use abi.encode(...) to properly generate it.
+// TypeError: (240-247): Invalid type for argument in function call. Invalid implicit conversion from uint256 to bytes memory requested. This function requires a single bytes argument. If all your arguments are value types, you can use abi.encode(...) to properly generate it.
+// TypeError: (297-333): Wrong argument count for function call: 2 arguments given but expected 1. This function requires a single bytes argument. If all your arguments are value types, you can use abi.encode(...) to properly generate it.
diff --git a/test/libsolidity/syntaxTests/globalFunctions/callcode_with_wrong_arg_count.sol b/test/libsolidity/syntaxTests/globalFunctions/callcode_with_wrong_arg_count.sol
index 2b424d53..655d5f4c 100644
--- a/test/libsolidity/syntaxTests/globalFunctions/callcode_with_wrong_arg_count.sol
+++ b/test/libsolidity/syntaxTests/globalFunctions/callcode_with_wrong_arg_count.sol
@@ -1,11 +1,14 @@
contract C {
function f() public {
- require(address(this).callcode());
- require(address(this).callcode(uint(1)));
- require(address(this).callcode(uint(1), uint(2)));
+ (bool success,) = address(this).callcode();
+ require(success);
+ (success,) = address(this).callcode(uint(1));
+ require(success);
+ (success,) = address(this).callcode(uint(1), uint(2));
+ require(success);
}
}
// ----
-// TypeError: (55-79): Wrong argument count for function call: 0 arguments given but expected 1. This function requires a single bytes argument. Use "" as argument to provide empty calldata.
-// TypeError: (121-128): Invalid type for argument in function call. Invalid implicit conversion from uint256 to bytes memory requested. This function requires a single bytes argument. If all your arguments are value types, you can use abi.encode(...) to properly generate it.
-// TypeError: (148-188): Wrong argument count for function call: 2 arguments given but expected 1. This function requires a single bytes argument. If all your arguments are value types, you can use abi.encode(...) to properly generate it.
+// TypeError: (65-89): Wrong argument count for function call: 0 arguments given but expected 1. This function requires a single bytes argument. Use "" as argument to provide empty calldata.
+// TypeError: (161-168): Invalid type for argument in function call. Invalid implicit conversion from uint256 to bytes memory requested. This function requires a single bytes argument. If all your arguments are value types, you can use abi.encode(...) to properly generate it.
+// TypeError: (218-258): Wrong argument count for function call: 2 arguments given but expected 1. This function requires a single bytes argument. If all your arguments are value types, you can use abi.encode(...) to properly generate it.
diff --git a/test/libsolidity/syntaxTests/globalFunctions/delegatecall_with_wrong_arg_count.sol b/test/libsolidity/syntaxTests/globalFunctions/delegatecall_with_wrong_arg_count.sol
index be0347de..fa524b99 100644
--- a/test/libsolidity/syntaxTests/globalFunctions/delegatecall_with_wrong_arg_count.sol
+++ b/test/libsolidity/syntaxTests/globalFunctions/delegatecall_with_wrong_arg_count.sol
@@ -1,11 +1,14 @@
contract C {
function f() public {
- require(address(this).delegatecall());
- require(address(this).delegatecall(uint(1)));
- require(address(this).delegatecall(uint(1), uint(2)));
+ (bool success,) = address(this).delegatecall();
+ require(success);
+ (success,) = address(this).delegatecall(uint(1));
+ require(success);
+ (success,) = address(this).delegatecall(uint(1), uint(2));
+ require(success);
}
}
// ----
-// TypeError: (55-83): Wrong argument count for function call: 0 arguments given but expected 1. This function requires a single bytes argument. Use "" as argument to provide empty calldata.
-// TypeError: (129-136): Invalid type for argument in function call. Invalid implicit conversion from uint256 to bytes memory requested. This function requires a single bytes argument. If all your arguments are value types, you can use abi.encode(...) to properly generate it.
-// TypeError: (156-200): Wrong argument count for function call: 2 arguments given but expected 1. This function requires a single bytes argument. If all your arguments are value types, you can use abi.encode(...) to properly generate it.
+// TypeError: (65-93): Wrong argument count for function call: 0 arguments given but expected 1. This function requires a single bytes argument. Use "" as argument to provide empty calldata.
+// TypeError: (169-176): Invalid type for argument in function call. Invalid implicit conversion from uint256 to bytes memory requested. This function requires a single bytes argument. If all your arguments are value types, you can use abi.encode(...) to properly generate it.
+// TypeError: (226-270): Wrong argument count for function call: 2 arguments given but expected 1. This function requires a single bytes argument. If all your arguments are value types, you can use abi.encode(...) to properly generate it.
diff --git a/test/libsolidity/syntaxTests/memberLookup/msg_value_modifier_payable.sol b/test/libsolidity/syntaxTests/memberLookup/msg_value_modifier_payable.sol
new file mode 100644
index 00000000..6e93626f
--- /dev/null
+++ b/test/libsolidity/syntaxTests/memberLookup/msg_value_modifier_payable.sol
@@ -0,0 +1,4 @@
+contract C {
+ modifier costs(uint _amount) { require(msg.value >= _amount); _; }
+ function f() costs(1 ether) public payable {}
+}
diff --git a/test/libsolidity/syntaxTests/memberLookup/msg_value_modifier_pure.sol b/test/libsolidity/syntaxTests/memberLookup/msg_value_modifier_pure.sol
new file mode 100644
index 00000000..398c127d
--- /dev/null
+++ b/test/libsolidity/syntaxTests/memberLookup/msg_value_modifier_pure.sol
@@ -0,0 +1,6 @@
+contract C {
+ modifier costs(uint _amount) { require(msg.value >= _amount); _; }
+ function f() costs(1 ether) public pure {}
+}
+// ----
+// TypeError: (101-115): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view".
diff --git a/test/libsolidity/syntaxTests/memberLookup/msg_value_modifier_view.sol b/test/libsolidity/syntaxTests/memberLookup/msg_value_modifier_view.sol
new file mode 100644
index 00000000..8430c5c3
--- /dev/null
+++ b/test/libsolidity/syntaxTests/memberLookup/msg_value_modifier_view.sol
@@ -0,0 +1,6 @@
+contract C {
+ modifier costs(uint _amount) { require(msg.value >= _amount); _; }
+ function f() costs(1 ether) public view {}
+}
+// ----
+// TypeError: (101-115): This modifier uses "msg.value" and thus the function has to be payable or internal.
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/041_functions_with_stucts_of_non_external_types_in_interface.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/041_functions_with_stucts_of_non_external_types_in_interface.sol
index 9fd09dd7..73b608ae 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/041_functions_with_stucts_of_non_external_types_in_interface.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/041_functions_with_stucts_of_non_external_types_in_interface.sol
@@ -6,4 +6,4 @@ contract C {
}
// ----
// Warning: (0-33): Experimental features are turned on. Do not use experimental features on live deployments.
-// TypeError: (103-104): Internal or recursive type is not allowed for public or external functions.
+// TypeError: (103-111): Internal or recursive type is not allowed for public or external functions.
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/042_functions_with_stucts_of_non_external_types_in_interface_2.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/042_functions_with_stucts_of_non_external_types_in_interface_2.sol
index 435a02ef..607a4a68 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/042_functions_with_stucts_of_non_external_types_in_interface_2.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/042_functions_with_stucts_of_non_external_types_in_interface_2.sol
@@ -6,4 +6,4 @@ contract C {
}
// ----
// Warning: (0-33): Experimental features are turned on. Do not use experimental features on live deployments.
-// TypeError: (105-106): Internal or recursive type is not allowed for public or external functions.
+// TypeError: (105-113): Internal or recursive type is not allowed for public or external functions.
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/043_functions_with_stucts_of_non_external_types_in_interface_nested.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/043_functions_with_stucts_of_non_external_types_in_interface_nested.sol
index b9dc7c2e..da73d8dd 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/043_functions_with_stucts_of_non_external_types_in_interface_nested.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/043_functions_with_stucts_of_non_external_types_in_interface_nested.sol
@@ -7,4 +7,4 @@ contract C {
}
// ----
// Warning: (0-33): Experimental features are turned on. Do not use experimental features on live deployments.
-// TypeError: (132-133): Internal or recursive type is not allowed for public or external functions.
+// TypeError: (132-140): Internal or recursive type is not allowed for public or external functions.
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/045_returning_multi_dimensional_arrays.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/045_returning_multi_dimensional_arrays.sol
index 221e5fa4..b9a64c2a 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/045_returning_multi_dimensional_arrays.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/045_returning_multi_dimensional_arrays.sol
@@ -2,4 +2,4 @@ contract C {
function f() public pure returns (string[][] memory) {}
}
// ----
-// TypeError: (51-61): This type is only supported in the new experimental ABI encoder. Use "pragma experimental ABIEncoderV2;" to enable the feature.
+// TypeError: (51-68): This type is only supported in the new experimental ABI encoder. Use "pragma experimental ABIEncoderV2;" to enable the feature.
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/046_returning_multi_dimensional_static_arrays.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/046_returning_multi_dimensional_static_arrays.sol
index 75423bc9..ccee6093 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/046_returning_multi_dimensional_static_arrays.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/046_returning_multi_dimensional_static_arrays.sol
@@ -2,4 +2,4 @@ contract C {
function f() public pure returns (uint[][2] memory) {}
}
// ----
-// TypeError: (51-60): This type is only supported in the new experimental ABI encoder. Use "pragma experimental ABIEncoderV2;" to enable the feature.
+// TypeError: (51-67): This type is only supported in the new experimental ABI encoder. Use "pragma experimental ABIEncoderV2;" to enable the feature.
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/397_warns_msg_value_in_non_payable_public_function.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/397_warns_msg_value_in_non_payable_public_function.sol
index 4e1f62e1..c56ad25f 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/397_warns_msg_value_in_non_payable_public_function.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/397_warns_msg_value_in_non_payable_public_function.sol
@@ -4,4 +4,4 @@ contract C {
}
}
// ----
-// Warning: (52-61): "msg.value" used in non-payable function. Do you want to add the "payable" modifier to this function?
+// TypeError: (52-61): "msg.value" can only be used in payable public functions. Make the function "payable" or use an internal function to avoid this error.
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/413_address_methods.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/413_address_methods.sol
index 9c42bc8f..b63d2a55 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/413_address_methods.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/413_address_methods.sol
@@ -2,11 +2,11 @@ contract C {
function f() public {
address addr;
uint balance = addr.balance;
- bool callRet = addr.call("");
- bool delegatecallRet = addr.delegatecall("");
+ (bool callSuc,) = addr.call("");
+ (bool delegatecallSuc,) = addr.delegatecall("");
bool sendRet = addr.send(1);
addr.transfer(1);
- balance; callRet; delegatecallRet; sendRet;
+ balance; callSuc; delegatecallSuc; sendRet;
}
}
// ----
diff --git a/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_empty.sol b/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_empty.sol
new file mode 100644
index 00000000..9972f01d
--- /dev/null
+++ b/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_empty.sol
@@ -0,0 +1,7 @@
+contract C {
+ function f() public pure {
+ abi.decode("abc", ());
+ }
+}
+// ----
+// Warning: (52-73): Statement has no effect.
diff --git a/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_single_return.sol b/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_single_return.sol
new file mode 100644
index 00000000..654b7873
--- /dev/null
+++ b/test/libsolidity/syntaxTests/specialFunctions/abidecode/abi_decode_single_return.sol
@@ -0,0 +1,5 @@
+contract C {
+ function f() public pure returns (bool) {
+ return abi.decode("abc", (uint)) == 2;
+ }
+}
diff --git a/test/libsolidity/syntaxTests/specialFunctions/types_with_unspecified_encoding_special_types.sol b/test/libsolidity/syntaxTests/specialFunctions/types_with_unspecified_encoding_special_types.sol
index c97f588e..6e0b6db4 100644
--- a/test/libsolidity/syntaxTests/specialFunctions/types_with_unspecified_encoding_special_types.sol
+++ b/test/libsolidity/syntaxTests/specialFunctions/types_with_unspecified_encoding_special_types.sol
@@ -1,13 +1,13 @@
contract C {
function f() public pure {
- bool a = address(this).call(abi.encode(address(this).delegatecall, super));
- bool b = address(this).delegatecall(abi.encode(log0, tx, mulmod));
- a; b;
+ (bool a,) = address(this).call(abi.encode(address(this).delegatecall, super));
+ (a,) = address(this).delegatecall(abi.encode(log0, tx, mulmod));
+ a;
}
}
// ----
-// TypeError: (91-117): This type cannot be encoded.
-// TypeError: (119-124): This type cannot be encoded.
-// TypeError: (183-187): This type cannot be encoded.
-// TypeError: (189-191): This type cannot be encoded.
-// TypeError: (193-199): This type cannot be encoded.
+// TypeError: (94-120): This type cannot be encoded.
+// TypeError: (122-127): This type cannot be encoded.
+// TypeError: (184-188): This type cannot be encoded.
+// TypeError: (190-192): This type cannot be encoded.
+// TypeError: (194-200): This type cannot be encoded.
diff --git a/test/libsolidity/syntaxTests/structs/recursion/return_recursive_structs.sol b/test/libsolidity/syntaxTests/structs/recursion/return_recursive_structs.sol
index 89d1ddd9..c8f9185c 100644
--- a/test/libsolidity/syntaxTests/structs/recursion/return_recursive_structs.sol
+++ b/test/libsolidity/syntaxTests/structs/recursion/return_recursive_structs.sol
@@ -4,4 +4,4 @@ contract C {
}
}
// ----
-// TypeError: (91-92): Internal or recursive type is not allowed for public or external functions.
+// TypeError: (91-99): Internal or recursive type is not allowed for public or external functions.
diff --git a/test/libsolidity/syntaxTests/structs/recursion/return_recursive_structs2.sol b/test/libsolidity/syntaxTests/structs/recursion/return_recursive_structs2.sol
index 1c31e180..a8b7ac75 100644
--- a/test/libsolidity/syntaxTests/structs/recursion/return_recursive_structs2.sol
+++ b/test/libsolidity/syntaxTests/structs/recursion/return_recursive_structs2.sol
@@ -4,4 +4,4 @@ contract C {
}
}
// ----
-// TypeError: (94-95): Internal or recursive type is not allowed for public or external functions.
+// TypeError: (94-102): Internal or recursive type is not allowed for public or external functions.
diff --git a/test/libsolidity/syntaxTests/types/mapping/argument_external.sol b/test/libsolidity/syntaxTests/types/mapping/argument_external.sol
index 02beefec..2b5e6b05 100644
--- a/test/libsolidity/syntaxTests/types/mapping/argument_external.sol
+++ b/test/libsolidity/syntaxTests/types/mapping/argument_external.sol
@@ -3,4 +3,4 @@ contract C {
}
}
// ----
-// TypeError: (28-49): Data location must be "calldata" for parameter in external function, but "storage" was given.
+// TypeError: (28-57): Data location must be "calldata" for parameter in external function, but "storage" was given.
diff --git a/test/libsolidity/syntaxTests/types/mapping/argument_public.sol b/test/libsolidity/syntaxTests/types/mapping/argument_public.sol
index 3939cf26..32f11fe9 100644
--- a/test/libsolidity/syntaxTests/types/mapping/argument_public.sol
+++ b/test/libsolidity/syntaxTests/types/mapping/argument_public.sol
@@ -3,4 +3,4 @@ contract C {
}
}
// ----
-// TypeError: (28-49): Data location must be "memory" for parameter in function, but "storage" was given.
+// TypeError: (28-57): Data location must be "memory" for parameter in function, but "storage" was given.
diff --git a/test/libsolidity/syntaxTests/types/mapping/array_argument_external.sol b/test/libsolidity/syntaxTests/types/mapping/array_argument_external.sol
index ef0046d4..0863653c 100644
--- a/test/libsolidity/syntaxTests/types/mapping/array_argument_external.sol
+++ b/test/libsolidity/syntaxTests/types/mapping/array_argument_external.sol
@@ -3,4 +3,4 @@ contract C {
}
}
// ----
-// TypeError: (28-51): Data location must be "calldata" for parameter in external function, but "storage" was given.
+// TypeError: (28-59): Data location must be "calldata" for parameter in external function, but "storage" was given.
diff --git a/test/libsolidity/syntaxTests/types/mapping/array_argument_public.sol b/test/libsolidity/syntaxTests/types/mapping/array_argument_public.sol
index fb3f25a4..99c83d8a 100644
--- a/test/libsolidity/syntaxTests/types/mapping/array_argument_public.sol
+++ b/test/libsolidity/syntaxTests/types/mapping/array_argument_public.sol
@@ -3,4 +3,4 @@ contract C {
}
}
// ----
-// TypeError: (28-51): Data location must be "memory" for parameter in function, but "storage" was given.
+// TypeError: (28-59): Data location must be "memory" for parameter in function, but "storage" was given.
diff --git a/test/libsolidity/syntaxTests/types/mapping/function_type_argument_external.sol b/test/libsolidity/syntaxTests/types/mapping/function_type_argument_external.sol
index 349a4f97..34f95701 100644
--- a/test/libsolidity/syntaxTests/types/mapping/function_type_argument_external.sol
+++ b/test/libsolidity/syntaxTests/types/mapping/function_type_argument_external.sol
@@ -3,5 +3,5 @@ contract C {
}
}
// ----
-// TypeError: (37-56): Data location must be "memory" for parameter in function, but "storage" was given.
-// TypeError: (37-56): Internal type cannot be used for external function type.
+// TypeError: (37-64): Data location must be "memory" for parameter in function, but "storage" was given.
+// TypeError: (37-64): Internal type cannot be used for external function type.
diff --git a/test/libsolidity/syntaxTests/types/mapping/function_type_return_external.sol b/test/libsolidity/syntaxTests/types/mapping/function_type_return_external.sol
index 108d9861..aed9b387 100644
--- a/test/libsolidity/syntaxTests/types/mapping/function_type_return_external.sol
+++ b/test/libsolidity/syntaxTests/types/mapping/function_type_return_external.sol
@@ -3,5 +3,5 @@ contract C {
}
}
// ----
-// TypeError: (57-76): Data location must be "memory" for return parameter in function, but "storage" was given.
-// TypeError: (57-76): Internal type cannot be used for external function type.
+// TypeError: (57-84): Data location must be "memory" for return parameter in function, but "storage" was given.
+// TypeError: (57-84): Internal type cannot be used for external function type.
diff --git a/test/libsolidity/syntaxTests/types/mapping/library_argument_external.sol b/test/libsolidity/syntaxTests/types/mapping/library_argument_external.sol
index e78c6930..1098008d 100644
--- a/test/libsolidity/syntaxTests/types/mapping/library_argument_external.sol
+++ b/test/libsolidity/syntaxTests/types/mapping/library_argument_external.sol
@@ -3,4 +3,4 @@ library L {
}
}
// ----
-// TypeError: (27-48): Type is required to live outside storage.
+// TypeError: (27-56): Type is required to live outside storage.
diff --git a/test/libsolidity/syntaxTests/types/mapping/library_argument_public.sol b/test/libsolidity/syntaxTests/types/mapping/library_argument_public.sol
index 56393b68..dedd4f68 100644
--- a/test/libsolidity/syntaxTests/types/mapping/library_argument_public.sol
+++ b/test/libsolidity/syntaxTests/types/mapping/library_argument_public.sol
@@ -3,4 +3,4 @@ library L {
}
}
// ----
-// TypeError: (27-48): Type is required to live outside storage.
+// TypeError: (27-56): Type is required to live outside storage.
diff --git a/test/libsolidity/syntaxTests/types/mapping/library_array_argument_external.sol b/test/libsolidity/syntaxTests/types/mapping/library_array_argument_external.sol
index f5691675..da5a911b 100644
--- a/test/libsolidity/syntaxTests/types/mapping/library_array_argument_external.sol
+++ b/test/libsolidity/syntaxTests/types/mapping/library_array_argument_external.sol
@@ -3,4 +3,4 @@ library L {
}
}
// ----
-// TypeError: (27-50): Type is required to live outside storage.
+// TypeError: (27-58): Type is required to live outside storage.
diff --git a/test/libsolidity/syntaxTests/types/mapping/library_array_argument_public.sol b/test/libsolidity/syntaxTests/types/mapping/library_array_argument_public.sol
index bb06d4bc..adb62203 100644
--- a/test/libsolidity/syntaxTests/types/mapping/library_array_argument_public.sol
+++ b/test/libsolidity/syntaxTests/types/mapping/library_array_argument_public.sol
@@ -3,4 +3,4 @@ library L {
}
}
// ----
-// TypeError: (27-50): Type is required to live outside storage.
+// TypeError: (27-58): Type is required to live outside storage.
diff --git a/test/libsolidity/syntaxTests/types/mapping/library_return_external.sol b/test/libsolidity/syntaxTests/types/mapping/library_return_external.sol
index a3bb1c32..1e756819 100644
--- a/test/libsolidity/syntaxTests/types/mapping/library_return_external.sol
+++ b/test/libsolidity/syntaxTests/types/mapping/library_return_external.sol
@@ -7,4 +7,4 @@ library L
// ----
// TypeError: (27-58): Type is required to live outside storage.
// TypeError: (60-91): Type is required to live outside storage.
-// TypeError: (123-144): Type is required to live outside storage.
+// TypeError: (123-152): Type is required to live outside storage.
diff --git a/test/libsolidity/syntaxTests/types/mapping/library_return_public.sol b/test/libsolidity/syntaxTests/types/mapping/library_return_public.sol
index ac52d677..357751a0 100644
--- a/test/libsolidity/syntaxTests/types/mapping/library_return_public.sol
+++ b/test/libsolidity/syntaxTests/types/mapping/library_return_public.sol
@@ -7,4 +7,4 @@ library L
// ----
// TypeError: (27-58): Type is required to live outside storage.
// TypeError: (60-91): Type is required to live outside storage.
-// TypeError: (121-142): Type is required to live outside storage.
+// TypeError: (121-150): Type is required to live outside storage.
diff --git a/test/libsolidity/syntaxTests/types/mapping/mapping_array_data_location_function_param_external.sol b/test/libsolidity/syntaxTests/types/mapping/mapping_array_data_location_function_param_external.sol
index 9b96fd3a..0c29ebd8 100644
--- a/test/libsolidity/syntaxTests/types/mapping/mapping_array_data_location_function_param_external.sol
+++ b/test/libsolidity/syntaxTests/types/mapping/mapping_array_data_location_function_param_external.sol
@@ -2,5 +2,5 @@ contract c {
function f1(mapping(uint => uint)[] calldata) pure external {}
}
// ----
-// TypeError: (29-52): Type is required to live outside storage.
-// TypeError: (29-52): Internal or recursive type is not allowed for public or external functions.
+// TypeError: (29-61): Type is required to live outside storage.
+// TypeError: (29-61): Internal or recursive type is not allowed for public or external functions.
diff --git a/test/libsolidity/syntaxTests/types/mapping/mapping_data_location_function_param_external.sol b/test/libsolidity/syntaxTests/types/mapping/mapping_data_location_function_param_external.sol
index adcfee2a..c050f8e9 100644
--- a/test/libsolidity/syntaxTests/types/mapping/mapping_data_location_function_param_external.sol
+++ b/test/libsolidity/syntaxTests/types/mapping/mapping_data_location_function_param_external.sol
@@ -2,5 +2,5 @@ contract c {
function f1(mapping(uint => uint) calldata) pure external returns (mapping(uint => uint) memory) {}
}
// ----
-// TypeError: (29-50): Type is required to live outside storage.
-// TypeError: (29-50): Internal or recursive type is not allowed for public or external functions.
+// TypeError: (29-59): Type is required to live outside storage.
+// TypeError: (29-59): Internal or recursive type is not allowed for public or external functions.
diff --git a/test/libsolidity/syntaxTests/types/mapping/mapping_data_location_function_param_public.sol b/test/libsolidity/syntaxTests/types/mapping/mapping_data_location_function_param_public.sol
index e98c1fe8..b63868b8 100644
--- a/test/libsolidity/syntaxTests/types/mapping/mapping_data_location_function_param_public.sol
+++ b/test/libsolidity/syntaxTests/types/mapping/mapping_data_location_function_param_public.sol
@@ -2,5 +2,5 @@ contract c {
function f3(mapping(uint => uint) memory) view public {}
}
// ----
-// TypeError: (29-50): Type is required to live outside storage.
-// TypeError: (29-50): Internal or recursive type is not allowed for public or external functions.
+// TypeError: (29-57): Type is required to live outside storage.
+// TypeError: (29-57): Internal or recursive type is not allowed for public or external functions.
diff --git a/test/libsolidity/syntaxTests/variableDeclaration/do_while.sol b/test/libsolidity/syntaxTests/variableDeclaration/do_while.sol
new file mode 100644
index 00000000..8fc48b33
--- /dev/null
+++ b/test/libsolidity/syntaxTests/variableDeclaration/do_while.sol
@@ -0,0 +1,12 @@
+pragma solidity >0.4.24;
+
+contract C
+{
+ function f(uint x) public pure {
+ do
+ uint y;
+ while (x > 0);
+ }
+}
+// ----
+// SyntaxError: (81-87): Variable declarations can only be used inside blocks.
diff --git a/test/libsolidity/syntaxTests/variableDeclaration/else.sol b/test/libsolidity/syntaxTests/variableDeclaration/else.sol
new file mode 100644
index 00000000..914e0c0c
--- /dev/null
+++ b/test/libsolidity/syntaxTests/variableDeclaration/else.sol
@@ -0,0 +1,13 @@
+pragma solidity >0.4.24;
+
+contract C
+{
+ function f(uint x) public pure {
+ if (x > 0)
+ {uint y;}
+ else
+ uint z;
+ }
+}
+// ----
+// SyntaxError: (109-115): Variable declarations can only be used inside blocks.
diff --git a/test/libsolidity/syntaxTests/variableDeclaration/for.sol b/test/libsolidity/syntaxTests/variableDeclaration/for.sol
new file mode 100644
index 00000000..bc137f93
--- /dev/null
+++ b/test/libsolidity/syntaxTests/variableDeclaration/for.sol
@@ -0,0 +1,11 @@
+pragma solidity >0.4.24;
+
+contract C
+{
+ function f(uint x) public pure {
+ for (uint i = 0; i < x; ++i)
+ uint y;
+ }
+}
+// ----
+// SyntaxError: (107-113): Variable declarations can only be used inside blocks.
diff --git a/test/libsolidity/syntaxTests/variableDeclaration/if.sol b/test/libsolidity/syntaxTests/variableDeclaration/if.sol
new file mode 100644
index 00000000..75ab2026
--- /dev/null
+++ b/test/libsolidity/syntaxTests/variableDeclaration/if.sol
@@ -0,0 +1,11 @@
+pragma solidity >0.4.24;
+
+contract C
+{
+ function f(uint x) public pure {
+ if (x > 0)
+ uint y;
+ }
+}
+// ----
+// SyntaxError: (89-95): Variable declarations can only be used inside blocks.
diff --git a/test/libsolidity/syntaxTests/variableDeclaration/while.sol b/test/libsolidity/syntaxTests/variableDeclaration/while.sol
new file mode 100644
index 00000000..2997d80c
--- /dev/null
+++ b/test/libsolidity/syntaxTests/variableDeclaration/while.sol
@@ -0,0 +1,11 @@
+pragma solidity >0.4.24;
+
+contract C
+{
+ function f(uint x) public pure {
+ while (x > 0)
+ uint y;
+ }
+}
+// ----
+// SyntaxError: (92-98): Variable declarations can only be used inside blocks.
diff --git a/test/libsolidity/syntaxTests/viewPureChecker/builtin_functions.sol b/test/libsolidity/syntaxTests/viewPureChecker/builtin_functions.sol
index 2cb185c9..2503a319 100644
--- a/test/libsolidity/syntaxTests/viewPureChecker/builtin_functions.sol
+++ b/test/libsolidity/syntaxTests/viewPureChecker/builtin_functions.sol
@@ -3,8 +3,10 @@ contract C {
address(this).transfer(1);
require(address(this).send(2));
selfdestruct(address(this));
- require(address(this).delegatecall(""));
- require(address(this).call(""));
+ (bool success,) = address(this).delegatecall("");
+ require(success);
+ (success,) = address(this).call("");
+ require(success);
}
function g() pure public {
bytes32 x = keccak256("abc");
diff --git a/test/libsolidity/syntaxTests/viewPureChecker/builtin_functions_view_fail.sol b/test/libsolidity/syntaxTests/viewPureChecker/builtin_functions_view_fail.sol
index 9b00fd6d..f951feb4 100644
--- a/test/libsolidity/syntaxTests/viewPureChecker/builtin_functions_view_fail.sol
+++ b/test/libsolidity/syntaxTests/viewPureChecker/builtin_functions_view_fail.sol
@@ -9,15 +9,17 @@ contract C {
selfdestruct(address(this));
}
function i() view public {
- require(address(this).delegatecall(""));
+ (bool success,) = address(this).delegatecall("");
+ require(success);
}
function j() view public {
- require(address(this).call(""));
+ (bool success,) = address(this).call("");
+ require(success);
}
}
// ----
// TypeError: (52-77): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable.
// TypeError: (132-153): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable.
// TypeError: (201-228): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable.
-// TypeError: (283-313): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable.
-// TypeError: (369-391): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable.
+// TypeError: (293-323): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable.
+// TypeError: (414-436): Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable.
diff --git a/test/libsolidity/syntaxTests/viewPureChecker/msg_value_modifier.sol b/test/libsolidity/syntaxTests/viewPureChecker/msg_value_modifier.sol
new file mode 100644
index 00000000..160b20a7
--- /dev/null
+++ b/test/libsolidity/syntaxTests/viewPureChecker/msg_value_modifier.sol
@@ -0,0 +1,6 @@
+contract C {
+ modifier m(uint _amount, uint _avail) { require(_avail >= _amount); _; }
+ function f() m(1 ether, msg.value) public pure {}
+}
+// ----
+// TypeError: (118-127): Function declared as pure, but this expression (potentially) reads from the environment or state and thus requires "view".
diff --git a/test/libsolidity/syntaxTests/viewPureChecker/msg_value_modifier_view.sol b/test/libsolidity/syntaxTests/viewPureChecker/msg_value_modifier_view.sol
new file mode 100644
index 00000000..613b0198
--- /dev/null
+++ b/test/libsolidity/syntaxTests/viewPureChecker/msg_value_modifier_view.sol
@@ -0,0 +1,6 @@
+contract C {
+ modifier m(uint _amount, uint _avail) { require(_avail >= _amount); _; }
+ function f() m(1 ether, msg.value) public view {}
+}
+// ----
+// TypeError: (118-127): "msg.value" can only be used in payable public functions. Make the function "payable" or use an internal function to avoid this error.