aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFederico Bond <federicobond@gmail.com>2018-01-04 18:24:39 +0800
committerchriseth <chris@ethereum.org>2018-01-04 18:24:39 +0800
commita0771691ff1a8ea8b2dda07ff50e48fc81a2a705 (patch)
treee7ffc52054042274dceb8702f609d1a448173cac
parentfdbe78a7693aef51a69ec4399de4f9b919ae1675 (diff)
downloaddexon-solidity-a0771691ff1a8ea8b2dda07ff50e48fc81a2a705.tar.gz
dexon-solidity-a0771691ff1a8ea8b2dda07ff50e48fc81a2a705.tar.zst
dexon-solidity-a0771691ff1a8ea8b2dda07ff50e48fc81a2a705.zip
Improve error message for wrong struct initialization (#3359)
-rw-r--r--Changelog.md1
-rw-r--r--libsolidity/analysis/TypeChecker.cpp6
-rw-r--r--test/libsolidity/SolidityNameAndTypeResolution.cpp14
3 files changed, 20 insertions, 1 deletions
diff --git a/Changelog.md b/Changelog.md
index 361fee9c..026b9118 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -9,6 +9,7 @@ Bugfixes:
* Standard JSON: Populate the ``sourceLocation`` field in the error list.
* Type Checker: Suggest the experimental ABI encoder if using ``struct``s as function parameters
(instead of an internal compiler error).
+ * Type Checker: Improve error message for wrong struct initialization.
### 0.4.19 (2017-11-30)
diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp
index 090e5159..75d71925 100644
--- a/libsolidity/analysis/TypeChecker.cpp
+++ b/libsolidity/analysis/TypeChecker.cpp
@@ -1551,8 +1551,12 @@ bool TypeChecker::visit(FunctionCall const& _functionCall)
if (!functionType->takesArbitraryParameters() && parameterTypes.size() != arguments.size())
{
+ bool isStructConstructorCall = _functionCall.annotation().kind == FunctionCallKind::StructConstructorCall;
+
string msg =
- "Wrong argument count for function call: " +
+ "Wrong argument count for " +
+ string(isStructConstructorCall ? "struct constructor" : "function call") +
+ ": " +
toString(arguments.size()) +
" arguments given but expected " +
toString(parameterTypes.size()) +
diff --git a/test/libsolidity/SolidityNameAndTypeResolution.cpp b/test/libsolidity/SolidityNameAndTypeResolution.cpp
index 8f58dcb1..eb6a440e 100644
--- a/test/libsolidity/SolidityNameAndTypeResolution.cpp
+++ b/test/libsolidity/SolidityNameAndTypeResolution.cpp
@@ -3608,6 +3608,20 @@ BOOST_AUTO_TEST_CASE(invalid_args_creating_memory_array)
CHECK_ERROR(text, TypeError, "Wrong argument count for function call: 0 arguments given but expected 1.");
}
+BOOST_AUTO_TEST_CASE(invalid_args_creating_struct)
+{
+ char const* text = R"(
+ contract C {
+ struct S { uint a; uint b; }
+
+ function f() public {
+ var s = S({a: 1});
+ }
+ }
+ )";
+ CHECK_ERROR(text, TypeError, "Wrong argument count for struct constructor: 1 arguments given but expected 2.");
+}
+
BOOST_AUTO_TEST_CASE(function_overload_array_type)
{
char const* text = R"(