Skip to content

Commit 3f20eec

Browse files
committed
Restrict merge(::NamedTuple, ::Pair{..., NamedTuple}) optimization
This restricts this optimization to apply only to "fully-iterated" NamedTuple Pairs, which are the only kind generated by lowering and `Base.pairs`. Resolves #59292.
1 parent 1c9865a commit 3f20eec

File tree

2 files changed

+5
-1
lines changed

2 files changed

+5
-1
lines changed

base/namedtuple.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ merge(a::NamedTuple, b::NamedTuple{()}) = a
343343
merge(a::NamedTuple{()}, b::NamedTuple{()}) = a
344344
merge(a::NamedTuple{()}, b::NamedTuple) = b
345345

346-
merge(a::NamedTuple, b::Iterators.Pairs{<:Any,<:Any,<:Any,<:NamedTuple}) = merge(a, getfield(b, :data))
346+
merge(a::NamedTuple, b::Iterators.Pairs{<:Any,<:Any,Nothing,<:NamedTuple}) = merge(a, getfield(b, :data))
347347

348348
merge(a::NamedTuple, b::Iterators.Zip{<:Tuple{Any,Any}}) = merge(a, NamedTuple{Tuple(b.is[1])}(b.is[2]))
349349

test/namedtuple.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,10 @@ end
163163
@test merge(NamedTuple(), [:a=>1, :b=>2, :c=>3, :a=>4, :c=>5]) == (a=4, b=2, c=5)
164164
@test merge((c=0, z=1), [:a=>1, :b=>2, :c=>3, :a=>4, :c=>5]) == (c=5, z=1, a=4, b=2)
165165

166+
# https://github.com/JuliaLang/julia/issues/59292
167+
@test merge((; a = 1), Base.Pairs((; b = 2, c = 3), (:b,))) == (a = 1, b = 2)
168+
@test merge((; a = 1), Base.pairs((; b = 2, c = 3))) == (a = 1, b = 2, c = 3)
169+
166170
@test keys((a=1, b=2, c=3)) == (:a, :b, :c)
167171
@test keys(NamedTuple()) == ()
168172
@test keys((a=1,)) == (:a,)

0 commit comments

Comments
 (0)