aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2017-06-23 17:56:24 +0800
committerGitHub <noreply@github.com>2017-06-23 17:56:24 +0800
commit1f7697eee318445e770d4e634477c38685af5110 (patch)
tree329139d9665742e7fb99661d9b0fd1129a7f7198
parentb00d7a6911e5378d8207a07e7df1ffaf23419c8c (diff)
parent0fb1621a983025d41ef05d1156bc167ce4490259 (diff)
downloaddexon-solidity-1f7697eee318445e770d4e634477c38685af5110.tar.gz
dexon-solidity-1f7697eee318445e770d4e634477c38685af5110.tar.zst
dexon-solidity-1f7697eee318445e770d4e634477c38685af5110.zip
Merge pull request #2448 from federicobond/constant-addresses
Fix address literals not being treated as compile-time constants
-rw-r--r--Changelog.md1
-rw-r--r--libsolidity/analysis/TypeChecker.cpp10
-rw-r--r--test/libsolidity/SolidityNameAndTypeResolution.cpp10
3 files changed, 16 insertions, 5 deletions
diff --git a/Changelog.md b/Changelog.md
index 6f0d76d6..4dc79827 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -13,6 +13,7 @@ Features:
* Code Generator: Added the Whiskers template system.
Bugfixes:
+ * Type Checker: Fix address literals not being treated as compile-time constants.
* Type Checker: Make UTF8-validation a bit more sloppy to include more valid sequences.
* Fixed crash concerning non-callable types.
* Unused variable warnings no longer issued for variables used inside inline assembly.
diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp
index 4194e1c2..40853608 100644
--- a/libsolidity/analysis/TypeChecker.cpp
+++ b/libsolidity/analysis/TypeChecker.cpp
@@ -1726,10 +1726,7 @@ void TypeChecker::endVisit(Literal const& _literal)
if (_literal.looksLikeAddress())
{
if (_literal.passesAddressChecksum())
- {
_literal.annotation().type = make_shared<IntegerType>(0, IntegerType::Modifier::Address);
- return;
- }
else
m_errorReporter.warning(
_literal.location(),
@@ -1737,10 +1734,13 @@ void TypeChecker::endVisit(Literal const& _literal)
"If this is not used as an address, please prepend '00'."
);
}
- _literal.annotation().type = Type::forLiteral(_literal);
- _literal.annotation().isPure = true;
+ if (!_literal.annotation().type)
+ _literal.annotation().type = Type::forLiteral(_literal);
+
if (!_literal.annotation().type)
m_errorReporter.fatalTypeError(_literal.location(), "Invalid literal value.");
+
+ _literal.annotation().isPure = true;
}
bool TypeChecker::contractDependenciesAreCyclic(
diff --git a/test/libsolidity/SolidityNameAndTypeResolution.cpp b/test/libsolidity/SolidityNameAndTypeResolution.cpp
index c4b1250f..9775d6d0 100644
--- a/test/libsolidity/SolidityNameAndTypeResolution.cpp
+++ b/test/libsolidity/SolidityNameAndTypeResolution.cpp
@@ -2284,6 +2284,16 @@ BOOST_AUTO_TEST_CASE(constant_struct)
CHECK_ERROR(text, TypeError, "implemented");
}
+BOOST_AUTO_TEST_CASE(address_is_constant)
+{
+ char const* text = R"(
+ contract C {
+ address constant x = 0x1212121212121212121212121212121212121212;
+ }
+ )";
+ CHECK_SUCCESS_NO_WARNINGS(text);
+}
+
BOOST_AUTO_TEST_CASE(uninitialized_const_variable)
{
char const* text = R"(