NON_LOCAL_DEFINITIONS in rustc_lint::non_local_def - Rust
Description: The `non_local_definitions` lint checks for `impl` blocks and `#[macro_export]` macro inside bodies (functions, enum discriminant, …).

Skip to main content

## NON_LOCAL_DEFINITIONS

# Static NON_LOCAL_DEFINITIONS

Source

    pub static NON_LOCAL_DEFINITIONS: &Lint

Expand description

The `non_local_definitions` lint checks for `impl` blocks and `#[macro_export]` macro inside bodies (functions, enum discriminant, …).

#### §Example

    #![warn(non_local_definitions)]
    trait MyTrait {}
    struct MyStruct;

    fn foo() {
        impl MyTrait for MyStruct {}
    }

{{produces}}

#### §Explanation

Creating non-local definitions go against expectation and can create discrepancies in tooling. It should be avoided. It may become deny-by-default in edition 2024 and higher, see the tracking issue https://github.com/rust-lang/rust/issues/120363.

An `impl` definition is non-local if it is nested inside an item and neither the type nor the trait are at the same nesting level as the `impl` block.

All nested bodies (functions, enum discriminant, array length, consts) (expect for `const _: Ty = { ... }` in top-level module, which is still undecided) are checked.