diff options
author | Alex Beregszaszi <alex@rtfs.hu> | 2018-04-21 00:32:50 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-04-21 00:32:50 +0800 |
commit | 72b0412ef68f332c9dcdc66b554aabc3fb69ba59 (patch) | |
tree | 48c0402a2b019d8fd3670539ffa10f93188b8468 | |
parent | 676732776eaf087a17b79bc97213c84746dabd09 (diff) | |
parent | 65345162b4217c7d3f9035ee8d2f4c3fa2ecb72a (diff) | |
download | dexon-solidity-72b0412ef68f332c9dcdc66b554aabc3fb69ba59.tar.gz dexon-solidity-72b0412ef68f332c9dcdc66b554aabc3fb69ba59.tar.zst dexon-solidity-72b0412ef68f332c9dcdc66b554aabc3fb69ba59.zip |
Merge pull request #3956 from ethereum/tight-pack-hash
Make literals an error for tight packing (experimental 0.5.0)
-rw-r--r-- | Changelog.md | 2 | ||||
-rw-r--r-- | libsolidity/analysis/TypeChecker.cpp | 26 | ||||
-rw-r--r-- | test/libsolidity/syntaxTests/tight_packing_literals_050.sol | 26 | ||||
-rw-r--r-- | test/libsolidity/syntaxTests/tight_packing_literals_fine.sol | 17 |
4 files changed, 59 insertions, 12 deletions
diff --git a/Changelog.md b/Changelog.md index 207e2c21..0fbce7c5 100644 --- a/Changelog.md +++ b/Changelog.md @@ -2,7 +2,7 @@ Features: * Optimizer: Remove unnecessary masking of the result of known short instructions (``ADDRESS``, ``CALLER``, ``ORIGIN`` and ``COINBASE``). - + * Type Checker: Make literals (without explicit type casting) an error for tight packing as experimental 0.5.0 feature. Bugfixes: diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp index 72d29762..66b0af58 100644 --- a/libsolidity/analysis/TypeChecker.cpp +++ b/libsolidity/analysis/TypeChecker.cpp @@ -1648,6 +1648,8 @@ bool TypeChecker::visit(FunctionCall const& _functionCall) else _functionCall.annotation().type = make_shared<TupleType>(returnTypes); + bool const v050 = m_scope->sourceUnit().annotation().experimentalFeatures.count(ExperimentalFeature::V050); + if (auto functionName = dynamic_cast<Identifier const*>(&_functionCall.expression())) { if (functionName->name() == "sha3" && functionType->kind() == FunctionType::Kind::SHA3) @@ -1674,14 +1676,22 @@ bool TypeChecker::visit(FunctionCall const& _functionCall) { /* If no mobile type is available an error will be raised elsewhere. */ if (literal->mobileType()) - m_errorReporter.warning( - arguments[i]->location(), - "The type of \"" + - argType->toString() + - "\" was inferred as " + - literal->mobileType()->toString() + - ". This is probably not desired. Use an explicit type to silence this warning." - ); + { + if (v050) + m_errorReporter.typeError( + arguments[i]->location(), + "Cannot perform packed encoding for a literal. Please convert it to an explicit type first." + ); + else + m_errorReporter.warning( + arguments[i]->location(), + "The type of \"" + + argType->toString() + + "\" was inferred as " + + literal->mobileType()->toString() + + ". This is probably not desired. Use an explicit type to silence this warning." + ); + } } } } diff --git a/test/libsolidity/syntaxTests/tight_packing_literals_050.sol b/test/libsolidity/syntaxTests/tight_packing_literals_050.sol new file mode 100644 index 00000000..617af543 --- /dev/null +++ b/test/libsolidity/syntaxTests/tight_packing_literals_050.sol @@ -0,0 +1,26 @@ +pragma experimental "v0.5.0"; +contract C { + function f() pure public returns (bytes32) { + return keccak256(1); + } + function g() pure public returns (bytes32) { + return sha3(1); + } + function h() pure public returns (bytes32) { + return sha256(1); + } + function j() pure public returns (bytes32) { + return ripemd160(1); + } + function k() pure public returns (bytes) { + return abi.encodePacked(1); + } +} + +// ---- +// TypeError: (117-118): Cannot perform packed encoding for a literal. Please convert it to an explicit type first. +// Warning: (191-198): "sha3" has been deprecated in favour of "keccak256" +// TypeError: (196-197): Cannot perform packed encoding for a literal. Please convert it to an explicit type first. +// TypeError: (277-278): Cannot perform packed encoding for a literal. Please convert it to an explicit type first. +// TypeError: (361-362): Cannot perform packed encoding for a literal. Please convert it to an explicit type first. +// TypeError: (450-451): Cannot perform packed encoding for a literal. Please convert it to an explicit type first. diff --git a/test/libsolidity/syntaxTests/tight_packing_literals_fine.sol b/test/libsolidity/syntaxTests/tight_packing_literals_fine.sol index 46407f71..81e69eb4 100644 --- a/test/libsolidity/syntaxTests/tight_packing_literals_fine.sol +++ b/test/libsolidity/syntaxTests/tight_packing_literals_fine.sol @@ -2,10 +2,21 @@ contract C { function f() pure public returns (bytes32) { return keccak256(uint8(1)); } - function g() pure public returns (bytes) { - return abi.encode(1); + function g() pure public returns (bytes32) { + return sha3(uint8(1)); + } + function h() pure public returns (bytes32) { + return sha256(uint8(1)); + } + function j() pure public returns (bytes32) { + return ripemd160(uint8(1)); } - function h() pure public returns (bytes) { + function k() pure public returns (bytes) { return abi.encodePacked(uint8(1)); } + function l() pure public returns (bytes) { + return abi.encode(1); + } } +// ---- +// Warning: (168-182): "sha3" has been deprecated in favour of "keccak256" |