aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--test/libsolidity/SolidityEndToEndTest.cpp25
-rw-r--r--test/libsolidity/SolidityNameAndTypeResolution.cpp14
2 files changed, 39 insertions, 0 deletions
diff --git a/test/libsolidity/SolidityEndToEndTest.cpp b/test/libsolidity/SolidityEndToEndTest.cpp
index 6233e25f..9df64cdc 100644
--- a/test/libsolidity/SolidityEndToEndTest.cpp
+++ b/test/libsolidity/SolidityEndToEndTest.cpp
@@ -6710,6 +6710,31 @@ BOOST_AUTO_TEST_CASE(internal_library_function_bound)
BOOST_CHECK(callContractFunction("f()") == encodeArgs(u256(2)));
}
+BOOST_AUTO_TEST_CASE(internal_library_function_return_var_size)
+{
+ char const* sourceCode = R"(
+ library L {
+ struct S { uint[] data; }
+ function f(S _s) internal returns (uint[]) {
+ _s.data[3] = 2;
+ return _s.data;
+ }
+ }
+ contract C {
+ using L for L.S;
+ function f() returns (uint) {
+ L.S memory x;
+ x.data = new uint[](7);
+ x.data[3] = 8;
+ return x.f()[3];
+ }
+ }
+ )";
+ // This has to work without linking, because everything will be inlined.
+ compileAndRun(sourceCode, 0, "C");
+ BOOST_CHECK(callContractFunction("f()") == encodeArgs(u256(2)));
+}
+
BOOST_AUTO_TEST_SUITE_END()
}
diff --git a/test/libsolidity/SolidityNameAndTypeResolution.cpp b/test/libsolidity/SolidityNameAndTypeResolution.cpp
index b6e21d0f..44525d74 100644
--- a/test/libsolidity/SolidityNameAndTypeResolution.cpp
+++ b/test/libsolidity/SolidityNameAndTypeResolution.cpp
@@ -3257,6 +3257,20 @@ BOOST_AUTO_TEST_CASE(library_functions_do_not_have_value)
BOOST_CHECK(!success(text));
}
+BOOST_AUTO_TEST_CASE(library_instances_cannot_be_used)
+{
+ char const* text = R"(
+ library L { function l() {} }
+ contract test {
+ function f() {
+ L x;
+ x.l();
+ }
+ }
+ )";
+ BOOST_CHECK(!success(text));
+}
+
BOOST_AUTO_TEST_CASE(invalid_fixed_type_long)
{
char const* text = R"(