# Path resolution within fn
## Timeline with related documents/threads
Date | Description
-----------|-------------
2018-07-17 | Github thread from Diesel when the deprecation lint referenced here was first introduced: https://github.com/rust-lang/rust/pull/51952#issuecomment-405608959
2021-03-27 | Tracking issue 83583 filed to track deprecation lint proc_macro_derive_resolution_fallback: https://github.com/rust-lang/rust/issues/83583 (You can see proc-macro authors there bemoaning Rust's expressivity gap for this case.)
2021-04-08 | PR 84022 made PROC_MACRO_DERIVE_RESOLUTION_FALLBACK a hard error https://github.com/rust-lang/rust/pull/84022
2022-01-20 | PR 107133 reverted the aformentioned upgrade to hard error, in response to breakage found on crater (and pnkfelix's personal belief that we should aim higher here) https://github.com/rust-lang/rust/pull/107133
## The problem: `fn`-bodies and `super`
When you put a derive on a struct, such as:
```rust=
#[derive(MyTrait)]
struct ModLevelStruct;
```
you expect it to generate some code corresponding to a trait implementation; but it might also include other helper code that the trait implementation calls out to.
Some macro authors have put such helper code into a generated submodule (though there exist other options, depending on where you are willing/able to put the aforementioned trait impl). Assuming the helper code is going into a generated submodule, you might have the above expand to:
```rust=
mod _inner_mod {
// Note the need for `super::` here,
// to access the surrounding context.
pub fn helper(x: &super::ModLevelStruct) { }
}
impl MyTrait for ModLevelStruct {
fn method(&self) { _inner_mod::helper(self); }
}
struct ModLevelStruct;
```
This works today when the struct and associated derive attribute occurs immediately within the body of a module (e.g. the outermost section of a Rust source file).
However, what about when you add the same `derive` to a struct that is within an `fn`-body:
```rust
fn problem() {
#[derive(MyTrait)]
struct FnLevelStruct;
}
```
which now will expand into:
```rust!
fn problem() {
mod _inner_mod {
// Where does *this* use of `super` start
// searching? The module that contains
// `fn problem`, or the body of `fn problem`
// itself?
pub fn helper(x: &super::FnLevelStruct) { }
}
impl MyTrait for FnLevelStruct {
fn method(&self) { _inner_mod::helper(self); }
}
struct FnLevelStruct;
}
```
Today, this latter code, if written directly without using the macro expander, does not compile. (Even if it *is* written using the macro-expander, it still won't compile unless one uses a `derive`, because non-derive proc-macros are not allowed to expand into `mod` forms (see [PR #50820](https://github.com/rust-lang/rust/pull/50820)).)
Note that defining structs within a `fn`-body is not an exceptional corner case for Rust; for example, it is standard for rustdoc to turn individual code blocks into testable code by injecting them into the body of a fresh `fn`.