From d4285efab2f0799bfeb26644eeb475eb755d1354 Mon Sep 17 00:00:00 2001 From: Will Tebbutt Date: Mon, 7 Oct 2024 14:37:49 +0200 Subject: [PATCH] Handle `Union`s / `UnionAll`s of `Tuple`s in zero_rdata (#284) * Handle unions and unionalls of tuples * Bump patch * Add comment * Refine new tests * Refine implementation * Refine implementation further * Add comment --- Project.toml | 2 +- src/fwds_rvs_data.jl | 1 + test/fwds_rvs_data.jl | 4 +++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Project.toml b/Project.toml index 4501ca07..edba62cb 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "Mooncake" uuid = "da2b9cff-9c12-43a0-ae48-6db2b0edb7d6" authors = ["Will Tebbutt, Hong Ge, and contributors"] -version = "0.4.8" +version = "0.4.9" [deps] ADTypes = "47edcb42-4c32-4615-8424-f2b9edc5f35b" diff --git a/src/fwds_rvs_data.jl b/src/fwds_rvs_data.jl index 16a8ce98..e506ee61 100644 --- a/src/fwds_rvs_data.jl +++ b/src/fwds_rvs_data.jl @@ -563,6 +563,7 @@ obtained from `P` alone. R == NoRData && return true isabstracttype(P) && return false (isconcretetype(P) || P <: Tuple) || return false + (P <: Tuple && !(P isa DataType)) && return false # catch Unions and UnionAlls (P <: Tuple && Base.datatype_fieldcount(P) === nothing) && return false # For general structs, just look at their fields. diff --git a/test/fwds_rvs_data.jl b/test/fwds_rvs_data.jl index 2536645f..c70d0bf0 100644 --- a/test/fwds_rvs_data.jl +++ b/test/fwds_rvs_data.jl @@ -24,13 +24,15 @@ end @testset "zero_rdata_from_type checks" begin @test Mooncake.can_produce_zero_rdata_from_type(Vector) == true @test Mooncake.zero_rdata_from_type(Vector) == NoRData() - @test Mooncake.can_produce_zero_rdata_from_type(FwdsRvsDataTestResources.Foo) == false + @test !Mooncake.can_produce_zero_rdata_from_type(FwdsRvsDataTestResources.Foo) @test Mooncake.can_produce_zero_rdata_from_type(Tuple{Float64, Type{Float64}}) @test ==( Mooncake.zero_rdata_from_type(FwdsRvsDataTestResources.Foo), Mooncake.CannotProduceZeroRDataFromType(), ) @test !Mooncake.can_produce_zero_rdata_from_type(Tuple) + @test !Mooncake.can_produce_zero_rdata_from_type(Union{Tuple{Float64}, Tuple{Int}}) + @test !Mooncake.can_produce_zero_rdata_from_type(Tuple{T, T} where {T<:Integer}) end @testset "lazy construction checks" begin # Check that lazy construction is in fact lazy for some cases where performance