CLASHING_EXTERN_DECLARATIONS in rustc_lint::foreign_modules - Rust
Description: The `clashing_extern_declarations` lint detects when an `extern fn` has been declared with the same name but different types.

Skip to main content

## CLASHING_EXTERN_DECLARATIONS

# Static CLASHING_EXTERN_DECLARATIONS

Source

    pub static CLASHING_EXTERN_DECLARATIONS: &Lint

Expand description

The `clashing_extern_declarations` lint detects when an `extern fn` has been declared with the same name but different types.

#### §Example

    mod m {
        unsafe extern "C" {
            fn foo();
        }
    }

    unsafe extern "C" {
        fn foo(_: u32);
    }

{{produces}}

#### §Explanation

Because two symbols of the same name cannot be resolved to two different functions at link time, and one function cannot possibly have two types, a clashing extern declaration is almost certainly a mistake. Check to make sure that the `extern` definitions are correct and equivalent, and possibly consider unifying them in one location.

This lint does not run between crates because a project may have dependencies which both rely on the same extern function, but declare it in a different (but valid) way. For example, they may both declare an opaque type for one or more of the arguments (which would end up distinct types), or use types that are valid conversions in the language the `extern fn` is defined in. In these cases, the compiler can’t say that the clashing declaration is incorrect.