@@ -489,13 +489,22 @@ doc! {macro_rules! select {
489
489
// Create a scope to separate polling from handling the output. This
490
490
// adds borrow checker flexibility when using the macro.
491
491
let mut output = {
492
+ // Store each future directly first (that is, without wrapping the future in a call to
493
+ // `IntoFuture::into_future`). This allows the `$fut` expression to make use of
494
+ // temporary lifetime extension.
495
+ //
496
+ // https://doc.rust-lang.org/1.58.1/reference/destructors.html#temporary-lifetime-extension
497
+ let futures_init = ( $( $fut, ) +) ;
498
+
492
499
// Safety: Nothing must be moved out of `futures`. This is to
493
500
// satisfy the requirement of `Pin::new_unchecked` called below.
494
501
//
495
502
// We can't use the `pin!` macro for this because `futures` is a
496
503
// tuple and the standard library provides no way to pin-project to
497
504
// the fields of a tuple.
498
- let mut futures = ( $( $crate :: macros:: support:: IntoFuture :: into_future( $fut) , ) + ) ;
505
+ let mut futures = ( $( $crate :: macros:: support:: IntoFuture :: into_future(
506
+ $crate :: count_field!( futures_init. $( $skip) * )
507
+ ) , ) +) ;
499
508
500
509
// This assignment makes sure that the `poll_fn` closure only has a
501
510
// reference to the futures, instead of taking ownership of them.
@@ -854,6 +863,206 @@ macro_rules! count {
854
863
} ;
855
864
}
856
865
866
+ #[ macro_export]
867
+ #[ doc( hidden) ]
868
+ macro_rules! count_field {
869
+ ( $var: ident. ) => {
870
+ $var. 0
871
+ } ;
872
+ ( $var: ident. _) => {
873
+ $var. 1
874
+ } ;
875
+ ( $var: ident. _ _) => {
876
+ $var. 2
877
+ } ;
878
+ ( $var: ident. _ _ _) => {
879
+ $var. 3
880
+ } ;
881
+ ( $var: ident. _ _ _ _) => {
882
+ $var. 4
883
+ } ;
884
+ ( $var: ident. _ _ _ _ _) => {
885
+ $var. 5
886
+ } ;
887
+ ( $var: ident. _ _ _ _ _ _) => {
888
+ $var. 6
889
+ } ;
890
+ ( $var: ident. _ _ _ _ _ _ _) => {
891
+ $var. 7
892
+ } ;
893
+ ( $var: ident. _ _ _ _ _ _ _ _) => {
894
+ $var. 8
895
+ } ;
896
+ ( $var: ident. _ _ _ _ _ _ _ _ _) => {
897
+ $var. 9
898
+ } ;
899
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _) => {
900
+ $var. 10
901
+ } ;
902
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _) => {
903
+ $var. 11
904
+ } ;
905
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _) => {
906
+ $var. 12
907
+ } ;
908
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _) => {
909
+ $var. 13
910
+ } ;
911
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
912
+ $var. 14
913
+ } ;
914
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
915
+ $var. 15
916
+ } ;
917
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
918
+ $var. 16
919
+ } ;
920
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
921
+ $var. 17
922
+ } ;
923
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
924
+ $var. 18
925
+ } ;
926
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
927
+ $var. 19
928
+ } ;
929
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
930
+ $var. 20
931
+ } ;
932
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
933
+ $var. 21
934
+ } ;
935
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
936
+ $var. 22
937
+ } ;
938
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
939
+ $var. 23
940
+ } ;
941
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
942
+ $var. 24
943
+ } ;
944
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
945
+ $var. 25
946
+ } ;
947
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
948
+ $var. 26
949
+ } ;
950
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
951
+ $var. 27
952
+ } ;
953
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
954
+ $var. 28
955
+ } ;
956
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
957
+ $var. 29
958
+ } ;
959
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
960
+ $var. 30
961
+ } ;
962
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
963
+ $var. 31
964
+ } ;
965
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
966
+ $var. 32
967
+ } ;
968
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
969
+ $var. 33
970
+ } ;
971
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
972
+ $var. 34
973
+ } ;
974
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
975
+ $var. 35
976
+ } ;
977
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
978
+ $var. 36
979
+ } ;
980
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
981
+ $var. 37
982
+ } ;
983
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
984
+ $var. 38
985
+ } ;
986
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
987
+ $var. 39
988
+ } ;
989
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
990
+ $var. 40
991
+ } ;
992
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
993
+ $var. 41
994
+ } ;
995
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
996
+ $var. 42
997
+ } ;
998
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
999
+ $var. 43
1000
+ } ;
1001
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1002
+ $var. 44
1003
+ } ;
1004
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1005
+ $var. 45
1006
+ } ;
1007
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1008
+ $var. 46
1009
+ } ;
1010
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1011
+ $var. 47
1012
+ } ;
1013
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1014
+ $var. 48
1015
+ } ;
1016
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1017
+ $var. 49
1018
+ } ;
1019
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1020
+ $var. 50
1021
+ } ;
1022
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1023
+ $var. 51
1024
+ } ;
1025
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1026
+ $var. 52
1027
+ } ;
1028
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1029
+ $var. 53
1030
+ } ;
1031
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1032
+ $var. 54
1033
+ } ;
1034
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1035
+ $var. 55
1036
+ } ;
1037
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1038
+ $var. 56
1039
+ } ;
1040
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1041
+ $var. 57
1042
+ } ;
1043
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1044
+ $var. 58
1045
+ } ;
1046
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1047
+ $var. 59
1048
+ } ;
1049
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1050
+ $var. 60
1051
+ } ;
1052
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1053
+ $var. 61
1054
+ } ;
1055
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1056
+ $var. 62
1057
+ } ;
1058
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1059
+ $var. 63
1060
+ } ;
1061
+ ( $var: ident. _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) => {
1062
+ $var. 64
1063
+ } ;
1064
+ }
1065
+
857
1066
#[ macro_export]
858
1067
#[ doc( hidden) ]
859
1068
macro_rules! select_variant {
0 commit comments