| Static variables with the `#[linkage]` attribute within external blocks | |
| must have one of the following types, which are equivalent to a nullable | |
| pointer in C: | |
| * `*mut T` or `*const T`, where `T` may be any type. | |
| * An enumerator type with no `#[repr]` attribute and with two variants, where | |
| one of the variants has no fields, and the other has a single field of one of | |
| the following non-nullable types: | |
| * Reference type | |
| * Function pointer type | |
| The variants can appear in either order. | |
| For example, the following declaration is invalid: | |
| ```compile_fail,E0791 | |
| #![feature(linkage)] | |
| extern "C" { | |
| #[linkage = "extern_weak"] | |
| static foo: i8; | |
| } | |
| ``` | |
| The following declarations are valid: | |
| ``` | |
| #![feature(linkage)] | |
| extern "C" { | |
| #[linkage = "extern_weak"] | |
| static foo: Option<unsafe extern "C" fn()>; | |
| #[linkage = "extern_weak"] | |
| static bar: Option<&'static i8>; | |
| #[linkage = "extern_weak"] | |
| static baz: *mut i8; | |
| } | |
| ``` |