Merge pull request #3450 from ethereum/interface-public-visibility

Issue warning for using public visibility for interface functions
This commit is contained in:
chriseth 2018-02-01 13:54:51 +01:00 committed by GitHub
commit 07f8f96c94
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 12 additions and 3 deletions

View File

@ -8,6 +8,7 @@ Features:
* Inline Assembly: Support some restricted tokens (return, byte, address) as identifiers in Julia mode. * 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 * SMT Checker: If-else branch conditions are taken into account in the SMT encoding of the program
variables. variables.
* Type Checker: Issue warning for using ``public`` visibility for interface functions.
Bugfixes: Bugfixes:
* Parser: Disallow event declarations with no parameter list. * Parser: Disallow event declarations with no parameter list.

View File

@ -604,6 +604,8 @@ bool TypeChecker::visit(FunctionDefinition const& _function)
{ {
if (_function.visibility() < FunctionDefinition::Visibility::Public) if (_function.visibility() < FunctionDefinition::Visibility::Public)
m_errorReporter.typeError(_function.location(), "Functions in interfaces cannot be internal or private."); 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()) if (_function.isConstructor())
m_errorReporter.typeError(_function.location(), "Constructor cannot be defined in interfaces."); m_errorReporter.typeError(_function.location(), "Constructor cannot be defined in interfaces.");

View File

@ -5963,6 +5963,12 @@ BOOST_AUTO_TEST_CASE(interface_function_external)
BOOST_AUTO_TEST_CASE(interface_function_public) BOOST_AUTO_TEST_CASE(interface_function_public)
{ {
char const* text = R"( 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"; pragma experimental "v0.5.0";
interface I { interface I {
function f() public; function f() public;
@ -6306,7 +6312,7 @@ BOOST_AUTO_TEST_CASE(no_unused_warning_interface_arguments)
{ {
char const* text = R"( char const* text = R"(
interface I { 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); CHECK_SUCCESS_NO_WARNINGS(text);

View File

@ -181,10 +181,10 @@ BOOST_AUTO_TEST_CASE(interface)
{ {
string text = R"( string text = R"(
interface D { interface D {
function f() view public; function f() view external;
} }
contract C is D { contract C is D {
function f() view public {} function f() view external {}
} }
)"; )";
CHECK_SUCCESS_NO_WARNINGS(text); CHECK_SUCCESS_NO_WARNINGS(text);