Open jrose-signal opened 1 year ago
This diagnostic is poor, but I'd like to point out that packed
is pointless in the Header
struct and you'd have a better time without it.
This is stripped down from a full example, but you're probably right…it would be enough to use repr(C)
and static-assert that the alignment is 1.
Yeah our diagnostics regressed when we fixed https://github.com/rust-lang/rust/issues/27060, good point. Not sure how we usually handle special diagnostics for derive
-- do we really want code littered all over the compiler that special-cases derive
? I don't think we can emit this diagnostic in the derive code itself, but it would still be valuable for compiler maintenance to keep this clean, somehow.
Also FWIW, the intended fix is to declare UInt16LE
as Copy
.
The derive macro has to decide whether to take a reference or a copy without having any type information. And for a packed struct, taking a copy seems like the more promising strategy in general, so that's what we do.
Maybe we could add a PackedDeriveField
helper trait (with a T: Copy
blanket impl) and add Field: PackedDeriveField
trait bounds on the impls. Then, throw a rustc_on_unimplemented
on that trait and hope the diagnostics machinery picks it all up.
Code
Current output
Desired output
Rationale and extra context
I thought this was a regression in 1.69, and it sort of was, but presumably the old code was incorrect, since you can't form a reference to a field in a
repr(packed)
struct. Nothing in the diagnostic pointed me to that, though, so I had to figure out why this struct was different.Other cases
No response
Anything else?
No response