aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2019-01-21 19:03:32 +0800
committerGitHub <noreply@github.com>2019-01-21 19:03:32 +0800
commitea790e3b7ed445ef632ea76958538c1d084001f0 (patch)
tree7e39db9cd9aef1f031f863635ca466bef8a74d59
parentda73e253988788ee0733425174e99520b320a7fd (diff)
parent610ef9f1999c1dd201a121334394b10f6ac54bc7 (diff)
downloaddexon-solidity-ea790e3b7ed445ef632ea76958538c1d084001f0.tar
dexon-solidity-ea790e3b7ed445ef632ea76958538c1d084001f0.tar.gz
dexon-solidity-ea790e3b7ed445ef632ea76958538c1d084001f0.tar.bz2
dexon-solidity-ea790e3b7ed445ef632ea76958538c1d084001f0.tar.lz
dexon-solidity-ea790e3b7ed445ef632ea76958538c1d084001f0.tar.xz
dexon-solidity-ea790e3b7ed445ef632ea76958538c1d084001f0.tar.zst
dexon-solidity-ea790e3b7ed445ef632ea76958538c1d084001f0.zip
Merge pull request #5806 from ethereum/calldataStructs
Disallow calldata structs.
-rw-r--r--Changelog.md3
-rw-r--r--libsolidity/analysis/TypeChecker.cpp10
-rw-r--r--test/libsolidity/SolidityNameAndTypeResolution.cpp14
-rw-r--r--test/libsolidity/syntaxTests/inheritance/override/calldata_memory_struct.sol4
-rw-r--r--test/libsolidity/syntaxTests/structs/array_calldata.sol10
-rw-r--r--test/libsolidity/syntaxTests/structs/calldata.sol8
6 files changed, 44 insertions, 5 deletions
diff --git a/Changelog.md b/Changelog.md
index 0562426d..56577f63 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -10,7 +10,8 @@ Compiler Features:
Bugfixes:
* Emscripten: Split simplification rule initialization up further to work around issues with soljson.js in some browsers.
- * TypeChecker: Return type error if fixed point encoding is attempted instead of throwing ``UnimplementedFeatureError``.
+ * Type Checker: Disallow calldata structs until implemented.
+ * Type Checker: 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/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp
index f1a5f7ce..6d887c45 100644
--- a/libsolidity/analysis/TypeChecker.cpp
+++ b/libsolidity/analysis/TypeChecker.cpp
@@ -359,6 +359,16 @@ bool TypeChecker::visit(FunctionDefinition const& _function)
};
for (ASTPointer<VariableDeclaration> const& var: _function.parameters())
{
+ TypePointer baseType = type(*var);
+ while (auto const* arrayType = dynamic_cast<ArrayType const*>(baseType.get()))
+ baseType = arrayType->baseType();
+
+ if (
+ !m_scope->isInterface() &&
+ baseType->category() == Type::Category::Struct &&
+ baseType->dataStoredIn(DataLocation::CallData)
+ )
+ m_errorReporter.typeError(var->location(), "Calldata structs are not yet supported.");
checkArgumentAndReturnParameter(*var);
var->accept(*this);
}
diff --git a/test/libsolidity/SolidityNameAndTypeResolution.cpp b/test/libsolidity/SolidityNameAndTypeResolution.cpp
index 774f67fe..0470cf4c 100644
--- a/test/libsolidity/SolidityNameAndTypeResolution.cpp
+++ b/test/libsolidity/SolidityNameAndTypeResolution.cpp
@@ -198,7 +198,7 @@ BOOST_AUTO_TEST_CASE(enum_external_type)
}
}
-BOOST_AUTO_TEST_CASE(external_structs)
+BOOST_AUTO_TEST_CASE(external_struct_signatures)
{
char const* text = R"(
pragma experimental ABIEncoderV2;
@@ -213,7 +213,10 @@ BOOST_AUTO_TEST_CASE(external_structs)
function i(Nested[] calldata) external {}
}
)";
- SourceUnit const* sourceUnit = parseAndAnalyse(text);
+ // Ignore analysis errors. This test only checks that correct signatures
+ // are generated for external structs, but they are not yet supported
+ // in code generation and therefore cause an error in the TypeChecker.
+ SourceUnit const* sourceUnit = parseAnalyseAndReturnError(text, false, true, true).first;
for (ASTPointer<ASTNode> const& node: sourceUnit->nodes())
if (ContractDefinition* contract = dynamic_cast<ContractDefinition*>(node.get()))
{
@@ -226,7 +229,7 @@ BOOST_AUTO_TEST_CASE(external_structs)
}
}
-BOOST_AUTO_TEST_CASE(external_structs_in_libraries)
+BOOST_AUTO_TEST_CASE(external_struct_signatures_in_libraries)
{
char const* text = R"(
pragma experimental ABIEncoderV2;
@@ -241,7 +244,10 @@ BOOST_AUTO_TEST_CASE(external_structs_in_libraries)
function i(Nested[] calldata) external {}
}
)";
- SourceUnit const* sourceUnit = parseAndAnalyse(text);
+ // Ignore analysis errors. This test only checks that correct signatures
+ // are generated for external structs, but calldata structs are not yet supported
+ // in code generation and therefore cause an error in the TypeChecker.
+ SourceUnit const* sourceUnit = parseAnalyseAndReturnError(text, false, true, true).first;
for (ASTPointer<ASTNode> const& node: sourceUnit->nodes())
if (ContractDefinition* contract = dynamic_cast<ContractDefinition*>(node.get()))
{
diff --git a/test/libsolidity/syntaxTests/inheritance/override/calldata_memory_struct.sol b/test/libsolidity/syntaxTests/inheritance/override/calldata_memory_struct.sol
index 42aebf30..b81e3859 100644
--- a/test/libsolidity/syntaxTests/inheritance/override/calldata_memory_struct.sol
+++ b/test/libsolidity/syntaxTests/inheritance/override/calldata_memory_struct.sol
@@ -15,3 +15,7 @@ contract B is A {
}
// ----
// Warning: (0-33): Experimental features are turned on. Do not use experimental features on live deployments.
+// TypeError: (102-112): Calldata structs are not yet supported.
+// TypeError: (146-156): Calldata structs are not yet supported.
+// TypeError: (198-208): Calldata structs are not yet supported.
+// TypeError: (250-260): Calldata structs are not yet supported.
diff --git a/test/libsolidity/syntaxTests/structs/array_calldata.sol b/test/libsolidity/syntaxTests/structs/array_calldata.sol
new file mode 100644
index 00000000..3aac5606
--- /dev/null
+++ b/test/libsolidity/syntaxTests/structs/array_calldata.sol
@@ -0,0 +1,10 @@
+pragma experimental ABIEncoderV2;
+contract Test {
+ struct S { int a; }
+ function f(S[] calldata) external { }
+ function f(S[][] calldata) external { }
+}
+// ----
+// Warning: (0-33): Experimental features are turned on. Do not use experimental features on live deployments.
+// TypeError: (89-101): Calldata structs are not yet supported.
+// TypeError: (131-145): Calldata structs are not yet supported.
diff --git a/test/libsolidity/syntaxTests/structs/calldata.sol b/test/libsolidity/syntaxTests/structs/calldata.sol
new file mode 100644
index 00000000..dadf6e4f
--- /dev/null
+++ b/test/libsolidity/syntaxTests/structs/calldata.sol
@@ -0,0 +1,8 @@
+pragma experimental ABIEncoderV2;
+contract Test {
+ struct S { int a; }
+ function f(S calldata) external { }
+}
+// ----
+// Warning: (0-33): Experimental features are turned on. Do not use experimental features on live deployments.
+// TypeError: (89-99): Calldata structs are not yet supported.