aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Changelog.md1
-rw-r--r--docs/common-patterns.rst2
-rw-r--r--libsolidity/analysis/TypeChecker.cpp11
-rw-r--r--test/libsolidity/syntaxTests/types/encoding_fractional.sol7
-rw-r--r--test/libsolidity/syntaxTests/types/encoding_fractional_abiencoderv2.sol9
-rw-r--r--test/libsolidity/syntaxTests/types/encoding_packed_fractional.sol8
-rw-r--r--test/libsolidity/syntaxTests/types/encoding_packed_fractional_abiencoderv2.sol10
7 files changed, 46 insertions, 2 deletions
diff --git a/Changelog.md b/Changelog.md
index 79ec90a0..dc6beb44 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -8,6 +8,7 @@ Compiler Features:
Bugfixes:
+ * TypeChecker: Return type error if fixed point encoding is attempted instead of throwing ``UnimplementedFeatureError``.
* Yul: Check that arguments to ``dataoffset`` and ``datasize`` are literals at parse time and properly take this into account in the optimizer.
* Yul: Parse number literals for detecting duplicate switch cases.
* Yul: Require switch cases to have the same type.
diff --git a/docs/common-patterns.rst b/docs/common-patterns.rst
index 3704b730..65bf7f44 100644
--- a/docs/common-patterns.rst
+++ b/docs/common-patterns.rst
@@ -117,7 +117,7 @@ to read the data, so will everyone else.
You can restrict read access to your contract's state
by **other contracts**. That is actually the default
-unless you declare make your state variables ``public``.
+unless you declare your state variables ``public``.
Furthermore, you can restrict who can make modifications
to your contract's state or call your contract's
diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp
index 507a2c94..7fa9933c 100644
--- a/libsolidity/analysis/TypeChecker.cpp
+++ b/libsolidity/analysis/TypeChecker.cpp
@@ -1482,7 +1482,16 @@ void TypeChecker::typeCheckABIEncodeFunctions(
if (argType->category() == Type::Category::RationalNumber)
{
- if (!argType->mobileType())
+ auto const& rationalType = dynamic_cast<RationalNumberType const&>(*argType);
+ if (rationalType.isFractional())
+ {
+ m_errorReporter.typeError(
+ arguments[i]->location(),
+ "Fractional numbers cannot yet be encoded."
+ );
+ continue;
+ }
+ else if (!argType->mobileType())
{
m_errorReporter.typeError(
arguments[i]->location(),
diff --git a/test/libsolidity/syntaxTests/types/encoding_fractional.sol b/test/libsolidity/syntaxTests/types/encoding_fractional.sol
new file mode 100644
index 00000000..16c76d9a
--- /dev/null
+++ b/test/libsolidity/syntaxTests/types/encoding_fractional.sol
@@ -0,0 +1,7 @@
+contract C {
+ function f1() public pure returns (bytes memory) {
+ return abi.encode(0.1, 1);
+ }
+}
+// ----
+// TypeError: (92-95): Fractional numbers cannot yet be encoded.
diff --git a/test/libsolidity/syntaxTests/types/encoding_fractional_abiencoderv2.sol b/test/libsolidity/syntaxTests/types/encoding_fractional_abiencoderv2.sol
new file mode 100644
index 00000000..80efa9c5
--- /dev/null
+++ b/test/libsolidity/syntaxTests/types/encoding_fractional_abiencoderv2.sol
@@ -0,0 +1,9 @@
+pragma experimental ABIEncoderV2;
+contract C {
+ function f1() public pure returns (bytes memory) {
+ return abi.encode(0.1, 1);
+ }
+}
+// ----
+// Warning: (0-33): Experimental features are turned on. Do not use experimental features on live deployments.
+// TypeError: (126-129): Fractional numbers cannot yet be encoded.
diff --git a/test/libsolidity/syntaxTests/types/encoding_packed_fractional.sol b/test/libsolidity/syntaxTests/types/encoding_packed_fractional.sol
new file mode 100644
index 00000000..71080cb0
--- /dev/null
+++ b/test/libsolidity/syntaxTests/types/encoding_packed_fractional.sol
@@ -0,0 +1,8 @@
+contract C {
+ function f1() public pure returns (bytes memory) {
+ return abi.encodePacked(0.1, 1);
+ }
+}
+// ----
+// TypeError: (98-101): Fractional numbers cannot yet be encoded.
+// TypeError: (103-104): Cannot perform packed encoding for a literal. Please convert it to an explicit type first.
diff --git a/test/libsolidity/syntaxTests/types/encoding_packed_fractional_abiencoderv2.sol b/test/libsolidity/syntaxTests/types/encoding_packed_fractional_abiencoderv2.sol
new file mode 100644
index 00000000..e82c3c9a
--- /dev/null
+++ b/test/libsolidity/syntaxTests/types/encoding_packed_fractional_abiencoderv2.sol
@@ -0,0 +1,10 @@
+pragma experimental ABIEncoderV2;
+contract C {
+ function f1() public pure returns (bytes memory) {
+ return abi.encodePacked(0.1, 1);
+ }
+}
+// ----
+// Warning: (0-33): Experimental features are turned on. Do not use experimental features on live deployments.
+// TypeError: (132-135): Fractional numbers cannot yet be encoded.
+// TypeError: (137-138): Cannot perform packed encoding for a literal. Please convert it to an explicit type first.