aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2018-08-15 03:38:07 +0800
committerGitHub <noreply@github.com>2018-08-15 03:38:07 +0800
commitcc54f6c4256cdccf4b25586ed63800caa836d9c6 (patch)
tree11fe607f1acbc6daaa8d17b30ac45db2f7981d77 /test
parent8f27fb1f4a14f369e8feb3ea22a38d50998cad5c (diff)
parent14e116c1d57e1797e7206299d0fdfed2aa03cdf2 (diff)
downloaddexon-solidity-cc54f6c4256cdccf4b25586ed63800caa836d9c6.tar
dexon-solidity-cc54f6c4256cdccf4b25586ed63800caa836d9c6.tar.gz
dexon-solidity-cc54f6c4256cdccf4b25586ed63800caa836d9c6.tar.bz2
dexon-solidity-cc54f6c4256cdccf4b25586ed63800caa836d9c6.tar.lz
dexon-solidity-cc54f6c4256cdccf4b25586ed63800caa836d9c6.tar.xz
dexon-solidity-cc54f6c4256cdccf4b25586ed63800caa836d9c6.tar.zst
dexon-solidity-cc54f6c4256cdccf4b25586ed63800caa836d9c6.zip
Merge pull request #4738 from ethereum/dataloc_merged
Enforce data location.
Diffstat (limited to 'test')
-rw-r--r--test/compilationTests/corion/moduleHandler.sol12
-rw-r--r--test/compilationTests/corion/premium.sol8
-rw-r--r--test/compilationTests/corion/provider.sol8
-rw-r--r--test/compilationTests/corion/publisher.sol2
-rw-r--r--test/compilationTests/corion/schelling.sol2
-rw-r--r--test/compilationTests/corion/token.sol8
-rw-r--r--test/compilationTests/zeppelin/MultisigWallet.sol2
-rw-r--r--test/compilationTests/zeppelin/ownership/HasNoTokens.sol2
-rw-r--r--test/compilationTests/zeppelin/ownership/Multisig.sol2
-rw-r--r--test/contracts/AuctionRegistrar.cpp2
-rw-r--r--test/contracts/Wallet.cpp4
-rw-r--r--test/libsolidity/ABIDecoderTests.cpp4
-rw-r--r--test/libsolidity/ABIEncoderTests.cpp2
-rw-r--r--test/libsolidity/ASTJSON/function_type.json4
-rw-r--r--test/libsolidity/ASTJSON/function_type.sol2
-rw-r--r--test/libsolidity/ASTJSON/function_type_legacy.json4
-rw-r--r--test/libsolidity/SolidityABIJSON.cpp2
-rw-r--r--test/libsolidity/SolidityEndToEndTest.cpp42
-rw-r--r--test/libsolidity/SolidityNameAndTypeResolution.cpp20
-rw-r--r--test/libsolidity/syntaxTests/array/length/array_length_cannot_be_constant_function_parameter.sol1
-rw-r--r--test/libsolidity/syntaxTests/conversion/conversion_to_bytes.sol2
-rw-r--r--test/libsolidity/syntaxTests/dataLocations/data_location_in_function_type.sol4
-rw-r--r--test/libsolidity/syntaxTests/dataLocations/data_location_in_function_type_fail.sol9
-rw-r--r--test/libsolidity/syntaxTests/dataLocations/externalFunction/external_function_return_parameters_no_data_location.sol5
-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_library.sol5
-rw-r--r--test/libsolidity/syntaxTests/dataLocations/function_argument_location_specifier_test_non_reference_type.sol2
-rw-r--r--test/libsolidity/syntaxTests/dataLocations/function_parameters_with_data_location_fine.sol8
-rw-r--r--test/libsolidity/syntaxTests/dataLocations/function_return_parameters_with_data_location_fine.sol6
-rw-r--r--test/libsolidity/syntaxTests/dataLocations/function_type_array_as_reference_type.sol8
-rw-r--r--test/libsolidity/syntaxTests/dataLocations/internalFunction/function_argument_location_specifier_test_internal_calldata.sol2
-rw-r--r--test/libsolidity/syntaxTests/dataLocations/internalFunction/internal_function_parameters_no_data_location.sol5
-rw-r--r--test/libsolidity/syntaxTests/dataLocations/internalFunction/internal_function_return_parameters_no_data_location.sol5
-rw-r--r--test/libsolidity/syntaxTests/dataLocations/libraries/library_external_function_params_no_data_location.sol12
-rw-r--r--test/libsolidity/syntaxTests/dataLocations/libraries/library_external_function_return_no_data_location.sol12
-rw-r--r--test/libsolidity/syntaxTests/dataLocations/libraries/library_function_with_data_location_fine.sol10
-rw-r--r--test/libsolidity/syntaxTests/dataLocations/libraries/library_internal_function_no_data_location.sol20
-rw-r--r--test/libsolidity/syntaxTests/dataLocations/libraries/library_private_function_no_data_location.sol20
-rw-r--r--test/libsolidity/syntaxTests/dataLocations/libraries/library_public_function_no_data_location.sol19
-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/privateFunction/private_function_parameters_no_data_location.sol5
-rw-r--r--test/libsolidity/syntaxTests/dataLocations/privateFunction/private_function_return_parameters_no_data_location.sol5
-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/dataLocations/publicFunction/public_function_parameters_no_data_location.sol5
-rw-r--r--test/libsolidity/syntaxTests/dataLocations/publicFunction/public_function_return_parameters_no_data_location.sol5
-rw-r--r--test/libsolidity/syntaxTests/dataLocations/variable_declaration_location_specifier_test_non_reference_type.sol8
-rw-r--r--test/libsolidity/syntaxTests/functionTypes/external_function_to_function_type_calldata_parameter.sol2
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/105_constant_input_parameter.sol2
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/149_test_for_bug_override_function_with_bytearray_type.sol6
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/204_overwrite_memory_location_external.sol2
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/205_overwrite_storage_location_external.sol2
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/224_string_bytes_conversion.sol18
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/385_inline_assembly_calldata_variables.sol4
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/471_unspecified_storage_fail.sol4
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/473_storage_location_non_array_or_struct_disallowed.sol2
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/474_storage_location_non_array_or_struct_disallowed_is_not_fatal.sol2
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/476_too_large_arrays_for_calldata_external.sol4
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/constant_mapping.sol8
-rw-r--r--test/libsolidity/syntaxTests/parsing/location_specifiers_for_params.sol4
-rw-r--r--test/libsolidity/syntaxTests/types/mapping/argument_external.sol3
-rw-r--r--test/libsolidity/syntaxTests/types/mapping/argument_public.sol3
-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.sol1
-rw-r--r--test/libsolidity/syntaxTests/types/mapping/function_type_return_external.sol1
-rw-r--r--test/libsolidity/syntaxTests/types/mapping/mapping_array_data_location_function_param_external.sol6
-rw-r--r--test/libsolidity/syntaxTests/types/mapping/mapping_array_return_external.sol2
-rw-r--r--test/libsolidity/syntaxTests/types/mapping/mapping_array_return_public.sol2
-rw-r--r--test/libsolidity/syntaxTests/types/mapping/mapping_data_location_calldata.sol2
-rw-r--r--test/libsolidity/syntaxTests/types/mapping/mapping_data_location_default.sol2
-rw-r--r--test/libsolidity/syntaxTests/types/mapping/mapping_data_location_function_param_external.sol6
-rw-r--r--test/libsolidity/syntaxTests/types/mapping/mapping_data_location_function_param_internal.sol4
-rw-r--r--test/libsolidity/syntaxTests/types/mapping/mapping_data_location_function_param_public.sol6
-rw-r--r--test/libsolidity/syntaxTests/types/mapping/mapping_data_location_memory.sol2
-rw-r--r--test/libsolidity/syntaxTests/types/mapping/mapping_return_external.sol3
-rw-r--r--test/libsolidity/syntaxTests/types/mapping/mapping_return_public.sol3
-rw-r--r--test/libsolidity/syntaxTests/types/mapping/mapping_return_public_memory.sol7
80 files changed, 318 insertions, 126 deletions
diff --git a/test/compilationTests/corion/moduleHandler.sol b/test/compilationTests/corion/moduleHandler.sol
index 5628f657..2b513eb1 100644
--- a/test/compilationTests/corion/moduleHandler.sol
+++ b/test/compilationTests/corion/moduleHandler.sol
@@ -140,7 +140,7 @@ contract moduleHandler is multiOwner, announcementTypes {
}
return (true, false, 0);
}
- function replaceModule(string name, address addr, bool callCallback) external returns (bool success) {
+ function replaceModule(string calldata name, address addr, bool callCallback) external returns (bool success) {
/*
Module replace, can be called only by the Publisher contract.
@@ -167,7 +167,7 @@ contract moduleHandler is multiOwner, announcementTypes {
return true;
}
- function callReplaceCallback(string moduleName, address newModule) external returns (bool success) {
+ function callReplaceCallback(string calldata moduleName, address newModule) external returns (bool success) {
require( block.number < debugModeUntil );
if ( ! insertAndCheckDo(calcDoHash("callReplaceCallback", keccak256(abi.encodePacked(moduleName, newModule)))) ) {
return true;
@@ -178,7 +178,7 @@ contract moduleHandler is multiOwner, announcementTypes {
return true;
}
- function newModule(string name, address addr, bool schellingEvent, bool transferEvent) external returns (bool success) {
+ function newModule(string calldata name, address addr, bool schellingEvent, bool transferEvent) external returns (bool success) {
/*
Adding new module to the database. Can be called only by the Publisher contract.
@@ -199,7 +199,7 @@ contract moduleHandler is multiOwner, announcementTypes {
addModule( modules_s(addr, keccak256(bytes(name)), schellingEvent, transferEvent), true);
return true;
}
- function dropModule(string name, bool callCallback) external returns (bool success) {
+ function dropModule(string calldata name, bool callCallback) external returns (bool success) {
/*
Deleting module from the database. Can be called only by the Publisher contract.
@@ -224,7 +224,7 @@ contract moduleHandler is multiOwner, announcementTypes {
return true;
}
- function callDisableCallback(string moduleName) external returns (bool success) {
+ function callDisableCallback(string calldata moduleName) external returns (bool success) {
require( block.number < debugModeUntil );
if ( ! insertAndCheckDo(calcDoHash("callDisableCallback", keccak256(bytes(moduleName)))) ) {
return true;
@@ -406,7 +406,7 @@ contract moduleHandler is multiOwner, announcementTypes {
require( token(modules[_id].addr).burn(from, value) );
return true;
}
- function configureModule(string moduleName, announcementType aType, uint256 value) external returns (bool success) {
+ function configureModule(string calldata moduleName, announcementType aType, uint256 value) external returns (bool success) {
/*
Changing configuration of a module. Can be called only by Publisher or while debug mode by owners.
diff --git a/test/compilationTests/corion/premium.sol b/test/compilationTests/corion/premium.sol
index 65895f33..84277a99 100644
--- a/test/compilationTests/corion/premium.sol
+++ b/test/compilationTests/corion/premium.sol
@@ -5,8 +5,8 @@ import "./tokenDB.sol";
import "./module.sol";
contract thirdPartyPContractAbstract {
- function receiveCorionPremiumToken(address, uint256, bytes) external returns (bool, uint256) {}
- function approvedCorionPremiumToken(address, uint256, bytes) external returns (bool) {}
+ function receiveCorionPremiumToken(address, uint256, bytes calldata) external returns (bool, uint256) {}
+ function approvedCorionPremiumToken(address, uint256, bytes calldata) external returns (bool) {}
}
contract ptokenDB is tokenDB {}
@@ -108,7 +108,7 @@ contract premium is module, safeMath {
* @param extraData Data to give forward to the receiver
* @return True if the approval was successful
*/
- function approveAndCall(address spender, uint256 amount, uint256 nonce, bytes extraData) isReady external returns (bool success) {
+ function approveAndCall(address spender, uint256 amount, uint256 nonce, bytes calldata extraData) isReady external returns (bool success) {
/*
Authorize another address to use an exact amount of the principal’s balance.
After the transaction the approvedCorionPremiumToken function of the address will be called with the given data.
@@ -226,7 +226,7 @@ contract premium is module, safeMath {
* @param extraData Data to give forward to the receiver
* @return Whether the transfer was successful or not
*/
- function transfer(address to, uint256 amount, bytes extraData) isReady external returns (bool success) {
+ function transfer(address to, uint256 amount, bytes calldata extraData) isReady external returns (bool success) {
/*
Launch a transaction where we transfer from a given address to another one.
After thetransaction the approvedCorionPremiumToken function of the receiver’s address is going to be called with the given data.
diff --git a/test/compilationTests/corion/provider.sol b/test/compilationTests/corion/provider.sol
index a4ee4a48..41857e54 100644
--- a/test/compilationTests/corion/provider.sol
+++ b/test/compilationTests/corion/provider.sol
@@ -213,7 +213,7 @@ contract provider is module, safeMath, announcementTypes {
return ( ! priv && ( rate >= publicMinRate && rate <= publicMaxRate ) ) ||
( priv && ( rate >= privateMinRate && rate <= privateMaxRate ) );
}
- function createProvider(bool priv, string name, string website, string country, string info, uint8 rate, bool isForRent, address admin) isReady external {
+ function createProvider(bool priv, string calldata name, string calldata website, string calldata country, string calldata info, uint8 rate, bool isForRent, address admin) isReady external {
/*
Creating a provider.
During the ICO its not allowed to create provider.
@@ -270,7 +270,7 @@ contract provider is module, safeMath, announcementTypes {
}
emit EProviderOpen(msg.sender, currHeight);
}
- function setProviderDetails(address addr, string website, string country, string info, uint8 rate, address admin) isReady external {
+ function setProviderDetails(address addr, string calldata website, string calldata country, string calldata info, uint8 rate, address admin) isReady external {
/*
Modifying the datas of the provider.
This can only be invited by the provider’s admin.
@@ -369,7 +369,7 @@ contract provider is module, safeMath, announcementTypes {
setRightForInterest(getProviderCurrentSupply(msg.sender), 0, providers[msg.sender].data[currHeight].priv);
emit EProviderClose(msg.sender, currHeight);
}
- function allowUsers(address provider, address[] addr) isReady external {
+ function allowUsers(address provider, address[] calldata addr) isReady external {
/*
Permition of the user to be able to connect to the provider.
This can only be invited by the provider’s admin.
@@ -387,7 +387,7 @@ contract provider is module, safeMath, announcementTypes {
providers[provider].data[currHeight].allowedUsers[addr[a]] = true;
}
}
- function disallowUsers(address provider, address[] addr) isReady external {
+ function disallowUsers(address provider, address[] calldata addr) isReady external {
/*
Disable of the user not to be able to connect to the provider.
It is can called only for the admin of the provider.
diff --git a/test/compilationTests/corion/publisher.sol b/test/compilationTests/corion/publisher.sol
index fcba13ad..6a77bc9e 100644
--- a/test/compilationTests/corion/publisher.sol
+++ b/test/compilationTests/corion/publisher.sol
@@ -116,7 +116,7 @@ contract publisher is announcementTypes, module, safeMath {
return _amount * oppositeRate / 100 > weight;
}
- function newAnnouncement(announcementType Type, string Announcement, string Link, bool Oppositable, string _str, uint256 _uint, address _addr) onlyOwner external {
+ function newAnnouncement(announcementType Type, string calldata Announcement, string calldata Link, bool Oppositable, string calldata _str, uint256 _uint, address _addr) onlyOwner external {
/*
New announcement. Can be called only by those in the admin list
diff --git a/test/compilationTests/corion/schelling.sol b/test/compilationTests/corion/schelling.sol
index c4f3c02c..e9288332 100644
--- a/test/compilationTests/corion/schelling.sol
+++ b/test/compilationTests/corion/schelling.sol
@@ -310,7 +310,7 @@ contract schelling is module, announcementTypes, schellingVars {
setRound(currentRound, round);
}
- function sendVote(string vote) isReady noContract external {
+ function sendVote(string calldata vote) isReady noContract external {
/*
Check vote (Envelope opening)
Only the sent “envelopes” can be opened.
diff --git a/test/compilationTests/corion/token.sol b/test/compilationTests/corion/token.sol
index 87ec64d6..6d3f1a1e 100644
--- a/test/compilationTests/corion/token.sol
+++ b/test/compilationTests/corion/token.sol
@@ -7,8 +7,8 @@ import "./moduleHandler.sol";
import "./tokenDB.sol";
contract thirdPartyContractAbstract {
- function receiveCorionToken(address, uint256, bytes) external returns (bool, uint256) {}
- function approvedCorionToken(address, uint256, bytes) external returns (bool) {}
+ function receiveCorionToken(address, uint256, bytes calldata) external returns (bool, uint256) {}
+ function approvedCorionToken(address, uint256, bytes calldata) external returns (bool) {}
}
contract token is safeMath, module, announcementTypes {
@@ -123,7 +123,7 @@ contract token is safeMath, module, announcementTypes {
* @param extraData Data to give forward to the receiver
* @return True if the approval was successful
*/
- function approveAndCall(address spender, uint256 amount, uint256 nonce, bytes extraData) isReady external returns (bool success) {
+ function approveAndCall(address spender, uint256 amount, uint256 nonce, bytes calldata extraData) isReady external returns (bool success) {
/*
Authorise another address to use a certain quantity of the authorising owner’s balance
Following the transaction the receiver address `approvedCorionToken` function is called by the given data
@@ -267,7 +267,7 @@ contract token is safeMath, module, announcementTypes {
* @param extraData Data to give forward to the receiver
* @return Whether the transfer was successful or not
*/
- function transfer(address to, uint256 amount, bytes extraData) isReady external returns (bool success) {
+ function transfer(address to, uint256 amount, bytes calldata extraData) isReady external returns (bool success) {
/*
Start transaction to send a quantity from a given address to another address
After transaction the function `receiveCorionToken`of the receiver is called by the given data
diff --git a/test/compilationTests/zeppelin/MultisigWallet.sol b/test/compilationTests/zeppelin/MultisigWallet.sol
index 3793428d..9aac5c53 100644
--- a/test/compilationTests/zeppelin/MultisigWallet.sol
+++ b/test/compilationTests/zeppelin/MultisigWallet.sol
@@ -55,7 +55,7 @@ contract MultisigWallet is Multisig, Shareable, DayLimit {
* @param _value The value to send
* @param _data The data part of the transaction
*/
- function execute(address _to, uint256 _value, bytes _data) external onlyOwner returns (bytes32 _r) {
+ function execute(address _to, uint256 _value, bytes calldata _data) external onlyOwner returns (bytes32 _r) {
// first, take the opportunity to check that we're under the daily limit.
if (underLimit(_value)) {
emit SingleTransact(msg.sender, _value, _to, _data);
diff --git a/test/compilationTests/zeppelin/ownership/HasNoTokens.sol b/test/compilationTests/zeppelin/ownership/HasNoTokens.sol
index e14d8da7..079cef7c 100644
--- a/test/compilationTests/zeppelin/ownership/HasNoTokens.sol
+++ b/test/compilationTests/zeppelin/ownership/HasNoTokens.sol
@@ -18,7 +18,7 @@ contract HasNoTokens is Ownable {
* @param value_ uint256 the amount of the specified token
* @param data_ Bytes The data passed from the caller.
*/
- function tokenFallback(address from_, uint256 value_, bytes data_) external {
+ function tokenFallback(address from_, uint256 value_, bytes calldata data_) external {
revert();
}
diff --git a/test/compilationTests/zeppelin/ownership/Multisig.sol b/test/compilationTests/zeppelin/ownership/Multisig.sol
index 25531d8d..2eb0f4bc 100644
--- a/test/compilationTests/zeppelin/ownership/Multisig.sol
+++ b/test/compilationTests/zeppelin/ownership/Multisig.sol
@@ -23,6 +23,6 @@ contract Multisig {
// TODO: document
function changeOwner(address _from, address _to) external;
- function execute(address _to, uint256 _value, bytes _data) external returns (bytes32);
+ function execute(address _to, uint256 _value, bytes calldata _data) external returns (bytes32);
function confirm(bytes32 _h) public returns (bool);
}
diff --git a/test/contracts/AuctionRegistrar.cpp b/test/contracts/AuctionRegistrar.cpp
index 4ff55b75..e178748f 100644
--- a/test/contracts/AuctionRegistrar.cpp
+++ b/test/contracts/AuctionRegistrar.cpp
@@ -132,7 +132,7 @@ contract GlobalRegistrar is Registrar, AuctionSystem {
}
}
- function reserve(string _name) external payable {
+ function reserve(string calldata _name) external payable {
if (bytes(_name).length == 0)
revert();
bool needAuction = requiresAuction(_name);
diff --git a/test/contracts/Wallet.cpp b/test/contracts/Wallet.cpp
index ce50fe59..a2e764fb 100644
--- a/test/contracts/Wallet.cpp
+++ b/test/contracts/Wallet.cpp
@@ -348,7 +348,7 @@ contract multisig {
// TODO: document
function changeOwner(address _from, address _to) external;
- function execute(address _to, uint _value, bytes _data) external returns (bytes32);
+ function execute(address _to, uint _value, bytes calldata _data) external returns (bytes32);
function confirm(bytes32 _h) public returns (bool);
}
@@ -390,7 +390,7 @@ contract Wallet is multisig, multiowned, daylimit {
// If not, goes into multisig process. We provide a hash on return to allow the sender to provide
// shortcuts for the other confirmations (allowing them to avoid replicating the _to, _value
// and _data arguments). They still get the option of using them if they want, anyways.
- function execute(address _to, uint _value, bytes _data) external onlyowner returns (bytes32 _r) {
+ function execute(address _to, uint _value, bytes calldata _data) external onlyowner returns (bytes32 _r) {
// first, take the opportunity to check that we're under the daily limit.
if (underLimit(_value)) {
emit SingleTransact(msg.sender, _value, _to, _data);
diff --git a/test/libsolidity/ABIDecoderTests.cpp b/test/libsolidity/ABIDecoderTests.cpp
index f91a4f85..94319985 100644
--- a/test/libsolidity/ABIDecoderTests.cpp
+++ b/test/libsolidity/ABIDecoderTests.cpp
@@ -234,7 +234,7 @@ BOOST_AUTO_TEST_CASE(byte_arrays)
return (a, b.length, b[3], c);
}
- function f_external(uint a, bytes b, uint c)
+ function f_external(uint a, bytes calldata b, uint c)
external pure returns (uint, uint, byte, uint) {
return (a, b.length, b[3], c);
}
@@ -261,7 +261,7 @@ BOOST_AUTO_TEST_CASE(calldata_arrays_too_large)
{
string sourceCode = R"(
contract C {
- function f(uint a, uint[] b, uint c) external pure returns (uint) {
+ function f(uint a, uint[] calldata b, uint c) external pure returns (uint) {
return 7;
}
}
diff --git a/test/libsolidity/ABIEncoderTests.cpp b/test/libsolidity/ABIEncoderTests.cpp
index 06cfb4ec..d2125cc7 100644
--- a/test/libsolidity/ABIEncoderTests.cpp
+++ b/test/libsolidity/ABIEncoderTests.cpp
@@ -367,7 +367,7 @@ BOOST_AUTO_TEST_CASE(calldata)
string sourceCode = R"(
contract C {
event E(bytes);
- function f(bytes a) external {
+ function f(bytes calldata a) external {
emit E(a);
}
}
diff --git a/test/libsolidity/ASTJSON/function_type.json b/test/libsolidity/ASTJSON/function_type.json
index 7b10f0dc..5dbc5b80 100644
--- a/test/libsolidity/ASTJSON/function_type.json
+++ b/test/libsolidity/ASTJSON/function_type.json
@@ -83,7 +83,7 @@
"id" : 3,
"name" : "",
"nodeType" : "VariableDeclaration",
- "scope" : 16,
+ "scope" : 5,
"src" : "61:4:1",
"stateVariable" : false,
"storageLocation" : "default",
@@ -167,7 +167,7 @@
"id" : 10,
"name" : "",
"nodeType" : "VariableDeclaration",
- "scope" : 16,
+ "scope" : 12,
"src" : "113:4:1",
"stateVariable" : false,
"storageLocation" : "default",
diff --git a/test/libsolidity/ASTJSON/function_type.sol b/test/libsolidity/ASTJSON/function_type.sol
index b63bcbf0..bed2742b 100644
--- a/test/libsolidity/ASTJSON/function_type.sol
+++ b/test/libsolidity/ASTJSON/function_type.sol
@@ -1 +1,3 @@
contract C { function f(function() external payable returns (uint) x) returns (function() external view returns (uint)) {} }
+
+// ----
diff --git a/test/libsolidity/ASTJSON/function_type_legacy.json b/test/libsolidity/ASTJSON/function_type_legacy.json
index 952fd865..af0c42dd 100644
--- a/test/libsolidity/ASTJSON/function_type_legacy.json
+++ b/test/libsolidity/ASTJSON/function_type_legacy.json
@@ -100,7 +100,7 @@
{
"constant" : false,
"name" : "",
- "scope" : 16,
+ "scope" : 5,
"stateVariable" : false,
"storageLocation" : "default",
"type" : "uint256",
@@ -191,7 +191,7 @@
{
"constant" : false,
"name" : "",
- "scope" : 16,
+ "scope" : 12,
"stateVariable" : false,
"storageLocation" : "default",
"type" : "uint256",
diff --git a/test/libsolidity/SolidityABIJSON.cpp b/test/libsolidity/SolidityABIJSON.cpp
index fdb11504..a8a67bca 100644
--- a/test/libsolidity/SolidityABIJSON.cpp
+++ b/test/libsolidity/SolidityABIJSON.cpp
@@ -727,7 +727,7 @@ BOOST_AUTO_TEST_CASE(strings_and_arrays)
// bug #1801
char const* sourceCode = R"(
contract test {
- function f(string a, bytes b, uint[] c) external {}
+ function f(string calldata a, bytes calldata b, uint[] calldata c) external {}
}
)";
diff --git a/test/libsolidity/SolidityEndToEndTest.cpp b/test/libsolidity/SolidityEndToEndTest.cpp
index 7b56fa9d..af2b3485 100644
--- a/test/libsolidity/SolidityEndToEndTest.cpp
+++ b/test/libsolidity/SolidityEndToEndTest.cpp
@@ -526,7 +526,7 @@ BOOST_AUTO_TEST_CASE(array_multiple_local_vars)
{
char const* sourceCode = R"(
contract test {
- function f(uint256[] seq) external pure returns (uint256) {
+ function f(uint256[] calldata seq) external pure returns (uint256) {
uint i = 0;
uint sum = 0;
while (i < seq.length)
@@ -4540,7 +4540,7 @@ BOOST_AUTO_TEST_CASE(struct_containing_bytes_copy_and_delete)
struct Struct { uint a; bytes data; uint b; }
Struct data1;
Struct data2;
- function set(uint _a, bytes _data, uint _b) external returns (bool) {
+ function set(uint _a, bytes calldata _data, uint _b) external returns (bool) {
data1.a = _a;
data1.b = _b;
data1.data = _data;
@@ -4764,12 +4764,12 @@ BOOST_AUTO_TEST_CASE(struct_referencing)
}
library L {
struct S { uint b; uint a; }
- function f() public pure returns (S) {
+ function f() public pure returns (S memory) {
S memory s;
s.a = 3;
return s;
}
- function g() public pure returns (I.S) {
+ function g() public pure returns (I.S memory) {
I.S memory s;
s.a = 4;
return s;
@@ -4779,25 +4779,25 @@ BOOST_AUTO_TEST_CASE(struct_referencing)
function a(S memory) public pure returns (uint) { return 2; }
}
contract C is I {
- function f() public pure returns (S) {
+ function f() public pure returns (S memory) {
S memory s;
s.a = 1;
return s;
}
- function g() public pure returns (I.S) {
+ function g() public pure returns (I.S memory) {
I.S memory s;
s.a = 2;
return s;
}
- function h() public pure returns (L.S) {
+ function h() public pure returns (L.S memory) {
L.S memory s;
s.a = 5;
return s;
}
- function x() public pure returns (L.S) {
+ function x() public pure returns (L.S memory) {
return L.f();
}
- function y() public pure returns (I.S) {
+ function y() public pure returns (I.S memory) {
return L.g();
}
function a1() public pure returns (uint) { S memory s; return L.a(s); }
@@ -4941,7 +4941,7 @@ BOOST_AUTO_TEST_CASE(bytes_in_arguments)
uint result;
function f(uint a, uint b) public { result += a + b; }
function g(uint a) public { result *= a; }
- function test(uint a, bytes data1, bytes data2, uint b) external returns (uint r_a, uint r, uint r_b, uint l) {
+ function test(uint a, bytes calldata data1, bytes calldata data2, uint b) external returns (uint r_a, uint r, uint r_b, uint l) {
r_a = a;
address(this).call(data1);
address(this).call(data2);
@@ -5876,7 +5876,7 @@ BOOST_AUTO_TEST_CASE(external_array_args)
{
char const* sourceCode = R"(
contract c {
- function test(uint[8] a, uint[] b, uint[5] c, uint a_index, uint b_index, uint c_index)
+ function test(uint[8] calldata a, uint[] calldata b, uint[5] calldata c, uint a_index, uint b_index, uint c_index)
external returns (uint av, uint bv, uint cv) {
av = a[a_index];
bv = b[b_index];
@@ -5901,10 +5901,10 @@ BOOST_AUTO_TEST_CASE(bytes_index_access)
char const* sourceCode = R"(
contract c {
bytes data;
- function direct(bytes arg, uint index) external returns (uint) {
+ function direct(bytes calldata arg, uint index) external returns (uint) {
return uint(uint8(arg[index]));
}
- function storageCopyRead(bytes arg, uint index) external returns (uint) {
+ function storageCopyRead(bytes calldata arg, uint index) external returns (uint) {
data = arg;
return uint(uint8(data[index]));
}
@@ -5959,7 +5959,7 @@ BOOST_AUTO_TEST_CASE(array_copy_calldata_storage)
uint[9] m_data;
uint[] m_data_dyn;
uint8[][] m_byte_data;
- function store(uint[9] a, uint8[3][] b) external returns (uint8) {
+ function store(uint[9] calldata a, uint8[3][] calldata b) external returns (uint8) {
m_data = a;
m_data_dyn = a;
m_byte_data = b;
@@ -5998,7 +5998,7 @@ BOOST_AUTO_TEST_CASE(array_copy_nested_array)
uint[4][] a;
uint[10][] b;
uint[][] c;
- function test(uint[2][] d) external returns (uint) {
+ function test(uint[2][] calldata d) external returns (uint) {
a = d;
b = a;
c = b;
@@ -6949,7 +6949,7 @@ BOOST_AUTO_TEST_CASE(return_string)
char const* sourceCode = R"(
contract Main {
string public s;
- function set(string _s) external {
+ function set(string calldata _s) external {
s = _s;
}
function get1() public returns (string memory r) {
@@ -6975,7 +6975,7 @@ BOOST_AUTO_TEST_CASE(return_multiple_strings_of_various_sizes)
contract Main {
string public s1;
string public s2;
- function set(string _s1, uint x, string _s2) external returns (uint) {
+ function set(string calldata _s1, uint x, string calldata _s2) external returns (uint) {
s1 = _s1;
s2 = _s2;
return x;
@@ -7024,7 +7024,7 @@ BOOST_AUTO_TEST_CASE(accessor_involving_strings)
contract Main {
struct stringData { string a; uint b; string c; }
mapping(uint => stringData[]) public data;
- function set(uint x, uint y, string a, uint b, string c) external returns (bool) {
+ function set(uint x, uint y, string calldata a, uint b, string calldata c) external returns (bool) {
data[x].length = y + 1;
data[x][y].a = a;
data[x][y].b = b;
@@ -7061,7 +7061,7 @@ BOOST_AUTO_TEST_CASE(bytes_in_function_calls)
function setIndirectFromMemory(string memory _s1, uint x, string memory _s2) public returns (uint) {
return this.set(_s1, x, _s2);
}
- function setIndirectFromCalldata(string _s1, uint x, string _s2) external returns (uint) {
+ function setIndirectFromCalldata(string calldata _s1, uint x, string calldata _s2) external returns (uint) {
return this.set(_s1, x, _s2);
}
}
@@ -7102,7 +7102,7 @@ BOOST_AUTO_TEST_CASE(return_bytes_internal)
s1 = _s1;
_r1 = s1;
}
- function set(bytes _s1) external returns (uint _r, bytes memory _r1) {
+ function set(bytes calldata _s1) external returns (uint _r, bytes memory _r1) {
_r1 = doSet(_s1);
_r = _r1.length;
}
@@ -8040,7 +8040,7 @@ BOOST_AUTO_TEST_CASE(library_call)
BOOST_AUTO_TEST_CASE(library_function_external)
{
char const* sourceCode = R"(
- library Lib { function m(bytes b) external pure returns (byte) { return b[2]; } }
+ library Lib { function m(bytes calldata b) external pure returns (byte) { return b[2]; } }
contract Test {
function f(bytes memory b) public pure returns (byte) {
return Lib.m(b);
diff --git a/test/libsolidity/SolidityNameAndTypeResolution.cpp b/test/libsolidity/SolidityNameAndTypeResolution.cpp
index 41814888..55e81867 100644
--- a/test/libsolidity/SolidityNameAndTypeResolution.cpp
+++ b/test/libsolidity/SolidityNameAndTypeResolution.cpp
@@ -158,7 +158,7 @@ BOOST_AUTO_TEST_CASE(function_external_types)
uint a;
}
contract Test {
- function boo(uint, bool, bytes8, bool[2], uint[], C, address[]) external returns (uint ret) {
+ function boo(uint, bool, bytes8, bool[2] calldata, uint[] calldata, C, address[] calldata) external returns (uint ret) {
ret = 5;
}
}
@@ -206,10 +206,10 @@ BOOST_AUTO_TEST_CASE(external_structs)
struct Simple { uint i; }
struct Nested { X[2][] a; uint y; }
struct X { bytes32 x; Test t; Simple[] s; }
- function f(ActionChoices, uint, Simple) external {}
- function g(Test, Nested) external {}
- function h(function(Nested memory) external returns (uint)[]) external {}
- function i(Nested[]) external {}
+ function f(ActionChoices, uint, Simple calldata) external {}
+ function g(Test, Nested calldata) external {}
+ function h(function(Nested memory) external returns (uint)[] calldata) external {}
+ function i(Nested[] calldata) external {}
}
)";
SourceUnit const* sourceUnit = parseAndAnalyse(text);
@@ -234,10 +234,10 @@ BOOST_AUTO_TEST_CASE(external_structs_in_libraries)
struct Simple { uint i; }
struct Nested { X[2][] a; uint y; }
struct X { bytes32 x; Test t; Simple[] s; }
- function f(ActionChoices, uint, Simple) external {}
- function g(Test, Nested) external {}
- function h(function(Nested memory) external returns (uint)[]) external {}
- function i(Nested[]) external {}
+ function f(ActionChoices, uint, Simple calldata) external {}
+ function g(Test, Nested calldata) external {}
+ function h(function(Nested memory) external returns (uint)[] calldata) external {}
+ function i(Nested[] calldata) external {}
}
)";
SourceUnit const* sourceUnit = parseAndAnalyse(text);
@@ -340,7 +340,7 @@ BOOST_AUTO_TEST_CASE(string)
char const* sourceCode = R"(
contract C {
string s;
- function f(string x) external { s = x; }
+ function f(string calldata x) external { s = x; }
}
)";
BOOST_CHECK_NO_THROW(parseAndAnalyse(sourceCode));
diff --git a/test/libsolidity/syntaxTests/array/length/array_length_cannot_be_constant_function_parameter.sol b/test/libsolidity/syntaxTests/array/length/array_length_cannot_be_constant_function_parameter.sol
index 5add9106..59328140 100644
--- a/test/libsolidity/syntaxTests/array/length/array_length_cannot_be_constant_function_parameter.sol
+++ b/test/libsolidity/syntaxTests/array/length/array_length_cannot_be_constant_function_parameter.sol
@@ -4,4 +4,5 @@ contract C {
}
}
// ----
+// DeclarationError: (28-45): The "constant" keyword can only be used for state variables.
// TypeError: (69-72): Invalid array length, expected integer literal or constant expression.
diff --git a/test/libsolidity/syntaxTests/conversion/conversion_to_bytes.sol b/test/libsolidity/syntaxTests/conversion/conversion_to_bytes.sol
index 5946e921..3a6deff1 100644
--- a/test/libsolidity/syntaxTests/conversion/conversion_to_bytes.sol
+++ b/test/libsolidity/syntaxTests/conversion/conversion_to_bytes.sol
@@ -1,5 +1,5 @@
contract test {
- function f() public pure returns (bytes) {
+ function f() public pure returns (bytes memory) {
return bytes("abc");
}
}
diff --git a/test/libsolidity/syntaxTests/dataLocations/data_location_in_function_type.sol b/test/libsolidity/syntaxTests/dataLocations/data_location_in_function_type.sol
new file mode 100644
index 00000000..b23fbb89
--- /dev/null
+++ b/test/libsolidity/syntaxTests/dataLocations/data_location_in_function_type.sol
@@ -0,0 +1,4 @@
+library L {
+ struct Nested { uint y; }
+ function c(function(Nested memory) external returns (uint)[] storage) external pure {}
+}
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
new file mode 100644
index 00000000..e1ea6989
--- /dev/null
+++ b/test/libsolidity/syntaxTests/dataLocations/data_location_in_function_type_fail.sol
@@ -0,0 +1,9 @@
+library L {
+ struct Nested { uint y; }
+ function b(function(Nested calldata) external returns (uint)[] storage) external pure {}
+ function d(function(Nested storage) external returns (uint)[] storage) external pure {}
+}
+
+// ----
+// 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.
diff --git a/test/libsolidity/syntaxTests/dataLocations/externalFunction/external_function_return_parameters_no_data_location.sol b/test/libsolidity/syntaxTests/dataLocations/externalFunction/external_function_return_parameters_no_data_location.sol
new file mode 100644
index 00000000..cbcf2a6e
--- /dev/null
+++ b/test/libsolidity/syntaxTests/dataLocations/externalFunction/external_function_return_parameters_no_data_location.sol
@@ -0,0 +1,5 @@
+contract C {
+ function i() external pure returns(uint[]) {}
+}
+// ----
+// TypeError: (52-58): Data location must be "memory" for return parameter in function, but none 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 807cc064..d914fa5b 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): Location has to be calldata for external functions (remove the "memory" or "storage" keyword).
+// TypeError: (31-36): 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 2664dbab..adb7e52e 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): Location has to be calldata for external functions (remove the "memory" or "storage" keyword).
+// TypeError: (31-36): 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_library.sol b/test/libsolidity/syntaxTests/dataLocations/function_argument_location_specifier_test_library.sol
deleted file mode 100644
index 4348482a..00000000
--- a/test/libsolidity/syntaxTests/dataLocations/function_argument_location_specifier_test_library.sol
+++ /dev/null
@@ -1,5 +0,0 @@
-library test {
- function f(bytes calldata) public;
-}
-// ----
-// TypeError: (30-35): Location cannot be calldata for non-external functions (remove the "calldata" keyword).
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 70f6c5eb..71756ebb 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 given for array or struct types.
+// TypeError: (31-37): Data location can only be specified for array, struct or mapping types, but "memory" was given.
diff --git a/test/libsolidity/syntaxTests/dataLocations/function_parameters_with_data_location_fine.sol b/test/libsolidity/syntaxTests/dataLocations/function_parameters_with_data_location_fine.sol
new file mode 100644
index 00000000..2bc7b393
--- /dev/null
+++ b/test/libsolidity/syntaxTests/dataLocations/function_parameters_with_data_location_fine.sol
@@ -0,0 +1,8 @@
+contract C {
+ function f(uint[] memory, uint[] storage) private pure {}
+ function g(uint[] memory, uint[] storage) internal pure {}
+ function h(uint[] memory) public pure {}
+ function i(uint[] calldata) external pure {}
+ // No data location for events.
+ event e(uint[]);
+}
diff --git a/test/libsolidity/syntaxTests/dataLocations/function_return_parameters_with_data_location_fine.sol b/test/libsolidity/syntaxTests/dataLocations/function_return_parameters_with_data_location_fine.sol
new file mode 100644
index 00000000..ea019198
--- /dev/null
+++ b/test/libsolidity/syntaxTests/dataLocations/function_return_parameters_with_data_location_fine.sol
@@ -0,0 +1,6 @@
+contract C {
+ function f() private pure returns(uint[] memory, uint[] storage b) { b = b; }
+ function g() internal pure returns(uint[] memory, uint[] storage b) { b = b; }
+ function h() public pure returns(uint[] memory) {}
+ function i() external pure returns(uint[] memory) {}
+}
diff --git a/test/libsolidity/syntaxTests/dataLocations/function_type_array_as_reference_type.sol b/test/libsolidity/syntaxTests/dataLocations/function_type_array_as_reference_type.sol
new file mode 100644
index 00000000..b3856f58
--- /dev/null
+++ b/test/libsolidity/syntaxTests/dataLocations/function_type_array_as_reference_type.sol
@@ -0,0 +1,8 @@
+contract C {
+ struct Nested { uint y; }
+ // ensure that we consider array of function pointers as reference type
+ function b(function(Nested memory) external returns (uint)[] storage) internal pure {}
+ function c(function(Nested memory) external returns (uint)[] memory) public pure {}
+ function d(function(Nested memory) external returns (uint)[] calldata) external pure {}
+}
+// ----
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 f2740946..771f1525 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): Variable cannot be declared as "calldata" (remove the "calldata" keyword).
+// TypeError: (31-36): Data location must be "storage" or "memory" for parameter in function, but "calldata" was given.
diff --git a/test/libsolidity/syntaxTests/dataLocations/internalFunction/internal_function_parameters_no_data_location.sol b/test/libsolidity/syntaxTests/dataLocations/internalFunction/internal_function_parameters_no_data_location.sol
new file mode 100644
index 00000000..f1c4a550
--- /dev/null
+++ b/test/libsolidity/syntaxTests/dataLocations/internalFunction/internal_function_parameters_no_data_location.sol
@@ -0,0 +1,5 @@
+contract C {
+ function g(uint[]) internal pure {}
+}
+// ----
+// TypeError: (28-34): Data location must be "storage" or "memory" for parameter in function, but none was given.
diff --git a/test/libsolidity/syntaxTests/dataLocations/internalFunction/internal_function_return_parameters_no_data_location.sol b/test/libsolidity/syntaxTests/dataLocations/internalFunction/internal_function_return_parameters_no_data_location.sol
new file mode 100644
index 00000000..a32995e7
--- /dev/null
+++ b/test/libsolidity/syntaxTests/dataLocations/internalFunction/internal_function_return_parameters_no_data_location.sol
@@ -0,0 +1,5 @@
+contract C {
+ function g() internal pure returns(uint[]) {}
+}
+// ----
+// TypeError: (52-58): Data location must be "storage" or "memory" for return parameter in function, but none was given.
diff --git a/test/libsolidity/syntaxTests/dataLocations/libraries/library_external_function_params_no_data_location.sol b/test/libsolidity/syntaxTests/dataLocations/libraries/library_external_function_params_no_data_location.sol
new file mode 100644
index 00000000..c20088b7
--- /dev/null
+++ b/test/libsolidity/syntaxTests/dataLocations/libraries/library_external_function_params_no_data_location.sol
@@ -0,0 +1,12 @@
+library L {
+ struct S { uint x; }
+ function g(uint[2]) external pure {}
+ function h(uint[]) external pure {}
+ function i(S) external pure {}
+ function j(mapping(uint => uint)) external pure {}
+}
+// ----
+// TypeError: (52-59): Data location must be "storage" or "calldata" for parameter in external function, but none was given.
+// TypeError: (93-99): Data location must be "storage" or "calldata" for parameter in external function, but none was given.
+// TypeError: (133-134): Data location must be "storage" or "calldata" for parameter in external function, but none was given.
+// TypeError: (168-189): Data location must be "storage" or "calldata" for parameter in external function, but none was given.
diff --git a/test/libsolidity/syntaxTests/dataLocations/libraries/library_external_function_return_no_data_location.sol b/test/libsolidity/syntaxTests/dataLocations/libraries/library_external_function_return_no_data_location.sol
new file mode 100644
index 00000000..fa3a7821
--- /dev/null
+++ b/test/libsolidity/syntaxTests/dataLocations/libraries/library_external_function_return_no_data_location.sol
@@ -0,0 +1,12 @@
+library L {
+ struct S { uint x; }
+ function g() external pure returns (uint[2]) {}
+ function h() external pure returns (uint[]) {}
+ function i() external pure returns (S) {}
+ function j() external pure returns (mapping(uint => uint)) {}
+}
+// ----
+// TypeError: (77-84): Data location must be "storage" or "memory" for return parameter in function, but none was given.
+// TypeError: (129-135): Data location must be "storage" or "memory" for return parameter in function, but none was given.
+// TypeError: (180-181): Data location must be "storage" or "memory" for return parameter in function, but none was given.
+// TypeError: (226-247): Data location must be "storage" or "memory" for return parameter in function, but none was given.
diff --git a/test/libsolidity/syntaxTests/dataLocations/libraries/library_function_with_data_location_fine.sol b/test/libsolidity/syntaxTests/dataLocations/libraries/library_function_with_data_location_fine.sol
new file mode 100644
index 00000000..7a276f95
--- /dev/null
+++ b/test/libsolidity/syntaxTests/dataLocations/libraries/library_function_with_data_location_fine.sol
@@ -0,0 +1,10 @@
+library L {
+ struct S { uint x; }
+ function f(uint[] memory, uint[] storage, S storage) private pure
+ returns (mapping(uint => uint) storage a, S memory b, uint[] storage c) { return (a, b, c); }
+ function g(uint[] memory, uint[] storage) internal pure
+ returns (mapping(uint => uint) storage a, S memory b, uint[] storage c) { return (a, b, c); }
+ function h(uint[] memory, uint[] storage) public pure returns (S storage x) { return x; }
+ function i(uint[] calldata, uint[] storage) external pure returns (S storage x) {return x; }
+}
+// ----
diff --git a/test/libsolidity/syntaxTests/dataLocations/libraries/library_internal_function_no_data_location.sol b/test/libsolidity/syntaxTests/dataLocations/libraries/library_internal_function_no_data_location.sol
new file mode 100644
index 00000000..68c177a8
--- /dev/null
+++ b/test/libsolidity/syntaxTests/dataLocations/libraries/library_internal_function_no_data_location.sol
@@ -0,0 +1,20 @@
+library L {
+ struct S { uint x; }
+ function g() internal pure returns (uint[2]) {}
+ function h() internal pure returns (uint[]) {}
+ function i() internal pure returns (S) {}
+ function j() internal pure returns (mapping(uint => uint)) {}
+ function gp(uint[2]) internal pure {}
+ function hp(uint[]) internal pure {}
+ function ip(S) internal pure {}
+ function jp(mapping(uint => uint)) internal pure {}
+}
+// ----
+// TypeError: (77-84): Data location must be "storage" or "memory" for return parameter in function, but none was given.
+// TypeError: (129-135): Data location must be "storage" or "memory" for return parameter in function, but none was given.
+// TypeError: (180-181): Data location must be "storage" or "memory" for return parameter in function, but none was given.
+// TypeError: (226-247): Data location must be "storage" or "memory" for return parameter in function, but none was given.
+// TypeError: (268-275): Data location must be "storage" or "memory" for parameter in function, but none was given.
+// TypeError: (310-316): Data location must be "storage" or "memory" for parameter in function, but none was given.
+// TypeError: (351-352): Data location must be "storage" or "memory" for parameter in function, but none was given.
+// TypeError: (387-408): Data location must be "storage" or "memory" for parameter in function, but none was given.
diff --git a/test/libsolidity/syntaxTests/dataLocations/libraries/library_private_function_no_data_location.sol b/test/libsolidity/syntaxTests/dataLocations/libraries/library_private_function_no_data_location.sol
new file mode 100644
index 00000000..35256eae
--- /dev/null
+++ b/test/libsolidity/syntaxTests/dataLocations/libraries/library_private_function_no_data_location.sol
@@ -0,0 +1,20 @@
+library L {
+ struct S { uint x; }
+ function g() private pure returns (uint[2]) {}
+ function h() private pure returns (uint[]) {}
+ function i() private pure returns (S) {}
+ function j() private pure returns (mapping(uint => uint)) {}
+ function gp(uint[2]) private pure {}
+ function hp(uint[]) private pure {}
+ function ip(S) private pure {}
+ function jp(mapping(uint => uint)) private pure {}
+}
+// ----
+// TypeError: (76-83): Data location must be "storage" or "memory" for return parameter in function, but none was given.
+// TypeError: (127-133): Data location must be "storage" or "memory" for return parameter in function, but none was given.
+// TypeError: (177-178): Data location must be "storage" or "memory" for return parameter in function, but none was given.
+// TypeError: (222-243): Data location must be "storage" or "memory" for return parameter in function, but none was given.
+// TypeError: (264-271): Data location must be "storage" or "memory" for parameter in function, but none was given.
+// TypeError: (305-311): Data location must be "storage" or "memory" for parameter in function, but none was given.
+// TypeError: (345-346): Data location must be "storage" or "memory" for parameter in function, but none was given.
+// TypeError: (380-401): Data location must be "storage" or "memory" for parameter in function, but none was given.
diff --git a/test/libsolidity/syntaxTests/dataLocations/libraries/library_public_function_no_data_location.sol b/test/libsolidity/syntaxTests/dataLocations/libraries/library_public_function_no_data_location.sol
new file mode 100644
index 00000000..f8f8dcb2
--- /dev/null
+++ b/test/libsolidity/syntaxTests/dataLocations/libraries/library_public_function_no_data_location.sol
@@ -0,0 +1,19 @@
+library L {
+ struct S { uint x; }
+ function g() private pure returns (uint[2]) {}
+ function h() private pure returns (uint[]) {}
+ function i() private pure returns (S) {}
+ function j() private pure returns (mapping(uint => uint)) {}
+ function gp(uint[2]) private pure {}
+ function hp(uint[]) private pure {}
+ function ip(S) private pure {}
+ function jp(mapping(uint => uint)) private pure {}}
+// ----
+// TypeError: (76-83): Data location must be "storage" or "memory" for return parameter in function, but none was given.
+// TypeError: (127-133): Data location must be "storage" or "memory" for return parameter in function, but none was given.
+// TypeError: (177-178): Data location must be "storage" or "memory" for return parameter in function, but none was given.
+// TypeError: (222-243): Data location must be "storage" or "memory" for return parameter in function, but none was given.
+// TypeError: (264-271): Data location must be "storage" or "memory" for parameter in function, but none was given.
+// TypeError: (305-311): Data location must be "storage" or "memory" for parameter in function, but none was given.
+// TypeError: (345-346): Data location must be "storage" or "memory" for parameter in function, but none was given.
+// TypeError: (380-401): Data location must be "storage" or "memory" for parameter in function, but none 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 6fa0a152..9a6b8b7c 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): Location has to be calldata or storage for external library functions (remove the "memory" keyword).
+// TypeError: (30-35): 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 868c5c30..99b89dfc 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): Variable cannot be declared as "calldata" (remove the "calldata" keyword).
+// TypeError: (30-35): Data location must be "storage" or "memory" for parameter in function, but "calldata" was given.
diff --git a/test/libsolidity/syntaxTests/dataLocations/privateFunction/private_function_parameters_no_data_location.sol b/test/libsolidity/syntaxTests/dataLocations/privateFunction/private_function_parameters_no_data_location.sol
new file mode 100644
index 00000000..fdd5cbaf
--- /dev/null
+++ b/test/libsolidity/syntaxTests/dataLocations/privateFunction/private_function_parameters_no_data_location.sol
@@ -0,0 +1,5 @@
+contract C {
+ function f(uint[]) private pure {}
+}
+// ----
+// TypeError: (28-34): Data location must be "storage" or "memory" for parameter in function, but none was given.
diff --git a/test/libsolidity/syntaxTests/dataLocations/privateFunction/private_function_return_parameters_no_data_location.sol b/test/libsolidity/syntaxTests/dataLocations/privateFunction/private_function_return_parameters_no_data_location.sol
new file mode 100644
index 00000000..65ec1bce
--- /dev/null
+++ b/test/libsolidity/syntaxTests/dataLocations/privateFunction/private_function_return_parameters_no_data_location.sol
@@ -0,0 +1,5 @@
+contract C {
+ function f() private pure returns(uint[]) {}
+}
+// ----
+// TypeError: (51-57): Data location must be "storage" or "memory" for return parameter in function, but none 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 cb00199f..efc92cf3 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): Location has to be memory for publicly visible functions (remove the "storage" or "calldata" keyword).
+// TypeError: (31-36): 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 9380d9df..b954ea78 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): Location has to be memory for publicly visible functions (remove the "storage" or "calldata" keyword).
+// TypeError: (31-36): Data location must be "memory" for parameter in function, but "storage" was given.
diff --git a/test/libsolidity/syntaxTests/dataLocations/publicFunction/public_function_parameters_no_data_location.sol b/test/libsolidity/syntaxTests/dataLocations/publicFunction/public_function_parameters_no_data_location.sol
new file mode 100644
index 00000000..f76bd631
--- /dev/null
+++ b/test/libsolidity/syntaxTests/dataLocations/publicFunction/public_function_parameters_no_data_location.sol
@@ -0,0 +1,5 @@
+contract C {
+ function h(uint[]) public pure {}
+}
+// ----
+// TypeError: (28-34): Data location must be "memory" for parameter in function, but none was given.
diff --git a/test/libsolidity/syntaxTests/dataLocations/publicFunction/public_function_return_parameters_no_data_location.sol b/test/libsolidity/syntaxTests/dataLocations/publicFunction/public_function_return_parameters_no_data_location.sol
new file mode 100644
index 00000000..6b087c34
--- /dev/null
+++ b/test/libsolidity/syntaxTests/dataLocations/publicFunction/public_function_return_parameters_no_data_location.sol
@@ -0,0 +1,5 @@
+contract C {
+ function h() public pure returns(uint[]) {}
+}
+// ----
+// TypeError: (50-56): Data location must be "memory" for return parameter in function, but none was given.
diff --git a/test/libsolidity/syntaxTests/dataLocations/variable_declaration_location_specifier_test_non_reference_type.sol b/test/libsolidity/syntaxTests/dataLocations/variable_declaration_location_specifier_test_non_reference_type.sol
index ac312685..5f6daf68 100644
--- a/test/libsolidity/syntaxTests/dataLocations/variable_declaration_location_specifier_test_non_reference_type.sol
+++ b/test/libsolidity/syntaxTests/dataLocations/variable_declaration_location_specifier_test_non_reference_type.sol
@@ -7,7 +7,7 @@ contract test {
}
}
// ----
-// TypeError: (48-63): Data location can only be given for array or struct types.
-// TypeError: (71-89): Data location can only be given for array or struct types.
-// TypeError: (97-111): Data location can only be given for array or struct types.
-// TypeError: (119-136): Data location can only be given for array or struct types.
+// TypeError: (48-63): Data location can only be specified for array, struct or mapping types, but "storage" was given.
+// TypeError: (71-89): Data location can only be specified for array, struct or mapping types, but "storage" was given.
+// TypeError: (97-111): Data location can only be specified for array, struct or mapping types, but "memory" was given.
+// TypeError: (119-136): Data location can only be specified for array, struct or mapping types, but "memory" was given.
diff --git a/test/libsolidity/syntaxTests/functionTypes/external_function_to_function_type_calldata_parameter.sol b/test/libsolidity/syntaxTests/functionTypes/external_function_to_function_type_calldata_parameter.sol
index eb4f0693..f22afe5e 100644
--- a/test/libsolidity/syntaxTests/functionTypes/external_function_to_function_type_calldata_parameter.sol
+++ b/test/libsolidity/syntaxTests/functionTypes/external_function_to_function_type_calldata_parameter.sol
@@ -3,7 +3,7 @@
// when converting to a function type.
contract C {
function f(function(bytes memory) pure external /*g*/) pure public { }
- function callback(bytes) pure external {}
+ function callback(bytes calldata) pure external {}
function g() view public {
f(this.callback);
}
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/105_constant_input_parameter.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/105_constant_input_parameter.sol
index df47aa6b..ba05fcb3 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/105_constant_input_parameter.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/105_constant_input_parameter.sol
@@ -2,6 +2,6 @@ contract test {
function f(uint[] memory constant a) public { }
}
// ----
-// TypeError: (31-55): Illegal use of "constant" specifier.
+// DeclarationError: (31-55): The "constant" keyword can only be used for state variables.
// TypeError: (31-55): Constants of non-value type not yet implemented.
// TypeError: (31-55): Uninitialized "constant" variable.
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/149_test_for_bug_override_function_with_bytearray_type.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/149_test_for_bug_override_function_with_bytearray_type.sol
index 871af310..bc1c4267 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/149_test_for_bug_override_function_with_bytearray_type.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/149_test_for_bug_override_function_with_bytearray_type.sol
@@ -1,8 +1,8 @@
contract Vehicle {
- function f(bytes) external returns (uint256 r) {r = 1;}
+ function f(bytes calldata) external returns (uint256 r) {r = 1;}
}
contract Bike is Vehicle {
- function f(bytes) external returns (uint256 r) {r = 42;}
+ function f(bytes calldata) external returns (uint256 r) {r = 42;}
}
// ----
-// Warning: (23-78): Function state mutability can be restricted to pure
+// Warning: (23-87): Function state mutability can be restricted to pure
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/204_overwrite_memory_location_external.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/204_overwrite_memory_location_external.sol
index 16d71ca4..22d515ea 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/204_overwrite_memory_location_external.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/204_overwrite_memory_location_external.sol
@@ -2,4 +2,4 @@ contract C {
function f(uint[] memory a) external {}
}
// ----
-// TypeError: (28-43): Location has to be calldata for external functions (remove the "memory" or "storage" keyword).
+// TypeError: (28-43): Data location must be "calldata" for parameter in external function, but "memory" was given.
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/205_overwrite_storage_location_external.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/205_overwrite_storage_location_external.sol
index 99c9827d..3825809c 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/205_overwrite_storage_location_external.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/205_overwrite_storage_location_external.sol
@@ -2,4 +2,4 @@ contract C {
function f(uint[] storage a) external {}
}
// ----
-// TypeError: (28-44): Location has to be calldata for external functions (remove the "memory" or "storage" keyword).
+// TypeError: (28-44): Data location must be "calldata" for parameter in external function, but "storage" was given.
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/224_string_bytes_conversion.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/224_string_bytes_conversion.sol
index 7b953abb..ed6a9b37 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/224_string_bytes_conversion.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/224_string_bytes_conversion.sol
@@ -1,17 +1,11 @@
contract Test {
string s;
bytes b;
- function h(string _s) external { bytes(_s).length; }
- function i(string memory _s) internal { bytes(_s).length; }
- function j() internal { bytes(s).length; }
- function k(bytes _b) external { string(_b); }
- function l(bytes memory _b) internal { string(_b); }
- function m() internal { string(b); }
+ function h(string calldata _s) pure external { bytes(_s).length; }
+ function i(string memory _s) pure internal { bytes(_s).length; }
+ function j() view internal { bytes(s).length; }
+ function k(bytes calldata _b) pure external { string(_b); }
+ function l(bytes memory _b) pure internal { string(_b); }
+ function m() view internal { string(b); }
}
// ----
-// Warning: (47-99): Function state mutability can be restricted to pure
-// Warning: (104-163): Function state mutability can be restricted to pure
-// Warning: (168-210): Function state mutability can be restricted to view
-// Warning: (215-260): Function state mutability can be restricted to pure
-// Warning: (265-317): Function state mutability can be restricted to pure
-// Warning: (322-358): Function state mutability can be restricted to view
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/385_inline_assembly_calldata_variables.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/385_inline_assembly_calldata_variables.sol
index 9e324ce1..952b9af6 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/385_inline_assembly_calldata_variables.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/385_inline_assembly_calldata_variables.sol
@@ -1,9 +1,9 @@
contract C {
- function f(bytes bytesAsCalldata) external {
+ function f(bytes calldata bytesAsCalldata) external {
assembly {
let x := bytesAsCalldata
}
}
}
// ----
-// TypeError: (102-117): Call data elements cannot be accessed directly. Copy to a local variable first or use "calldataload" or "calldatacopy" with manually determined offsets and sizes.
+// TypeError: (111-126): Call data elements cannot be accessed directly. Copy to a local variable first or use "calldataload" or "calldatacopy" with manually determined offsets and sizes.
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/471_unspecified_storage_fail.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/471_unspecified_storage_fail.sol
index 6e401920..de42ebd7 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/471_unspecified_storage_fail.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/471_unspecified_storage_fail.sol
@@ -9,5 +9,5 @@ contract C {
}
}
// ----
-// TypeError: (104-107): Data location must be specified as either "memory" or "storage".
-// TypeError: (123-131): Data location must be specified as either "memory" or "storage".
+// TypeError: (104-107): Data location must be "storage" or "memory" for variable, but none was given.
+// TypeError: (123-131): Data location must be "storage" or "memory" for variable, but none was given.
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/473_storage_location_non_array_or_struct_disallowed.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/473_storage_location_non_array_or_struct_disallowed.sol
index 6c9f50af..fe846aa0 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/473_storage_location_non_array_or_struct_disallowed.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/473_storage_location_non_array_or_struct_disallowed.sol
@@ -2,4 +2,4 @@ contract C {
function f(uint storage a) public { }
}
// ----
-// TypeError: (28-42): Data location can only be given for array or struct types.
+// TypeError: (28-42): Data location can only be specified for array, struct or mapping types, but "storage" was given.
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/474_storage_location_non_array_or_struct_disallowed_is_not_fatal.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/474_storage_location_non_array_or_struct_disallowed_is_not_fatal.sol
index a2f47407..e74db375 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/474_storage_location_non_array_or_struct_disallowed_is_not_fatal.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/474_storage_location_non_array_or_struct_disallowed_is_not_fatal.sol
@@ -4,4 +4,4 @@ contract C {
}
}
// ----
-// TypeError: (28-42): Data location can only be given for array or struct types.
+// TypeError: (28-42): Data location can only be specified for array, struct or mapping types, but "storage" was given.
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/476_too_large_arrays_for_calldata_external.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/476_too_large_arrays_for_calldata_external.sol
index de8b7501..78c38aaf 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/476_too_large_arrays_for_calldata_external.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/476_too_large_arrays_for_calldata_external.sol
@@ -1,6 +1,6 @@
contract C {
- function f(uint[85678901234] a) pure external {
+ function f(uint[85678901234] calldata a) pure external {
}
}
// ----
-// TypeError: (28-47): Array is too large to be encoded.
+// TypeError: (28-56): Array is too large to be encoded.
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/constant_mapping.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/constant_mapping.sol
new file mode 100644
index 00000000..61c0cc17
--- /dev/null
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/constant_mapping.sol
@@ -0,0 +1,8 @@
+contract C {
+ // This should probably have a better error message at some point.
+ // Constant mappings should not be possible in general.
+ mapping(uint => uint) constant x;
+}
+// ----
+// TypeError: (148-180): Constants of non-value type not yet implemented.
+// TypeError: (148-180): Uninitialized "constant" variable.
diff --git a/test/libsolidity/syntaxTests/parsing/location_specifiers_for_params.sol b/test/libsolidity/syntaxTests/parsing/location_specifiers_for_params.sol
index 72b6ce84..bf78e59c 100644
--- a/test/libsolidity/syntaxTests/parsing/location_specifiers_for_params.sol
+++ b/test/libsolidity/syntaxTests/parsing/location_specifiers_for_params.sol
@@ -2,4 +2,6 @@ contract Foo {
function f(uint[] storage constant x, uint[] memory y) internal { }
}
// ----
-// TypeError: (30-55): Data location has to be "memory" (or unspecified) for constants.
+// DeclarationError: (30-55): The "constant" keyword can only be used for state variables.
+// TypeError: (30-55): Constants of non-value type not yet implemented.
+// TypeError: (30-55): Uninitialized "constant" variable.
diff --git a/test/libsolidity/syntaxTests/types/mapping/argument_external.sol b/test/libsolidity/syntaxTests/types/mapping/argument_external.sol
index 0354893f..02beefec 100644
--- a/test/libsolidity/syntaxTests/types/mapping/argument_external.sol
+++ b/test/libsolidity/syntaxTests/types/mapping/argument_external.sol
@@ -3,5 +3,4 @@ contract C {
}
}
// ----
-// TypeError: (28-49): Type is required to live outside storage.
-// TypeError: (28-49): Internal or recursive type is not allowed for public or external functions.
+// TypeError: (28-49): 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 e4121c7f..3939cf26 100644
--- a/test/libsolidity/syntaxTests/types/mapping/argument_public.sol
+++ b/test/libsolidity/syntaxTests/types/mapping/argument_public.sol
@@ -3,5 +3,4 @@ contract C {
}
}
// ----
-// TypeError: (28-49): Type is required to live outside storage.
-// TypeError: (28-49): Internal or recursive type is not allowed for public or external functions.
+// TypeError: (28-49): 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 8dea6907..ef0046d4 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): Location has to be calldata for external functions (remove the "memory" or "storage" keyword).
+// TypeError: (28-51): 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 69dcec01..fb3f25a4 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): Location has to be memory for publicly visible functions (remove the "storage" or "calldata" keyword).
+// TypeError: (28-51): 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 7fe74fb6..349a4f97 100644
--- a/test/libsolidity/syntaxTests/types/mapping/function_type_argument_external.sol
+++ b/test/libsolidity/syntaxTests/types/mapping/function_type_argument_external.sol
@@ -3,4 +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.
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 f0f8dea6..108d9861 100644
--- a/test/libsolidity/syntaxTests/types/mapping/function_type_return_external.sol
+++ b/test/libsolidity/syntaxTests/types/mapping/function_type_return_external.sol
@@ -3,4 +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.
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
new file mode 100644
index 00000000..9b96fd3a
--- /dev/null
+++ b/test/libsolidity/syntaxTests/types/mapping/mapping_array_data_location_function_param_external.sol
@@ -0,0 +1,6 @@
+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.
diff --git a/test/libsolidity/syntaxTests/types/mapping/mapping_array_return_external.sol b/test/libsolidity/syntaxTests/types/mapping/mapping_array_return_external.sol
index dbe030fb..fe021bd0 100644
--- a/test/libsolidity/syntaxTests/types/mapping/mapping_array_return_external.sol
+++ b/test/libsolidity/syntaxTests/types/mapping/mapping_array_return_external.sol
@@ -3,4 +3,4 @@ contract C {
}
}
// ----
-// TypeError: (53-84): Location has to be memory for publicly visible functions (remove the "storage" or "calldata" keyword).
+// TypeError: (53-84): Data location must be "memory" for return parameter in function, but "storage" was given.
diff --git a/test/libsolidity/syntaxTests/types/mapping/mapping_array_return_public.sol b/test/libsolidity/syntaxTests/types/mapping/mapping_array_return_public.sol
index 7dfecf19..1eb9d03b 100644
--- a/test/libsolidity/syntaxTests/types/mapping/mapping_array_return_public.sol
+++ b/test/libsolidity/syntaxTests/types/mapping/mapping_array_return_public.sol
@@ -3,4 +3,4 @@ contract C {
}
}
// ----
-// TypeError: (51-82): Location has to be memory for publicly visible functions (remove the "storage" or "calldata" keyword).
+// TypeError: (51-82): Data location must be "memory" for return parameter in function, but "storage" was given.
diff --git a/test/libsolidity/syntaxTests/types/mapping/mapping_data_location_calldata.sol b/test/libsolidity/syntaxTests/types/mapping/mapping_data_location_calldata.sol
index c73c7f32..deff7c14 100644
--- a/test/libsolidity/syntaxTests/types/mapping/mapping_data_location_calldata.sol
+++ b/test/libsolidity/syntaxTests/types/mapping/mapping_data_location_calldata.sol
@@ -6,4 +6,4 @@ contract c {
}
}
// ----
-// TypeError: (81-113): Data location for mappings must be specified as "storage".
+// TypeError: (81-113): Data location must be "storage" for variable, but "calldata" was given.
diff --git a/test/libsolidity/syntaxTests/types/mapping/mapping_data_location_default.sol b/test/libsolidity/syntaxTests/types/mapping/mapping_data_location_default.sol
index 85531ae1..e5253f00 100644
--- a/test/libsolidity/syntaxTests/types/mapping/mapping_data_location_default.sol
+++ b/test/libsolidity/syntaxTests/types/mapping/mapping_data_location_default.sol
@@ -6,4 +6,4 @@ contract c {
}
}
// ----
-// TypeError: (81-104): Data location for mappings must be specified as "storage".
+// TypeError: (81-104): Data location must be "storage" for variable, but none was given.
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
new file mode 100644
index 00000000..adcfee2a
--- /dev/null
+++ b/test/libsolidity/syntaxTests/types/mapping/mapping_data_location_function_param_external.sol
@@ -0,0 +1,6 @@
+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.
diff --git a/test/libsolidity/syntaxTests/types/mapping/mapping_data_location_function_param_internal.sol b/test/libsolidity/syntaxTests/types/mapping/mapping_data_location_function_param_internal.sol
new file mode 100644
index 00000000..17f2f712
--- /dev/null
+++ b/test/libsolidity/syntaxTests/types/mapping/mapping_data_location_function_param_internal.sol
@@ -0,0 +1,4 @@
+contract c {
+ function f4(mapping(uint => uint) memory) pure internal {}
+}
+// ----
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
new file mode 100644
index 00000000..e98c1fe8
--- /dev/null
+++ b/test/libsolidity/syntaxTests/types/mapping/mapping_data_location_function_param_public.sol
@@ -0,0 +1,6 @@
+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.
diff --git a/test/libsolidity/syntaxTests/types/mapping/mapping_data_location_memory.sol b/test/libsolidity/syntaxTests/types/mapping/mapping_data_location_memory.sol
index 7151e887..600ae669 100644
--- a/test/libsolidity/syntaxTests/types/mapping/mapping_data_location_memory.sol
+++ b/test/libsolidity/syntaxTests/types/mapping/mapping_data_location_memory.sol
@@ -6,4 +6,4 @@ contract c {
}
}
// ----
-// TypeError: (81-111): Data location for mappings must be specified as "storage".
+// TypeError: (81-111): Data location must be "storage" for variable, but "memory" was given.
diff --git a/test/libsolidity/syntaxTests/types/mapping/mapping_return_external.sol b/test/libsolidity/syntaxTests/types/mapping/mapping_return_external.sol
index 85121241..17e646ce 100644
--- a/test/libsolidity/syntaxTests/types/mapping/mapping_return_external.sol
+++ b/test/libsolidity/syntaxTests/types/mapping/mapping_return_external.sol
@@ -3,5 +3,4 @@ contract C {
}
}
// ----
-// TypeError: (53-82): Type is required to live outside storage.
-// TypeError: (53-82): Internal or recursive type is not allowed for public or external functions.
+// TypeError: (53-82): Data location must be "memory" for return parameter in function, but "storage" was given.
diff --git a/test/libsolidity/syntaxTests/types/mapping/mapping_return_public.sol b/test/libsolidity/syntaxTests/types/mapping/mapping_return_public.sol
index 383fa797..cf5ec4ff 100644
--- a/test/libsolidity/syntaxTests/types/mapping/mapping_return_public.sol
+++ b/test/libsolidity/syntaxTests/types/mapping/mapping_return_public.sol
@@ -3,5 +3,4 @@ contract C {
}
}
// ----
-// TypeError: (51-80): Type is required to live outside storage.
-// TypeError: (51-80): Internal or recursive type is not allowed for public or external functions.
+// TypeError: (51-80): Data location must be "memory" for return parameter in function, but "storage" was given.
diff --git a/test/libsolidity/syntaxTests/types/mapping/mapping_return_public_memory.sol b/test/libsolidity/syntaxTests/types/mapping/mapping_return_public_memory.sol
new file mode 100644
index 00000000..35c3abc9
--- /dev/null
+++ b/test/libsolidity/syntaxTests/types/mapping/mapping_return_public_memory.sol
@@ -0,0 +1,7 @@
+contract C {
+ function f() public pure returns (mapping(uint=>uint) memory m) {
+ }
+}
+// ----
+// TypeError: (51-79): Type is required to live outside storage.
+// TypeError: (51-79): Internal or recursive type is not allowed for public or external functions.