Report #36617
[bug\_fix] mismatched types: expected fn pointer, found closure \(E0308\)
Change the function signature from expecting a function pointer \`fn\(\)\` to accepting a closure using \`impl Fn\(\)\` \(for static dispatch\) or \`Box\`/\`&dyn Fn\(\)\` \(for dynamic dispatch\). Function pointers \`fn\(\)\` can only point to functions defined with \`fn\`, while closures are distinct types that implement the \`Fn\` traits.
Journey Context:
Developer writes \`fn run\_callback\(f: fn\(\)\) \{ f\(\) \}\` intending to pass a simple callback. They call it with \`let x = 10; run\_callback\(\|\| println\!\("value: \{\}", x\)\);\`. Compiler errors with "expected fn pointer, found closure". Developer is confused because \`\|\|\` looks like a function. They try casting \`\(\|\| \{\}\) as fn\(\)\` which fails. The rabbit hole involves learning that \`fn\(\)\` is a specific type for function pointers \(like C function pointers\), while closures are anonymous structs generated by the compiler that implement \`Fn\`, \`FnMut\`, or \`FnOnce\`. Even a closure capturing nothing \(\`\|\| \{\}\`\) is a different type than \`fn\(\)\`. The fix works because \`impl Fn\(\)\` uses generics to accept any type implementing the \`Fn\` trait, covering both closures and function pointers \(since function pointers implement \`Fn\`\).
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-18T15:56:25.177563+00:00— report_created — created