Reflection metadata level and ReflectionMirror

It appears that ReflectionMirror.swift does not adequately take into account the situation where the compiler strips metadata.

When compiling under SWIFT_REFLECTION_METADATA_LEVEL = without-names, my app instantly crashes on start-up:

2023-05-26 17:10:29.254537-0400 Hubstaff Debug[52150:16357452] Swift/ReflectionMirror.swift:287: Fatal error: Unexpectedly found nil while unwrapping an Optional value

We can see that Swift force-unwraps the field name:

287     if !body(field.name!, offset, childType, kind) {

Backtrace:

* thread #1, queue = 'com.apple.main-thread', stop reason = Fatal error: Unexpectedly found nil while unwrapping an Optional value
    frame #0: 0x000000018bf82330 libswiftCore.dylib`_swift_runtime_on_report
    frame #1: 0x000000018c016760 libswiftCore.dylib`_swift_stdlib_reportFatalErrorInFile + 204
    frame #2: 0x000000018bcdc794 libswiftCore.dylib`closure #1 (Swift.UnsafeBufferPointer<Swift.UInt8>) -> () in closure #1 (Swift.UnsafeBufferPointer<Swift.UInt8>) -> () in closure #1 (Swift.UnsafeBufferPointer<Swift.UInt8>) -> () in Swift._assertionFailure(_: Swift.StaticString, _: Swift.StaticString, file: Swift.StaticString, line: Swift.UInt, flags: Swift.UInt32) -> Swift.Never + 288
    frame #3: 0x000000018bcdc544 libswiftCore.dylib`closure #1 (Swift.UnsafeBufferPointer<Swift.UInt8>) -> () in closure #1 (Swift.UnsafeBufferPointer<Swift.UInt8>) -> () in Swift._assertionFailure(_: Swift.StaticString, _: Swift.StaticString, file: Swift.StaticString, line: Swift.UInt, flags: Swift.UInt32) -> Swift.Never + 196
    frame #4: 0x000000018bcdc43c libswiftCore.dylib`closure #1 (Swift.UnsafeBufferPointer<Swift.UInt8>) -> () in Swift._assertionFailure(_: Swift.StaticString, _: Swift.StaticString, file: Swift.StaticString, line: Swift.UInt, flags: Swift.UInt32) -> Swift.Never + 328
    frame #5: 0x000000018bcdc034 libswiftCore.dylib`Swift._assertionFailure(_: Swift.StaticString, _: Swift.StaticString, file: Swift.StaticString, line: Swift.UInt, flags: Swift.UInt32) -> Swift.Never + 168
    frame #6: 0x000000018bdfa444 libswiftCore.dylib`Swift._forEachField(of: Any.Type, options: Swift._EachFieldOptions, body: (Swift.UnsafePointer<Swift.Int8>, Swift.Int, Any.Type, Swift._MetadataKind) -> Swift.Bool) -> Swift.Bool + 544
    frame #7: 0x000000019c964efc Combine`Combine.ObservableObject< where τ_0_0.ObjectWillChangePublisher == Combine.ObservableObjectPublisher>.objectWillChange.getter : Combine.ObservableObjectPublisher + 268
    frame #8: 0x0000000100c0bf00 Hubstaff Debug`protocol witness for ObservableObject.objectWillChange.getter in conformance NavigatingStackScreenPresenter at <compiler-generated>:0
    frame #9: 0x000000010be58e24 SwiftUI`___lldb_unnamed_symbol174468 + 144
    frame #10: 0x000000010c2ee0c4 SwiftUI`___lldb_unnamed_symbol212486 + 248
    frame #11: 0x000000010c2ed5b4 SwiftUI`___lldb_unnamed_symbol212465 + 88
    frame #12: 0x000000010be658e4 SwiftUI`___lldb_unnamed_symbol175025 + 392
    frame #13: 0x000000010b607a00 SwiftUI`___lldb_unnamed_symbol103442 + 28
    frame #14: 0x000000019d23fe34 AttributeGraph`AG::Graph::UpdateStack::update() + 512
    frame #15: 0x000000019d240534 AttributeGraph`AG::Graph::update_attribute(AG::data::ptr<AG::Node>, unsigned int) + 428
    frame #16: 0x000000019d247fdc AttributeGraph`AG::Graph::input_value_ref_slow(AG::data::ptr<AG::Node>, AG::AttributeID, unsigned int, AGSwiftMetadata const*, unsigned char&, long) + 324
    frame #17: 0x000000019d25e300 AttributeGraph`AGGraphGetValue + 216
    frame #18: 0x000000010be65458 SwiftUI`___lldb_unnamed_symbol175006 + 80
    frame #19: 0x000000010be6554c SwiftUI`___lldb_unnamed_symbol175008 + 164
    frame #20: 0x000000010b607a00 SwiftUI`___lldb_unnamed_symbol103442 + 28
    frame #21: 0x000000019d23fe34 AttributeGraph`AG::Graph::UpdateStack::update() + 512
    frame #22: 0x000000019d240534 AttributeGraph`AG::Graph::update_attribute(AG::data::ptr<AG::Node>, unsigned int) + 428
    frame #23: 0x000000019d247fdc AttributeGraph`AG::Graph::input_value_ref_slow(AG::data::ptr<AG::Node>, AG::AttributeID, unsigned int, AGSwiftMetadata const*, unsigned char&, long) + 324
    frame #24: 0x000000019d25e300 AttributeGraph`AGGraphGetValue + 216
    frame #25: 0x000000010bf0fefc SwiftUI`___lldb_unnamed_symbol179872 + 44
    frame #26: 0x000000010bf100e8 SwiftUI`___lldb_unnamed_symbol179880 + 324
    frame #27: 0x000000010b607a00 SwiftUI`___lldb_unnamed_symbol103442 + 28
    frame #28: 0x000000019d23fe34 AttributeGraph`AG::Graph::UpdateStack::update() + 512
    frame #29: 0x000000019d240534 AttributeGraph`AG::Graph::update_attribute(AG::data::ptr<AG::Node>, unsigned int) + 428
    frame #30: 0x000000019d247fdc AttributeGraph`AG::Graph::input_value_ref_slow(AG::data::ptr<AG::Node>, AG::AttributeID, unsigned int, AGSwiftMetadata const*, unsigned char&, long) + 324
    frame #31: 0x000000019d25e300 AttributeGraph`AGGraphGetValue + 216
    frame #32: 0x000000010b53e778 SwiftUI`___lldb_unnamed_symbol90491 + 92
    frame #33: 0x000000019d23fe34 AttributeGraph`AG::Graph::UpdateStack::update() + 512
    frame #34: 0x000000019d240534 AttributeGraph`AG::Graph::update_attribute(AG::data::ptr<AG::Node>, unsigned int) + 428
    frame #35: 0x000000019d247fdc AttributeGraph`AG::Graph::input_value_ref_slow(AG::data::ptr<AG::Node>, AG::AttributeID, unsigned int, AGSwiftMetadata const*, unsigned char&, long) + 324
    frame #36: 0x000000019d25e300 AttributeGraph`AGGraphGetValue + 216
    frame #37: 0x000000010b4d7280 SwiftUI`___lldb_unnamed_symbol86043 + 52
    frame #38: 0x000000010b4c2a30 SwiftUI`___lldb_unnamed_symbol85979 + 628
    frame #39: 0x000000010b5bf474 SwiftUI`___lldb_unnamed_symbol98602 + 20
    frame #40: 0x000000019d23fe34 AttributeGraph`AG::Graph::UpdateStack::update() + 512
    frame #41: 0x000000019d240534 AttributeGraph`AG::Graph::update_attribute(AG::data::ptr<AG::Node>, unsigned int) + 428
    frame #42: 0x000000019d247fdc AttributeGraph`AG::Graph::input_value_ref_slow(AG::data::ptr<AG::Node>, AG::AttributeID, unsigned int, AGSwiftMetadata const*, unsigned char&, long) + 324
    frame #43: 0x000000019d25e300 AttributeGraph`AGGraphGetValue + 216
    frame #44: 0x000000010bac6c4c SwiftUI`___lldb_unnamed_symbol143079 + 60
    frame #45: 0x000000010b341a5c SwiftUI`___lldb_unnamed_symbol83725 + 64
    frame #46: 0x000000010b340670 SwiftUI`___lldb_unnamed_symbol83724 + 372
    frame #47: 0x000000010b560468 SwiftUI`___lldb_unnamed_symbol91641 + 20
    frame #48: 0x000000019d23fe34 AttributeGraph`AG::Graph::UpdateStack::update() + 512
    frame #49: 0x000000019d240534 AttributeGraph`AG::Graph::update_attribute(AG::data::ptr<AG::Node>, unsigned int) + 428
    frame #50: 0x000000019d247fdc AttributeGraph`AG::Graph::input_value_ref_slow(AG::data::ptr<AG::Node>, AG::AttributeID, unsigned int, AGSwiftMetadata const*, unsigned char&, long) + 324
    frame #51: 0x000000019d25e300 AttributeGraph`AGGraphGetValue + 216
    frame #52: 0x000000010b7c4abc SwiftUI`___lldb_unnamed_symbol118499 + 92
    frame #53: 0x000000010b7c4c00 SwiftUI`___lldb_unnamed_symbol118508 + 56
    frame #54: 0x000000010b634f1c SwiftUI`___lldb_unnamed_symbol104663 + 148
    frame #55: 0x000000019d23fe34 AttributeGraph`AG::Graph::UpdateStack::update() + 512
    frame #56: 0x000000019d240534 AttributeGraph`AG::Graph::update_attribute(AG::data::ptr<AG::Node>, unsigned int) + 428
    frame #57: 0x000000019d247fdc AttributeGraph`AG::Graph::input_value_ref_slow(AG::data::ptr<AG::Node>, AG::AttributeID, unsigned int, AGSwiftMetadata const*, unsigned char&, long) + 324
    frame #58: 0x000000019d25e300 AttributeGraph`AGGraphGetValue + 216
    frame #59: 0x000000010c2af648 SwiftUI`___lldb_unnamed_symbol210222 + 252
    frame #60: 0x000000010b607a00 SwiftUI`___lldb_unnamed_symbol103442 + 28
    frame #61: 0x000000019d23fe34 AttributeGraph`AG::Graph::UpdateStack::update() + 512
    frame #62: 0x000000019d240534 AttributeGraph`AG::Graph::update_attribute(AG::data::ptr<AG::Node>, unsigned int) + 428
    frame #63: 0x000000019d247fdc AttributeGraph`AG::Graph::input_value_ref_slow(AG::data::ptr<AG::Node>, AG::AttributeID, unsigned int, AGSwiftMetadata const*, unsigned char&, long) + 324
    frame #64: 0x000000019d25e300 AttributeGraph`AGGraphGetValue + 216
    frame #65: 0x000000010bdd2780 SwiftUI`___lldb_unnamed_symbol169228 + 96
    frame #66: 0x000000010b607a00 SwiftUI`___lldb_unnamed_symbol103442 + 28
    frame #67: 0x000000019d23fe34 AttributeGraph`AG::Graph::UpdateStack::update() + 512
    frame #68: 0x000000019d240534 AttributeGraph`AG::Graph::update_attribute(AG::data::ptr<AG::Node>, unsigned int) + 428
    frame #69: 0x000000019d247fdc AttributeGraph`AG::Graph::input_value_ref_slow(AG::data::ptr<AG::Node>, AG::AttributeID, unsigned int, AGSwiftMetadata const*, unsigned char&, long) + 324
    frame #70: 0x000000019d25e300 AttributeGraph`AGGraphGetValue + 216
    frame #71: 0x000000010b7c4ea8 SwiftUI`___lldb_unnamed_symbol118508 + 736
    frame #72: 0x000000010b634f1c SwiftUI`___lldb_unnamed_symbol104663 + 148
    frame #73: 0x000000019d23fe34 AttributeGraph`AG::Graph::UpdateStack::update() + 512
    frame #74: 0x000000019d240534 AttributeGraph`AG::Graph::update_attribute(AG::data::ptr<AG::Node>, unsigned int) + 428
    frame #75: 0x000000019d2477e0 AttributeGraph`AG::Graph::value_ref(AG::AttributeID, AGSwiftMetadata const*, unsigned char&) + 160
    frame #76: 0x000000019d25e348 AttributeGraph`AGGraphGetValue + 288
    frame #77: 0x000000010c2e210c SwiftUI`___lldb_unnamed_symbol212005 + 52
    frame #78: 0x000000010b9e0c08 SwiftUI`___lldb_unnamed_symbol138074 + 260
    frame #79: 0x000000010c15c9f8 SwiftUI`___lldb_unnamed_symbol199705 + 2120
    frame #80: 0x000000010c1550f4 SwiftUI`___lldb_unnamed_symbol199511 + 340
    frame #81: 0x000000010c4c3a44 SwiftUI`___lldb_unnamed_symbol228309 + 256
    frame #82: 0x000000010c4c3a8c SwiftUI`___lldb_unnamed_symbol228310 + 32
    frame #83: 0x00000001081cac00 UIKitCore`-[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 1860
    frame #84: 0x0000000187dfd528 QuartzCore`CA::Layer::layout_if_needed(CA::Transaction*) + 440
    frame #85: 0x0000000187e08288 QuartzCore`CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 128
    frame #86: 0x0000000187d32130 QuartzCore`CA::Context::commit_transaction(CA::Transaction*, double, double*) + 440
    frame #87: 0x0000000187d5d0f4 QuartzCore`CA::Transaction::commit() + 636
    frame #88: 0x0000000107d3fbd0 UIKitCore`__34-[UIApplication _firstCommitBlock]_block_invoke_2 + 32
    frame #89: 0x000000018039aa34 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 20
    frame #90: 0x000000018039a17c CoreFoundation`__CFRunLoopDoBlocks + 360
    frame #91: 0x000000018039496c CoreFoundation`__CFRunLoopRun + 768
    frame #92: 0x0000000180394254 CoreFoundation`CFRunLoopRunSpecific + 584
    frame #93: 0x0000000188eb7c9c GraphicsServices`GSEventRunModal + 160
    frame #94: 0x0000000107d26ff0 UIKitCore`-[UIApplication _run] + 868
    frame #95: 0x0000000107d2af3c UIKitCore`UIApplicationMain + 124
    frame #96: 0x000000010c1db34c SwiftUI`___lldb_unnamed_symbol203070 + 172
    frame #97: 0x000000010c1db1ec SwiftUI`___lldb_unnamed_symbol203068 + 140
    frame #98: 0x000000010b9d3474 SwiftUI`static SwiftUI.App.main() -> () + 80
  * frame #99: 0x0000000100c4c9e8 Hubstaff Debug`static HubstaffApp.$main(self=Hubstaff.HubstaffApp) at HubstaffApp.swift:42:1
    frame #100: 0x0000000100c5106c Hubstaff Debug`main at HubstaffApp.swift:0
    frame #101: 0x000000010325d514 dyld_sim`start_sim + 20
    frame #102: 0x00000001034a9f28 dyld`start + 2236

It's fixed in the current version:

if let name = field.name {
  if !body(name, offset, childType, kind) {

The change was done on the 1st of May.