diff --git a/src/datatype.c b/src/datatype.c index fe8eb5642a255..ba5f38f946375 100644 --- a/src/datatype.c +++ b/src/datatype.c @@ -577,12 +577,17 @@ void jl_compute_field_offsets(jl_datatype_t *st) // Should never happen throw_ovf(should_malloc, desc, st, fsz); desc[i].isptr = 0; + if (jl_is_uniontype(fld)) { haspadding = 1; fsz += 1; // selector byte zeroinit = 1; } else { + if (fsz > jl_datatype_size(fld)) { + // We have to pad the size to integer size class, but it means this has some padding + haspadding = 1; + } uint32_t fld_npointers = ((jl_datatype_t*)fld)->layout->npointers; if (((jl_datatype_t*)fld)->layout->haspadding) haspadding = 1; diff --git a/test/core.jl b/test/core.jl index 0549c1eec32df..4ccf4e15d1acd 100644 --- a/test/core.jl +++ b/test/core.jl @@ -8085,3 +8085,8 @@ let widen_diagonal(x::UnionAll) = Base.rewrap_unionall(Base.widen_diagonal(Base. @test Tuple === widen_diagonal(Union{Tuple{Vararg{S}}, Tuple{Vararg{T}}} where {S, T}) @test Tuple{Vararg{Val{<:Set}}} == widen_diagonal(Tuple{Vararg{T}} where T<:Val{<:Set}) end + +#58434 bitsegal comparison of oddly sized fields +primitive type ByteString58434 (18 * 8) end + +@test Base.datatype_haspadding(Tuple{ByteString58434}) == true