aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libsolidity/AST.h9
-rw-r--r--libsolidity/ExpressionCompiler.cpp2
-rw-r--r--test/libsolidity/SolidityEndToEndTest.cpp42
3 files changed, 49 insertions, 4 deletions
diff --git a/libsolidity/AST.h b/libsolidity/AST.h
index de0ef3ef..ba529a8a 100644
--- a/libsolidity/AST.h
+++ b/libsolidity/AST.h
@@ -347,10 +347,13 @@ private:
class StructDefinition: public Declaration
{
public:
- StructDefinition(SourceLocation const& _location,
- ASTPointer<ASTString> const& _name,
- std::vector<ASTPointer<VariableDeclaration>> const& _members):
+ StructDefinition(
+ SourceLocation const& _location,
+ ASTPointer<ASTString> const& _name,
+ std::vector<ASTPointer<VariableDeclaration>> const& _members
+ ):
Declaration(_location, _name), m_members(_members) {}
+
virtual void accept(ASTVisitor& _visitor) override;
virtual void accept(ASTConstVisitor& _visitor) const override;
diff --git a/libsolidity/ExpressionCompiler.cpp b/libsolidity/ExpressionCompiler.cpp
index 1b9f2150..7db0dde9 100644
--- a/libsolidity/ExpressionCompiler.cpp
+++ b/libsolidity/ExpressionCompiler.cpp
@@ -390,7 +390,7 @@ bool ExpressionCompiler::visit(FunctionCall const& _functionCall)
TypeType const& type = dynamic_cast<TypeType const&>(*_functionCall.expression().type());
auto const& structType = dynamic_cast<StructType const&>(*type.actualType());
- m_context << u256(max(32u, structType.calldataEncodedSize(true)));
+ m_context << max(u256(32u), structType.memorySize());
utils().allocateMemory();
m_context << eth::Instruction::DUP1;
diff --git a/test/libsolidity/SolidityEndToEndTest.cpp b/test/libsolidity/SolidityEndToEndTest.cpp
index 9c4d0c5b..98da1e27 100644
--- a/test/libsolidity/SolidityEndToEndTest.cpp
+++ b/test/libsolidity/SolidityEndToEndTest.cpp
@@ -5283,6 +5283,48 @@ BOOST_AUTO_TEST_CASE(simple_throw)
BOOST_CHECK(callContractFunction("f(uint256)", u256(1)) == encodeArgs());
}
+BOOST_AUTO_TEST_CASE(strings_in_struct)
+{
+ char const* sourceCode = R"(
+ contract buggystruct {
+ Buggy public bug;
+
+ struct Buggy {
+ uint first;
+ uint second;
+ uint third;
+ string last;
+ }
+
+ function buggystruct(){
+ bug = Buggy(10, 20, 30, "asdfghjkl");
+ }
+ function getFirst() returns (uint)
+ {
+ return bug.first;
+ }
+ function getSecond() returns (uint)
+ {
+ return bug.second;
+ }
+ function getThird() returns (uint)
+ {
+ return bug.third;
+ }
+ function getLast() returns (string)
+ {
+ return bug.last;
+ }
+ }
+ )";
+ compileAndRun(sourceCode);
+ string s = "asdfghjkl";
+ BOOST_CHECK(callContractFunction("getFirst()") == encodeArgs(u256(10)));
+ BOOST_CHECK(callContractFunction("getSecond()") == encodeArgs(u256(20)));
+ BOOST_CHECK(callContractFunction("getThird()") == encodeArgs(u256(30)));
+ BOOST_CHECK(callContractFunction("getLast()") == encodeDyn(s));
+}
+
BOOST_AUTO_TEST_SUITE_END()
}