Update to 0.1.50 am: f833bced20 am: 6a58d211c4 am: 676ed34add

Original change: https://android-review.googlesource.com/c/platform/external/rust/crates/async-trait/+/1682043

Change-Id: I8e743118e3b238baf3bb38bd22a547eaa53ff261
diff --git a/.cargo_vcs_info.json b/.cargo_vcs_info.json
index a638e3f..d7f5c7b 100644
--- a/.cargo_vcs_info.json
+++ b/.cargo_vcs_info.json
@@ -1,5 +1,5 @@
 {
   "git": {
-    "sha1": "a4aab7b9285e4912d16f1f4733cfb99fc8aa37da"
+    "sha1": "651ddc1131325b08c1b76ae6b65c1f23ca4cf7cf"
   }
 }
diff --git a/Android.bp b/Android.bp
index 4bc7fa9..22a10c5 100644
--- a/Android.bp
+++ b/Android.bp
@@ -52,5 +52,5 @@
 // dependent_library ["feature_list"]
 //   proc-macro2-1.0.26 "default,proc-macro"
 //   quote-1.0.9 "default,proc-macro"
-//   syn-1.0.68 "clone-impls,default,derive,extra-traits,full,parsing,printing,proc-macro,quote,visit,visit-mut"
+//   syn-1.0.69 "clone-impls,default,derive,extra-traits,full,parsing,printing,proc-macro,quote,visit,visit-mut"
 //   unicode-xid-0.2.1 "default"
diff --git a/Cargo.toml b/Cargo.toml
index 5b222ec..e97aafa 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -13,11 +13,12 @@
 [package]
 edition = "2018"
 name = "async-trait"
-version = "0.1.48"
+version = "0.1.50"
 authors = ["David Tolnay <dtolnay@gmail.com>"]
 description = "Type erasure for async trait methods"
 documentation = "https://docs.rs/async-trait"
 readme = "README.md"
+keywords = ["async"]
 license = "MIT OR Apache-2.0"
 repository = "https://github.com/dtolnay/async-trait"
 [package.metadata.docs.rs]
@@ -34,6 +35,9 @@
 [dependencies.syn]
 version = "1.0.61"
 features = ["full", "visit-mut"]
+[dev-dependencies.futures]
+version = "0.3"
+
 [dev-dependencies.rustversion]
 version = "1.0"
 
@@ -41,10 +45,7 @@
 version = "0.1.14"
 
 [dev-dependencies.tracing-attributes]
-version = "0.1.8"
-
-[dev-dependencies.tracing-futures]
-version = "0.2"
+version = "0.1.14"
 
 [dev-dependencies.trybuild]
 version = "1.0.19"
diff --git a/Cargo.toml.orig b/Cargo.toml.orig
index d5599b1..8af0b3b 100644
--- a/Cargo.toml.orig
+++ b/Cargo.toml.orig
@@ -1,6 +1,6 @@
 [package]
 name = "async-trait"
-version = "0.1.48"
+version = "0.1.50"
 authors = ["David Tolnay <dtolnay@gmail.com>"]
 edition = "2018"
 license = "MIT OR Apache-2.0"
@@ -8,6 +8,7 @@
 repository = "https://github.com/dtolnay/async-trait"
 documentation = "https://docs.rs/async-trait"
 readme = "README.md"
+keywords = ["async"]
 
 [lib]
 proc-macro = true
@@ -18,10 +19,10 @@
 syn = { version = "1.0.61", features = ["full", "visit-mut"] }
 
 [dev-dependencies]
+futures = "0.3"
 rustversion = "1.0"
 tracing = "0.1.14"
-tracing-attributes = "0.1.8"
-tracing-futures = "0.2"
+tracing-attributes = "0.1.14"
 trybuild = { version = "1.0.19", features = ["diff"] }
 
 [package.metadata.docs.rs]
diff --git a/METADATA b/METADATA
index 3e6f11b..4f74759 100644
--- a/METADATA
+++ b/METADATA
@@ -7,13 +7,13 @@
   }
   url {
     type: ARCHIVE
-    value: "https://static.crates.io/crates/async-trait/async-trait-0.1.48.crate"
+    value: "https://static.crates.io/crates/async-trait/async-trait-0.1.50.crate"
   }
-  version: "0.1.48"
+  version: "0.1.50"
   license_type: NOTICE
   last_upgrade_date {
     year: 2021
     month: 4
-    day: 1
+    day: 21
   }
 }
diff --git a/TEST_MAPPING b/TEST_MAPPING
new file mode 100644
index 0000000..0f4f93c
--- /dev/null
+++ b/TEST_MAPPING
@@ -0,0 +1,8 @@
+// Generated by update_crate_tests.py for tests that depend on this crate.
+{
+  "presubmit": [
+    {
+      "name": "authfs_device_test_src_lib"
+    }
+  ]
+}
diff --git a/src/receiver.rs b/src/receiver.rs
index 64ab65e..f6ea327 100644
--- a/src/receiver.rs
+++ b/src/receiver.rs
@@ -2,7 +2,7 @@
 use std::iter::FromIterator;
 use syn::visit_mut::{self, VisitMut};
 use syn::{
-    Block, ExprPath, Ident, Item, Macro, Pat, PatIdent, PatPath, Receiver, Signature, Token,
+    Block, ExprPath, Ident, Item, Macro, Pat, PatIdent, PatPath, Path, Receiver, Signature, Token,
     TypePath,
 };
 
@@ -139,11 +139,28 @@
         self.prepend_underscore_to_self(i);
     }
 
+    fn visit_path_mut(&mut self, p: &mut Path) {
+        if p.segments.len() == 1 {
+            // Replace `self`, but not `self::function`.
+            self.visit_ident_mut(&mut p.segments[0].ident);
+        }
+        for segment in &mut p.segments {
+            self.visit_path_arguments_mut(&mut segment.arguments);
+        }
+    }
+
     fn visit_item_mut(&mut self, i: &mut Item) {
         // Visit `macro_rules!` because locally defined macros can refer to
-        // `self`. Otherwise, do not recurse into nested items.
+        // `self`.
+        //
+        // Visit `futures::select` and similar select macros, which commonly
+        // appear syntactically like an item despite expanding to an expression.
+        //
+        // Otherwise, do not recurse into nested items.
         if let Item::Macro(i) = i {
-            if i.mac.path.is_ident("macro_rules") {
+            if i.mac.path.is_ident("macro_rules")
+                || i.mac.path.segments.last().unwrap().ident == "select"
+            {
                 self.visit_macro_mut(&mut i.mac)
             }
         }
diff --git a/tests/test.rs b/tests/test.rs
index 604d092..6f95576 100644
--- a/tests/test.rs
+++ b/tests/test.rs
@@ -1,6 +1,6 @@
 #![cfg_attr(
     async_trait_nightly_testing,
-    feature(min_specialization, min_const_generics, type_alias_impl_trait)
+    feature(min_specialization, min_type_alias_impl_trait)
 )]
 #![allow(
     clippy::let_underscore_drop,
@@ -615,7 +615,6 @@
     }
 
     #[test]
-    #[should_panic]
     fn tracing() {
         // Create the future outside of the subscriber, as no call to tracing
         // should be made until the future is polled.
@@ -1322,3 +1321,43 @@
         }
     }
 }
+
+// https://github.com/dtolnay/async-trait/issues/158
+pub mod issue158 {
+    use async_trait::async_trait;
+
+    fn f() {}
+
+    #[async_trait]
+    pub trait Trait {
+        async fn f(&self) {
+            self::f()
+        }
+    }
+}
+
+// https://github.com/dtolnay/async-trait/issues/161
+#[allow(clippy::mut_mut)]
+pub mod issue161 {
+    use async_trait::async_trait;
+    use futures::future::FutureExt;
+    use std::sync::Arc;
+
+    #[async_trait]
+    pub trait Trait {
+        async fn f(self: Arc<Self>);
+    }
+
+    pub struct MyStruct(bool);
+
+    #[async_trait]
+    impl Trait for MyStruct {
+        async fn f(self: Arc<Self>) {
+            futures::select! {
+                _ = async {
+                    println!("{}", self.0);
+                }.fuse() => {}
+            }
+        }
+    }
+}