Skip to content

Commit 160bba5

Browse files
authored
inference: improve isdefined_tfunc accuracy for Unions (#43036)
1 parent f614f3c commit 160bba5

File tree

2 files changed

+11
-0
lines changed

2 files changed

+11
-0
lines changed

base/compiler/tfuncs.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,12 @@ function isdefined_tfunc(@nospecialize(arg1), @nospecialize(sym))
313313
end
314314
end
315315
end
316+
elseif isa(a1, Union)
317+
t = Bottom
318+
for u in uniontypes(a1)
319+
t = tmerge(t, isdefined_tfunc(u, sym))
320+
end
321+
return t
316322
end
317323
return Bool
318324
end

test/compiler/inference.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1153,6 +1153,11 @@ end
11531153
@test isdefined_tfunc(NamedTuple{(:x,:y),<:Tuple{Int,Any}}, Const(:y)) === Const(true)
11541154
@test isdefined_tfunc(NamedTuple{(:x,:y),<:Tuple{Int,Any}}, Const(:z)) === Const(false)
11551155
end
1156+
struct UnionIsdefinedA; x; end
1157+
struct UnionIsdefinedB; x; end
1158+
@test isdefined_tfunc(Union{UnionIsdefinedA,UnionIsdefinedB}, Const(:x)) === Const(true)
1159+
@test isdefined_tfunc(Union{UnionIsdefinedA,UnionIsdefinedB}, Const(:y)) === Const(false)
1160+
@test isdefined_tfunc(Union{UnionIsdefinedA,Nothing}, Const(:x)) === Bool
11561161

11571162
@noinline map3_22347(f, t::Tuple{}) = ()
11581163
@noinline map3_22347(f, t::Tuple) = (f(t[1]), map3_22347(f, Base.tail(t))...)

0 commit comments

Comments
 (0)