aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Changelog.md1
-rw-r--r--libsolidity/analysis/TypeChecker.cpp2
-rw-r--r--test/libsolidity/SolidityNameAndTypeResolution.cpp8
-rw-r--r--test/libsolidity/ViewPureChecker.cpp4
4 files changed, 12 insertions, 3 deletions
diff --git a/Changelog.md b/Changelog.md
index 4909aca3..3a1a23dc 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -8,6 +8,7 @@ Features:
* Inline Assembly: Support some restricted tokens (return, byte, address) as identifiers in Julia mode.
* SMT Checker: If-else branch conditions are taken into account in the SMT encoding of the program
variables.
+ * Type Checker: Issue warning for using ``public`` visibility for interface functions.
Bugfixes:
* Parser: Disallow event declarations with no parameter list.
diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp
index 191f78e9..d67142e4 100644
--- a/libsolidity/analysis/TypeChecker.cpp
+++ b/libsolidity/analysis/TypeChecker.cpp
@@ -604,6 +604,8 @@ bool TypeChecker::visit(FunctionDefinition const& _function)
{
if (_function.visibility() < FunctionDefinition::Visibility::Public)
m_errorReporter.typeError(_function.location(), "Functions in interfaces cannot be internal or private.");
+ else if (_function.visibility() != FunctionDefinition::Visibility::External)
+ m_errorReporter.warning(_function.location(), "Functions in interfaces should be declared external.");
}
if (_function.isConstructor())
m_errorReporter.typeError(_function.location(), "Constructor cannot be defined in interfaces.");
diff --git a/test/libsolidity/SolidityNameAndTypeResolution.cpp b/test/libsolidity/SolidityNameAndTypeResolution.cpp
index eb6a440e..513b5e2c 100644
--- a/test/libsolidity/SolidityNameAndTypeResolution.cpp
+++ b/test/libsolidity/SolidityNameAndTypeResolution.cpp
@@ -5963,6 +5963,12 @@ BOOST_AUTO_TEST_CASE(interface_function_external)
BOOST_AUTO_TEST_CASE(interface_function_public)
{
char const* text = R"(
+ interface I {
+ function f() public;
+ }
+ )";
+ CHECK_WARNING(text, "Functions in interfaces should be declared external.");
+ text = R"(
pragma experimental "v0.5.0";
interface I {
function f() public;
@@ -6306,7 +6312,7 @@ BOOST_AUTO_TEST_CASE(no_unused_warning_interface_arguments)
{
char const* text = R"(
interface I {
- function f(uint a) pure public returns (uint b);
+ function f(uint a) pure external returns (uint b);
}
)";
CHECK_SUCCESS_NO_WARNINGS(text);
diff --git a/test/libsolidity/ViewPureChecker.cpp b/test/libsolidity/ViewPureChecker.cpp
index 6353ae8a..debeb4dc 100644
--- a/test/libsolidity/ViewPureChecker.cpp
+++ b/test/libsolidity/ViewPureChecker.cpp
@@ -181,10 +181,10 @@ BOOST_AUTO_TEST_CASE(interface)
{
string text = R"(
interface D {
- function f() view public;
+ function f() view external;
}
contract C is D {
- function f() view public {}
+ function f() view external {}
}
)";
CHECK_SUCCESS_NO_WARNINGS(text);