Snap for 8730993 from b13a626221c2744d6ab9400568dd111c76c945bb to mainline-tzdata3-release
Change-Id: Ie6902af7b09cd3f2e7c0932b65392f523d78a835
diff --git a/.cargo_vcs_info.json b/.cargo_vcs_info.json
index 942329b..f3ad3ab 100644
--- a/.cargo_vcs_info.json
+++ b/.cargo_vcs_info.json
@@ -1,6 +1,5 @@
{
"git": {
- "sha1": "fc1e3250219170e31cddb8857a276cba7dd08d44"
- },
- "path_in_vcs": "futures-macro"
-}
\ No newline at end of file
+ "sha1": "c91f8691672c7401b1923ab00bf138975c99391a"
+ }
+}
diff --git a/Android.bp b/Android.bp
index 7674084..996d4d9 100644
--- a/Android.bp
+++ b/Android.bp
@@ -1,4 +1,4 @@
-// This file is generated by cargo2android.py --config cargo2android.json.
+// This file is generated by cargo2android.py --run --dependencies.
// Do not modify this file as changes will be overridden on upgrade.
package {
@@ -40,8 +40,6 @@
rust_proc_macro {
name: "libfutures_macro",
crate_name: "futures_macro",
- cargo_env_compat: true,
- cargo_pkg_version: "0.3.21",
srcs: ["src/lib.rs"],
edition: "2018",
rustlibs: [
@@ -49,4 +47,12 @@
"libquote",
"libsyn",
],
+ proc_macros: ["libproc_macro_hack"],
}
+
+// dependent_library ["feature_list"]
+// proc-macro-hack-0.5.19
+// proc-macro2-1.0.26 "default,proc-macro"
+// quote-1.0.9 "default,proc-macro"
+// syn-1.0.68 "clone-impls,default,derive,full,parsing,printing,proc-macro,quote"
+// unicode-xid-0.2.1 "default"
diff --git a/Cargo.toml b/Cargo.toml
index 86fc5c9..a01c8cc 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -3,26 +3,28 @@
# When uploading crates to the registry Cargo will automatically
# "normalize" Cargo.toml files for maximal compatibility
# with all versions of Cargo and also rewrite `path` dependencies
-# to registry (e.g., crates.io) dependencies.
+# to registry (e.g., crates.io) dependencies
#
-# If you are reading this file be aware that the original Cargo.toml
-# will likely look very different (and much more reasonable).
-# See Cargo.toml.orig for the original contents.
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
[package]
edition = "2018"
-rust-version = "1.45"
name = "futures-macro"
-version = "0.3.21"
-description = """
-The futures-rs procedural macro implementations.
-"""
+version = "0.3.13"
+authors = ["Taylor Cramer <cramertj@google.com>", "Taiki Endo <te316e89@gmail.com>"]
+description = "The futures-rs procedural macro implementations.\n"
homepage = "https://rust-lang.github.io/futures-rs"
+documentation = "https://docs.rs/futures-macro/0.3"
license = "MIT OR Apache-2.0"
repository = "https://github.com/rust-lang/futures-rs"
[lib]
proc-macro = true
+[dependencies.proc-macro-hack]
+version = "0.5.19"
[dependencies.proc-macro2]
version = "1.0"
@@ -31,7 +33,7 @@
version = "1.0"
[dependencies.syn]
-version = "1.0.56"
+version = "1.0"
features = ["full"]
[features]
diff --git a/Cargo.toml.orig b/Cargo.toml.orig
index a929d0f..090f736 100644
--- a/Cargo.toml.orig
+++ b/Cargo.toml.orig
@@ -1,11 +1,12 @@
[package]
name = "futures-macro"
-version = "0.3.21"
edition = "2018"
-rust-version = "1.45"
+version = "0.3.13"
+authors = ["Taylor Cramer <cramertj@google.com>", "Taiki Endo <te316e89@gmail.com>"]
license = "MIT OR Apache-2.0"
repository = "https://github.com/rust-lang/futures-rs"
homepage = "https://rust-lang.github.io/futures-rs"
+documentation = "https://docs.rs/futures-macro/0.3"
description = """
The futures-rs procedural macro implementations.
"""
@@ -17,5 +18,6 @@
[dependencies]
proc-macro2 = "1.0"
+proc-macro-hack = "0.5.19"
quote = "1.0"
-syn = { version = "1.0.56", features = ["full"] }
+syn = { version = "1.0", features = ["full"] }
diff --git a/METADATA b/METADATA
index ca144da..05b2aa8 100644
--- a/METADATA
+++ b/METADATA
@@ -7,13 +7,13 @@
}
url {
type: ARCHIVE
- value: "https://static.crates.io/crates/futures-macro/futures-macro-0.3.21.crate"
+ value: "https://static.crates.io/crates/futures-macro/futures-macro-0.3.13.crate"
}
- version: "0.3.21"
+ version: "0.3.13"
license_type: NOTICE
last_upgrade_date {
- year: 2022
- month: 3
+ year: 2021
+ month: 4
day: 1
}
}
diff --git a/TEST_MAPPING b/TEST_MAPPING
index 5ef61de..a86ecdd 100644
--- a/TEST_MAPPING
+++ b/TEST_MAPPING
@@ -1,45 +1,56 @@
// Generated by update_crate_tests.py for tests that depend on this crate.
{
- "imports": [
- {
- "path": "external/rust/crates/anyhow"
- },
- {
- "path": "external/rust/crates/futures-util"
- },
- {
- "path": "external/rust/crates/tokio"
- },
- {
- "path": "external/rust/crates/tokio-test"
- }
- ],
"presubmit": [
{
- "name": "ZipFuseTest"
+ "name": "tokio-test_device_test_src_lib"
},
{
- "name": "authfs_device_test_src_lib"
+ "name": "tokio-test_device_test_tests_io"
},
{
- "name": "doh_unit_test"
+ "name": "tokio-test_device_test_tests_macros"
},
{
- "name": "virtualizationservice_device_test"
- }
- ],
- "presubmit-rust": [
- {
- "name": "ZipFuseTest"
+ "name": "anyhow_device_test_tests_test_convert"
},
{
- "name": "authfs_device_test_src_lib"
+ "name": "tokio-test_device_test_tests_block_on"
},
{
- "name": "doh_unit_test"
+ "name": "anyhow_device_test_tests_test_source"
},
{
- "name": "virtualizationservice_device_test"
+ "name": "anyhow_device_test_tests_test_context"
+ },
+ {
+ "name": "anyhow_device_test_tests_test_fmt"
+ },
+ {
+ "name": "anyhow_device_test_tests_test_macros"
+ },
+ {
+ "name": "anyhow_device_test_tests_test_repr"
+ },
+ {
+ "name": "futures-util_device_test_src_lib"
+ },
+ {
+ "name": "anyhow_device_test_tests_test_ffi"
+ },
+ {
+ "name": "anyhow_device_test_tests_test_chain"
+ },
+ {
+ "name": "anyhow_device_test_tests_test_boxed"
+ },
+ {
+ "name": "anyhow_device_test_tests_test_autotrait"
+ },
+ {
+ "name": "anyhow_device_test_src_lib"
+ },
+ {
+ "name": "anyhow_device_test_tests_test_downcast"
}
]
}
diff --git a/cargo2android.json b/cargo2android.json
deleted file mode 100644
index 958632b..0000000
--- a/cargo2android.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "run": true
-}
\ No newline at end of file
diff --git a/src/executor.rs b/src/executor.rs
deleted file mode 100644
index 40a091f..0000000
--- a/src/executor.rs
+++ /dev/null
@@ -1,55 +0,0 @@
-use proc_macro::TokenStream;
-use proc_macro2::Span;
-use quote::{quote, quote_spanned, ToTokens};
-
-pub(crate) fn test(args: TokenStream, item: TokenStream) -> TokenStream {
- if !args.is_empty() {
- return syn::Error::new_spanned(proc_macro2::TokenStream::from(args), "invalid argument")
- .to_compile_error()
- .into();
- }
-
- let mut input = syn::parse_macro_input!(item as syn::ItemFn);
-
- if input.sig.asyncness.take().is_none() {
- return syn::Error::new_spanned(input.sig.fn_token, "Only async functions are supported")
- .to_compile_error()
- .into();
- }
-
- // If type mismatch occurs, the current rustc points to the last statement.
- let (last_stmt_start_span, last_stmt_end_span) = {
- let mut last_stmt = input
- .block
- .stmts
- .last()
- .map(ToTokens::into_token_stream)
- .unwrap_or_default()
- .into_iter();
- // `Span` on stable Rust has a limitation that only points to the first
- // token, not the whole tokens. We can work around this limitation by
- // using the first/last span of the tokens like
- // `syn::Error::new_spanned` does.
- let start = last_stmt.next().map_or_else(Span::call_site, |t| t.span());
- let end = last_stmt.last().map_or(start, |t| t.span());
- (start, end)
- };
-
- let path = quote_spanned! {last_stmt_start_span=>
- ::futures_test::__private
- };
- let body = &input.block;
- input.block.stmts = vec![syn::Stmt::Expr(
- syn::parse2(quote_spanned! {last_stmt_end_span=>
- #path::block_on(async #body)
- })
- .unwrap(),
- )];
-
- let gen = quote! {
- #[::core::prelude::v1::test]
- #input
- };
-
- gen.into()
-}
diff --git a/src/join.rs b/src/join.rs
index d427da2..048b62a 100644
--- a/src/join.rs
+++ b/src/join.rs
@@ -27,7 +27,10 @@
}
}
-fn bind_futures(fut_exprs: Vec<Expr>, span: Span) -> (Vec<TokenStream2>, Vec<Ident>) {
+fn bind_futures(
+ fut_exprs: Vec<Expr>,
+ span: Span,
+) -> (Vec<TokenStream2>, Vec<Ident>) {
let mut future_let_bindings = Vec::with_capacity(fut_exprs.len());
let future_names: Vec<_> = fut_exprs
.into_iter()
diff --git a/src/lib.rs b/src/lib.rs
index 0afe34b..5f0c47c 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,13 +1,11 @@
//! The futures-rs procedural macro implementations.
-#![warn(rust_2018_idioms, single_use_lifetimes, unreachable_pub)]
-#![doc(test(
- no_crate_inject,
- attr(
- deny(warnings, rust_2018_idioms, single_use_lifetimes),
- allow(dead_code, unused_assignments, unused_variables)
- )
-))]
+#![recursion_limit = "128"]
+#![warn(rust_2018_idioms, unreachable_pub)]
+// It cannot be included in the published code because this lints have false positives in the minimum required version.
+#![cfg_attr(test, warn(single_use_lifetimes))]
+#![warn(clippy::all)]
+#![doc(test(attr(deny(warnings), allow(dead_code, unused_assignments, unused_variables))))]
// Since https://github.com/rust-lang/cargo/pull/7700 `proc_macro` is part of the prelude for
// proc-macro crates, but to support older compilers we still need this explicit `extern crate`.
@@ -15,47 +13,31 @@
extern crate proc_macro;
use proc_macro::TokenStream;
+use proc_macro_hack::proc_macro_hack;
-mod executor;
mod join;
mod select;
-mod stream_select;
/// The `join!` macro.
-#[proc_macro]
+#[proc_macro_hack]
pub fn join_internal(input: TokenStream) -> TokenStream {
crate::join::join(input)
}
/// The `try_join!` macro.
-#[proc_macro]
+#[proc_macro_hack]
pub fn try_join_internal(input: TokenStream) -> TokenStream {
crate::join::try_join(input)
}
/// The `select!` macro.
-#[proc_macro]
+#[proc_macro_hack]
pub fn select_internal(input: TokenStream) -> TokenStream {
crate::select::select(input)
}
/// The `select_biased!` macro.
-#[proc_macro]
+#[proc_macro_hack]
pub fn select_biased_internal(input: TokenStream) -> TokenStream {
crate::select::select_biased(input)
}
-
-// TODO: Change this to doc comment once rustdoc bug fixed: https://github.com/rust-lang/futures-rs/pull/2435
-// The `test` attribute.
-#[proc_macro_attribute]
-pub fn test_internal(input: TokenStream, item: TokenStream) -> TokenStream {
- crate::executor::test(input, item)
-}
-
-/// The `stream_select!` macro.
-#[proc_macro]
-pub fn stream_select_internal(input: TokenStream) -> TokenStream {
- crate::stream_select::stream_select(input.into())
- .unwrap_or_else(syn::Error::into_compile_error)
- .into()
-}
diff --git a/src/select.rs b/src/select.rs
index 0c8e5f1..65b3187 100644
--- a/src/select.rs
+++ b/src/select.rs
@@ -3,8 +3,8 @@
use proc_macro::TokenStream;
use proc_macro2::Span;
use quote::{format_ident, quote};
-use syn::parse::{Parse, ParseStream};
use syn::{parse_quote, Expr, Ident, Pat, Token};
+use syn::parse::{Parse, ParseStream};
mod kw {
syn::custom_keyword!(complete);
@@ -63,10 +63,7 @@
// Commas after the expression are only optional if it's a `Block`
// or it is the last branch in the `match`.
- let is_block = match expr {
- Expr::Block(_) => true,
- _ => false,
- };
+ let is_block = match expr { Expr::Block(_) => true, _ => false };
if is_block || input.is_empty() {
input.parse::<Option<Token![,]>>()?;
} else {
@@ -79,7 +76,7 @@
CaseKind::Normal(pat, fut_expr) => {
select.normal_fut_exprs.push(fut_expr);
select.normal_fut_handlers.push((pat, expr));
- }
+ },
}
}
@@ -95,16 +92,22 @@
result_ident: Ident,
variants: usize,
complete: bool,
- span: Span,
+ span: Span
) -> (Vec<Ident>, syn::ItemEnum) {
// "_0", "_1", "_2"
let variant_names: Vec<Ident> =
- (0..variants).map(|num| format_ident!("_{}", num, span = span)).collect();
+ (0..variants)
+ .map(|num| format_ident!("_{}", num, span = span))
+ .collect();
let type_parameters = &variant_names;
let variants = &variant_names;
- let complete_variant = if complete { Some(quote!(Complete)) } else { None };
+ let complete_variant = if complete {
+ Some(quote!(Complete))
+ } else {
+ None
+ };
let enum_item = parse_quote! {
enum #result_ident<#(#type_parameters,)*> {
@@ -145,9 +148,7 @@
// bind non-`Ident` future exprs w/ `let`
let mut future_let_bindings = Vec::with_capacity(parsed.normal_fut_exprs.len());
- let bound_future_names: Vec<_> = parsed
- .normal_fut_exprs
- .into_iter()
+ let bound_future_names: Vec<_> = parsed.normal_fut_exprs.into_iter()
.zip(variant_names.iter())
.map(|(expr, variant_name)| {
match expr {
@@ -163,7 +164,7 @@
__futures_crate::async_await::assert_unpin(&#path);
});
path
- }
+ },
_ => {
// Bind and pin the resulting Future on the stack. This is
// necessary to support direct select! calls on !Unpin
@@ -187,8 +188,8 @@
// For each future, make an `&mut dyn FnMut(&mut Context<'_>) -> Option<Poll<__PrivResult<...>>`
// to use for polling that individual future. These will then be put in an array.
- let poll_functions = bound_future_names.iter().zip(variant_names.iter()).map(
- |(bound_future_name, variant_name)| {
+ let poll_functions = bound_future_names.iter().zip(variant_names.iter())
+ .map(|(bound_future_name, variant_name)| {
// Below we lazily create the Pin on the Future below.
// This is done in order to avoid allocating memory in the generator
// for the Pin variable.
@@ -215,8 +216,7 @@
&mut __futures_crate::task::Context<'_>
) -> __futures_crate::Option<__futures_crate::task::Poll<_>> = &mut #variant_name;
}
- },
- );
+ });
let none_polled = if parsed.complete.is_some() {
quote! {
@@ -229,13 +229,13 @@
}
};
- let branches = parsed.normal_fut_handlers.into_iter().zip(variant_names.iter()).map(
- |((pat, expr), variant_name)| {
+ let branches = parsed.normal_fut_handlers.into_iter()
+ .zip(variant_names.iter())
+ .map(|((pat, expr), variant_name)| {
quote! {
#enum_ident::#variant_name(#pat) => { #expr },
}
- },
- );
+ });
let branches = quote! { #( #branches )* };
let complete_branch = parsed.complete.map(|complete_expr| {
diff --git a/src/stream_select.rs b/src/stream_select.rs
deleted file mode 100644
index 9927b53..0000000
--- a/src/stream_select.rs
+++ /dev/null
@@ -1,113 +0,0 @@
-use proc_macro2::TokenStream;
-use quote::{format_ident, quote, ToTokens};
-use syn::{parse::Parser, punctuated::Punctuated, Expr, Index, Token};
-
-/// The `stream_select!` macro.
-pub(crate) fn stream_select(input: TokenStream) -> Result<TokenStream, syn::Error> {
- let args = Punctuated::<Expr, Token![,]>::parse_terminated.parse2(input)?;
- if args.len() < 2 {
- return Ok(quote! {
- compile_error!("stream select macro needs at least two arguments.")
- });
- }
- let generic_idents = (0..args.len()).map(|i| format_ident!("_{}", i)).collect::<Vec<_>>();
- let field_idents = (0..args.len()).map(|i| format_ident!("__{}", i)).collect::<Vec<_>>();
- let field_idents_2 = (0..args.len()).map(|i| format_ident!("___{}", i)).collect::<Vec<_>>();
- let field_indices = (0..args.len()).map(Index::from).collect::<Vec<_>>();
- let args = args.iter().map(|e| e.to_token_stream());
-
- Ok(quote! {
- {
- #[derive(Debug)]
- struct StreamSelect<#(#generic_idents),*> (#(Option<#generic_idents>),*);
-
- enum StreamEnum<#(#generic_idents),*> {
- #(
- #generic_idents(#generic_idents)
- ),*,
- None,
- }
-
- impl<ITEM, #(#generic_idents),*> __futures_crate::stream::Stream for StreamEnum<#(#generic_idents),*>
- where #(#generic_idents: __futures_crate::stream::Stream<Item=ITEM> + ::std::marker::Unpin,)*
- {
- type Item = ITEM;
-
- fn poll_next(mut self: ::std::pin::Pin<&mut Self>, cx: &mut __futures_crate::task::Context<'_>) -> __futures_crate::task::Poll<Option<Self::Item>> {
- match self.get_mut() {
- #(
- Self::#generic_idents(#generic_idents) => ::std::pin::Pin::new(#generic_idents).poll_next(cx)
- ),*,
- Self::None => panic!("StreamEnum::None should never be polled!"),
- }
- }
- }
-
- impl<ITEM, #(#generic_idents),*> __futures_crate::stream::Stream for StreamSelect<#(#generic_idents),*>
- where #(#generic_idents: __futures_crate::stream::Stream<Item=ITEM> + ::std::marker::Unpin,)*
- {
- type Item = ITEM;
-
- fn poll_next(mut self: ::std::pin::Pin<&mut Self>, cx: &mut __futures_crate::task::Context<'_>) -> __futures_crate::task::Poll<Option<Self::Item>> {
- let Self(#(ref mut #field_idents),*) = self.get_mut();
- #(
- let mut #field_idents_2 = false;
- )*
- let mut any_pending = false;
- {
- let mut stream_array = [#(#field_idents.as_mut().map(|f| StreamEnum::#generic_idents(f)).unwrap_or(StreamEnum::None)),*];
- __futures_crate::async_await::shuffle(&mut stream_array);
-
- for mut s in stream_array {
- if let StreamEnum::None = s {
- continue;
- } else {
- match __futures_crate::stream::Stream::poll_next(::std::pin::Pin::new(&mut s), cx) {
- r @ __futures_crate::task::Poll::Ready(Some(_)) => {
- return r;
- },
- __futures_crate::task::Poll::Pending => {
- any_pending = true;
- },
- __futures_crate::task::Poll::Ready(None) => {
- match s {
- #(
- StreamEnum::#generic_idents(_) => { #field_idents_2 = true; }
- ),*,
- StreamEnum::None => panic!("StreamEnum::None should never be polled!"),
- }
- },
- }
- }
- }
- }
- #(
- if #field_idents_2 {
- *#field_idents = None;
- }
- )*
- if any_pending {
- __futures_crate::task::Poll::Pending
- } else {
- __futures_crate::task::Poll::Ready(None)
- }
- }
-
- fn size_hint(&self) -> (usize, Option<usize>) {
- let mut s = (0, Some(0));
- #(
- if let Some(new_hint) = self.#field_indices.as_ref().map(|s| s.size_hint()) {
- s.0 += new_hint.0;
- // We can change this out for `.zip` when the MSRV is 1.46.0 or higher.
- s.1 = s.1.and_then(|a| new_hint.1.map(|b| a + b));
- }
- )*
- s
- }
- }
-
- StreamSelect(#(Some(#args)),*)
-
- }
- })
-}