Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Tracking Issue for RFC 3373: Avoid non-local definitions in functions #120363

Open
1 of 5 tasks
traviscross opened this issue Jan 26, 2024 · 25 comments
Open
1 of 5 tasks

Tracking Issue for RFC 3373: Avoid non-local definitions in functions #120363

traviscross opened this issue Jan 26, 2024 · 25 comments
Labels
A-maybe-future-edition Something we may consider for a future edition. B-RFC-approved Blocker: Approved by a merged RFC but not yet implemented. C-tracking-issue Category: A tracking issue for an RFC or an unstable feature. L-non_local_definitions Lint: non_local_definitions T-lang Relevant to the language team, which will review and decide on the PR/issue.

Comments

@traviscross
Copy link
Contributor

traviscross commented Jan 26, 2024

This is a tracking issue for the RFC 3373: Avoid non-local definitions in functions (rust-lang/rfcs#3373).

Summary

Add a warn-by-default lint for items inside functions or expressions that implement methods or traits that are visible outside the function or expression. Consider ramping that lint to deny-by-default for Rust 2024, and evaluating a hard error for 2027.

warning: non-local `impl` definition, they should be avoided as they go against expectation
  --> src/de/impls.rs:21:9
   |
21 | /         impl Visitor for Place<()> {
22 | |             fn null(&mut self) -> Result<()> {
23 | |                 self.out = Some(());
24 | |                 Ok(())
25 | |             }
26 | |         }
   | |_________^
   |
   = help: move this `impl` block outside the of the current associated function `begin`
   = note: 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
   = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
   = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
   = note: `#[warn(non_local_definitions)]` on by default

About tracking issues

Tracking issues are used to record the overall progress of implementation. They are also used as hubs connecting to other relevant issues, e.g., bugs or open design questions. A tracking issue is however not meant for large scale discussion, questions, or bug reports about a feature. Instead, open a dedicated issue for the specific matter and add the relevant feature gate label.

Steps

Unresolved questions

  • We need a crater run to look at how widespread this pattern is in existing code.
  • Should we flag these definitions in anonymous const items as well, or would that produce unwanted warnings?
    • We do not currently warn on const _: () = { /* .. */ } since the pattern is widely used in the ecosystem, including serde_derive.

Related

@traviscross traviscross added B-RFC-approved Blocker: Approved by a merged RFC but not yet implemented. T-lang Relevant to the language team, which will review and decide on the PR/issue. C-tracking-issue Category: A tracking issue for an RFC or an unstable feature. labels Jan 26, 2024
bors added a commit to rust-lang-ci/rust that referenced this issue Jan 30, 2024
Implement RFC 3373: Avoid non-local definitions in functions

This PR implements [RFC 3373: Avoid non-local definitions in functions](rust-lang#120363).
bors added a commit to rust-lang-ci/rust that referenced this issue Feb 25, 2024
…leLapkin

Implement RFC 3373: Avoid non-local definitions in functions

This PR implements [RFC 3373: Avoid non-local definitions in functions](rust-lang#120363).
dtolnay added a commit to dtolnay/miniserde that referenced this issue Feb 26, 2024
Fixes a non_local_definitions warning in the derived code.

    warning: non-local `impl` definition, they should be avoided as they go against expectation
     --> tests/test_derive.rs:5:28
      |
    5 | #[derive(PartialEq, Debug, Serialize, Deserialize)]
      |                            ^^^^^^^^^
      |
      = help: move this `impl` block outside the of the current constant `_IMPL_MINISERIALIZE_FOR_Tag`
      = note: 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
      = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
      = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
      = note: the derive macro `Serialize` may come from an old version of the `mini_internal` crate, try updating your dependency with `cargo update -p mini_internal`
      = note: `#[warn(non_local_definitions)]` on by default
      = note: this warning originates in the derive macro `Serialize` (in Nightly builds, run with -Z macro-backtrace for more info)
dtolnay added a commit to dtolnay/miniserde that referenced this issue Feb 26, 2024
Fixes warning about non_local_definitions.

    warning: non-local `impl` definition, they should be avoided as they go against expectation
      --> src/de/impls.rs:21:9
       |
    21 | /         impl Visitor for Place<()> {
    22 | |             fn null(&mut self) -> Result<()> {
    23 | |                 self.out = Some(());
    24 | |                 Ok(())
    25 | |             }
    26 | |         }
       | |_________^
       |
       = help: move this `impl` block outside the of the current associated function `begin`
       = note: 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
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: `#[warn(non_local_definitions)]` on by default

    warning: non-local `impl` definition, they should be avoided as they go against expectation
      --> src/de/impls.rs:33:9
       |
    33 | /         impl Visitor for Place<bool> {
    34 | |             fn boolean(&mut self, b: bool) -> Result<()> {
    35 | |                 self.out = Some(b);
    36 | |                 Ok(())
    37 | |             }
    38 | |         }
       | |_________^
       |
       = help: move this `impl` block outside the of the current associated function `begin`
       = note: 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
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
      --> src/de/impls.rs:45:9
       |
    45 | /         impl Visitor for Place<String> {
    46 | |             fn string(&mut self, s: &str) -> Result<()> {
    47 | |                 self.out = Some(s.to_owned());
    48 | |                 Ok(())
    49 | |             }
    50 | |         }
       | |_________^
       |
       = help: move this `impl` block outside the of the current associated function `begin`
       = note: 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
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
      --> src/de/impls.rs:59:17
       |
    59 | /                 impl Visitor for Place<$ty> {
    60 | |                     fn negative(&mut self, n: i64) -> Result<()> {
    61 | |                         if n >= $ty::min_value() as i64 {
    62 | |                             self.out = Some(n as $ty);
    ...  |
    76 | |                     }
    77 | |                 }
       | |_________________^
    ...
    83 |   signed!(i8);
       |   ----------- in this macro invocation
       |
       = help: move this `impl` block outside the of the current associated function `begin`
       = note: 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
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: this warning originates in the macro `signed` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
      --> src/de/impls.rs:59:17
       |
    59 | /                 impl Visitor for Place<$ty> {
    60 | |                     fn negative(&mut self, n: i64) -> Result<()> {
    61 | |                         if n >= $ty::min_value() as i64 {
    62 | |                             self.out = Some(n as $ty);
    ...  |
    76 | |                     }
    77 | |                 }
       | |_________________^
    ...
    84 |   signed!(i16);
       |   ------------ in this macro invocation
       |
       = help: move this `impl` block outside the of the current associated function `begin`
       = note: 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
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: this warning originates in the macro `signed` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
      --> src/de/impls.rs:59:17
       |
    59 | /                 impl Visitor for Place<$ty> {
    60 | |                     fn negative(&mut self, n: i64) -> Result<()> {
    61 | |                         if n >= $ty::min_value() as i64 {
    62 | |                             self.out = Some(n as $ty);
    ...  |
    76 | |                     }
    77 | |                 }
       | |_________________^
    ...
    85 |   signed!(i32);
       |   ------------ in this macro invocation
       |
       = help: move this `impl` block outside the of the current associated function `begin`
       = note: 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
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: this warning originates in the macro `signed` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
      --> src/de/impls.rs:59:17
       |
    59 | /                 impl Visitor for Place<$ty> {
    60 | |                     fn negative(&mut self, n: i64) -> Result<()> {
    61 | |                         if n >= $ty::min_value() as i64 {
    62 | |                             self.out = Some(n as $ty);
    ...  |
    76 | |                     }
    77 | |                 }
       | |_________________^
    ...
    86 |   signed!(i64);
       |   ------------ in this macro invocation
       |
       = help: move this `impl` block outside the of the current associated function `begin`
       = note: 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
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: this warning originates in the macro `signed` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
      --> src/de/impls.rs:59:17
       |
    59 | /                 impl Visitor for Place<$ty> {
    60 | |                     fn negative(&mut self, n: i64) -> Result<()> {
    61 | |                         if n >= $ty::min_value() as i64 {
    62 | |                             self.out = Some(n as $ty);
    ...  |
    76 | |                     }
    77 | |                 }
       | |_________________^
    ...
    87 |   signed!(isize);
       |   -------------- in this macro invocation
       |
       = help: move this `impl` block outside the of the current associated function `begin`
       = note: 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
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: this warning originates in the macro `signed` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/de/impls.rs:93:17
        |
    93  | /                 impl Visitor for Place<$ty> {
    94  | |                     fn nonnegative(&mut self, n: u64) -> Result<()> {
    95  | |                         if n <= $ty::max_value() as u64 {
    96  | |                             self.out = Some(n as $ty);
    ...   |
    101 | |                     }
    102 | |                 }
        | |_________________^
    ...
    108 |   unsigned!(u8);
        |   ------------- in this macro invocation
        |
        = help: move this `impl` block outside the of the current associated function `begin`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
        = note: this warning originates in the macro `unsigned` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/de/impls.rs:93:17
        |
    93  | /                 impl Visitor for Place<$ty> {
    94  | |                     fn nonnegative(&mut self, n: u64) -> Result<()> {
    95  | |                         if n <= $ty::max_value() as u64 {
    96  | |                             self.out = Some(n as $ty);
    ...   |
    101 | |                     }
    102 | |                 }
        | |_________________^
    ...
    109 |   unsigned!(u16);
        |   -------------- in this macro invocation
        |
        = help: move this `impl` block outside the of the current associated function `begin`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
        = note: this warning originates in the macro `unsigned` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/de/impls.rs:93:17
        |
    93  | /                 impl Visitor for Place<$ty> {
    94  | |                     fn nonnegative(&mut self, n: u64) -> Result<()> {
    95  | |                         if n <= $ty::max_value() as u64 {
    96  | |                             self.out = Some(n as $ty);
    ...   |
    101 | |                     }
    102 | |                 }
        | |_________________^
    ...
    110 |   unsigned!(u32);
        |   -------------- in this macro invocation
        |
        = help: move this `impl` block outside the of the current associated function `begin`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
        = note: this warning originates in the macro `unsigned` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/de/impls.rs:93:17
        |
    93  | /                 impl Visitor for Place<$ty> {
    94  | |                     fn nonnegative(&mut self, n: u64) -> Result<()> {
    95  | |                         if n <= $ty::max_value() as u64 {
    96  | |                             self.out = Some(n as $ty);
    ...   |
    101 | |                     }
    102 | |                 }
        | |_________________^
    ...
    111 |   unsigned!(u64);
        |   -------------- in this macro invocation
        |
        = help: move this `impl` block outside the of the current associated function `begin`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
        = note: this warning originates in the macro `unsigned` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/de/impls.rs:93:17
        |
    93  | /                 impl Visitor for Place<$ty> {
    94  | |                     fn nonnegative(&mut self, n: u64) -> Result<()> {
    95  | |                         if n <= $ty::max_value() as u64 {
    96  | |                             self.out = Some(n as $ty);
    ...   |
    101 | |                     }
    102 | |                 }
        | |_________________^
    ...
    112 |   unsigned!(usize);
        |   ---------------- in this macro invocation
        |
        = help: move this `impl` block outside the of the current associated function `begin`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
        = note: this warning originates in the macro `unsigned` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/de/impls.rs:118:17
        |
    118 | /                 impl Visitor for Place<$ty> {
    119 | |                     fn negative(&mut self, n: i64) -> Result<()> {
    120 | |                         self.out = Some(n as $ty);
    121 | |                         Ok(())
    ...   |
    132 | |                     }
    133 | |                 }
        | |_________________^
    ...
    139 |   float!(f32);
        |   ----------- in this macro invocation
        |
        = help: move this `impl` block outside the of the current associated function `begin`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
        = note: this warning originates in the macro `float` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/de/impls.rs:118:17
        |
    118 | /                 impl Visitor for Place<$ty> {
    119 | |                     fn negative(&mut self, n: i64) -> Result<()> {
    120 | |                         self.out = Some(n as $ty);
    121 | |                         Ok(())
    ...   |
    132 | |                     }
    133 | |                 }
        | |_________________^
    ...
    140 |   float!(f64);
        |   ----------- in this macro invocation
        |
        = help: move this `impl` block outside the of the current associated function `begin`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
        = note: this warning originates in the macro `float` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/de/impls.rs:144:9
        |
    144 | /         impl<T: Deserialize> Visitor for Place<Box<T>> {
    145 | |             fn null(&mut self) -> Result<()> {
    146 | |                 let mut out = None;
    147 | |                 Deserialize::begin(&mut out).null()?;
    ...   |
    205 | |             }
    206 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current associated function `begin`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/de/impls.rs:270:9
        |
    270 | /         impl<T: Deserialize> Visitor for Place<Option<T>> {
    271 | |             fn null(&mut self) -> Result<()> {
    272 | |                 self.out = Some(None);
    273 | |                 Ok(())
    ...   |
    309 | |             }
    310 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current associated function `begin`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/de/impls.rs:318:9
        |
    318 | /         impl<A: Deserialize, B: Deserialize> Visitor for Place<(A, B)> {
    319 | |             fn seq(&mut self) -> Result<Box<dyn Seq + '_>> {
    320 | |                 Ok(Box::new(TupleBuilder {
    321 | |                     out: &mut self.out,
    ...   |
    324 | |             }
    325 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current associated function `begin`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/de/impls.rs:359:9
        |
    359 | /         impl<T: Deserialize> Visitor for Place<Vec<T>> {
    360 | |             fn seq(&mut self) -> Result<Box<dyn Seq + '_>> {
    361 | |                 Ok(Box::new(VecBuilder {
    362 | |                     out: &mut self.out,
    ...   |
    366 | |             }
    367 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current associated function `begin`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/de/impls.rs:402:9
        |
    402 | /         impl<T: Deserialize, const N: usize> Visitor for Place<[T; N]> {
    403 | |             fn seq(&mut self) -> Result<Box<dyn Seq + '_>> {
    404 | |                 Ok(Box::new(ArrayBuilder {
    405 | |                     out: &mut self.out,
    ...   |
    410 | |             }
    411 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current associated function `begin`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/de/impls.rs:472:9
        |
    472 | /         impl<K, V, H> Visitor for Place<HashMap<K, V, H>>
    473 | |         where
    474 | |             K: FromStr + Hash + Eq,
    475 | |             V: Deserialize,
    ...   |
    485 | |             }
    486 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current associated function `begin`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/de/impls.rs:532:9
        |
    532 | /         impl<K: FromStr + Ord, V: Deserialize> Visitor for Place<BTreeMap<K, V>> {
    533 | |             fn map(&mut self) -> Result<Box<dyn Map + '_>> {
    534 | |                 Ok(Box::new(MapBuilder {
    535 | |                     out: &mut self.out,
    ...   |
    540 | |             }
    541 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current associated function `begin`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/json/value.rs:75:9
        |
    75  | /         impl Visitor for Place<Value> {
    76  | |             fn null(&mut self) -> Result<()> {
    77  | |                 self.out = Some(Value::Null);
    78  | |                 Ok(())
    ...   |
    121 | |             }
    122 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current associated function `begin`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
      --> src/json/number.rs:37:9
       |
    37 | /         impl Visitor for Place<Number> {
    38 | |             fn negative(&mut self, n: i64) -> Result<()> {
    39 | |                 self.out = Some(Number::I64(n));
    40 | |                 Ok(())
    ...  |
    51 | |             }
    52 | |         }
       | |_________^
       |
       = help: move this `impl` block outside the of the current associated function `begin`
       = note: 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
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/json/array.rs:116:9
        |
    116 | /         impl Visitor for Place<Array> {
    117 | |             fn seq(&mut self) -> Result<Box<dyn Seq + '_>> {
    118 | |                 Ok(Box::new(ArrayBuilder {
    119 | |                     out: &mut self.out,
    ...   |
    123 | |             }
    124 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current associated function `begin`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/json/object.rs:119:9
        |
    119 | /         impl Visitor for Place<Object> {
    120 | |             fn map(&mut self) -> Result<Box<dyn Map + '_>> {
    121 | |                 Ok(Box::new(ObjectBuilder {
    122 | |                     out: &mut self.out,
    ...   |
    127 | |             }
    128 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current associated function `begin`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
@dtolnay
Copy link
Member

dtolnay commented Feb 26, 2024

I pasted an example of such a warning into the summary above. This issue previously was not appearing in a GitHub search for "non_local_definitions".

dtolnay added a commit to serde-rs/json that referenced this issue Feb 26, 2024
rust-lang/rust#121621

    warning: non-local `impl` definition, they should be avoided as they go against expectation
        --> tests/test.rs:2338:5
         |
    2338 | /     impl<'de> Deserialize<'de> for &'de RawMapKey {
    2339 | |         fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    2340 | |         where
    2341 | |             D: serde::Deserializer<'de>,
    ...    |
    2345 | |         }
    2346 | |     }
         | |_____^
         |
         = help: move this `impl` block outside the of the current function `test_raw_value_in_map_key`
         = note: 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
         = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
         = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
         = note: `#[warn(non_local_definitions)]` on by default
@dtolnay
Copy link
Member

dtolnay commented Feb 26, 2024

Should an exception be made for #[fundamental] types?

Filed as #121621.

github-actions bot pushed a commit to rust-lang/miri that referenced this issue Feb 26, 2024
Implement RFC 3373: Avoid non-local definitions in functions

This PR implements [RFC 3373: Avoid non-local definitions in functions](rust-lang/rust#120363).
dtolnay added a commit to dtolnay/dyn-clone that referenced this issue Feb 26, 2024
rust-lang/rust#121621

    warning: non-local `impl` definition, they should be avoided as they go against expectation
      --> tests/macros.rs:11:5
       |
    11 |     clone_trait_object!(Trait);
       |     ^^^^^^^^^^^^^^^^^^^^^^^^^^
       |
       = help: move this `impl` block outside the of the current function `test_plain`
       = note: 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
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: the macro `$crate::__internal_clone_trait_object` may come from an old version of the `dyn_clone` crate, try updating your dependency with `cargo update -p dyn_clone`
       = note: `#[warn(non_local_definitions)]` on by default
       = note: this warning originates in the macro `$crate::__internal_clone_trait_object` which comes from the expansion of the macro `clone_trait_object` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
      --> tests/macros.rs:11:5
       |
    11 |     clone_trait_object!(Trait);
       |     ^^^^^^^^^^^^^^^^^^^^^^^^^^
       |
       = help: move this `impl` block outside the of the current function `test_plain`
       = note: 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
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: the macro `$crate::__internal_clone_trait_object` may come from an old version of the `dyn_clone` crate, try updating your dependency with `cargo update -p dyn_clone`
       = note: this warning originates in the macro `$crate::__internal_clone_trait_object` which comes from the expansion of the macro `clone_trait_object` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
      --> tests/macros.rs:23:5
       |
    23 |     clone_trait_object!(<T> Trait<T>);
       |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
       |
       = help: move this `impl` block outside the of the current function `test_type_parameter`
       = note: 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
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: the macro `$crate::__internal_clone_trait_object` may come from an old version of the `dyn_clone` crate, try updating your dependency with `cargo update -p dyn_clone`
       = note: this warning originates in the macro `$crate::__internal_clone_trait_object` which comes from the expansion of the macro `clone_trait_object` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
      --> tests/macros.rs:32:5
       |
    32 |     clone_trait_object!(<T: PartialEq<T>, U> Trait<T, U>);
       |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
       |
       = help: move this `impl` block outside the of the current function `test_generic_bound`
       = note: 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
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: the macro `$crate::__internal_clone_trait_object` may come from an old version of the `dyn_clone` crate, try updating your dependency with `cargo update -p dyn_clone`
       = note: this warning originates in the macro `$crate::__internal_clone_trait_object` which comes from the expansion of the macro `clone_trait_object` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
      --> tests/macros.rs:45:5
       |
    45 |     clone_trait_object!(<T> Trait<T> where T: Clone);
       |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
       |
       = help: move this `impl` block outside the of the current function `test_where_clause`
       = note: 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
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: the macro `$crate::__internal_clone_trait_object` may come from an old version of the `dyn_clone` crate, try updating your dependency with `cargo update -p dyn_clone`
       = note: this warning originates in the macro `$crate::__internal_clone_trait_object` which comes from the expansion of the macro `clone_trait_object` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
      --> tests/macros.rs:54:5
       |
    54 |     clone_trait_object!(<'a> Trait<'a>);
       |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
       |
       = help: move this `impl` block outside the of the current function `test_lifetime`
       = note: 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
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: the macro `$crate::__internal_clone_trait_object` may come from an old version of the `dyn_clone` crate, try updating your dependency with `cargo update -p dyn_clone`
       = note: this warning originates in the macro `$crate::__internal_clone_trait_object` which comes from the expansion of the macro `clone_trait_object` (in Nightly builds, run with -Z macro-backtrace for more info)
dtolnay added a commit to dtolnay/serde-yaml that referenced this issue Feb 26, 2024
    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> tests/test_error.rs:412:13
        |
    412 | /             impl<'de> Visitor<'de> for X {
    413 | |                 type Value = X;
    414 | |
    415 | |                 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
    ...   |
    429 | |                 }
    430 | |             }
        | |_____________^
        |
        = help: move this `impl` block outside the of the current associated function `deserialize` and up 2 bodies
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
        = note: `#[warn(non_local_definitions)]` on by default
dtolnay added a commit to dtolnay/reflect that referenced this issue Feb 26, 2024
This macro needs to be redesigned if this ever becomes a hard error.

    warning: non-local `impl` definition, they should be avoided as they go against expectation
      --> tests/test_generics.rs:7:1
       |
    7  | / library! {
    8  | |     use simple {
    9  | |         trait Simple {
    10 | |             fn simple();
    ...  |
    14 | |     }
    15 | | }
       | |_^
       |
       = help: move this `impl` block outside the of the current associated function `simple`
       = note: 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
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: the macro `library` may come from an old version of the `reflect_internal` crate, try updating your dependency with `cargo update -p reflect_internal`
       = note: `#[warn(non_local_definitions)]` on by default
       = note: this warning originates in the macro `library` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
      --> tests/test_parse_trait_objects.rs:6:1
       |
    6  | / library! {
    7  | |     use Mod {
    8  | |         type Struct;
    9  | |         trait Trait {}
    ...  |
    16 | |     }
    17 | | }
       | |_^
       |
       = help: move this `impl` block outside the of the current associated function `single_dyn`
       = note: 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
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: the macro `library` may come from an old version of the `reflect_internal` crate, try updating your dependency with `cargo update -p reflect_internal`
       = note: `#[warn(non_local_definitions)]` on by default
       = note: this warning originates in the macro `library` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
      --> tests/test_parse_trait_objects.rs:6:1
       |
    6  | / library! {
    7  | |     use Mod {
    8  | |         type Struct;
    9  | |         trait Trait {}
    ...  |
    16 | |     }
    17 | | }
       | |_^
       |
       = help: move this `impl` block outside the of the current associated function `double_dyn`
       = note: 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
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: the macro `library` may come from an old version of the `reflect_internal` crate, try updating your dependency with `cargo update -p reflect_internal`
       = note: this warning originates in the macro `library` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
      --> tests/test_zero_args.rs:7:1
       |
    7  | / library! {
    8  | |     use zero {
    9  | |         trait Zero {
    10 | |             fn zero();
    11 | |         }
    12 | |     }
    13 | | }
       | |_^
       |
       = help: move this `impl` block outside the of the current associated function `zero`
       = note: 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
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: the macro `library` may come from an old version of the `reflect_internal` crate, try updating your dependency with `cargo update -p reflect_internal`
       = note: `#[warn(non_local_definitions)]` on by default
       = note: this warning originates in the macro `library` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
      --> tests/test_field_access.rs:36:1
       |
    36 | / library! {
    37 | |     use base {
    38 | |         type FieldAccessor;
    39 | |         impl FieldAccessor {
    ...  |
    46 | |     }
    47 | | }
       | |_^
       |
       = help: move this `impl` block outside the of the current associated function `access_field`
       = note: 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
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: the macro `library` may come from an old version of the `reflect_internal` crate, try updating your dependency with `cargo update -p reflect_internal`
       = note: `#[warn(non_local_definitions)]` on by default
       = note: this warning originates in the macro `library` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
      --> tests/test_field_access.rs:36:1
       |
    36 | / library! {
    37 | |     use base {
    38 | |         type FieldAccessor;
    39 | |         impl FieldAccessor {
    ...  |
    46 | |     }
    47 | | }
       | |_^
       |
       = help: move this `impl` block outside the of the current associated function `trivial`
       = note: 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
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: the macro `library` may come from an old version of the `reflect_internal` crate, try updating your dependency with `cargo update -p reflect_internal`
       = note: this warning originates in the macro `library` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
      --> tests/test_tuple.rs:7:1
       |
    7  | / library! {
    8  | |     use tuple {
    9  | |         type One;
    10 | |         type Two;
    ...  |
    15 | |     }
    16 | | }
       | |_^
       |
       = help: move this `impl` block outside the of the current associated function `swap`
       = note: 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
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: the macro `library` may come from an old version of the `reflect_internal` crate, try updating your dependency with `cargo update -p reflect_internal`
       = note: `#[warn(non_local_definitions)]` on by default
       = note: this warning originates in the macro `library` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
      --> tests/test_displaydoc.rs:16:1
       |
    16 | / reflect::library! {
    17 | |     extern crate std {
    18 | |         mod fmt {
    19 | |             type Formatter;
    ...  |
    28 | |     }
    29 | | }
       | |_^
       |
       = help: move this `impl` block outside the of the current associated function `fmt`
       = note: 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
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: the macro `reflect::library` may come from an old version of the `reflect_internal` crate, try updating your dependency with `cargo update -p reflect_internal`
       = note: `#[warn(non_local_definitions)]` on by default
       = note: this warning originates in the macro `reflect::library` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
      --> tests/debug/mod.rs:10:1
       |
    10 | / reflect::library! {
    11 | |     extern crate std {
    12 | |         mod fmt {
    13 | |             type Formatter;
    ...  |
    30 | |     }
    31 | | }
       | |_^
       |
       = help: move this `impl` block outside the of the current associated function `fmt`
       = note: 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
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: the macro `reflect::library` may come from an old version of the `reflect_internal` crate, try updating your dependency with `cargo update -p reflect_internal`
       = note: `#[warn(non_local_definitions)]` on by default
       = note: this warning originates in the macro `reflect::library` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
      --> tests/debug/mod.rs:10:1
       |
    10 | / reflect::library! {
    11 | |     extern crate std {
    12 | |         mod fmt {
    13 | |             type Formatter;
    ...  |
    30 | |     }
    31 | | }
       | |_^
       |
       = help: move this `impl` block outside the of the current associated function `debug_struct`
       = note: 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
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: the macro `reflect::library` may come from an old version of the `reflect_internal` crate, try updating your dependency with `cargo update -p reflect_internal`
       = note: this warning originates in the macro `reflect::library` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
      --> tests/debug/mod.rs:10:1
       |
    10 | / reflect::library! {
    11 | |     extern crate std {
    12 | |         mod fmt {
    13 | |             type Formatter;
    ...  |
    30 | |     }
    31 | | }
       | |_^
       |
       = help: move this `impl` block outside the of the current associated function `field`
       = note: 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
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: the macro `reflect::library` may come from an old version of the `reflect_internal` crate, try updating your dependency with `cargo update -p reflect_internal`
       = note: this warning originates in the macro `reflect::library` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
      --> tests/debug/mod.rs:10:1
       |
    10 | / reflect::library! {
    11 | |     extern crate std {
    12 | |         mod fmt {
    13 | |             type Formatter;
    ...  |
    30 | |     }
    31 | | }
       | |_^
       |
       = help: move this `impl` block outside the of the current associated function `finish`
       = note: 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
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: the macro `reflect::library` may come from an old version of the `reflect_internal` crate, try updating your dependency with `cargo update -p reflect_internal`
       = note: this warning originates in the macro `reflect::library` (in Nightly builds, run with -Z macro-backtrace for more info)
dtolnay added a commit to dtolnay/linkme that referenced this issue Feb 26, 2024
In typical usage, I think this would not be triggered. We need to
reorganize the test.

    warning: non-local `macro_rules!` definition, they should be avoided as they go against expectation
      --> tests/distributed_slice.rs:33:5
       |
    33 |     #[distributed_slice]
       |     ^^^^^^^^^^^^^^^^^^^^
       |
       = help: remove the `#[macro_export]` or move this `macro_rules!` outside the of the current function `test_empty`
       = note: a `macro_rules!` definition is non-local if it is nested inside an item and has a `#[macro_export]` attribute
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: the attribute macro `distributed_slice` may come from an old version of the `linkme_impl` crate, try updating your dependency with `cargo update -p linkme_impl`
       = note: `#[warn(non_local_definitions)]` on by default
       = note: this warning originates in the attribute macro `distributed_slice` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `macro_rules!` definition, they should be avoided as they go against expectation
      --> tests/distributed_slice.rs:43:5
       |
    43 |     #[distributed_slice]
       |     ^^^^^^^^^^^^^^^^^^^^
       |
       = help: remove the `#[macro_export]` or move this `macro_rules!` outside the of the current function `test_non_copy`
       = note: a `macro_rules!` definition is non-local if it is nested inside an item and has a `#[macro_export]` attribute
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: the attribute macro `distributed_slice` may come from an old version of the `linkme_impl` crate, try updating your dependency with `cargo update -p linkme_impl`
       = note: this warning originates in the attribute macro `distributed_slice` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `macro_rules!` definition, they should be avoided as they go against expectation
      --> tests/distributed_slice.rs:54:5
       |
    54 |     #[distributed_slice]
       |     ^^^^^^^^^^^^^^^^^^^^
       |
       = help: remove the `#[macro_export]` or move this `macro_rules!` outside the of the current function `test_interior_mutable`
       = note: a `macro_rules!` definition is non-local if it is nested inside an item and has a `#[macro_export]` attribute
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: the attribute macro `distributed_slice` may come from an old version of the `linkme_impl` crate, try updating your dependency with `cargo update -p linkme_impl`
       = note: this warning originates in the attribute macro `distributed_slice` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `macro_rules!` definition, they should be avoided as they go against expectation
      --> tests/distributed_slice.rs:66:5
       |
    66 |     #[distributed_slice]
       |     ^^^^^^^^^^^^^^^^^^^^
       |
       = help: remove the `#[macro_export]` or move this `macro_rules!` outside the of the current function `test_elided_lifetime`
       = note: a `macro_rules!` definition is non-local if it is nested inside an item and has a `#[macro_export]` attribute
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: the attribute macro `distributed_slice` may come from an old version of the `linkme_impl` crate, try updating your dependency with `cargo update -p linkme_impl`
       = note: this warning originates in the attribute macro `distributed_slice` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `macro_rules!` definition, they should be avoided as they go against expectation
      --> tests/distributed_slice.rs:79:5
       |
    79 |     #[distributed_slice]
       |     ^^^^^^^^^^^^^^^^^^^^
       |
       = help: remove the `#[macro_export]` or move this `macro_rules!` outside the of the current function `test_legacy_syntax`
       = note: a `macro_rules!` definition is non-local if it is nested inside an item and has a `#[macro_export]` attribute
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: the attribute macro `distributed_slice` may come from an old version of the `linkme_impl` crate, try updating your dependency with `cargo update -p linkme_impl`
       = note: this warning originates in the attribute macro `distributed_slice` (in Nightly builds, run with -Z macro-backtrace for more info)
dtolnay added a commit to dtolnay/linkme that referenced this issue Feb 26, 2024
In typical usage, I think this would not be triggered. We need to
reorganize the test.

    warning: non-local `macro_rules!` definition, they should be avoided as they go against expectation
      --> tests/distributed_slice.rs:33:5
       |
    33 |     #[distributed_slice]
       |     ^^^^^^^^^^^^^^^^^^^^
       |
       = help: remove the `#[macro_export]` or move this `macro_rules!` outside the of the current function `test_empty`
       = note: a `macro_rules!` definition is non-local if it is nested inside an item and has a `#[macro_export]` attribute
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: the attribute macro `distributed_slice` may come from an old version of the `linkme_impl` crate, try updating your dependency with `cargo update -p linkme_impl`
       = note: `#[warn(non_local_definitions)]` on by default
       = note: this warning originates in the attribute macro `distributed_slice` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `macro_rules!` definition, they should be avoided as they go against expectation
      --> tests/distributed_slice.rs:43:5
       |
    43 |     #[distributed_slice]
       |     ^^^^^^^^^^^^^^^^^^^^
       |
       = help: remove the `#[macro_export]` or move this `macro_rules!` outside the of the current function `test_non_copy`
       = note: a `macro_rules!` definition is non-local if it is nested inside an item and has a `#[macro_export]` attribute
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: the attribute macro `distributed_slice` may come from an old version of the `linkme_impl` crate, try updating your dependency with `cargo update -p linkme_impl`
       = note: this warning originates in the attribute macro `distributed_slice` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `macro_rules!` definition, they should be avoided as they go against expectation
      --> tests/distributed_slice.rs:54:5
       |
    54 |     #[distributed_slice]
       |     ^^^^^^^^^^^^^^^^^^^^
       |
       = help: remove the `#[macro_export]` or move this `macro_rules!` outside the of the current function `test_interior_mutable`
       = note: a `macro_rules!` definition is non-local if it is nested inside an item and has a `#[macro_export]` attribute
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: the attribute macro `distributed_slice` may come from an old version of the `linkme_impl` crate, try updating your dependency with `cargo update -p linkme_impl`
       = note: this warning originates in the attribute macro `distributed_slice` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `macro_rules!` definition, they should be avoided as they go against expectation
      --> tests/distributed_slice.rs:66:5
       |
    66 |     #[distributed_slice]
       |     ^^^^^^^^^^^^^^^^^^^^
       |
       = help: remove the `#[macro_export]` or move this `macro_rules!` outside the of the current function `test_elided_lifetime`
       = note: a `macro_rules!` definition is non-local if it is nested inside an item and has a `#[macro_export]` attribute
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: the attribute macro `distributed_slice` may come from an old version of the `linkme_impl` crate, try updating your dependency with `cargo update -p linkme_impl`
       = note: this warning originates in the attribute macro `distributed_slice` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `macro_rules!` definition, they should be avoided as they go against expectation
      --> tests/distributed_slice.rs:79:5
       |
    79 |     #[distributed_slice]
       |     ^^^^^^^^^^^^^^^^^^^^
       |
       = help: remove the `#[macro_export]` or move this `macro_rules!` outside the of the current function `test_legacy_syntax`
       = note: a `macro_rules!` definition is non-local if it is nested inside an item and has a `#[macro_export]` attribute
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: the attribute macro `distributed_slice` may come from an old version of the `linkme_impl` crate, try updating your dependency with `cargo update -p linkme_impl`
       = note: this warning originates in the attribute macro `distributed_slice` (in Nightly builds, run with -Z macro-backtrace for more info)

    error: non-local `macro_rules!` definition, they should be avoided as they go against expectation
      --> tests/cortex/src/main.rs:35:5
       |
    35 |     #[distributed_slice]
       |     ^^^^^^^^^^^^^^^^^^^^
       |
       = help: remove the `#[macro_export]` or move this `macro_rules!` outside the of the current function `__cortex_m_rt_main`
       = note: a `macro_rules!` definition is non-local if it is nested inside an item and has a `#[macro_export]` attribute
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: the attribute macro `distributed_slice` may come from an old version of the `linkme_impl` crate, try updating your dependency with `cargo update -p linkme_impl`
       = note: `-D non-local-definitions` implied by `-D warnings`
       = help: to override `-D warnings` add `#[allow(non_local_definitions)]`
       = note: this error originates in the attribute macro `distributed_slice` (in Nightly builds, run with -Z macro-backtrace for more info)
dtolnay added a commit to dtolnay/typetag that referenced this issue Feb 26, 2024
Fixes a non_local_definitions warning in the generated code.

    warning: non-local `impl` definition, they should be avoided as they go against expectation
      --> tests/test.rs:18:5
       |
    18 |     #[typetag::serde]
       |     ^^^^^^^^^^^^^^^^^
       |
       = help: move this `impl` block outside the of the current constant `_Trait_registry`
       = note: 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
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: the attribute macro `typetag::serde` may come from an old version of the `typetag_impl` crate, try updating your dependency with `cargo update -p typetag_impl`
       = note: `#[warn(non_local_definitions)]` on by default
       = note: this warning originates in the attribute macro `typetag::serde` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
      --> tests/test.rs:18:5
       |
    18 |     #[typetag::serde]
       |     ^^^^^^^^^^^^^^^^^
       |
       = help: move this `impl` block outside the of the current constant `_Trait_registry`
       = note: 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
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: the attribute macro `typetag::serde` may come from an old version of the `typetag_impl` crate, try updating your dependency with `cargo update -p typetag_impl`
       = note: this warning originates in the attribute macro `typetag::serde` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
      --> tests/test.rs:71:5
       |
    71 |     #[typetag::serde(tag = "type")]
       |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
       |
       = help: move this `impl` block outside the of the current constant `_Trait_registry`
       = note: 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
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
       = note: the attribute macro `typetag::serde` may come from an old version of the `typetag_impl` crate, try updating your dependency with `cargo update -p typetag_impl`
       = note: this warning originates in the attribute macro `typetag::serde` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> tests/test.rs:124:5
        |
    124 |     #[typetag::serde(tag = "type", content = "content")]
        |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        |
        = help: move this `impl` block outside the of the current constant `_Trait_registry`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
        = note: the attribute macro `typetag::serde` may come from an old version of the `typetag_impl` crate, try updating your dependency with `cargo update -p typetag_impl`
        = note: this warning originates in the attribute macro `typetag::serde` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> tests/test.rs:192:5
        |
    192 |     #[typetag::serde]
        |     ^^^^^^^^^^^^^^^^^
        |
        = help: move this `impl` block outside the of the current constant `_Trait_registry`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
        = note: the attribute macro `typetag::serde` may come from an old version of the `typetag_impl` crate, try updating your dependency with `cargo update -p typetag_impl`
        = note: this warning originates in the attribute macro `typetag::serde` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> tests/test.rs:278:5
        |
    278 |     #[typetag::serde(tag = "type", default_variant = "A")]
        |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        |
        = help: move this `impl` block outside the of the current constant `_Trait_registry`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
        = note: the attribute macro `typetag::serde` may come from an old version of the `typetag_impl` crate, try updating your dependency with `cargo update -p typetag_impl`
        = note: this warning originates in the attribute macro `typetag::serde` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> tests/test.rs:322:5
        |
    322 |     #[typetag::serde(tag = "type", content = "content", default_variant = "A")]
        |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        |
        = help: move this `impl` block outside the of the current constant `_Trait_registry`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
        = note: the attribute macro `typetag::serde` may come from an old version of the `typetag_impl` crate, try updating your dependency with `cargo update -p typetag_impl`
        = note: this warning originates in the attribute macro `typetag::serde` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> tests/test.rs:366:5
        |
    366 |     #[typetag::serde(tag = "type", content = "content", deny_unknown_fields)]
        |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        |
        = help: move this `impl` block outside the of the current constant `_Trait_registry`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
        = note: the attribute macro `typetag::serde` may come from an old version of the `typetag_impl` crate, try updating your dependency with `cargo update -p typetag_impl`
        = note: this warning originates in the attribute macro `typetag::serde` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> tests/test.rs:393:5
        |
    393 |     #[typetag::serde]
        |     ^^^^^^^^^^^^^^^^^
        |
        = help: move this `impl` block outside the of the current constant `_Neither_registry`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
        = note: the attribute macro `typetag::serde` may come from an old version of the `typetag_impl` crate, try updating your dependency with `cargo update -p typetag_impl`
        = note: this warning originates in the attribute macro `typetag::serde` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> tests/test.rs:396:5
        |
    396 |     #[typetag::serde]
        |     ^^^^^^^^^^^^^^^^^
        |
        = help: move this `impl` block outside the of the current constant `_Sendable_registry`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
        = note: the attribute macro `typetag::serde` may come from an old version of the `typetag_impl` crate, try updating your dependency with `cargo update -p typetag_impl`
        = note: this warning originates in the attribute macro `typetag::serde` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> tests/test.rs:399:5
        |
    399 |     #[typetag::serde]
        |     ^^^^^^^^^^^^^^^^^
        |
        = help: move this `impl` block outside the of the current constant `_Syncable_registry`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
        = note: the attribute macro `typetag::serde` may come from an old version of the `typetag_impl` crate, try updating your dependency with `cargo update -p typetag_impl`
        = note: this warning originates in the attribute macro `typetag::serde` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> tests/test.rs:402:5
        |
    402 |     #[typetag::serde]
        |     ^^^^^^^^^^^^^^^^^
        |
        = help: move this `impl` block outside the of the current constant `_Both_registry`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
        = note: the attribute macro `typetag::serde` may come from an old version of the `typetag_impl` crate, try updating your dependency with `cargo update -p typetag_impl`
        = note: this warning originates in the attribute macro `typetag::serde` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> tests/test.rs:459:5
        |
    459 |     #[typetag::serialize]
        |     ^^^^^^^^^^^^^^^^^^^^^
        |
        = help: move this `impl` block outside the of the current constant `_Generic_registry`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
        = note: the attribute macro `typetag::serialize` may come from an old version of the `typetag_impl` crate, try updating your dependency with `cargo update -p typetag_impl`
        = note: this warning originates in the attribute macro `typetag::serialize` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> tests/test.rs:466:5
        |
    466 |     #[typetag::serde]
        |     ^^^^^^^^^^^^^^^^^
        |
        = help: move this `impl` block outside the of the current constant `_Trait_registry`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
        = note: the attribute macro `typetag::serde` may come from an old version of the `typetag_impl` crate, try updating your dependency with `cargo update -p typetag_impl`
        = note: this warning originates in the attribute macro `typetag::serde` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> tests/test.rs:483:5
        |
    483 |     #[typetag::serde]
        |     ^^^^^^^^^^^^^^^^^
        |
        = help: move this `impl` block outside the of the current constant `_Base_registry`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
        = note: the attribute macro `typetag::serde` may come from an old version of the `typetag_impl` crate, try updating your dependency with `cargo update -p typetag_impl`
        = note: this warning originates in the attribute macro `typetag::serde` (in Nightly builds, run with -Z macro-backtrace for more info)

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> tests/test.rs:492:5
        |
    492 |     #[typetag::serde]
        |     ^^^^^^^^^^^^^^^^^
        |
        = help: move this `impl` block outside the of the current constant `_Derived_registry`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
        = note: the attribute macro `typetag::serde` may come from an old version of the `typetag_impl` crate, try updating your dependency with `cargo update -p typetag_impl`
        = note: this warning originates in the attribute macro `typetag::serde` (in Nightly builds, run with -Z macro-backtrace for more info)
dtolnay added a commit to dtolnay/typetag that referenced this issue Feb 26, 2024
rust-lang/rust#121621

    fn main() {
        #[typetag::serde]
        trait Trait {}
    }

    warning: non-local `impl` definition, they should be avoided as they go against expectation
     --> src/main.rs:2:5
      |
    2 |     #[typetag::serde]
      |     ^^^^^^^^^^^^^^^^^
      |
      = help: move this `impl` block outside the of the current constant `_` and up 2 bodies
      = note: 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
      = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
      = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
      = note: the attribute macro `typetag::serde` may come from an old version of the `typetag_impl` crate, try updating your dependency with `cargo update -p typetag_impl`
      = note: `#[warn(non_local_definitions)]` on by default
      = note: this warning originates in the attribute macro `typetag::serde` (in Nightly builds, run with -Z macro-backtrace for more info)
dtolnay added a commit to dtolnay/typetag that referenced this issue Feb 26, 2024
rust-lang/rust#121621

    fn main() {
        #[typetag::serde]
        trait Trait {}
    }

    warning: non-local `impl` definition, they should be avoided as they go against expectation
     --> src/main.rs:2:5
      |
    2 |     #[typetag::serde]
      |     ^^^^^^^^^^^^^^^^^
      |
      = help: move this `impl` block outside the of the current constant `_` and up 2 bodies
      = note: 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
      = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
      = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
      = note: the attribute macro `typetag::serde` may come from an old version of the `typetag_impl` crate, try updating your dependency with `cargo update -p typetag_impl`
      = note: `#[warn(non_local_definitions)]` on by default
      = note: this warning originates in the attribute macro `typetag::serde` (in Nightly builds, run with -Z macro-backtrace for more info)
dtolnay added a commit to dtolnay/syn that referenced this issue Feb 26, 2024
    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/lit.rs:564:13
        |
    564 | /             impl LitStr {
    565 | |                 pub(crate) fn debug(
    566 | |                     &self,
    567 | |                     formatter: &mut fmt::Formatter,
    ...   |
    574 | |                 }
    575 | |             }
        | |_____________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
        = note: `#[warn(non_local_definitions)]` on by default

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/lit.rs:583:13
        |
    583 | /             impl LitByteStr {
    584 | |                 pub(crate) fn debug(
    585 | |                     &self,
    586 | |                     formatter: &mut fmt::Formatter,
    ...   |
    593 | |                 }
    594 | |             }
        | |_____________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/lit.rs:602:13
        |
    602 | /             impl LitByte {
    603 | |                 pub(crate) fn debug(
    604 | |                     &self,
    605 | |                     formatter: &mut fmt::Formatter,
    ...   |
    612 | |                 }
    613 | |             }
        | |_____________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/lit.rs:621:13
        |
    621 | /             impl LitChar {
    622 | |                 pub(crate) fn debug(
    623 | |                     &self,
    624 | |                     formatter: &mut fmt::Formatter,
    ...   |
    631 | |                 }
    632 | |             }
        | |_____________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/lit.rs:640:13
        |
    640 | /             impl LitInt {
    641 | |                 pub(crate) fn debug(
    642 | |                     &self,
    643 | |                     formatter: &mut fmt::Formatter,
    ...   |
    650 | |                 }
    651 | |             }
        | |_____________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/lit.rs:659:13
        |
    659 | /             impl LitFloat {
    660 | |                 pub(crate) fn debug(
    661 | |                     &self,
    662 | |                     formatter: &mut fmt::Formatter,
    ...   |
    669 | |                 }
    670 | |             }
        | |_____________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/lit.rs:678:13
        |
    678 | /             impl LitBool {
    679 | |                 pub(crate) fn debug(
    680 | |                     &self,
    681 | |                     formatter: &mut fmt::Formatter,
    ...   |
    688 | |                 }
    689 | |             }
        | |_____________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
      --> src/gen/debug.rs:19:9
       |
    19 | /         impl crate::AngleBracketedGenericArguments {
    20 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    21 | |                 let mut formatter = formatter.debug_struct(name);
    22 | |                 formatter.field("colon2_token", &self.colon2_token);
    ...  |
    27 | |             }
    28 | |         }
       | |_________^
       |
       = help: move this `impl` block outside the of the current method `fmt`
       = note: 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
       = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
       = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/gen/debug.rs:334:9
        |
    334 | /         impl crate::DataEnum {
    335 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    336 | |                 let mut formatter = formatter.debug_struct(name);
    337 | |                 formatter.field("enum_token", &self.enum_token);
    ...   |
    341 | |             }
    342 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/gen/debug.rs:350:9
        |
    350 | /         impl crate::DataStruct {
    351 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    352 | |                 let mut formatter = formatter.debug_struct(name);
    353 | |                 formatter.field("struct_token", &self.struct_token);
    ...   |
    357 | |             }
    358 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/gen/debug.rs:366:9
        |
    366 | /         impl crate::DataUnion {
    367 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    368 | |                 let mut formatter = formatter.debug_struct(name);
    369 | |                 formatter.field("union_token", &self.union_token);
    ...   |
    372 | |             }
    373 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/gen/debug.rs:472:9
        |
    472 | /         impl crate::ExprArray {
    473 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    474 | |                 let mut formatter = formatter.debug_struct(name);
    475 | |                 formatter.field("attrs", &self.attrs);
    ...   |
    479 | |             }
    480 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/gen/debug.rs:488:9
        |
    488 | /         impl crate::ExprAssign {
    489 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    490 | |                 let mut formatter = formatter.debug_struct(name);
    491 | |                 formatter.field("attrs", &self.attrs);
    ...   |
    496 | |             }
    497 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/gen/debug.rs:505:9
        |
    505 | /         impl crate::ExprAsync {
    506 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    507 | |                 let mut formatter = formatter.debug_struct(name);
    508 | |                 formatter.field("attrs", &self.attrs);
    ...   |
    513 | |             }
    514 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/gen/debug.rs:522:9
        |
    522 | /         impl crate::ExprAwait {
    523 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    524 | |                 let mut formatter = formatter.debug_struct(name);
    525 | |                 formatter.field("attrs", &self.attrs);
    ...   |
    530 | |             }
    531 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/gen/debug.rs:539:9
        |
    539 | /         impl crate::ExprBinary {
    540 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    541 | |                 let mut formatter = formatter.debug_struct(name);
    542 | |                 formatter.field("attrs", &self.attrs);
    ...   |
    547 | |             }
    548 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/gen/debug.rs:556:9
        |
    556 | /         impl crate::ExprBlock {
    557 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    558 | |                 let mut formatter = formatter.debug_struct(name);
    559 | |                 formatter.field("attrs", &self.attrs);
    ...   |
    563 | |             }
    564 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/gen/debug.rs:572:9
        |
    572 | /         impl crate::ExprBreak {
    573 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    574 | |                 let mut formatter = formatter.debug_struct(name);
    575 | |                 formatter.field("attrs", &self.attrs);
    ...   |
    580 | |             }
    581 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/gen/debug.rs:589:9
        |
    589 | /         impl crate::ExprCall {
    590 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    591 | |                 let mut formatter = formatter.debug_struct(name);
    592 | |                 formatter.field("attrs", &self.attrs);
    ...   |
    597 | |             }
    598 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/gen/debug.rs:606:9
        |
    606 | /         impl crate::ExprCast {
    607 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    608 | |                 let mut formatter = formatter.debug_struct(name);
    609 | |                 formatter.field("attrs", &self.attrs);
    ...   |
    614 | |             }
    615 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/gen/debug.rs:623:9
        |
    623 | /         impl crate::ExprClosure {
    624 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    625 | |                 let mut formatter = formatter.debug_struct(name);
    626 | |                 formatter.field("attrs", &self.attrs);
    ...   |
    638 | |             }
    639 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/gen/debug.rs:647:9
        |
    647 | /         impl crate::ExprConst {
    648 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    649 | |                 let mut formatter = formatter.debug_struct(name);
    650 | |                 formatter.field("attrs", &self.attrs);
    ...   |
    654 | |             }
    655 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/gen/debug.rs:663:9
        |
    663 | /         impl crate::ExprContinue {
    664 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    665 | |                 let mut formatter = formatter.debug_struct(name);
    666 | |                 formatter.field("attrs", &self.attrs);
    ...   |
    670 | |             }
    671 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/gen/debug.rs:679:9
        |
    679 | /         impl crate::ExprField {
    680 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    681 | |                 let mut formatter = formatter.debug_struct(name);
    682 | |                 formatter.field("attrs", &self.attrs);
    ...   |
    687 | |             }
    688 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/gen/debug.rs:696:9
        |
    696 | /         impl crate::ExprForLoop {
    697 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    698 | |                 let mut formatter = formatter.debug_struct(name);
    699 | |                 formatter.field("attrs", &self.attrs);
    ...   |
    707 | |             }
    708 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/gen/debug.rs:716:9
        |
    716 | /         impl crate::ExprGroup {
    717 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    718 | |                 let mut formatter = formatter.debug_struct(name);
    719 | |                 formatter.field("attrs", &self.attrs);
    ...   |
    723 | |             }
    724 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/gen/debug.rs:732:9
        |
    732 | /         impl crate::ExprIf {
    733 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    734 | |                 let mut formatter = formatter.debug_struct(name);
    735 | |                 formatter.field("attrs", &self.attrs);
    ...   |
    741 | |             }
    742 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/gen/debug.rs:750:9
        |
    750 | /         impl crate::ExprIndex {
    751 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    752 | |                 let mut formatter = formatter.debug_struct(name);
    753 | |                 formatter.field("attrs", &self.attrs);
    ...   |
    758 | |             }
    759 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/gen/debug.rs:767:9
        |
    767 | /         impl crate::ExprInfer {
    768 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    769 | |                 let mut formatter = formatter.debug_struct(name);
    770 | |                 formatter.field("attrs", &self.attrs);
    ...   |
    773 | |             }
    774 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/gen/debug.rs:782:9
        |
    782 | /         impl crate::ExprLet {
    783 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    784 | |                 let mut formatter = formatter.debug_struct(name);
    785 | |                 formatter.field("attrs", &self.attrs);
    ...   |
    791 | |             }
    792 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/gen/debug.rs:800:9
        |
    800 | /         impl crate::ExprLit {
    801 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    802 | |                 let mut formatter = formatter.debug_struct(name);
    803 | |                 formatter.field("attrs", &self.attrs);
    ...   |
    806 | |             }
    807 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/gen/debug.rs:815:9
        |
    815 | /         impl crate::ExprLoop {
    816 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    817 | |                 let mut formatter = formatter.debug_struct(name);
    818 | |                 formatter.field("attrs", &self.attrs);
    ...   |
    823 | |             }
    824 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/gen/debug.rs:832:9
        |
    832 | /         impl crate::ExprMacro {
    833 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    834 | |                 let mut formatter = formatter.debug_struct(name);
    835 | |                 formatter.field("attrs", &self.attrs);
    ...   |
    838 | |             }
    839 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/gen/debug.rs:847:9
        |
    847 | /         impl crate::ExprMatch {
    848 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    849 | |                 let mut formatter = formatter.debug_struct(name);
    850 | |                 formatter.field("attrs", &self.attrs);
    ...   |
    856 | |             }
    857 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/gen/debug.rs:865:9
        |
    865 | /         impl crate::ExprMethodCall {
    866 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    867 | |                 let mut formatter = formatter.debug_struct(name);
    868 | |                 formatter.field("attrs", &self.attrs);
    ...   |
    876 | |             }
    877 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/gen/debug.rs:885:9
        |
    885 | /         impl crate::ExprParen {
    886 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    887 | |                 let mut formatter = formatter.debug_struct(name);
    888 | |                 formatter.field("attrs", &self.attrs);
    ...   |
    892 | |             }
    893 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/gen/debug.rs:901:9
        |
    901 | /         impl crate::ExprPath {
    902 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    903 | |                 let mut formatter = formatter.debug_struct(name);
    904 | |                 formatter.field("attrs", &self.attrs);
    ...   |
    908 | |             }
    909 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/gen/debug.rs:917:9
        |
    917 | /         impl crate::ExprRange {
    918 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    919 | |                 let mut formatter = formatter.debug_struct(name);
    920 | |                 formatter.field("attrs", &self.attrs);
    ...   |
    925 | |             }
    926 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/gen/debug.rs:934:9
        |
    934 | /         impl crate::ExprReference {
    935 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    936 | |                 let mut formatter = formatter.debug_struct(name);
    937 | |                 formatter.field("attrs", &self.attrs);
    ...   |
    942 | |             }
    943 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/gen/debug.rs:951:9
        |
    951 | /         impl crate::ExprRepeat {
    952 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    953 | |                 let mut formatter = formatter.debug_struct(name);
    954 | |                 formatter.field("attrs", &self.attrs);
    ...   |
    960 | |             }
    961 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/gen/debug.rs:969:9
        |
    969 | /         impl crate::ExprReturn {
    970 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    971 | |                 let mut formatter = formatter.debug_struct(name);
    972 | |                 formatter.field("attrs", &self.attrs);
    ...   |
    976 | |             }
    977 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
       --> src/gen/debug.rs:985:9
        |
    985 | /         impl crate::ExprStruct {
    986 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    987 | |                 let mut formatter = formatter.debug_struct(name);
    988 | |                 formatter.field("attrs", &self.attrs);
    ...   |
    996 | |             }
    997 | |         }
        | |_________^
        |
        = help: move this `impl` block outside the of the current method `fmt`
        = note: 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
        = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
        = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
        --> src/gen/debug.rs:1005:9
         |
    1005 | /         impl crate::ExprTry {
    1006 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    1007 | |                 let mut formatter = formatter.debug_struct(name);
    1008 | |                 formatter.field("attrs", &self.attrs);
    ...    |
    1012 | |             }
    1013 | |         }
         | |_________^
         |
         = help: move this `impl` block outside the of the current method `fmt`
         = note: 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
         = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
         = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
        --> src/gen/debug.rs:1021:9
         |
    1021 | /         impl crate::ExprTryBlock {
    1022 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    1023 | |                 let mut formatter = formatter.debug_struct(name);
    1024 | |                 formatter.field("attrs", &self.attrs);
    ...    |
    1028 | |             }
    1029 | |         }
         | |_________^
         |
         = help: move this `impl` block outside the of the current method `fmt`
         = note: 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
         = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
         = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
        --> src/gen/debug.rs:1037:9
         |
    1037 | /         impl crate::ExprTuple {
    1038 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    1039 | |                 let mut formatter = formatter.debug_struct(name);
    1040 | |                 formatter.field("attrs", &self.attrs);
    ...    |
    1044 | |             }
    1045 | |         }
         | |_________^
         |
         = help: move this `impl` block outside the of the current method `fmt`
         = note: 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
         = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
         = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
        --> src/gen/debug.rs:1053:9
         |
    1053 | /         impl crate::ExprUnary {
    1054 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    1055 | |                 let mut formatter = formatter.debug_struct(name);
    1056 | |                 formatter.field("attrs", &self.attrs);
    ...    |
    1060 | |             }
    1061 | |         }
         | |_________^
         |
         = help: move this `impl` block outside the of the current method `fmt`
         = note: 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
         = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
         = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
        --> src/gen/debug.rs:1069:9
         |
    1069 | /         impl crate::ExprUnsafe {
    1070 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    1071 | |                 let mut formatter = formatter.debug_struct(name);
    1072 | |                 formatter.field("attrs", &self.attrs);
    ...    |
    1076 | |             }
    1077 | |         }
         | |_________^
         |
         = help: move this `impl` block outside the of the current method `fmt`
         = note: 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
         = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
         = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
        --> src/gen/debug.rs:1085:9
         |
    1085 | /         impl crate::ExprWhile {
    1086 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    1087 | |                 let mut formatter = formatter.debug_struct(name);
    1088 | |                 formatter.field("attrs", &self.attrs);
    ...    |
    1094 | |             }
    1095 | |         }
         | |_________^
         |
         = help: move this `impl` block outside the of the current method `fmt`
         = note: 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
         = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
         = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
        --> src/gen/debug.rs:1103:9
         |
    1103 | /         impl crate::ExprYield {
    1104 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    1105 | |                 let mut formatter = formatter.debug_struct(name);
    1106 | |                 formatter.field("attrs", &self.attrs);
    ...    |
    1110 | |             }
    1111 | |         }
         | |_________^
         |
         = help: move this `impl` block outside the of the current method `fmt`
         = note: 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
         = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
         = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
        --> src/gen/debug.rs:1179:9
         |
    1179 | /         impl crate::FieldsNamed {
    1180 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    1181 | |                 let mut formatter = formatter.debug_struct(name);
    1182 | |                 formatter.field("brace_token", &self.brace_token);
    ...    |
    1185 | |             }
    1186 | |         }
         | |_________^
         |
         = help: move this `impl` block outside the of the current method `fmt`
         = note: 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
         = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
         = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
        --> src/gen/debug.rs:1194:9
         |
    1194 | /         impl crate::FieldsUnnamed {
    1195 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    1196 | |                 let mut formatter = formatter.debug_struct(name);
    1197 | |                 formatter.field("paren_token", &self.paren_token);
    ...    |
    1200 | |             }
    1201 | |         }
         | |_________^
         |
         = help: move this `impl` block outside the of the current method `fmt`
         = note: 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
         = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
         = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
        --> src/gen/debug.rs:1257:9
         |
    1257 | /         impl crate::ForeignItemFn {
    1258 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    1259 | |                 let mut formatter = formatter.debug_struct(name);
    1260 | |                 formatter.field("attrs", &self.attrs);
    ...    |
    1265 | |             }
    1266 | |         }
         | |_________^
         |
         = help: move this `impl` block outside the of the current method `fmt`
         = note: 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
         = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
         = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
        --> src/gen/debug.rs:1274:9
         |
    1274 | /         impl crate::ForeignItemMacro {
    1275 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    1276 | |                 let mut formatter = formatter.debug_struct(name);
    1277 | |                 formatter.field("attrs", &self.attrs);
    ...    |
    1281 | |             }
    1282 | |         }
         | |_________^
         |
         = help: move this `impl` block outside the of the current method `fmt`
         = note: 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
         = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
         = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
        --> src/gen/debug.rs:1290:9
         |
    1290 | /         impl crate::ForeignItemStatic {
    1291 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    1292 | |                 let mut formatter = formatter.debug_struct(name);
    1293 | |                 formatter.field("attrs", &self.attrs);
    ...    |
    1302 | |             }
    1303 | |         }
         | |_________^
         |
         = help: move this `impl` block outside the of the current method `fmt`
         = note: 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
         = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
         = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
        --> src/gen/debug.rs:1311:9
         |
    1311 | /         impl crate::ForeignItemType {
    1312 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    1313 | |                 let mut formatter = formatter.debug_struct(name);
    1314 | |                 formatter.field("attrs", &self.attrs);
    ...    |
    1321 | |             }
    1322 | |         }
         | |_________^
         |
         = help: move this `impl` block outside the of the current method `fmt`
         = note: 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
         = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
         = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
        --> src/gen/debug.rs:1423:9
         |
    1423 | /         impl crate::ImplItemConst {
    1424 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    1425 | |                 let mut formatter = formatter.debug_struct(name);
    1426 | |                 formatter.field("attrs", &self.attrs);
    ...    |
    1438 | |             }
    1439 | |         }
         | |_________^
         |
         = help: move this `impl` block outside the of the current method `fmt`
         = note: 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
         = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
         = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
        --> src/gen/debug.rs:1447:9
         |
    1447 | /         impl crate::ImplItemFn {
    1448 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    1449 | |                 let mut formatter = formatter.debug_struct(name);
    1450 | |                 formatter.field("attrs", &self.attrs);
    ...    |
    1456 | |             }
    1457 | |         }
         | |_________^
         |
         = help: move this `impl` block outside the of the current method `fmt`
         = note: 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
         = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
         = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
        --> src/gen/debug.rs:1465:9
         |
    1465 | /         impl crate::ImplItemMacro {
    1466 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    1467 | |                 let mut formatter = formatter.debug_struct(name);
    1468 | |                 formatter.field("attrs", &self.attrs);
    ...    |
    1472 | |             }
    1473 | |         }
         | |_________^
         |
         = help: move this `impl` block outside the of the current method `fmt`
         = note: 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
         = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
         = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
        --> src/gen/debug.rs:1481:9
         |
    1481 | /         impl crate::ImplItemType {
    1482 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    1483 | |                 let mut formatter = formatter.debug_struct(name);
    1484 | |                 formatter.field("attrs", &self.attrs);
    ...    |
    1494 | |             }
    1495 | |         }
         | |_________^
         |
         = help: move this `impl` block outside the of the current method `fmt`
         = note: 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
         = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
         = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
        --> src/gen/debug.rs:1549:9
         |
    1549 | /         impl crate::ItemConst {
    1550 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    1551 | |                 let mut formatter = formatter.debug_struct(name);
    1552 | |                 formatter.field("attrs", &self.attrs);
    ...    |
    1563 | |             }
    1564 | |         }
         | |_________^
         |
         = help: move this `impl` block outside the of the current method `fmt`
         = note: 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
         = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
         = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>

    warning: non-local `impl` definition, they should be avoided as they go against expectation
        --> src/gen/debug.rs:1572:9
         |
    1572 | /         impl crate::ItemEnum {
    1573 | |             fn debug(&self, formatter: &mut fmt::Formatter, name: &str) -> fmt::Result {
    1574 | |                 let mut formatter = formatter.debug_struct(name);
    1575 | |                 formatter.field("attrs", &self.attrs);
    ...    |
    1583 | |             }
    1584 | |         }
         | |_________^
         |
     …
martin-g added a commit to apache/avro that referenced this issue Feb 26, 2024
…02-25)

Extract the test trait impls out of the test function body.
No user facing changes!

```
error: non-local `impl` definition, they should be avoided as they go against expectation
  --> avro/tests/validators.rs:42:5
   |
42 | /     impl SchemaNamespaceValidator for CustomValidator {
43 | |         fn validate(&self, _ns: &str) -> AvroResult<()> {
44 | |             Ok(())
45 | |         }
46 | |     }
   | |_____^
   |
   = help: move this `impl` block outside the of the current function `avro_3900_custom_validator_with_spec_invalid_names`
   = note: 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
   = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
   = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
```

Signed-off-by: Martin Tzvetanov Grigorov <mgrigorov@apache.org>
martin-g added a commit to apache/avro that referenced this issue Feb 26, 2024
…02-25)

Extract the test trait impls out of the test function body.
No user facing changes!

```
error: non-local `impl` definition, they should be avoided as they go against expectation
  --> avro/tests/validators.rs:42:5
   |
42 | /     impl SchemaNamespaceValidator for CustomValidator {
43 | |         fn validate(&self, _ns: &str) -> AvroResult<()> {
44 | |             Ok(())
45 | |         }
46 | |     }
   | |_____^
   |
   = help: move this `impl` block outside the of the current function `avro_3900_custom_validator_with_spec_invalid_names`
   = note: 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
   = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
   = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
```

Signed-off-by: Martin Tzvetanov Grigorov <mgrigorov@apache.org>
(cherry picked from commit 9e72af2)
taiki-e added a commit to taiki-e/pin-project that referenced this issue Feb 26, 2024
```
error: non-local `impl` definition, they should be avoided as they go against expectation
   --> tests/pinned_drop.rs:140:17
    |
140 | /                 impl S {
141 | |                     fn _f(self) -> Self {
142 | |                         self
143 | |                     }
144 | |                 }
    | |_________________^
    |
    = help: move this `impl` block outside the of the current function `__drop_inner` and up 3 bodies
    = note: 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
    = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
    = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
    = note: `-D non-local-definitions` implied by `-D warnings`
    = help: to override `-D warnings` add `#[allow(non_local_definitions)]`
```
taiki-e added a commit to taiki-e/syn-serde that referenced this issue Feb 26, 2024
```
error: non-local `impl` definition, they should be avoided as they go against expectation
   --> src/gen/ast_struct.rs:9:10
    |
  9 | #[derive(Serialize, Deserialize)]
    |          ^^^^^^^^^
    |
    = help: move this `impl` block outside the of the current constant `_IMPL_SERIALIZE_FOR_Abi`
    = note: 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
    = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
    = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
    = note: the derive macro `Serialize` may come from an old version of the `serde_derive` crate, try updating your dependency with `cargo update -p serde_derive`
    = note: `-D non-local-definitions` implied by `-D warnings`
    = help: to override `-D warnings` add `#[allow(non_local_definitions)]`
    = note: this error originates in the derive macro `Serialize` (in Nightly builds, run with -Z macro-backtrace for more info)
```
taiki-e added a commit to taiki-e/syn-serde that referenced this issue Feb 26, 2024
```
error: non-local `impl` definition, they should be avoided as they go against expectation
   --> src/gen/ast_struct.rs:9:10
    |
  9 | #[derive(Serialize, Deserialize)]
    |          ^^^^^^^^^
    |
    = help: move this `impl` block outside the of the current constant `_IMPL_SERIALIZE_FOR_Abi`
    = note: 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
    = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
    = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
    = note: the derive macro `Serialize` may come from an old version of the `serde_derive` crate, try updating your dependency with `cargo update -p serde_derive`
    = note: `-D non-local-definitions` implied by `-D warnings`
    = help: to override `-D warnings` add `#[allow(non_local_definitions)]`
    = note: this error originates in the derive macro `Serialize` (in Nightly builds, run with -Z macro-backtrace for more info)
```
@Ddystopia
Copy link
Contributor

Ddystopia commented May 10, 2024

Hello, that RFC disallows code like that, and it is non-local by it's nature

#[diagnostic::on_unimplemented(message = "Type was not produced", label = "Type to be produced")]
#[allow(dead_code)]
trait Produced {}
#[allow(dead_code)]
trait AssertProcuded: Produced {}

trait ProducedExactlyOnce {
    type Args;
    fn produce(args: Self::Args) -> Self;
}

macro_rules! assert_produced {
    ($generic:ty) => {
        impl AssertProcuded for $generic {}
    };
}

macro_rules! produce_exactly_once {
    ($name:ty, $value:expr) => {{
        impl Produced for $name {}
        <$name as ProducedExactlyOnce>::produce($value)
    }};
}

struct Foo(u32);
struct Bar(i32);

impl ProducedExactlyOnce for Foo {
    type Args = u32;
    fn produce(args: Self::Args) -> Self {
        Self(args)
    }
}

impl ProducedExactlyOnce for Bar {
    type Args = i32;
    fn produce(args: Self::Args) -> Self {
        Self(args)
    }
}

assert_produced!(Foo);
assert_produced!(Bar);

fn main() {
    let Foo(foo) = produce_exactly_once!(Foo, 42);
    let Bar(bar) = produce_exactly_once!(Bar, 42);

    println!("{foo:?} {bar:?}");
}

@jieyouxu jieyouxu added the L-non_local_definitions Lint: non_local_definitions label May 13, 2024
RanbirK pushed a commit to RanbirK/avro that referenced this issue May 13, 2024
…02-25)

Extract the test trait impls out of the test function body.
No user facing changes!

```
error: non-local `impl` definition, they should be avoided as they go against expectation
  --> avro/tests/validators.rs:42:5
   |
42 | /     impl SchemaNamespaceValidator for CustomValidator {
43 | |         fn validate(&self, _ns: &str) -> AvroResult<()> {
44 | |             Ok(())
45 | |         }
46 | |     }
   | |_____^
   |
   = help: move this `impl` block outside the of the current function `avro_3900_custom_validator_with_spec_invalid_names`
   = note: 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
   = note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
   = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
```

Signed-off-by: Martin Tzvetanov Grigorov <mgrigorov@apache.org>
nvzqz pushed a commit to nvzqz/divan that referenced this issue May 25, 2024
This triggers a lint (at least on nightly) which
will become deny-by-default in the next edition:
<rust-lang/rust#120363>
ogoffart added a commit to ogoffart/scoped-tls-hkt that referenced this issue Jun 17, 2024
Fix the warning in recent rust versions

```
warning: non-local `impl` definition, `impl` blocks should be written at the same level as their item
   --> src/lib.rs:320:17
    |
304 |         $vis static $name: $name<'static> = {
    |         --------------------------------- move the `impl` block outside of this static `BAR` and up 2 bodies
...
320 |                 unsafe impl Sync for $name<'static> {}
    |                 ^^^^^^^^^^^^----^^^^^-----^^^^^^^^^
    |                             |        |
    |                             |        `BAR` is not local
    |                             `Sync` is not local
...
822 |         scoped_thread_local!(static mut BAR: for<'a> (&'a mut i32, &'a mut f32));
    |         ------------------------------------------------------------------------ in this macro invocation
    |
    = note: `impl` may be usable in bounds, etc. from outside the expression, which might e.g. make something constructible that previously wasn't, because it's still on a publicly-visible type
    = note: an `impl` is never scoped, even when it is nested inside an item, as it may impact type checking outside of that item, which can be the case if neither the trait or the self type are at the same nesting level as the `impl`
    = note: items in an anonymous const item (`const _: () = { ... }`) are treated as in the same scope as the anonymous const's declaration
    = note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <rust-lang/rust#120363>
```
@Manishearth
Copy link
Member

This breaks displaydoc.

A lot of macros use this trick to create local scopes. I don't think this should become a hard error unless there are well supported ways to do this.

@Manishearth
Copy link
Member

Actually no, this isn't displaydoc, this is doctests breaking

https://github.com/unicode-org/icu4x/actions/runs/9549144605/job/26318035304

@Manishearth
Copy link
Member

Manishearth commented Jun 18, 2024

Nope, this also occurs for displaydoc without any doctest shenanigans: https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=c9584f9ecbd510b358e6be29abc7ea39

This kind of const-wrapping is a common macro trick, we should try to support that somehow

yaahc/displaydoc#46

@bjorn3
Copy link
Member

bjorn3 commented Jun 18, 2024

We do allow it for const _, just not for named constants like displaydoc uses.

@Manishearth
Copy link
Member

@bjorn3 Yeah, but it seems like const _ automatically hoists the internal items to the outer scope, defeating the purpose?

Or at least that's what the error message says:

  = note: items in an anonymous const item (`const _: () = { ... }`) are treated as in the same scope as the anonymous const's declaration

@bjorn3
Copy link
Member

bjorn3 commented Jun 18, 2024

They are treated the same for the purpose of this lint. They still encapsulate name resolution.

@Manishearth
Copy link
Member

@bjorn3 Hmm, in that case the current error message appears misleading. To me, it more or less explicitly says that they don't encapsulate name resolution.

matthiaskrgr added a commit to matthiaskrgr/rust that referenced this issue Jun 20, 2024
…orn3,Urgau

Clarify that anonymous consts still do introduce a new scope

See rust-lang#120363 (comment)

This error message is misleading: it's trying to say that `const _ : () = ...` is a workaround for the lint, but by saying that anonymous constants are treated as being in the parent scope, it makes them appear useless for scope-hiding.

They *are* useful for scope-hiding, they are simply treated as part of the parent scope when it comes to this lint.
rust-timer added a commit to rust-lang-ci/rust that referenced this issue Jun 20, 2024
Rollup merge of rust-lang#126652 - Manishearth:anon-const-scope, r=bjorn3,Urgau

Clarify that anonymous consts still do introduce a new scope

See rust-lang#120363 (comment)

This error message is misleading: it's trying to say that `const _ : () = ...` is a workaround for the lint, but by saying that anonymous constants are treated as being in the parent scope, it makes them appear useless for scope-hiding.

They *are* useful for scope-hiding, they are simply treated as part of the parent scope when it comes to this lint.
@jstarks
Copy link

jstarks commented Jun 20, 2024

Is it intended that this lint fires in cases like these?

trait Tr {}
struct Foo<T>(T);
fn foo() {
    struct Bar;
    impl Tr for Foo<Bar> {}
}

Currently it fires.

This seems somewhat against the spirit of the lint. Foo<Bar> is cannot be named outside of foo(), so the reasoning behind the lint doesn't to apply. The impl isn't at the same level as its item, but it is at the outermost level it can be without making Bar visible to surrounding functions.

The lint also fires on fundamental types like Box<T>, which is even more unexpected:

trait Tr{}
fn foo() {
    struct Bar;
    impl Tr for Box<Bar> {}
}

This seems like a bug or at least a wart.

@traviscross
Copy link
Contributor Author

traviscross commented Jun 20, 2024

@jstarks: That is worth filing a dedicated issue about, if you would.

@jstarks
Copy link

jstarks commented Jun 20, 2024

OK, #126768. Feel free to clean up the title and such.

@chinedufn
Copy link
Contributor

chinedufn commented Jun 25, 2024

I quickly scanned though the RFC rust-lang/rfcs#3373 comments and didn't see anything about macro generated runtime tables.

Here's a minimal example of code that should not become a hard error:

struct MyType;

// Heavily simplified version of a macro in my codebase. 
macro_rules! my_macro {
	($($fn_name:ident),*) => {
	    impl MyType {
		pub fn $fn_name(&self) {
	            SomeHandler::$fn_name()
		}
	    }

            do_stuff(&some_type, stringify!($fn_name));
	}
}

fn initialize(some_type: &MyType) {
    my_macro!(
        method1,
        method2,
        method_foo,
        method_bar,
    );
}

fn do_stuff(some_type: &MyType, method_name: &str) {
    // Oversimplified, in real code the key and value might be different here.
    some_type.insert_into_runtime_generated_table(method_name, method_name);
}

In the above example we initialize function takes in MyType.

It calls the macro my_macro! with names of methods to implement on MyType.

my_macro! also generates a runtime call to fn do_stuff that adds the stringified method name to some table.

To satisfy the lint the above could would need to be changed to:

// BAD: Now we're using two macro invocations instead of one.

struct MyType;


macro_rules! implement {
	($($fn_name:ident),*) => {
		impl MyType {
			pub fn $fn_name(&self) {
			    SomeHandler::$fn_name()
			}
		}
	}

}

macro_rules! bind {
	($($fn_name:ident),*) => {
        do_stuff(&some_type, stringify!($fn_name));
	}
}


implement! {
	method1,
	method2,
	method_foo,
	method_bar,
};

fn initialize(some_type: MyType) {
	bind!(
        method1,
        method2,
        method_foo,
        method_bar,
    );
}

fn do_stuff(some_type: &MyType, method_name: &str) {
    // ...
}

Pattern

The pattern here is when you need to implement a method on a type AND also register that method name in some runtime generated table.

Real World

This section is included to help prove that the above problem can be encountered in real-world code. It does not need to be read to understand the problem. For this reason I did not take the time to make this real-world example easy to understand / illustrate with simple code examples.

A real world example of when something like this comes up is when using wasm-bindgen to instantiate a WebAssembly module instance at runtime.

To expose a Rust type's methods to the wasm module you need to write code that essentially maps NAME OF WASM IMPORT -> NAME OF HOST METHOD.

This way when the wasm module calls my_wasm_module_import the host_method gets called.

Closing Thoughts

RFC 3373 rust-lang/rfcs#3373 states the following as the motivation for the change:

Currently, tools cross-referencing uses and definitions (such as IDEs) must
search inside all function bodies to find potential definitions corresponding
to uses within a function.

Humans cross-referencing such uses and definitions may find themselves
similarly baffled.

In my case the human would be more confused if they had to check two macros to understand this pattern instead of one.

My alternative would be to write a build script or some other form of codegen to generate this, but that would be more difficult for the human to find and maintain than a simple inlined macro.

@bjorn3
Copy link
Member

bjorn3 commented Jun 25, 2024

Can you generate the initialize function directly from your macro?

@chinedufn
Copy link
Contributor

My real initialize method does a little bit of setup before invoking the macro.

My development environment's syntax highlighting / other tools work better outside of macros than inside, so I'd prefer to avoid moving code into a macro to satisfy a lint.


That said, I could have my macro generate the initialize and then have initialize call some other initialize_inner_setup() function, then move my other setup code into fn initialize_inner_setup.
Then my macro could remain fairly lean.

my_macro! {
    // generated impl blocks here

    fn initialize() {
        initialize_inner_setup();
        
        // ... generated code that inserts into a runtime table here ...
    }
}

my_macro!();

#[inline]
fn initialize_inner_setup() {
    // ... setup code that does not need to be in the macro ...
}

The downside of extracting out the initialize_inner_setup is that my initialization routine no longer reads top to bottom.
You need to go look at initialize_inner_setup, which should only be a few lines that would've been better off at the top of the fn initialize.

That said, when given a better name this hypothetical initialize_inner_setup would be named clearly enough that you wouldn't need to go read it to it to understand.
Something like fn specific_thing_that_is_happening() {}


None of this is a big deal for my own codebase since this pattern only occurs once, just illustrating the trade-off.


In practice it would be fine for me to generate the entire initialize function in a single macro invocation since it barely has any code in it.
And if it had a lot of code I would want to move parts of it into other sub-functions like the initialize_inner_setup example.

So generating everything in a single macro invocation would be okay in my case.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-maybe-future-edition Something we may consider for a future edition. B-RFC-approved Blocker: Approved by a merged RFC but not yet implemented. C-tracking-issue Category: A tracking issue for an RFC or an unstable feature. L-non_local_definitions Lint: non_local_definitions T-lang Relevant to the language team, which will review and decide on the PR/issue.
Projects
Status: Idea
Development

No branches or pull requests