Skip to content

Commit 7718bc7

Browse files
committed
Handle Structs with undef fields
1 parent f7213c8 commit 7718bc7

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
@@ -113,7 +113,11 @@ zero_tangent(x::Number) = zero(x)
113113
@generated function zero_tangent(primal)
114114
has_mutable_tangent(primal) || return ZeroTangent() # note this takes care of tuples
115115
zfield_exprs = map(fieldnames(primal)) do fname
116-
fval = Expr(:call, zero_tangent, Expr(:call, getfield, :primal, QuoteNode(fname)))
116+
fval = if isdefined(primal, fname)
117+
Expr(:call, zero_tangent, Expr(:call, getfield, :primal, QuoteNode(fname)))
118+
else
119+
ZeroTangent()
120+
end
117121
Expr(:kw, fname, fval)
118122
end
119123
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
@@ -180,7 +180,7 @@ end
180180
@test zero_tangent([1.0, 2.0]) == [0.0, 0.0]
181181
@test zero_tangent([[1.0, 2.0], [3.0]]) == [[0.0, 0.0], [0.0]]
182182

183-
@testset "undef elements" begin
183+
@testset "undef elements Vector" begin
184184
x = Vector{Vector{Float64}}(undef, 3)
185185
x[2] = [1.0, 2.0]
186186
dx = zero_tangent(x)
@@ -202,4 +202,20 @@ end
202202
@test length(db) == 3
203203
@test db isa Vector
204204
end
205+
206+
@testset "undef fields struct" begin
207+
dx = zero_tangent(Core.Box())
208+
@test dx.contents isa ZeroTangent
209+
@test (dx.contents = 2.0) == 2.0 # should be assignable
210+
211+
mutable struct MyPartiallyDefinedStruct
212+
intro::Float64
213+
contents::Number
214+
MyPartiallyDefinedStruct(x) = new(x)
215+
end
216+
dy = zero_tangent(MyPartiallyDefinedStruct(1.5))
217+
@test iszero(dy.intro)
218+
@test iszero(dy.contents)
219+
@test (dy.contents = 2.0) == 2.0 # should be assignable
220+
end
205221
end

0 commit comments

Comments
 (0)