# Function pointer types

> Syntax
> BareFunctionType :
> ForLifetimes? FunctionQualifiers `fn`
> `(` FunctionParametersMaybeNamedVariadic? `)` BareFunctionReturnType?

> BareFunctionReturnType:
> `->` TypeNoBounds

> FunctionParametersMaybeNamedVariadic :
> MaybeNamedFunctionParameters | MaybeNamedFunctionParametersVariadic

> MaybeNamedFunctionParameters :
> MaybeNamedParam ( `,` MaybeNamedParam )* `,`?

> MaybeNamedParam :
> OuterAttribute* ( ( IDENTIFIER | `_` ) `:` )? Type

> MaybeNamedFunctionParametersVariadic :
> ( MaybeNamedParam `,` )* MaybeNamedParam `,` OuterAttribute* `...`

Function pointer types, written using the `fn` keyword, refer to a function whose identity is not necessarily known at compile-time. They can be created via a coercion from both function items and non-capturing closures.

The `unsafe` qualifier indicates that the type's value is an unsafe function, and the `extern` qualifier indicates it is an extern function.

Variadic parameters can only be specified with `extern` function types with the `"C"` or `"cdecl"` calling convention.

An example where `Binop` is defined as a function pointer type:

    #![allow(unused_variables)]
    fn main() {
    fn add(x: i32, y: i32) -> i32 {
        x + y
    }

    let mut x = add(5,7);

    type Binop = fn(i32, i32) -> i32;
    let bo: Binop = add;
    x = bo(5,7);
    }

## Attributes on function pointer parameters

Attributes on function pointer parameters follow the same rules and restrictions as regular function parameters.