Skip to content

Commit 438def7

Browse files
authored
macros: allow temporary lifetime extension in select (#6722)
1 parent ee8d4d1 commit 438def7

File tree

2 files changed

+218
-1
lines changed

2 files changed

+218
-1
lines changed

tokio/src/macros/select.rs

+210-1
Original file line numberDiff line numberDiff line change
@@ -489,13 +489,22 @@ doc! {macro_rules! select {
489489
// Create a scope to separate polling from handling the output. This
490490
// adds borrow checker flexibility when using the macro.
491491
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+
492499
// Safety: Nothing must be moved out of `futures`. This is to
493500
// satisfy the requirement of `Pin::new_unchecked` called below.
494501
//
495502
// We can't use the `pin!` macro for this because `futures` is a
496503
// tuple and the standard library provides no way to pin-project to
497504
// 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+
),)+);
499508

500509
// This assignment makes sure that the `poll_fn` closure only has a
501510
// reference to the futures, instead of taking ownership of them.
@@ -854,6 +863,206 @@ macro_rules! count {
854863
};
855864
}
856865

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+
8571066
#[macro_export]
8581067
#[doc(hidden)]
8591068
macro_rules! select_variant {

tokio/tests/macros_select.rs

+8
Original file line numberDiff line numberDiff line change
@@ -709,3 +709,11 @@ async fn select_into_future() {
709709
() = NotAFuture => {},
710710
}
711711
}
712+
713+
// regression test for https://github.com/tokio-rs/tokio/issues/6721
714+
#[tokio::test]
715+
async fn temporary_lifetime_extension() {
716+
tokio::select! {
717+
() = &mut std::future::ready(()) => {},
718+
}
719+
}

0 commit comments

Comments
 (0)