diff --git a/Project.toml b/Project.toml index b213cc39d..1a1bbdb1b 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "ChainRulesCore" uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" -version = "0.9.31" +version = "0.9.32" [deps] Compat = "34da2185-b29b-5c13-b0c7-acf172513d20" diff --git a/src/differentials/composite.jl b/src/differentials/composite.jl index 36d21853e..10eb50730 100644 --- a/src/differentials/composite.jl +++ b/src/differentials/composite.jl @@ -180,6 +180,12 @@ canonicalize(comp::Composite{<:Tuple, <:Tuple}) = comp # Dict composite are always in their canonical form. canonicalize(comp::Composite{<:Any, <:AbstractDict}) = comp +# Composites of unspecified primal types (indicated by specifying exactly `Any`) +# all combinations of type-params are specified here to avoid ambiguities +canonicalize(comp::Composite{Any, <:NamedTuple{L}}) where {L} = comp +canonicalize(comp::Composite{Any, <:Tuple}) where {L} = comp +canonicalize(comp::Composite{Any, <:AbstractDict}) where {L} = comp + """ _zeroed_backing(P) diff --git a/test/differentials/composite.jl b/test/differentials/composite.jl index 599c50b22..50dfddc0f 100644 --- a/test/differentials/composite.jl +++ b/test/differentials/composite.jl @@ -153,6 +153,16 @@ end @test canonicalize(CFoo(y=10)) == CFoo(x=Zero(), y=10) @test_throws ArgumentError canonicalize(CFoo(q=99.0, x=2.5)) + + @testset "unspecified primal type" begin + c1 = Composite{Any}(;a=1, b=2) + c2 = Composite{Any}(1, 2) + c3 = Composite{Any}(Dict(4 => 3)) + + @test c1 == canonicalize(c1) + @test c2 == canonicalize(c2) + @test c3 == canonicalize(c3) + end end @testset "+ with other composites" begin