@@ -818,3 +818,177 @@ namedtup = (;a=1, b=2, c=3)
818
818
@test (1 , " 2" ) == @inferred Tuple (pair)
819
819
@test (1 , " 2" ) == @inferred Tuple {Int,String} (pair)
820
820
end
821
+
822
+ @testset " from constant-length iterators, issue #52993" begin
823
+ allocs = function (:: Type{T} , iter) where {T}
824
+ @allocated T (iter)
825
+ end
826
+
827
+ @testset " conversion" begin
828
+ @testset " length 1" begin
829
+ iters = (7 :: Number , Ref (7 ):: Ref , fill (7 ):: AbstractArray{<:Any,0} )
830
+
831
+ @testset " iter: $iter " for iter ∈ iters
832
+ types = (
833
+ Tuple{Float64}, Tuple{AbstractFloat},Tuple{Float64,Vararg{Float64}},
834
+ Tuple{Vararg{Float64}}, Tuple{Vararg{AbstractFloat}},
835
+ )
836
+ @testset " T: $T " for T ∈ types
837
+ @test (7.0 ,) === @inferred T (iter)
838
+ @test iszero (allocs (T, iter))
839
+ end
840
+ end
841
+ end
842
+
843
+ @testset " length 2" begin
844
+ iters = ((10 => 20 ):: Pair ,)
845
+
846
+ @testset " iter: $iter " for iter ∈ iters
847
+ types = (
848
+ Tuple{Float64,Float64}, Tuple{AbstractFloat,AbstractFloat},
849
+ Tuple{Float64,AbstractFloat}, Tuple{AbstractFloat,Float64},
850
+ Tuple{Vararg{Float64}}, Tuple{Vararg{AbstractFloat}},
851
+ Tuple{Float64,Vararg{Float64}}, Tuple{Float64,Vararg{AbstractFloat}}
852
+ )
853
+ @testset " T: $T " for T ∈ types
854
+ @test (10.0 , 20.0 ) === @inferred T (iter)
855
+ @test iszero (allocs (T, iter))
856
+ end
857
+ end
858
+ end
859
+ end
860
+
861
+ types_length_0 = (Tuple{},)
862
+ types_length_1 = (
863
+ Tuple{Int}, Tuple{Number}, Tuple{Any}, (Tuple{T} where {T<: Number }),
864
+ (Tuple{T} where {Number<: T <: Any }), (Tuple{T} where {Int<: T <: Number })
865
+ )
866
+ types_length_2 = (
867
+ Tuple{Int,Int}, Tuple{Number,Number}, Tuple{Number,Any}, Tuple{Number,Int},
868
+ Tuple{Any,Any}, (Tuple{Number, T} where {Int<: T <: Number }),
869
+ (Tuple{T, T} where {Int<: T <: Number }), (Tuple{T, T} where {T<: Number })
870
+ )
871
+ types_length_3 = (
872
+ Tuple{Int,Int,Int}, Tuple{Number,Number,Number}, Tuple{Number,Any,Int},
873
+ Tuple{Any,Any,Any}, (Tuple{T,T,T} where {T}),
874
+ (Tuple{T,T,T} where {Number<: T <: Any }), (Tuple{Number,T,T} where {T<: Number })
875
+ )
876
+ types_length_4 = (
877
+ Tuple{Int,Int,Int,Int}, Tuple{Any,Number,Int,Any}, (Tuple{T,T,T,T} where {T}),
878
+ (Tuple{T,T,T,T} where {Int<: T <: Number }), (Tuple{Int,T,T,T} where {T})
879
+ )
880
+
881
+ types_vararg_0 = (
882
+ Tuple, Tuple{Vararg{Int}}, Tuple{Vararg{Number}}, (Tuple{Vararg{T}} where {T}),
883
+ (Tuple{Vararg{T}} where {T<: Number }), (Tuple{Vararg{T}} where {T<: Int }),
884
+ (Tuple{Vararg{T}} where {Number<: T <: Any }),
885
+ (Tuple{Vararg{T}} where {Int<: T <: Number })
886
+ )
887
+ types_vararg_1 = (
888
+ Tuple{Number,Vararg{Number}}, Tuple{Number,Vararg{Any}}, Tuple{Int,Vararg{Int}},
889
+ (Tuple{Int,Vararg{T}} where {T}), (Tuple{Int,Vararg{T}} where {Int<: T <: Number })
890
+ )
891
+ types_vararg_2 = (
892
+ Tuple{Any,Any,Vararg{Any}}, Tuple{Int,Int,Vararg{Number}},
893
+ Tuple{Int,Int,Vararg{Int}}, (Tuple{Int,Number,Vararg{T}} where {T}),
894
+ (Tuple{Int,Number,Vararg{T}} where {T}),
895
+ (Tuple{Int,Number,Vararg{T}} where {T<: Number }),
896
+ (Tuple{Int,Number,Vararg{T}} where {Int, T<: Number })
897
+ )
898
+ types_vararg_3 = (
899
+ Tuple{Any,Any,Any,Vararg{Any}}, Tuple{Number,Int,Any,Vararg{Number}},
900
+ Tuple{Int,Int,Int,Vararg{Int}}, (Tuple{T,Number,Any,Vararg{T}} where {T}),
901
+ (Tuple{T,Number,Any,Vararg{T}} where {T<: Number }),
902
+ (Tuple{T,Number,Any,Vararg{T}} where {Int<: T <: Number })
903
+ )
904
+ types_vararg_4 = (
905
+ Tuple{Any,Number,Int,Number,Vararg{Number}},
906
+ (Tuple{Any,Number,Int,Number,Vararg{T}} where {T}),
907
+ (Tuple{Any,Number,T,Number,Vararg{T}} where {Int<: T <: Number })
908
+ )
909
+
910
+ @testset " length 1" begin
911
+ types_ok_0 = types_length_0
912
+ types_ok_1 = (
913
+ types_length_1... , types_vararg_0... , types_vararg_1...
914
+ )
915
+ types_throws = (
916
+ types_length_2... , types_length_3... , types_length_4... ,
917
+ types_vararg_2... , types_vararg_3... , types_vararg_4...
918
+ )
919
+ iters = (7 :: Number , Ref (7 ):: Ref , fill (7 ):: AbstractArray{<:Any,0} )
920
+
921
+ @testset " iter: $iter " for iter ∈ iters
922
+ @testset " OK 0" begin
923
+ @testset " T: $T " for T ∈ types_ok_0
924
+ @test () === @inferred T (iter)
925
+ @test iszero (allocs (T, iter))
926
+ end
927
+ end
928
+
929
+ @testset " OK 1" begin
930
+ @testset " T: $T " for T ∈ types_ok_1
931
+ @test (7 ,) === @inferred T (iter)
932
+ @test iszero (allocs (T, iter))
933
+ end
934
+ end
935
+
936
+ @testset " throws `ArgumentError`" begin
937
+ @testset " T: $T " for T ∈ types_throws
938
+ @test_throws ArgumentError T (iter)
939
+ end
940
+ end
941
+
942
+ @testset " throws" begin
943
+ @test_throws Exception Tuple {Nothing} (iter)
944
+ @test_throws Exception Tuple {Matrix} (iter)
945
+ end
946
+ end
947
+ end
948
+
949
+ @testset " length 2" begin
950
+ types_ok_0 = types_length_0
951
+ types_ok_1 = types_length_1
952
+ types_ok_2 = (
953
+ types_length_2... , types_vararg_0... , types_vararg_1... , types_vararg_2...
954
+ )
955
+ types_throws = (
956
+ types_length_3... , types_length_4... , types_vararg_3... , types_vararg_4...
957
+ )
958
+ iters = ((10 => 20 ):: Pair ,)
959
+
960
+ @testset " iter: $iter " for iter ∈ iters
961
+ @testset " OK 0" begin
962
+ @testset " T: $T " for T ∈ types_ok_0
963
+ @test () === @inferred T (iter)
964
+ @test iszero (allocs (T, iter))
965
+ end
966
+ end
967
+
968
+ @testset " OK 1" begin
969
+ @testset " T: $T " for T ∈ types_ok_1
970
+ @test (10 ,) === @inferred T (iter)
971
+ @test iszero (allocs (T, iter))
972
+ end
973
+ end
974
+
975
+ @testset " OK 2" begin
976
+ @testset " T: $T " for T ∈ types_ok_2
977
+ @test (10 , 20 ) === @inferred T (iter)
978
+ @test iszero (allocs (T, iter))
979
+ end
980
+ end
981
+
982
+ @testset " throws `ArgumentError`" begin
983
+ @testset " T: $T " for T ∈ types_throws
984
+ @test_throws ArgumentError T (iter)
985
+ end
986
+ end
987
+
988
+ @testset " throws" begin
989
+ @test_throws Exception Tuple {Nothing,Any} (iter)
990
+ @test_throws Exception Tuple {Matrix,Any} (iter)
991
+ end
992
+ end
993
+ end
994
+ end
0 commit comments