aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian <c@ethdev.com>2015-02-14 08:22:44 +0800
committerChristian <c@ethdev.com>2015-02-17 02:25:24 +0800
commit8290b6305bfa66cbff74a5c61cca88d968224a8b (patch)
treea6c385a14a524c669d729725a4135537ef2dad6c
parent7dd200d140725a326b31cc6bf07e56d820627854 (diff)
downloaddexon-solidity-8290b6305bfa66cbff74a5c61cca88d968224a8b.tar
dexon-solidity-8290b6305bfa66cbff74a5c61cca88d968224a8b.tar.gz
dexon-solidity-8290b6305bfa66cbff74a5c61cca88d968224a8b.tar.bz2
dexon-solidity-8290b6305bfa66cbff74a5c61cca88d968224a8b.tar.lz
dexon-solidity-8290b6305bfa66cbff74a5c61cca88d968224a8b.tar.xz
dexon-solidity-8290b6305bfa66cbff74a5c61cca88d968224a8b.tar.zst
dexon-solidity-8290b6305bfa66cbff74a5c61cca88d968224a8b.zip
No write access to parameters of external functions.
-rw-r--r--SolidityEndToEndTest.cpp15
-rw-r--r--SolidityNameAndTypeResolution.cpp30
2 files changed, 45 insertions, 0 deletions
diff --git a/SolidityEndToEndTest.cpp b/SolidityEndToEndTest.cpp
index 0325c4c6..9899af29 100644
--- a/SolidityEndToEndTest.cpp
+++ b/SolidityEndToEndTest.cpp
@@ -2534,6 +2534,21 @@ BOOST_AUTO_TEST_CASE(constructing_enums_from_ints)
BOOST_CHECK(callContractFunction("test()") == encodeArgs(1));
}
+BOOST_AUTO_TEST_CASE(external_function)
+{
+ char const* sourceCode = R"(
+ contract c {
+ function f(uint a) returns (uint) { return a; }
+ function test(uint a, uint b) external returns (uint r_a, uint r_b) {
+ r_a = f(a + 7);
+ r_b = b;
+ }
+ }
+ )";
+ compileAndRun(sourceCode);
+ BOOST_CHECK(callContractFunction("test(uint256,uint256)", 2, 3) == encodeArgs(2, 3+7));
+}
+
BOOST_AUTO_TEST_SUITE_END()
}
diff --git a/SolidityNameAndTypeResolution.cpp b/SolidityNameAndTypeResolution.cpp
index f30de96c..6b337ac7 100644
--- a/SolidityNameAndTypeResolution.cpp
+++ b/SolidityNameAndTypeResolution.cpp
@@ -1133,6 +1133,36 @@ BOOST_AUTO_TEST_CASE(external_base_visibility)
BOOST_CHECK_THROW(parseTextAndResolveNames(sourceCode), TypeError);
}
+BOOST_AUTO_TEST_CASE(external_argument_assign)
+{
+ char const* sourceCode = R"(
+ contract c {
+ function f(uint a) external { a = 1; }
+ }
+ )";
+ BOOST_CHECK_THROW(parseTextAndResolveNames(sourceCode), TypeError);
+}
+
+BOOST_AUTO_TEST_CASE(external_argument_increment)
+{
+ char const* sourceCode = R"(
+ contract c {
+ function f(uint a) external { a++; }
+ }
+ )";
+ BOOST_CHECK_THROW(parseTextAndResolveNames(sourceCode), TypeError);
+}
+
+BOOST_AUTO_TEST_CASE(external_argument_delete)
+{
+ char const* sourceCode = R"(
+ contract c {
+ function f(uint a) external { delete a; }
+ }
+ )";
+ BOOST_CHECK_THROW(parseTextAndResolveNames(sourceCode), TypeError);
+}
+
BOOST_AUTO_TEST_SUITE_END()
}