diff --git a/text/3476-expose-fn-type.md b/text/3476-expose-fn-type.md
new file mode 100644
index 00000000000..15154f91803
--- /dev/null
+++ b/text/3476-expose-fn-type.md
@@ -0,0 +1,269 @@
+- Feature Name: `expose-fn-type`
+- Start Date: 2023-08-20
+- RFC PR: [rust-lang/rfcs#3476](https://github.com/rust-lang/rfcs/pull/3476)
+- Rust Issue: N/A
+
+# Summary
+[summary]: #summary
+
+This exposes the function type of a function item to the user.
+
+# Motivation
+[motivation]: #motivation
+
+### DasLixou
+
+I was trying to make something similar to bevy's system functions. And for safety reasons, they check for conflicts between SystemParams, so that a function requiring `Res` and `ResMut` [panic](https://github.com/bevyengine/bevy/blob/main/crates/bevy_ecs/src/system/system_param.rs#L421).
+
+Then after I heard about axum's [`#[debug_handler]`](https://docs.rs/axum/latest/axum/attr.debug_handler.html) I wanted to do something similar to my copy of bevy systems, so that I get compile time errors when there is a conflict. I wanted even more, I wanted to force the user to mark the function with a specific proc attribute macro in order to make it possible to pass it into my code and call itself a system.
+
+For that, I would need to mark the type behind the function item, for example, with a trait.
+
+### madsmtm
+
+In Swift, some functions have an associated selector that you can access with [`#selector`](https://developer.apple.com/documentation/swift/using-objective-c-runtime-features-in-swift).
+
+In my crate `objc2`, it would be immensely beautiful (and useful) to be able to do something similar, e.g. access a function's selector using something like `MyClass::my_function::Selector` or `selector(MyClass::my_function)`, instead of having to know the selector name (which might be something completely different than the function name).
+
+# Terminology
+
+I'll may shorten `function` to `fn` sometimes.
+
+- **function pointer**: pointer type with the type syntax `fn(?) -> ?` directly pointing at a function, not the type implementing the `Fn[Once/Mut](?) -> ?` traits.
+- **function item** (or just function): a declared function in code. free-standing or associated to a type.
+- **function group**: many non-specific functions with the same signature (params, return type, etc.)
+- **function trait(s)**: the `Fn[Once/Mut](?) -> ?` traits
+- **function type**: the type behind a function, which also implements the function traits.
+- **fixed type**: directly named type, no generic / `impl Trait`.
+- **describe the function type**: write `fn(..) -> ? name` instead of just `fn name`.
+
+# Guide-level explanation
+[guide-level-explanation]: #guide-level-explanation
+
+As we all know, you can refer to a struct by its name and for example implement a trait
+```rust
+struct Timmy;
+impl Person for Timmy {
+ fn greet() {
+ println!("Hey it's me, Timmy!");
+ }
+}
+```
+When we want to target a specific function for a trait implementation, we somehow need to get to the type behind it.
+Refering to the hidden type is achieved via the following syntax
+```rust
+fn is_positive(a: i32) -> bool { /* ... */ }
+impl MyTrait for fn(i32) -> bool is_positive {
+ /* ... */
+}
+```
+For function signatures, where every parameter/return-type is a fixed type and can be known just by refering to the function (so no generics or `impl Trait` parameters/return type), we can drop the redundant information:
+```rust
+fn is_positive(a: i32) -> bool { /* ... */ }
+impl MyTrait for fn is_positive {
+ /* ... */
+}
+```
+
+> 💡 NOTE: Even when we need to describe the function type but the return type is `()`, we can (just as for function pointers and function traits) drop the `-> ()` from the type. (This should also be added as a lint).
+
+---
+A function with a more complex signature, like a function that specifies `const`, `unsafe` or `extern "ABI"`, we just ignore that when naming the type:
+```rust
+const fn my_fn(a: i32) -> (i16, i16) { .. }
+impl MyTrait for fn my_fn {}
+// or with explicit declaration
+impl MyTrait for fn(i32) -> (i16, i16) my_fn { .. }
+```
+
+When having an async function, we in theory have a `impl Future