Skip to content

Commit 75c2ca3

Browse files
committed
Handle Structs with undef fields
1 parent bbfb4ba commit 75c2ca3

File tree

2 files changed

+22
-2
lines changed

2 files changed

+22
-2
lines changed

src/tangent_types/abstract_zero.jl

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,11 @@ zero_tangent(x::Number) = zero(x)
109109
@generated function zero_tangent(primal)
110110
has_mutable_tangent(primal) || return ZeroTangent() # note this takes care of tuples
111111
zfield_exprs = map(fieldnames(primal)) do fname
112-
fval = Expr(:call, zero_tangent, Expr(:call, getfield, :primal, QuoteNode(fname)))
112+
fval = if isdefined(primal, fname)
113+
Expr(:call, zero_tangent, Expr(:call, getfield, :primal, QuoteNode(fname)))
114+
else
115+
ZeroTangent()
116+
end
113117
Expr(:kw, fname, fval)
114118
end
115119
backing_expr = Expr(:tuple, Expr(:parameters, zfield_exprs...))

test/tangent_types/abstract_zero.jl

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ end
174174
@test zero_tangent([1.0, 2.0]) == [0.0, 0.0]
175175
@test zero_tangent([[1.0, 2.0], [3.0]]) == [[0.0, 0.0], [0.0]]
176176

177-
@testset "undef elements" begin
177+
@testset "undef elements Vector" begin
178178
x = Vector{Vector{Float64}}(undef, 3)
179179
x[2] = [1.0, 2.0]
180180
dx = zero_tangent(x)
@@ -196,4 +196,20 @@ end
196196
@test length(db) == 3
197197
@test db isa Vector
198198
end
199+
200+
@testset "undef fields struct" begin
201+
dx = zero_tangent(Core.Box())
202+
@test dx.contents isa ZeroTangent
203+
@test (dx.contents = 2.0) == 2.0 # should be assignable
204+
205+
mutable struct MyPartiallyDefinedStruct
206+
intro::Float64
207+
contents::Number
208+
MyPartiallyDefinedStruct(x) = new(x)
209+
end
210+
dy = zero_tangent(MyPartiallyDefinedStruct(1.5))
211+
@test iszero(dy.intro)
212+
@test iszero(dy.contents)
213+
@test (dy.contents = 2.0) == 2.0 # should be assignable
214+
end
199215
end

0 commit comments

Comments
 (0)