aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2018-07-16 20:43:56 +0800
committerGitHub <noreply@github.com>2018-07-16 20:43:56 +0800
commit931794001e92cbfe99c91da037cf36a1808d9df1 (patch)
tree0bfb67ef7175f9758cfef0a4ca8e290570903965
parent58667db8b891a535dfc139144271c1bd8a1e067a (diff)
parent396bf118585d213a397be990b5118a47ac4753c1 (diff)
downloaddexon-solidity-931794001e92cbfe99c91da037cf36a1808d9df1.tar.gz
dexon-solidity-931794001e92cbfe99c91da037cf36a1808d9df1.tar.zst
dexon-solidity-931794001e92cbfe99c91da037cf36a1808d9df1.zip
Merge pull request #4500 from ethereum/v050-interface-functions-must-be-external
[BREAKING] interface functions must be external
-rw-r--r--Changelog.md1
-rw-r--r--docs/contracts.rst3
-rw-r--r--docs/security-considerations.rst2
-rw-r--r--libsolidity/analysis/TypeChecker.cpp16
-rw-r--r--test/libsolidity/SolidityEndToEndTest.cpp2
-rw-r--r--test/libsolidity/syntaxTests/constructor/interface_constructor_new.sol2
-rw-r--r--test/libsolidity/syntaxTests/constructor/interface_constructor_old.sol2
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/416_interface_function_bodies.sol5
-rw-r--r--test/libsolidity/syntaxTests/nameAndTypeResolution/421_interface_function_parameters.sol3
-rw-r--r--test/libsolidity/syntaxTests/parsing/interface_basic.sol3
-rw-r--r--test/libsolidity/syntaxTests/visibility/interface/function_default.sol3
-rw-r--r--test/libsolidity/syntaxTests/visibility/interface/function_internal.sol2
-rw-r--r--test/libsolidity/syntaxTests/visibility/interface/function_private.sol2
-rw-r--r--test/libsolidity/syntaxTests/visibility/interface/function_public.sol2
14 files changed, 19 insertions, 29 deletions
diff --git a/Changelog.md b/Changelog.md
index b27254a8..35fd42b4 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -44,6 +44,7 @@ Breaking Changes:
* Type Checker: Disallow uninitialized storage variables. This was already the case in the experimental 0.5.0 mode.
* Type Checker: Only accept a single ``bytes`` type for ``.call()`` (and family), ``keccak256()``, ``sha256()`` and ``ripemd160()``.
* Type Checker: Fallback function must be external. This was already the case in the experimental 0.5.0 mode.
+ * Type Checker: Interface functions must be declared external. This was already the case in the experimental 0.5.0 mode.
* Remove obsolete ``std`` directory from the Solidity repository. This means accessing ``https://github.com/ethereum/soldity/blob/develop/std/*.sol`` (or ``https://github.com/ethereum/solidity/std/*.sol`` in Remix) will not be possible.
* References Resolver: Turn missing storage locations into an error. This was already the case in the experimental 0.5.0 mode.
* Syntax Checker: Named return values in function types are an error.
diff --git a/docs/contracts.rst b/docs/contracts.rst
index ea41cb54..033e9a45 100644
--- a/docs/contracts.rst
+++ b/docs/contracts.rst
@@ -1150,6 +1150,7 @@ Interfaces
Interfaces are similar to abstract contracts, but they cannot have any functions implemented. There are further restrictions:
- Cannot inherit other contracts or interfaces.
+- All declared functions must be external.
- Cannot define constructor.
- Cannot define variables.
- Cannot define structs.
@@ -1167,7 +1168,7 @@ Interfaces are denoted by their own keyword:
pragma solidity ^0.4.11;
interface Token {
- function transfer(address recipient, uint amount) public;
+ function transfer(address recipient, uint amount) external;
}
Contracts can inherit interfaces as they would inherit other contracts.
diff --git a/docs/security-considerations.rst b/docs/security-considerations.rst
index afdecb98..b997466b 100644
--- a/docs/security-considerations.rst
+++ b/docs/security-considerations.rst
@@ -203,7 +203,7 @@ Now someone tricks you into sending ether to the address of this attack wallet:
pragma solidity >0.4.24;
interface TxUserWallet {
- function transferTo(address dest, uint amount) public;
+ function transferTo(address dest, uint amount) external;
}
contract TxAttackWallet {
diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp
index cc373e03..72be7394 100644
--- a/libsolidity/analysis/TypeChecker.cpp
+++ b/libsolidity/analysis/TypeChecker.cpp
@@ -671,18 +671,10 @@ bool TypeChecker::visit(FunctionDefinition const& _function)
{
if (_function.isImplemented())
m_errorReporter.typeError(_function.location(), "Functions in interfaces cannot have an implementation.");
- if (_function.sourceUnit().annotation().experimentalFeatures.count(ExperimentalFeature::V050))
- {
- if (_function.visibility() != FunctionDefinition::Visibility::External)
- m_errorReporter.typeError(_function.location(), "Functions in interfaces must be declared external.");
- }
- else
- {
- 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.visibility() != FunctionDefinition::Visibility::External)
+ m_errorReporter.typeError(_function.location(), "Functions in interfaces must be declared external.");
+
if (_function.isConstructor())
m_errorReporter.typeError(_function.location(), "Constructor cannot be defined in interfaces.");
}
diff --git a/test/libsolidity/SolidityEndToEndTest.cpp b/test/libsolidity/SolidityEndToEndTest.cpp
index f76f1196..be74c5ff 100644
--- a/test/libsolidity/SolidityEndToEndTest.cpp
+++ b/test/libsolidity/SolidityEndToEndTest.cpp
@@ -11649,7 +11649,7 @@ BOOST_AUTO_TEST_CASE(interface_contract)
char const* sourceCode = R"(
interface I {
event A();
- function f() public returns (bool);
+ function f() external returns (bool);
function() external payable;
}
diff --git a/test/libsolidity/syntaxTests/constructor/interface_constructor_new.sol b/test/libsolidity/syntaxTests/constructor/interface_constructor_new.sol
index 2cab1851..87585a62 100644
--- a/test/libsolidity/syntaxTests/constructor/interface_constructor_new.sol
+++ b/test/libsolidity/syntaxTests/constructor/interface_constructor_new.sol
@@ -2,6 +2,6 @@ interface I {
constructor() public;
}
// ----
-// Warning: (15-36): Functions in interfaces should be declared external.
+// TypeError: (15-36): Functions in interfaces must be declared external.
// TypeError: (15-36): Constructor cannot be defined in interfaces.
// TypeError: (15-36): Constructor must be implemented if declared.
diff --git a/test/libsolidity/syntaxTests/constructor/interface_constructor_old.sol b/test/libsolidity/syntaxTests/constructor/interface_constructor_old.sol
index 313d4345..2c029f4d 100644
--- a/test/libsolidity/syntaxTests/constructor/interface_constructor_old.sol
+++ b/test/libsolidity/syntaxTests/constructor/interface_constructor_old.sol
@@ -3,6 +3,6 @@ interface I {
}
// ----
// Warning: (15-35): Defining constructors as functions with the same name as the contract is deprecated. Use "constructor(...) { ... }" instead.
-// Warning: (15-35): Functions in interfaces should be declared external.
+// TypeError: (15-35): Functions in interfaces must be declared external.
// TypeError: (15-35): Constructor cannot be defined in interfaces.
// TypeError: (15-35): Constructor must be implemented if declared.
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/416_interface_function_bodies.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/416_interface_function_bodies.sol
index 24b26c04..fee2525e 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/416_interface_function_bodies.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/416_interface_function_bodies.sol
@@ -1,7 +1,6 @@
interface I {
- function f() public {
+ function f() external pure {
}
}
// ----
-// TypeError: (18-45): Functions in interfaces cannot have an implementation.
-// Warning: (18-45): Functions in interfaces should be declared external.
+// TypeError: (18-52): Functions in interfaces cannot have an implementation.
diff --git a/test/libsolidity/syntaxTests/nameAndTypeResolution/421_interface_function_parameters.sol b/test/libsolidity/syntaxTests/nameAndTypeResolution/421_interface_function_parameters.sol
index 05e2dcfd..9722e936 100644
--- a/test/libsolidity/syntaxTests/nameAndTypeResolution/421_interface_function_parameters.sol
+++ b/test/libsolidity/syntaxTests/nameAndTypeResolution/421_interface_function_parameters.sol
@@ -1,5 +1,4 @@
interface I {
- function f(uint a) public returns (bool);
+ function f(uint a) external returns (bool);
}
// ----
-// Warning: (18-59): Functions in interfaces should be declared external.
diff --git a/test/libsolidity/syntaxTests/parsing/interface_basic.sol b/test/libsolidity/syntaxTests/parsing/interface_basic.sol
index 2363eaa8..0742c24f 100644
--- a/test/libsolidity/syntaxTests/parsing/interface_basic.sol
+++ b/test/libsolidity/syntaxTests/parsing/interface_basic.sol
@@ -1,5 +1,4 @@
interface Interface {
- function f() public;
+ function f() external;
}
// ----
-// Warning: (23-43): Functions in interfaces should be declared external.
diff --git a/test/libsolidity/syntaxTests/visibility/interface/function_default.sol b/test/libsolidity/syntaxTests/visibility/interface/function_default.sol
index 72ce3b40..161d66e1 100644
--- a/test/libsolidity/syntaxTests/visibility/interface/function_default.sol
+++ b/test/libsolidity/syntaxTests/visibility/interface/function_default.sol
@@ -2,5 +2,4 @@ interface I {
function f();
}
// ----
-// Warning: (15-28): Functions in interfaces should be declared external.
-// Warning: (15-28): No visibility specified. Defaulting to "public". In interfaces it defaults to external.
+// TypeError: (15-28): Functions in interfaces must be declared external.
diff --git a/test/libsolidity/syntaxTests/visibility/interface/function_internal.sol b/test/libsolidity/syntaxTests/visibility/interface/function_internal.sol
index ac62e69b..06c1547a 100644
--- a/test/libsolidity/syntaxTests/visibility/interface/function_internal.sol
+++ b/test/libsolidity/syntaxTests/visibility/interface/function_internal.sol
@@ -2,4 +2,4 @@ interface I {
function f() internal;
}
// ----
-// TypeError: (15-37): Functions in interfaces cannot be internal or private.
+// TypeError: (15-37): Functions in interfaces must be declared external.
diff --git a/test/libsolidity/syntaxTests/visibility/interface/function_private.sol b/test/libsolidity/syntaxTests/visibility/interface/function_private.sol
index 881e647e..98198c3d 100644
--- a/test/libsolidity/syntaxTests/visibility/interface/function_private.sol
+++ b/test/libsolidity/syntaxTests/visibility/interface/function_private.sol
@@ -2,4 +2,4 @@ interface I {
function f() private;
}
// ----
-// TypeError: (15-36): Functions in interfaces cannot be internal or private.
+// TypeError: (15-36): Functions in interfaces must be declared external.
diff --git a/test/libsolidity/syntaxTests/visibility/interface/function_public.sol b/test/libsolidity/syntaxTests/visibility/interface/function_public.sol
index 891d9fdf..a8cea199 100644
--- a/test/libsolidity/syntaxTests/visibility/interface/function_public.sol
+++ b/test/libsolidity/syntaxTests/visibility/interface/function_public.sol
@@ -2,4 +2,4 @@ interface I {
function f() public;
}
// ----
-// Warning: (15-35): Functions in interfaces should be declared external.
+// TypeError: (15-35): Functions in interfaces must be declared external.