diff --git a/docs/types.rst b/docs/types.rst index 1673c30d0..7f4570edd 100644 --- a/docs/types.rst +++ b/docs/types.rst @@ -291,7 +291,7 @@ be passed via and returned from external function calls. Function types are notated as follows: - function () {internal|external} [constant] [returns ()] + function () {internal|external} [constant] [payable] [returns ()] In contrast to the parameter types, the return types cannot be empty - if the function type should not return anything, the whole ``returns ()`` @@ -300,8 +300,13 @@ part has to be omitted. By default, function types are internal, so the ``internal`` keyword can be omitted. +There are two ways to access a function in the current contract: Either directly +by its name, ``f``, or using ``this.f``. The former will result in an internal +function, the latter in an external function. + If a function type variable is not initialized, calling it will result -in an exception. +in an exception. The same happens if you call a function after using ``delete`` +on it. If external function types are used outside of the context of Solidity, they are converted into the ``bytes24`` type. diff --git a/libsolidity/grammar.txt b/libsolidity/grammar.txt index cfa779eca..c8bc3aed0 100644 --- a/libsolidity/grammar.txt +++ b/libsolidity/grammar.txt @@ -22,7 +22,7 @@ StructDefinition = 'struct' Identifier '{' ( VariableDeclaration ';' (VariableDeclaration ';')* )? '}' ModifierDefinition = 'modifier' Identifier ParameterList? Block FunctionDefinition = 'function' Identifier? ParameterList - ( FunctionCall | Identifier | 'constant' | 'external' | 'public' | 'internal' | 'private' )* + ( FunctionCall | Identifier | 'constant' |' payable' | 'external' | 'public' | 'internal' | 'private' )* ( 'returns' ParameterList )? Block EventDefinition = 'event' Identifier IndexedParameterList 'anonymous'? ';' @@ -39,7 +39,7 @@ VariableDeclaration = TypeName Identifier TypeName = ElementaryTypeName | Identifier StorageLocation? | Mapping | ArrayTypeName | FunctionTypeName Mapping = 'mapping' '(' ElementaryTypeName '=>' TypeName ')' ArrayTypeName = TypeName StorageLocation? '[' Expression? ']' -FunctionTypeName = 'function' TypeNameList ( 'internal' | 'external' | 'constant' )* +FunctionTypeName = 'function' TypeNameList ( 'internal' | 'external' | 'constant' | 'payable' )* ( 'returns' TypeNameList )? StorageLocation = 'memory' | 'storage'