rustc_intrinsic: support functions without body
We synthesize a HIR body `loop {}` but such bodyless intrinsics.
Most of the diff is due to turning `ItemKind::Fn` into a brace (named-field) enum variant, because it carries a `bool`-typed field now. This is to remember whether the function has a body. MIR building panics to avoid ever translating the fake `loop {}` body, and the intrinsic logic uses the lack of a body to implicitly mark that intrinsic as must-be-overridden.
I first tried actually having no body rather than generating the fake body, but there's a *lot* of code that assumes that all function items have HIR and MIR, so this didn't work very well. Then I noticed that even `rustc_intrinsic_must_be_overridden` intrinsics have MIR generated (they are filled with an `Unreachable` terminator) so I guess I am not the first to discover this. ;)
r? `@oli-obk`
|
||
|---|---|---|
| .. | ||
| arena.rs | ||
| def.rs | ||
| def_path_hash_map.rs | ||
| definitions.rs | ||
| diagnostic_items.rs | ||
| hir.rs | ||
| hir_id.rs | ||
| intravisit.rs | ||
| lang_items.rs | ||
| lib.rs | ||
| pat_util.rs | ||
| stable_hash_impls.rs | ||
| target.rs | ||
| tests.rs | ||
| weak_lang_items.rs | ||