Bug 1587468 - Update lucet-runtime.
authorEmilio Cobos Álvarez <emilio@crisal.io>
Mon, 16 Dec 2019 13:48:11 +0000
changeset 507107 823a7bf8c482456c6361d16e7edc83ccea870ef1
parent 507106 c105b062c29812190c074cbd24f97c6306017321
child 507108 27d0d6cc21318714c62f8b23f4738793e126ad9d
push id36922
push userncsoregi@mozilla.com
push dateMon, 16 Dec 2019 17:21:47 +0000
treeherdermozilla-central@27d0d6cc2131 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
bugs1587468
milestone73.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1587468 - Update lucet-runtime. Differential Revision: https://phabricator.services.mozilla.com/D57264
Cargo.lock
third_party/rust/lucet-module/.cargo-checksum.json
third_party/rust/lucet-module/Cargo.toml
third_party/rust/lucet-runtime-internals/.cargo-checksum.json
third_party/rust/lucet-runtime-internals/Cargo.toml
third_party/rust/lucet-runtime/.cargo-checksum.json
third_party/rust/lucet-runtime/Cargo.toml
third_party/rust/lucet-wasi/.cargo-checksum.json
third_party/rust/lucet-wasi/Cargo.toml
third_party/rust/num-derive-0.2.5/.cargo-checksum.json
third_party/rust/num-derive-0.2.5/Cargo.toml
third_party/rust/num-derive-0.2.5/LICENSE-APACHE
third_party/rust/num-derive-0.2.5/LICENSE-MIT
third_party/rust/num-derive-0.2.5/README.md
third_party/rust/num-derive-0.2.5/RELEASES.md
third_party/rust/num-derive-0.2.5/build.rs
third_party/rust/num-derive-0.2.5/src/lib.rs
third_party/rust/num-derive-0.2.5/tests/empty_enum.rs
third_party/rust/num-derive-0.2.5/tests/issue-6.rs
third_party/rust/num-derive-0.2.5/tests/issue-9.rs
third_party/rust/num-derive-0.2.5/tests/newtype.rs
third_party/rust/num-derive-0.2.5/tests/num_derive_without_num.rs
third_party/rust/num-derive-0.2.5/tests/trivial.rs
third_party/rust/num-derive-0.2.5/tests/with_custom_values.rs
third_party/rust/quote-0.6.11/.cargo-checksum.json
third_party/rust/quote-0.6.11/Cargo.toml
third_party/rust/quote-0.6.11/LICENSE-APACHE
third_party/rust/quote-0.6.11/LICENSE-MIT
third_party/rust/quote-0.6.11/README.md
third_party/rust/quote-0.6.11/src/ext.rs
third_party/rust/quote-0.6.11/src/lib.rs
third_party/rust/quote-0.6.11/src/to_tokens.rs
third_party/rust/quote-0.6.11/tests/conditional/integer128.rs
third_party/rust/quote-0.6.11/tests/test.rs
third_party/rust/syn-0.15.30/.cargo-checksum.json
third_party/rust/syn-0.15.30/Cargo.toml
third_party/rust/syn-0.15.30/LICENSE-APACHE
third_party/rust/syn-0.15.30/LICENSE-MIT
third_party/rust/syn-0.15.30/README.md
third_party/rust/syn-0.15.30/build.rs
third_party/rust/syn-0.15.30/src/attr.rs
third_party/rust/syn-0.15.30/src/buffer.rs
third_party/rust/syn-0.15.30/src/data.rs
third_party/rust/syn-0.15.30/src/derive.rs
third_party/rust/syn-0.15.30/src/error.rs
third_party/rust/syn-0.15.30/src/export.rs
third_party/rust/syn-0.15.30/src/expr.rs
third_party/rust/syn-0.15.30/src/ext.rs
third_party/rust/syn-0.15.30/src/file.rs
third_party/rust/syn-0.15.30/src/gen/fold.rs
third_party/rust/syn-0.15.30/src/gen/visit.rs
third_party/rust/syn-0.15.30/src/gen/visit_mut.rs
third_party/rust/syn-0.15.30/src/gen_helper.rs
third_party/rust/syn-0.15.30/src/generics.rs
third_party/rust/syn-0.15.30/src/group.rs
third_party/rust/syn-0.15.30/src/ident.rs
third_party/rust/syn-0.15.30/src/item.rs
third_party/rust/syn-0.15.30/src/keyword.rs
third_party/rust/syn-0.15.30/src/lib.rs
third_party/rust/syn-0.15.30/src/lifetime.rs
third_party/rust/syn-0.15.30/src/lit.rs
third_party/rust/syn-0.15.30/src/lookahead.rs
third_party/rust/syn-0.15.30/src/mac.rs
third_party/rust/syn-0.15.30/src/macros.rs
third_party/rust/syn-0.15.30/src/op.rs
third_party/rust/syn-0.15.30/src/parse.rs
third_party/rust/syn-0.15.30/src/parse_macro_input.rs
third_party/rust/syn-0.15.30/src/parse_quote.rs
third_party/rust/syn-0.15.30/src/path.rs
third_party/rust/syn-0.15.30/src/print.rs
third_party/rust/syn-0.15.30/src/punctuated.rs
third_party/rust/syn-0.15.30/src/span.rs
third_party/rust/syn-0.15.30/src/spanned.rs
third_party/rust/syn-0.15.30/src/thread.rs
third_party/rust/syn-0.15.30/src/token.rs
third_party/rust/syn-0.15.30/src/tt.rs
third_party/rust/syn-0.15.30/src/ty.rs
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -688,17 +688,17 @@ source = "git+https://github.com/bytecod
 dependencies = [
  "packed_struct 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "packed_struct_codegen 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "cranelift-entity"
 version = "0.41.0"
-source = "git+https://github.com/PLSysSec/lucet_sandbox_compiler#5c22392b5b1aaa60e915c75e92b57391e1e61e6d"
+source = "git+https://github.com/PLSysSec/lucet_sandbox_compiler#36f0e4deb5b080dfee73042fec655d3723c7a12b"
 
 [[package]]
 name = "cranelift-entity"
 version = "0.51.0"
 source = "git+https://github.com/bytecodealliance/cranelift?rev=4727b70b67abfa4f3ae1c276454a0da7a76e1d49#4727b70b67abfa4f3ae1c276454a0da7a76e1d49"
 
 [[package]]
 name = "cranelift-frontend"
@@ -1957,77 +1957,77 @@ version = "0.4.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "lucet-module"
 version = "0.1.1"
-source = "git+https://github.com/PLSysSec/lucet_sandbox_compiler#5c22392b5b1aaa60e915c75e92b57391e1e61e6d"
+source = "git+https://github.com/PLSysSec/lucet_sandbox_compiler#36f0e4deb5b080dfee73042fec655d3723c7a12b"
 dependencies = [
  "bincode 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "cranelift-entity 0.41.0 (git+https://github.com/PLSysSec/lucet_sandbox_compiler)",
  "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "num-derive 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-derive 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
  "object 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_json 1.0.44 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "lucet-runtime"
 version = "0.1.1"
-source = "git+https://github.com/PLSysSec/lucet_sandbox_compiler#5c22392b5b1aaa60e915c75e92b57391e1e61e6d"
+source = "git+https://github.com/PLSysSec/lucet_sandbox_compiler#36f0e4deb5b080dfee73042fec655d3723c7a12b"
 dependencies = [
  "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)",
  "lucet-module 0.1.1 (git+https://github.com/PLSysSec/lucet_sandbox_compiler)",
  "lucet-runtime-internals 0.1.1 (git+https://github.com/PLSysSec/lucet_sandbox_compiler)",
- "num-derive 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-derive 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "lucet-runtime-internals"
 version = "0.1.1"
-source = "git+https://github.com/PLSysSec/lucet_sandbox_compiler#5c22392b5b1aaa60e915c75e92b57391e1e61e6d"
+source = "git+https://github.com/PLSysSec/lucet_sandbox_compiler#36f0e4deb5b080dfee73042fec655d3723c7a12b"
 dependencies = [
  "bincode 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)",
  "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "getrandom 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)",
  "libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "lucet-module 0.1.1 (git+https://github.com/PLSysSec/lucet_sandbox_compiler)",
  "memoffset 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "nix 0.13.1 (git+https://github.com/shravanrn/nix/?branch=r0.13.1)",
- "num-derive 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-derive 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
  "xfailure 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "lucet-wasi"
 version = "0.1.1"
-source = "git+https://github.com/PLSysSec/lucet_sandbox_compiler#5c22392b5b1aaa60e915c75e92b57391e1e61e6d"
+source = "git+https://github.com/PLSysSec/lucet_sandbox_compiler#36f0e4deb5b080dfee73042fec655d3723c7a12b"
 dependencies = [
  "cast 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.59 (registry+https://github.com/rust-lang/crates.io-index)",
  "lucet-module 0.1.1 (git+https://github.com/PLSysSec/lucet_sandbox_compiler)",
  "lucet-runtime 0.1.1 (git+https://github.com/PLSysSec/lucet_sandbox_compiler)",
  "lucet-runtime-internals 0.1.1 (git+https://github.com/PLSysSec/lucet_sandbox_compiler)",
  "nix 0.13.1 (git+https://github.com/shravanrn/nix/?branch=r0.13.1)",
- "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "lzw"
 version = "0.10.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
@@ -2541,26 +2541,16 @@ source = "registry+https://github.com/ru
 dependencies = [
  "autocfg 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
  "num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "num-derive"
-version = "0.2.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
- "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)",
- "syn 0.15.30 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "num-derive"
 version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "proc-macro2 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
@@ -2950,24 +2940,16 @@ source = "registry+https://github.com/ru
 
 [[package]]
 name = "quote"
 version = "0.3.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "quote"
-version = "0.6.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "quote"
 version = "1.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "proc-macro2 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "rand"
@@ -3825,26 +3807,16 @@ source = "registry+https://github.com/ru
 dependencies = [
  "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
  "synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "syn"
-version = "0.15.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)",
- "quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)",
- "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "syn"
 version = "1.0.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "proc-macro2 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
@@ -4924,17 +4896,16 @@ dependencies = [
 "checksum neqo-qpack 0.1.7 (git+https://github.com/mozilla/neqo?tag=v0.1.7)" = "<none>"
 "checksum neqo-transport 0.1.7 (git+https://github.com/mozilla/neqo?tag=v0.1.7)" = "<none>"
 "checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88"
 "checksum new_debug_unreachable 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0cdc457076c78ab54d5e0d6fa7c47981757f1e34dc39ff92787f217dede586c4"
 "checksum nix 0.13.1 (git+https://github.com/shravanrn/nix/?branch=r0.13.1)" = "<none>"
 "checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2"
 "checksum nom 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9c349f68f25f596b9f44cf0e7c69752a5c633b0550c3ff849518bfba0233774a"
 "checksum num-bigint 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "f9c3f34cdd24f334cb265d9bf8bfa8a241920d026916785747a92f0e55541a1a"
-"checksum num-derive 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "eafd0b45c5537c3ba526f79d3e75120036502bebacbb3f3220914067ce39dbf2"
 "checksum num-derive 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0c8b15b261814f992e33760b1fca9fe8b693d8a65299f20c9901688636cfb746"
 "checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea"
 "checksum num-iter 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "af3fdbbc3291a5464dc57b03860ec37ca6bf915ed6ee385e7c6c052c422b2124"
 "checksum num-rational 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4e96f040177bb3da242b5b1ecf3f54b5d5af3efbbfb18608977a5d2767b22f10"
 "checksum num-traits 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c81ffc11c212fa327657cb19dd85eb7419e163b5b076bede2bdb5c974c07e4"
 "checksum num_cpus 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "514f0d73e64be53ff320680ca671b64fe3fb91da01e1ae2ddc99eb51d453b20d"
 "checksum objc 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "31d20fd2b37e07cf5125be68357b588672e8cefe9a96f8c17a9d46053b3e590d"
 "checksum objc_exception 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4"
@@ -4968,17 +4939,16 @@ dependencies = [
 "checksum proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)" = "ecd45702f76d6d3c75a80564378ae228a85f0b59d2f3ed43c91b4a69eb2ebfc5"
 "checksum proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)" = "4d317f9caece796be1980837fd5cb3dfec5613ebdb04ad0956deea83ce168915"
 "checksum proc-macro2 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "90cf5f418035b98e655e9cdb225047638296b862b42411c4e45bb88d700f7fc0"
 "checksum procedural-masquerade 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9f566249236c6ca4340f7ca78968271f0ed2b0f234007a61b66f9ecd0af09260"
 "checksum pulse 0.3.0 (git+https://github.com/djg/cubeb-pulse-rs?rev=8069f8f4189982e0b38fa6dc8993dd4fab41f728)" = "<none>"
 "checksum pulse-ffi 0.1.0 (git+https://github.com/djg/cubeb-pulse-rs?rev=8069f8f4189982e0b38fa6dc8993dd4fab41f728)" = "<none>"
 "checksum quick-error 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "eda5fe9b71976e62bc81b781206aaa076401769b2143379d3eb2118388babac4"
 "checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a"
-"checksum quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)" = "cdd8e04bd9c52e0342b406469d494fcb033be4bdbe5c606016defbb1681411e1"
 "checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe"
 "checksum rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca"
 "checksum rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3ae1b169243eaf61759b8475a998f0a385e42042370f3a7dbaf35246eacc8412"
 "checksum rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef"
 "checksum rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03a2a90da8c7523f554344f921aa97283eadf6ac484a6d2a7d0212fa7f8d6853"
 "checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
 "checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0"
 "checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
@@ -5048,17 +5018,16 @@ dependencies = [
 "checksum socket2 0.3.10 (registry+https://github.com/rust-lang/crates.io-index)" = "df028e0e632c2a1823d920ad74895e7f9128e6438cbc4bc6fd1f180e644767b9"
 "checksum spirv_cross 0.16.0 (git+https://github.com/kvark/spirv_cross?branch=wgpu)" = "<none>"
 "checksum stable_deref_trait 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "15132e0e364248108c5e2c02e3ab539be8d6f5d52a01ca9bbf27ed657316f02b"
 "checksum storage-map 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fd0a4829a5c591dc24a944a736d6b1e4053e51339a79fd5d4702c4c999a9c45e"
 "checksum string 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00caf261d6f90f588f8450b8e1230fa0d5be49ee6140fdfbcb55335aff350970"
 "checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550"
 "checksum svg_fmt 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c666f0fed8e1e20e057af770af9077d72f3d5a33157b8537c1475dd8ffd6d32b"
 "checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad"
-"checksum syn 0.15.30 (registry+https://github.com/rust-lang/crates.io-index)" = "66c8865bf5a7cbb662d8b011950060b3c8743dca141b054bf7195b20d314d8e2"
 "checksum syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "66850e97125af79138385e9b88339cbcd037e3f28ceab8c5ad98e64f0f1f80bf"
 "checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6"
 "checksum synstructure 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3f085a5855930c0441ca1288cf044ea4aecf4f43a91668abdb870b4ba546a203"
 "checksum target-lexicon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6f4c118a7a38378f305a9e111fcb2f7f838c0be324bfb31a77ea04f7f6e684b4"
 "checksum tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9"
 "checksum term_size 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2b6b55df3198cc93372e85dd2ed817f0e38ce8cc0f22eb32391bfad9c4bf209"
 "checksum termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "96d6098003bde162e4277c70665bd87c326f5a0c3f3fbfb285787fa482d54e6e"
 "checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096"
--- a/third_party/rust/lucet-module/.cargo-checksum.json
+++ b/third_party/rust/lucet-module/.cargo-checksum.json
@@ -1,1 +1,1 @@
-{"files":{"Cargo.toml":"6262ca275106d1210b8e0737bb07f1392f5828c618f052cdc2f903851aef29df","src/bindings.rs":"bb0bcfb2e328f139d7d34b95d91ac64008c54fbf2748caf818b4a6af6c3bec14","src/error.rs":"1c938dfd33b790eb97e920785aadc7b4a2796d8e2e806b6083593ccf173d43d1","src/functions.rs":"29f4e4bd91986680d7d06ed6f5ccbb8bc734b52316e5bf9ac40ced45cbc8b149","src/globals.rs":"18841f6f5d6163673de5e9dfd641b1c558e9ad984418cbf94691059a1c4ed2a2","src/lib.rs":"9b5ec1e3fd8b0c51e5eceb8ac4930f9d2562cf296cffa102746b794547cbcfbb","src/linear_memory.rs":"aa62a57ad0783508465dc43bd22167c33d15efb32e44b9aeba6ff86ea72051ef","src/module.rs":"56f37d2892fe91d19afc49d2f62b562f0f71a21f21aec205b5368c733329d629","src/module_data.rs":"8059b46aeef038babdedbf3d2de758605f019ba6f2ab8ddc7c132581609a7a78","src/runtime.rs":"0532a55d2649eb6ea486a70c278ccbc243255cdbf5462739c0db6a2e73cb4d1a","src/signature.rs":"c1606419111edec1895762c212c7116a0d39670c8d303b5af0f58295ba15cfc4","src/tables.rs":"efe9aa8ae3602cce8aa093e220d63490b17907be8ed192024939445ff8b8922b","src/traps.rs":"2ff45ff2438f18ca1740182cf9735cbb789125bd57214e5a140b3bcd5295a433","src/types.rs":"d354b3a9f96b768dc7a8885b9fefa2efc1e01bcb66e5028e5f787247d1b2abb2","tests/bindings/bad_bindings.json":"7c5ad85eb0a222985857b6ff35246dccfa2a35de415d57fd712264ca7e078934","tests/bindings/bindings_test.json":"2e3ed6ff5d18da665d5c2fb24e279f009092f21bba6deff221db7a5770a6a3d4","tests/bindings/garbage.json":"f956f64c8c23ecf2aa6226fa7abc5f52eee2fa861e12ceac3bddbdf0602a174b"},"package":null}
\ No newline at end of file
+{"files":{"Cargo.toml":"541f0b13e6f51d7ce1e61275aaaeeaabd38ae9f3e5b6bb1d5b543be416449546","src/bindings.rs":"bb0bcfb2e328f139d7d34b95d91ac64008c54fbf2748caf818b4a6af6c3bec14","src/error.rs":"1c938dfd33b790eb97e920785aadc7b4a2796d8e2e806b6083593ccf173d43d1","src/functions.rs":"29f4e4bd91986680d7d06ed6f5ccbb8bc734b52316e5bf9ac40ced45cbc8b149","src/globals.rs":"18841f6f5d6163673de5e9dfd641b1c558e9ad984418cbf94691059a1c4ed2a2","src/lib.rs":"9b5ec1e3fd8b0c51e5eceb8ac4930f9d2562cf296cffa102746b794547cbcfbb","src/linear_memory.rs":"aa62a57ad0783508465dc43bd22167c33d15efb32e44b9aeba6ff86ea72051ef","src/module.rs":"56f37d2892fe91d19afc49d2f62b562f0f71a21f21aec205b5368c733329d629","src/module_data.rs":"8059b46aeef038babdedbf3d2de758605f019ba6f2ab8ddc7c132581609a7a78","src/runtime.rs":"0532a55d2649eb6ea486a70c278ccbc243255cdbf5462739c0db6a2e73cb4d1a","src/signature.rs":"c1606419111edec1895762c212c7116a0d39670c8d303b5af0f58295ba15cfc4","src/tables.rs":"efe9aa8ae3602cce8aa093e220d63490b17907be8ed192024939445ff8b8922b","src/traps.rs":"2ff45ff2438f18ca1740182cf9735cbb789125bd57214e5a140b3bcd5295a433","src/types.rs":"d354b3a9f96b768dc7a8885b9fefa2efc1e01bcb66e5028e5f787247d1b2abb2","tests/bindings/bad_bindings.json":"7c5ad85eb0a222985857b6ff35246dccfa2a35de415d57fd712264ca7e078934","tests/bindings/bindings_test.json":"2e3ed6ff5d18da665d5c2fb24e279f009092f21bba6deff221db7a5770a6a3d4","tests/bindings/garbage.json":"f956f64c8c23ecf2aa6226fa7abc5f52eee2fa861e12ceac3bddbdf0602a174b"},"package":null}
\ No newline at end of file
--- a/third_party/rust/lucet-module/Cargo.toml
+++ b/third_party/rust/lucet-module/Cargo.toml
@@ -10,17 +10,17 @@ authors = ["Lucet team <lucet@fastly.com
 edition = "2018"
 
 [dependencies]
 cranelift-entity = { path = "../cranelift/cranelift-entity", version = "0.41.0" }
 failure = "0.1"
 serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
 bincode = "1.1.4"
-num-derive = "0.2"
+num-derive = "0.3"
 num-traits = "0.2"
 # minisign = { version = "0.5.11", optional = true }
 object = ">=0.12"
 byteorder = "1.3"
 
 [features]
 # default = ["signature_checking"]
 default = []
--- a/third_party/rust/lucet-runtime-internals/.cargo-checksum.json
+++ b/third_party/rust/lucet-runtime-internals/.cargo-checksum.json
@@ -1,1 +1,1 @@
-{"files":{"Cargo.toml":"f4cf0547c1290bfc8844b72056b25ba1505b03998cc13a58859b37b6633b5f95","build.rs":"ae539feaad828d15cbe4924e8de5ae38c7d0086200a5c4d494edf8e8e28c074e","src/alloc/mod.rs":"842a9003ab8f89d142e567f62278b8a50ce08be9a1751035d5fdba09286dea75","src/alloc/tests.rs":"d7516622bfa8c96f81b2f6929674eea6b9f368e876ab84bd442de120debda234","src/c_api.rs":"5360954bad8cd332e881e466eb840e50da1984d72c44ccc809a38b7e33633d5a","src/context/context_asm.S":"6b0fe86e5e7f3699482d94819f67ead933aaf91da89f79da0d8a75fa71ba4380","src/context/mod.rs":"98452bfad053d4cd4143afed620233538688cf2bac857b0c4569f42ee8d6d844","src/context/tests/c_child.c":"a9ad91367ac37e7406a587f971858aa7758913f634ea7ae88fccc7f487a3c4fc","src/context/tests/c_child.rs":"33c0472401795d61af2a706cc69d62b69225159a10cfc55e4b0c6e15321f0964","src/context/tests/mod.rs":"5d1bc979aaea2870a8c3a3db66cde21d16d9aab20b898da2c67d6aa1f1f5c292","src/context/tests/rust_child.rs":"ed69940a0b426eef5f9524f06ca215d0952cf4b00d8ebcf8837077849502d075","src/embed_ctx.rs":"57ae60c1a50cf84af23dc529a154db21cbb58c52c8067b9f87069dd600b99473","src/error.rs":"fd09389d5112b04ea76ffed0a7b2a8180c524cded90e33e36399a690c5714e2e","src/hostcall_macros.rs":"b4a2fdd876eee50bec4188f7d9f7c708d71600974cc2b52ff38c7daaa63cb225","src/instance.rs":"04bf1dddd9a980579b3baef77b83f19e8187a085aee6276a0fd4e60af7918e7a","src/instance/siginfo_ext.c":"8ee3a54ef2b93041ca07ecce70ebeb8d421c8ad1257122d9e8ef064d2d45a4a4","src/instance/siginfo_ext.rs":"529b4cc7ce6eea140c17a97477cc862f9d224e40cc24687223a478696d27b971","src/instance/signals.rs":"b890f9f7ca571763c48fa004284aa09b4e80b07ae2f836826aa784fbcace28f1","src/instance/state.rs":"490278c7222fc22248c8f545364a5d522da721c35f5b5e814658dc90e8ed77bd","src/lib.rs":"0c97e40191f17826feccff762898a0f4cafd1ed45cc3e81c07f9f446e263a422","src/module.rs":"29b54cc59cf308d712d9ecf4d595ef10645213e8ea62ec7f3a12adb27089fb47","src/module/dl.rs":"863c487f7494353ca53e0c663dc297e65a4ff5f380cff94c7c760b9509275270","src/module/mock.rs":"12d8eb790de37c3065d7a3029ea5caa4811992dc62054f01737ad7562c7f4c05","src/module/sparse_page_data.rs":"84ef79aa4707e5c84d72a38c5ead18156b16ab29c617540e652e851c744449dc","src/region/mmap.rs":"3ad6dc578f52619300a24db532912fd3ac16ced9de894b9fce8dab4f78b0f04f","src/region/mod.rs":"d2bf8b8c769542299bae9e5ed5d334ca7b431dfd52619ae1487d1494653dfc82","src/sysdeps/linux.rs":"124cc2f0fb0856e23274facdab8ca4631f04cdf8e494d9a4531979efe4ba4ad9","src/sysdeps/macos.rs":"8dc632a9aab98993140a6faefb7c2e313d80e6b9db2e45f54e8d6604cd752a6f","src/sysdeps/mod.rs":"9caed471a08f5f7d39c836a649d0f61d7a84095cee7589cdfc1eafe10eaa866c","src/test_helpers.rs":"72d1aeb9ca9c512aadcecac7ad0869c883c13134fced9f625075dc5e2741c55d","src/val.rs":"503891cd17892349b931d49ed3cdc0c9fc572da47d4c8f8f94fee30f5f4543a6","src/vmctx.rs":"b401df03b483c827d694f5f9024cf54b40987cff025dd8f292137e8396f56e6e"},"package":null}
\ No newline at end of file
+{"files":{"Cargo.toml":"20c473420bb65fe6f8abb4695359ce4e56a051de9076e960fc831e4445053303","build.rs":"ae539feaad828d15cbe4924e8de5ae38c7d0086200a5c4d494edf8e8e28c074e","src/alloc/mod.rs":"842a9003ab8f89d142e567f62278b8a50ce08be9a1751035d5fdba09286dea75","src/alloc/tests.rs":"d7516622bfa8c96f81b2f6929674eea6b9f368e876ab84bd442de120debda234","src/c_api.rs":"5360954bad8cd332e881e466eb840e50da1984d72c44ccc809a38b7e33633d5a","src/context/context_asm.S":"6b0fe86e5e7f3699482d94819f67ead933aaf91da89f79da0d8a75fa71ba4380","src/context/mod.rs":"98452bfad053d4cd4143afed620233538688cf2bac857b0c4569f42ee8d6d844","src/context/tests/c_child.c":"a9ad91367ac37e7406a587f971858aa7758913f634ea7ae88fccc7f487a3c4fc","src/context/tests/c_child.rs":"33c0472401795d61af2a706cc69d62b69225159a10cfc55e4b0c6e15321f0964","src/context/tests/mod.rs":"5d1bc979aaea2870a8c3a3db66cde21d16d9aab20b898da2c67d6aa1f1f5c292","src/context/tests/rust_child.rs":"ed69940a0b426eef5f9524f06ca215d0952cf4b00d8ebcf8837077849502d075","src/embed_ctx.rs":"57ae60c1a50cf84af23dc529a154db21cbb58c52c8067b9f87069dd600b99473","src/error.rs":"fd09389d5112b04ea76ffed0a7b2a8180c524cded90e33e36399a690c5714e2e","src/hostcall_macros.rs":"b4a2fdd876eee50bec4188f7d9f7c708d71600974cc2b52ff38c7daaa63cb225","src/instance.rs":"04bf1dddd9a980579b3baef77b83f19e8187a085aee6276a0fd4e60af7918e7a","src/instance/siginfo_ext.c":"8ee3a54ef2b93041ca07ecce70ebeb8d421c8ad1257122d9e8ef064d2d45a4a4","src/instance/siginfo_ext.rs":"529b4cc7ce6eea140c17a97477cc862f9d224e40cc24687223a478696d27b971","src/instance/signals.rs":"b890f9f7ca571763c48fa004284aa09b4e80b07ae2f836826aa784fbcace28f1","src/instance/state.rs":"490278c7222fc22248c8f545364a5d522da721c35f5b5e814658dc90e8ed77bd","src/lib.rs":"0c97e40191f17826feccff762898a0f4cafd1ed45cc3e81c07f9f446e263a422","src/module.rs":"29b54cc59cf308d712d9ecf4d595ef10645213e8ea62ec7f3a12adb27089fb47","src/module/dl.rs":"863c487f7494353ca53e0c663dc297e65a4ff5f380cff94c7c760b9509275270","src/module/mock.rs":"12d8eb790de37c3065d7a3029ea5caa4811992dc62054f01737ad7562c7f4c05","src/module/sparse_page_data.rs":"84ef79aa4707e5c84d72a38c5ead18156b16ab29c617540e652e851c744449dc","src/region/mmap.rs":"3ad6dc578f52619300a24db532912fd3ac16ced9de894b9fce8dab4f78b0f04f","src/region/mod.rs":"d2bf8b8c769542299bae9e5ed5d334ca7b431dfd52619ae1487d1494653dfc82","src/sysdeps/linux.rs":"124cc2f0fb0856e23274facdab8ca4631f04cdf8e494d9a4531979efe4ba4ad9","src/sysdeps/macos.rs":"8dc632a9aab98993140a6faefb7c2e313d80e6b9db2e45f54e8d6604cd752a6f","src/sysdeps/mod.rs":"9caed471a08f5f7d39c836a649d0f61d7a84095cee7589cdfc1eafe10eaa866c","src/test_helpers.rs":"72d1aeb9ca9c512aadcecac7ad0869c883c13134fced9f625075dc5e2741c55d","src/val.rs":"503891cd17892349b931d49ed3cdc0c9fc572da47d4c8f8f94fee30f5f4543a6","src/vmctx.rs":"b401df03b483c827d694f5f9024cf54b40987cff025dd8f292137e8396f56e6e"},"package":null}
\ No newline at end of file
--- a/third_party/rust/lucet-runtime-internals/Cargo.toml
+++ b/third_party/rust/lucet-runtime-internals/Cargo.toml
@@ -16,17 +16,17 @@ bitflags = "1.0"
 bincode = "1.1.4"
 byteorder = "1.3"
 failure = "0.1"
 lazy_static = "1.1"
 libc = "=0.2.59"
 libloading = "0.5"
 memoffset = "0.5.1"
 nix = "0.13"
-num-derive = "0.2"
+num-derive = "0.3"
 num-traits = "0.2"
 xfailure = "0.1"
 
 # This is only a dependency to ensure that other crates don't pick a newer version as a transitive
 # dependency. `0.1.3 < getrandom <= 0.1.6` cause `lazy_static` to pull in spinlock implementations
 # of concurrency primitives, which for unknown reasons cause our signal handling code to
 # nondeterministically segfault. The maintainers have since removed the `lazy_static` dependency
 # from `getrandom`, but until a new release is cut, this keeps it on a safe version.
--- a/third_party/rust/lucet-runtime/.cargo-checksum.json
+++ b/third_party/rust/lucet-runtime/.cargo-checksum.json
@@ -1,1 +1,1 @@
-{"files":{"Cargo.toml":"38acfc7a7b669d320e703189635be086104b9b69fc399ce5e331993bce62e18f","LICENSE":"268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5","build.rs":"d56fd4e2fe9d0830aee061be443ef0b541ed98dd6a4233220a51745478b3fb77","include/lucet.h":"89ff353483287040e07e3f6eaeed4286cb06f541fb67057f9fdbbf844a7ec928","include/lucet_types.h":"9581effd486709f178f5e45b68eea015b9c5f94f4488bf8e745edd65ea02086d","include/lucet_val.h":"220b862b0280ac4f7962d44520f6cc34a47f3b3a34b8ecf389e6111cd95b8bf0","include/lucet_vmctx.h":"044ca80cf8cca51620de3f113a1c07c00ebecea108a45288f9b87e5e2fbb820c","src/c_api.rs":"97e28537fffeac5d21f09911a3474114997ce0268492edb8010ce8ca178a6c64","src/lib.rs":"48f0ba473b4da3616bddfce3cda00cf836eca3c9e7b055855156c1c167a6f908","tests/c_api.c":"82618645e60d714dd07338f9240eeea54a459e2c6bb6f7e35ee75d6aadd900ae","tests/entrypoint.rs":"1d0080e9f71a16f61e69c21922ac1c2207b2003fb13d3bacafb681be5cceb8b9","tests/globals.rs":"56248c5cefbaad546b08964d9193e5c16a461e974d1c9c520ebba3f1cf32af66","tests/guest_fault.rs":"cb4728d0851148f992c944199f4fc98595070d0879e1ddf5361419e4fc330ad3","tests/guests/null.c":"de2bf0dc98ac1acaef8cb856a300119aa1300d228a1dceb0b7e06b63d3ac712a","tests/guests/yield_resume.c":"b9c19d9c2d540e042d3488f2cea04a7a98cc75910c68faad738ad835b04dde9d","tests/guests/yield_resume_bindings.json":"e124e940038a552d08495d6f99b7dd8495a011e4a082b32ab8d035e40169d663","tests/host.rs":"0cd5f40ed9725c7ef2f497a4e31f09e88833841240dfbfe971d60724075eac00","tests/instruction_counting.rs":"6aa8c2cf4c32adbbb5bf74e8449dd29d4deff77dcb55947a2d15c4eccbb89d6e","tests/instruction_counting/arithmetic_count.wat":"c347c7a78e4159e45aa5ba299f1d03e1efbb7c635f13dd23053907de7f57193b","tests/instruction_counting/br_table_count.wat":"66cdac7595bd69103f5d1b825a58f09a5624db4e35c91e11ae7b30cc2f53eb0c","tests/instruction_counting/calls.wat":"8212736a55a897937c712bab33c22c62ab96f1b32eef44eab1cbee77f34ba641","tests/instruction_counting/count_after_br.wat":"12df2019f3b0c518bd747e485b423f73a82c91571e834bdeed5d7bd6455f84c0","tests/instruction_counting/empty_loop.wat":"3dfa9ab297a7f8fd21bd22db8ded37de0545ac741be132fdcdf1a61c50cf455a","tests/instruction_counting/empty_loop_2.wat":"c65b4516a1a26f9b8b0117bb1f4fe9282e3bc79052b89f834cad6c202a51f68e","tests/instruction_counting/if_count.wat":"620330be046a3b3890646e8fdbbde6d4a8c4763b450d818ee549e103a1c3e3aa","tests/instruction_counting/if_not_taken_count.wat":"12bdc1f0512016e549bd7656386274c7b7b92d32b5d3eeb73b93d6ef18cc4ff2","tests/instruction_counting/indirect_calls.wat":"f56f6a715a733176168a81ca6cbfd22333ab9755029174a3f7950da9b401320e","tests/instruction_counting/loops.wat":"0cd765b1cf694a2c35df69547b30303731512c937cad05e1c052ebcd7840e3b1","tests/instruction_counting/unreachable_call.wat":"c15653c3ff198f321f8b892c363ec7badad75ec703c5b3a215a6dbfb059a15b7","tests/memory.rs":"73b65dc44978181a5d2a3b39a6d0fc60fd6637e16387c2a7b025baedb16a004f","tests/stack.rs":"5e5939991a55c8ecd579d8c509226ed3ac7bae5a847bdcdac4d285df28d54d6b","tests/start.rs":"7b31f8c289c1ad52d05f17c0c46b0856382b0ff85d6e5579c4346c443eb93fb3","tests/strcmp.rs":"7420aa723630af51360a9e9a3763c2fd8d7c57aa8d4011cfd8ca452376036efb","tests/val.rs":"2e38a7aa10bde34d5cf580a958c07eff8593662a86678427a79d8a5f5bc2efac"},"package":null}
\ No newline at end of file
+{"files":{"Cargo.toml":"32943e73c9f49c3ce3512b312128bed7200631c33297f45a254db416a5a3d4bd","LICENSE":"268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5","build.rs":"d56fd4e2fe9d0830aee061be443ef0b541ed98dd6a4233220a51745478b3fb77","include/lucet.h":"89ff353483287040e07e3f6eaeed4286cb06f541fb67057f9fdbbf844a7ec928","include/lucet_types.h":"9581effd486709f178f5e45b68eea015b9c5f94f4488bf8e745edd65ea02086d","include/lucet_val.h":"220b862b0280ac4f7962d44520f6cc34a47f3b3a34b8ecf389e6111cd95b8bf0","include/lucet_vmctx.h":"044ca80cf8cca51620de3f113a1c07c00ebecea108a45288f9b87e5e2fbb820c","src/c_api.rs":"97e28537fffeac5d21f09911a3474114997ce0268492edb8010ce8ca178a6c64","src/lib.rs":"48f0ba473b4da3616bddfce3cda00cf836eca3c9e7b055855156c1c167a6f908","tests/c_api.c":"82618645e60d714dd07338f9240eeea54a459e2c6bb6f7e35ee75d6aadd900ae","tests/entrypoint.rs":"1d0080e9f71a16f61e69c21922ac1c2207b2003fb13d3bacafb681be5cceb8b9","tests/globals.rs":"56248c5cefbaad546b08964d9193e5c16a461e974d1c9c520ebba3f1cf32af66","tests/guest_fault.rs":"cb4728d0851148f992c944199f4fc98595070d0879e1ddf5361419e4fc330ad3","tests/guests/null.c":"de2bf0dc98ac1acaef8cb856a300119aa1300d228a1dceb0b7e06b63d3ac712a","tests/guests/yield_resume.c":"b9c19d9c2d540e042d3488f2cea04a7a98cc75910c68faad738ad835b04dde9d","tests/guests/yield_resume_bindings.json":"e124e940038a552d08495d6f99b7dd8495a011e4a082b32ab8d035e40169d663","tests/host.rs":"0cd5f40ed9725c7ef2f497a4e31f09e88833841240dfbfe971d60724075eac00","tests/instruction_counting.rs":"6aa8c2cf4c32adbbb5bf74e8449dd29d4deff77dcb55947a2d15c4eccbb89d6e","tests/instruction_counting/arithmetic_count.wat":"c347c7a78e4159e45aa5ba299f1d03e1efbb7c635f13dd23053907de7f57193b","tests/instruction_counting/br_table_count.wat":"66cdac7595bd69103f5d1b825a58f09a5624db4e35c91e11ae7b30cc2f53eb0c","tests/instruction_counting/calls.wat":"8212736a55a897937c712bab33c22c62ab96f1b32eef44eab1cbee77f34ba641","tests/instruction_counting/count_after_br.wat":"12df2019f3b0c518bd747e485b423f73a82c91571e834bdeed5d7bd6455f84c0","tests/instruction_counting/empty_loop.wat":"3dfa9ab297a7f8fd21bd22db8ded37de0545ac741be132fdcdf1a61c50cf455a","tests/instruction_counting/empty_loop_2.wat":"c65b4516a1a26f9b8b0117bb1f4fe9282e3bc79052b89f834cad6c202a51f68e","tests/instruction_counting/if_count.wat":"620330be046a3b3890646e8fdbbde6d4a8c4763b450d818ee549e103a1c3e3aa","tests/instruction_counting/if_not_taken_count.wat":"12bdc1f0512016e549bd7656386274c7b7b92d32b5d3eeb73b93d6ef18cc4ff2","tests/instruction_counting/indirect_calls.wat":"f56f6a715a733176168a81ca6cbfd22333ab9755029174a3f7950da9b401320e","tests/instruction_counting/loops.wat":"0cd765b1cf694a2c35df69547b30303731512c937cad05e1c052ebcd7840e3b1","tests/instruction_counting/unreachable_call.wat":"c15653c3ff198f321f8b892c363ec7badad75ec703c5b3a215a6dbfb059a15b7","tests/memory.rs":"73b65dc44978181a5d2a3b39a6d0fc60fd6637e16387c2a7b025baedb16a004f","tests/stack.rs":"5e5939991a55c8ecd579d8c509226ed3ac7bae5a847bdcdac4d285df28d54d6b","tests/start.rs":"7b31f8c289c1ad52d05f17c0c46b0856382b0ff85d6e5579c4346c443eb93fb3","tests/strcmp.rs":"7420aa723630af51360a9e9a3763c2fd8d7c57aa8d4011cfd8ca452376036efb","tests/val.rs":"2e38a7aa10bde34d5cf580a958c07eff8593662a86678427a79d8a5f5bc2efac"},"package":null}
\ No newline at end of file
--- a/third_party/rust/lucet-runtime/Cargo.toml
+++ b/third_party/rust/lucet-runtime/Cargo.toml
@@ -9,17 +9,17 @@ categories = ["wasm"]
 authors = ["Lucet team <lucet@fastly.com>"]
 edition = "2018"
 
 [dependencies]
 libc = "=0.2.59"
 lucet-runtime-internals = { path = "lucet-runtime-internals", version = "0.1.1" }
 lucet-module = { path = "../lucet-module", version = "0.1.1" }
 num-traits = "0.2"
-num-derive = "0.2"
+num-derive = "0.3"
 
 [dev-dependencies]
 byteorder = "1.2"
 failure = "0.1"
 lazy_static = "1.1"
 lucetc = { path = "../lucetc" }
 lucet-runtime-tests = { path = "lucet-runtime-tests", version = "0.1.1" }
 lucet-wasi-sdk = { path = "../lucet-wasi-sdk" }
--- a/third_party/rust/lucet-wasi/.cargo-checksum.json
+++ b/third_party/rust/lucet-wasi/.cargo-checksum.json
@@ -1,1 +1,1 @@
-{"files":{"Cargo.toml":"9a4b138b95b0832c74f2003a8b7e4ed80612892b6e9d99684bbdcf37a9346196","LICENSE":"268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5","LICENSE.cloudabi-utils":"86a34251f0aab76b7dc3daf8d252afbdf481ea94aa5b46d020205178b7e2eac1","LICENSE.wasmtime":"a6c48161a09acc75a0e25503bab66a731eb5fba5392ed4bb4743e4ba5085327a","bindings.json":"fad8362f845e6f7a2af1d7547cee5730894e7b96804f338181fc070ffdcfae1e","build.rs":"593173ad03963afcbef43f1843be6f04cde1df3eae0298ca20bf881019dd350a","examples/.gitignore":"44575cf5b28512d75644bf54a517dcef304ff809fd511747621b4d64f19aac66","examples/Makefile":"d2d2ceeb1bc4435189ea9a2710b6f5f5331ce6aa73ae8a4f4edcca215058a9b4","examples/README.md":"f2a5be6cc88d511c9f4d3bfefdd42dcb2ace813bc23f6a4430b6b543f7373341","examples/hello.c":"9cbc0d3173e02309e15372835fa849d196b2a202d81806fea60378e1878d0c53","examples/pseudoquine.c":"8fd696f8e1b8fb86188564a05f4776875ead31d785a12e3aa4af9d9c1b46d5b5","include/lucet_wasi.h":"497f712c64f753ebdf73ab05b0b340d50094f9c59bb8637ccbf99d895cd20966","src/bindings.rs":"edbeb51d1a93fd31039ee1f1dc7c1b6c0bded2cf5dad10039e8b7da81a4d4a12","src/c_api.rs":"a9c73070a88a461882a28e3e2adfd773f569b964c7ffabde39a3cef907782f71","src/ctx.rs":"1ce1e321edaf35fe663a7fc4764c93697532d96c051dcbebcbc74a43c12954df","src/fdentry.rs":"6cff1b16929e67e684baa7cd2b7ab82b76c5b44e1c59cf6b852ae888d5208b47","src/host.rs":"6f05f8fea2afed827abfc3c008a5854a8023d91d066580ecfb49e5c8036ef3a3","src/hostcalls/fs.rs":"18102b651f443e37197b2d808450c85535d3b39ff98d52844b4f5fd95e8018e6","src/hostcalls/fs_helpers.rs":"474bce0a1f15fa23b0b0b8aa83143d993dd2cbd7cdfc38c118d452d04e80caea","src/hostcalls/misc.rs":"2cb55f010d661f4e42dffc82d49d0970996de9437b8fd6f8e3b298dd898cd2f9","src/hostcalls/mod.rs":"7ffeb1c08825487d90dd516def21ddc303949d631792ac17a8f57d902993ffd1","src/lib.rs":"5554e1a3f0cd3756173ece6435a0d01b2f520b3401cd5fc33180a04fb9f69bbe","src/memory.rs":"0a09026b15d27f99d74e560cd94795f645cba414a8491bc961987fab9d9da69b","src/wasi_host.rs":"cacbdac28304a837b11e5ad400ae9de3ee79c0284be335e64606ecdfe426ad6e","src/wasm32.rs":"13a5dc6e59784662f1e55eccb457cbbae241a96f70cfa72c41d55858ca05b980","tests/guests/cant_dotdot.c":"609b8cece9443e375a0b38a7e43651b179f66ee9c686edba6696fe1bcd45b111","tests/guests/clock_getres.c":"f5e41c0a2b05a8d7cdb5b4da6c8b6778b858004c1e9d115503c45a1d976be33b","tests/guests/duplicate_import.wat":"4bd8d7a5c1d1597dbe7648300e94e3fab84d7ab068d56cfb656aa1a208026cee","tests/guests/exitcode.c":"b7c5cec3ead0ed82326c568287a1f3398e71ae7e447ce49a3c4c7114c82495af","tests/guests/follow_symlink.c":"de3143ad2bbbfe834c0c32b54c9fcf144ca4eba5cdcf7588929e5f47225ab616","tests/guests/fs.c":"0dca5232ff5da1b7745e3b44bca39333c01a20ba4eae1a6a0a1c492c71ca1efa","tests/guests/getentropy.c":"5d80bcc68dcf3ba91576969055099d61635ae713c057b3cb36afb122a5f26347","tests/guests/getrusage.c":"8114c103b85eb564d9ab43684958bc1939de3794d314b7c121762f3a2f0434a6","tests/guests/gettimeofday.c":"4a57f376b06f4228017b82695448a0bd213fb91455f5301d689cd87fcff01f06","tests/guests/notdir.c":"bd8f8b24360b7cf8d5dced9d9ba4c15843fcbbae89fecc13e3a457c33a275e28","tests/guests/poll.c":"aefaa9b58ce9906dc379e0bd25fa68dfbf8cdffb48cd5ecde1d67708b83b366d","tests/guests/preopen_populates.c":"f186e4eb4aab6a1d9ec7bc5c49eaea6d9d162e0159dfe8f953bb48ade9b58d43","tests/guests/read_file.c":"1aab9393f005f05b69592826d7c4d384a115d5bca42c66f10a901811b4b1dcac","tests/guests/read_file_twice.c":"04a3dad7a43b93e36efd4e2c822c11b3f129429ec799af304d82b358686c578a","tests/guests/stat.c":"02756933ea7d4337b4fa04344b32968851b02f9d0bd5ea1cb0e2f022e8c65ab0","tests/guests/stdin.c":"66efc4b54f68d1138046f1afefae15f7d4555b2904b4a988818e61e67fe8fefb","tests/guests/symlink_escape.c":"686e047b5c986e29c854bcd93996d027dcdc8721219fa9fa532efc98d2798f5c","tests/guests/symlink_loop.c":"2bbddf3a5edfc6e5f3c0fa82cee4ac92b18804810509e263abd17f5240cd37e5","tests/guests/write_file.c":"9e9b14552c2445cfa6d0aa26b334081a59e6e3428dbb17ceca005a9ba59d3220","tests/test_helpers/mod.rs":"bc18194317611fe1be5c439a7a9e0de75399555c3b6de4275af149fb180456c8","tests/tests.rs":"173a7e0f086f6ed46474686cc3413ee68bbd2ff67004f7790e963a1392c7c46e"},"package":null}
\ No newline at end of file
+{"files":{"Cargo.toml":"8874fee1c359b1a1e18014cd0237bb1c54db182216ec4d41ca1bd360eff2573f","LICENSE":"268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5","LICENSE.cloudabi-utils":"86a34251f0aab76b7dc3daf8d252afbdf481ea94aa5b46d020205178b7e2eac1","LICENSE.wasmtime":"a6c48161a09acc75a0e25503bab66a731eb5fba5392ed4bb4743e4ba5085327a","bindings.json":"fad8362f845e6f7a2af1d7547cee5730894e7b96804f338181fc070ffdcfae1e","build.rs":"593173ad03963afcbef43f1843be6f04cde1df3eae0298ca20bf881019dd350a","examples/.gitignore":"44575cf5b28512d75644bf54a517dcef304ff809fd511747621b4d64f19aac66","examples/Makefile":"d2d2ceeb1bc4435189ea9a2710b6f5f5331ce6aa73ae8a4f4edcca215058a9b4","examples/README.md":"f2a5be6cc88d511c9f4d3bfefdd42dcb2ace813bc23f6a4430b6b543f7373341","examples/hello.c":"9cbc0d3173e02309e15372835fa849d196b2a202d81806fea60378e1878d0c53","examples/pseudoquine.c":"8fd696f8e1b8fb86188564a05f4776875ead31d785a12e3aa4af9d9c1b46d5b5","include/lucet_wasi.h":"497f712c64f753ebdf73ab05b0b340d50094f9c59bb8637ccbf99d895cd20966","src/bindings.rs":"edbeb51d1a93fd31039ee1f1dc7c1b6c0bded2cf5dad10039e8b7da81a4d4a12","src/c_api.rs":"a9c73070a88a461882a28e3e2adfd773f569b964c7ffabde39a3cef907782f71","src/ctx.rs":"1ce1e321edaf35fe663a7fc4764c93697532d96c051dcbebcbc74a43c12954df","src/fdentry.rs":"6cff1b16929e67e684baa7cd2b7ab82b76c5b44e1c59cf6b852ae888d5208b47","src/host.rs":"6f05f8fea2afed827abfc3c008a5854a8023d91d066580ecfb49e5c8036ef3a3","src/hostcalls/fs.rs":"18102b651f443e37197b2d808450c85535d3b39ff98d52844b4f5fd95e8018e6","src/hostcalls/fs_helpers.rs":"474bce0a1f15fa23b0b0b8aa83143d993dd2cbd7cdfc38c118d452d04e80caea","src/hostcalls/misc.rs":"2cb55f010d661f4e42dffc82d49d0970996de9437b8fd6f8e3b298dd898cd2f9","src/hostcalls/mod.rs":"7ffeb1c08825487d90dd516def21ddc303949d631792ac17a8f57d902993ffd1","src/lib.rs":"5554e1a3f0cd3756173ece6435a0d01b2f520b3401cd5fc33180a04fb9f69bbe","src/memory.rs":"0a09026b15d27f99d74e560cd94795f645cba414a8491bc961987fab9d9da69b","src/wasi_host.rs":"cacbdac28304a837b11e5ad400ae9de3ee79c0284be335e64606ecdfe426ad6e","src/wasm32.rs":"13a5dc6e59784662f1e55eccb457cbbae241a96f70cfa72c41d55858ca05b980","tests/guests/cant_dotdot.c":"609b8cece9443e375a0b38a7e43651b179f66ee9c686edba6696fe1bcd45b111","tests/guests/clock_getres.c":"f5e41c0a2b05a8d7cdb5b4da6c8b6778b858004c1e9d115503c45a1d976be33b","tests/guests/duplicate_import.wat":"4bd8d7a5c1d1597dbe7648300e94e3fab84d7ab068d56cfb656aa1a208026cee","tests/guests/exitcode.c":"b7c5cec3ead0ed82326c568287a1f3398e71ae7e447ce49a3c4c7114c82495af","tests/guests/follow_symlink.c":"de3143ad2bbbfe834c0c32b54c9fcf144ca4eba5cdcf7588929e5f47225ab616","tests/guests/fs.c":"0dca5232ff5da1b7745e3b44bca39333c01a20ba4eae1a6a0a1c492c71ca1efa","tests/guests/getentropy.c":"5d80bcc68dcf3ba91576969055099d61635ae713c057b3cb36afb122a5f26347","tests/guests/getrusage.c":"8114c103b85eb564d9ab43684958bc1939de3794d314b7c121762f3a2f0434a6","tests/guests/gettimeofday.c":"4a57f376b06f4228017b82695448a0bd213fb91455f5301d689cd87fcff01f06","tests/guests/notdir.c":"bd8f8b24360b7cf8d5dced9d9ba4c15843fcbbae89fecc13e3a457c33a275e28","tests/guests/poll.c":"aefaa9b58ce9906dc379e0bd25fa68dfbf8cdffb48cd5ecde1d67708b83b366d","tests/guests/preopen_populates.c":"f186e4eb4aab6a1d9ec7bc5c49eaea6d9d162e0159dfe8f953bb48ade9b58d43","tests/guests/read_file.c":"1aab9393f005f05b69592826d7c4d384a115d5bca42c66f10a901811b4b1dcac","tests/guests/read_file_twice.c":"04a3dad7a43b93e36efd4e2c822c11b3f129429ec799af304d82b358686c578a","tests/guests/stat.c":"02756933ea7d4337b4fa04344b32968851b02f9d0bd5ea1cb0e2f022e8c65ab0","tests/guests/stdin.c":"66efc4b54f68d1138046f1afefae15f7d4555b2904b4a988818e61e67fe8fefb","tests/guests/symlink_escape.c":"686e047b5c986e29c854bcd93996d027dcdc8721219fa9fa532efc98d2798f5c","tests/guests/symlink_loop.c":"2bbddf3a5edfc6e5f3c0fa82cee4ac92b18804810509e263abd17f5240cd37e5","tests/guests/write_file.c":"9e9b14552c2445cfa6d0aa26b334081a59e6e3428dbb17ceca005a9ba59d3220","tests/test_helpers/mod.rs":"bc18194317611fe1be5c439a7a9e0de75399555c3b6de4275af149fb180456c8","tests/tests.rs":"173a7e0f086f6ed46474686cc3413ee68bbd2ff67004f7790e963a1392c7c46e"},"package":null}
\ No newline at end of file
--- a/third_party/rust/lucet-wasi/Cargo.toml
+++ b/third_party/rust/lucet-wasi/Cargo.toml
@@ -26,17 +26,17 @@ update-bindings = ["bindgen"]
 [dependencies]
 cast = "0.2"
 failure = "0.1"
 libc = "=0.2.59"
 lucet-runtime = { path = "../lucet-runtime", version = "0.1.1" }
 lucet-runtime-internals = { path = "../lucet-runtime/lucet-runtime-internals", version = "0.1.1" }
 lucet-module = { path = "../lucet-module", version = "0.1.1" }
 nix = "0.13"
-rand = "0.6"
+rand = "0.7"
 
 [dev-dependencies]
 lucet-wasi-sdk = { path = "../lucet-wasi-sdk", version = "0.1.1" }
 lucetc = { path = "../lucetc", version = "0.1.1" }
 tempfile = "3.0"
 
 [build-dependencies.bindgen]
 version = "0.47"
deleted file mode 100644
--- a/third_party/rust/num-derive-0.2.5/.cargo-checksum.json
+++ /dev/null
@@ -1,1 +0,0 @@
-{"files":{"Cargo.toml":"24357f38521e03dbc562a42d44139d615a922406fb2bb122e17df29bc9bbb586","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"5c81631711af54d31e40841cd0153a95d9e505d8eba7503d114789ffb5e232c6","RELEASES.md":"62d6fef92273d9ee0e520ba611562b744e775318f5f6ae8e042ed94a3e19b2d6","build.rs":"16de2aa57e754fc1526d0400b5d87a3f771296705fca54601aa598b6f74ded8f","src/lib.rs":"5860c6007ea74b7b58033c15beae7c9e0859205e3ca1b76af9dc3e82914e08a2","tests/empty_enum.rs":"1b2312ec2fc9866fce7172e71e0aa2efcc3cb9d7659d0b633eb352bb1e080d53","tests/issue-6.rs":"b03b7382de854f30b84fd39d11b2c09aa97c136408942841cfc2c30c31b3f1a7","tests/issue-9.rs":"1aa7353078321a964c70986ceb071569290509b70faa9825e8b584165865ea7e","tests/newtype.rs":"1b60f13afbed8f18e94fe37141543d0c8d265419e1c2447b84ce14ac82af48e8","tests/num_derive_without_num.rs":"3ce528221a2cb752859e20c5423c4b474fec714b41d8c1b62f5614b165d7262b","tests/trivial.rs":"a6b0faab04527f6835f43cd72317a00065a7a6cf4c506d04e77f898134f7a59b","tests/with_custom_values.rs":"81ed60b50726555ee840ca773335aae68ac425d5af9ebbcbb3c6d6834358c73c"},"package":"eafd0b45c5537c3ba526f79d3e75120036502bebacbb3f3220914067ce39dbf2"}
\ No newline at end of file
deleted file mode 100644
--- a/third_party/rust/num-derive-0.2.5/Cargo.toml
+++ /dev/null
@@ -1,47 +0,0 @@
-# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
-#
-# 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
-#
-# 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]
-name = "num-derive"
-version = "0.2.5"
-authors = ["The Rust Project Developers"]
-build = "build.rs"
-exclude = ["/ci/*", "/.travis.yml", "/bors.toml"]
-description = "Numeric syntax extensions"
-homepage = "https://github.com/rust-num/num-derive"
-documentation = "https://docs.rs/num-derive"
-readme = "README.md"
-keywords = ["mathematics", "numerics"]
-categories = ["science"]
-license = "MIT/Apache-2.0"
-repository = "https://github.com/rust-num/num-derive"
-
-[lib]
-name = "num_derive"
-test = false
-proc-macro = true
-[dependencies.proc-macro2]
-version = "0.4.2"
-
-[dependencies.quote]
-version = "0.6"
-
-[dependencies.syn]
-version = "0.15"
-[dev-dependencies.num]
-version = "0.2"
-
-[dev-dependencies.num-traits]
-version = "0.2"
-
-[features]
-full-syntax = ["syn/full"]
deleted file mode 100644
--- a/third_party/rust/num-derive-0.2.5/LICENSE-APACHE
+++ /dev/null
@@ -1,201 +0,0 @@
-                              Apache License
-                        Version 2.0, January 2004
-                     http://www.apache.org/licenses/
-
-TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-1. Definitions.
-
-   "License" shall mean the terms and conditions for use, reproduction,
-   and distribution as defined by Sections 1 through 9 of this document.
-
-   "Licensor" shall mean the copyright owner or entity authorized by
-   the copyright owner that is granting the License.
-
-   "Legal Entity" shall mean the union of the acting entity and all
-   other entities that control, are controlled by, or are under common
-   control with that entity. For the purposes of this definition,
-   "control" means (i) the power, direct or indirect, to cause the
-   direction or management of such entity, whether by contract or
-   otherwise, or (ii) ownership of fifty percent (50%) or more of the
-   outstanding shares, or (iii) beneficial ownership of such entity.
-
-   "You" (or "Your") shall mean an individual or Legal Entity
-   exercising permissions granted by this License.
-
-   "Source" form shall mean the preferred form for making modifications,
-   including but not limited to software source code, documentation
-   source, and configuration files.
-
-   "Object" form shall mean any form resulting from mechanical
-   transformation or translation of a Source form, including but
-   not limited to compiled object code, generated documentation,
-   and conversions to other media types.
-
-   "Work" shall mean the work of authorship, whether in Source or
-   Object form, made available under the License, as indicated by a
-   copyright notice that is included in or attached to the work
-   (an example is provided in the Appendix below).
-
-   "Derivative Works" shall mean any work, whether in Source or Object
-   form, that is based on (or derived from) the Work and for which the
-   editorial revisions, annotations, elaborations, or other modifications
-   represent, as a whole, an original work of authorship. For the purposes
-   of this License, Derivative Works shall not include works that remain
-   separable from, or merely link (or bind by name) to the interfaces of,
-   the Work and Derivative Works thereof.
-
-   "Contribution" shall mean any work of authorship, including
-   the original version of the Work and any modifications or additions
-   to that Work or Derivative Works thereof, that is intentionally
-   submitted to Licensor for inclusion in the Work by the copyright owner
-   or by an individual or Legal Entity authorized to submit on behalf of
-   the copyright owner. For the purposes of this definition, "submitted"
-   means any form of electronic, verbal, or written communication sent
-   to the Licensor or its representatives, including but not limited to
-   communication on electronic mailing lists, source code control systems,
-   and issue tracking systems that are managed by, or on behalf of, the
-   Licensor for the purpose of discussing and improving the Work, but
-   excluding communication that is conspicuously marked or otherwise
-   designated in writing by the copyright owner as "Not a Contribution."
-
-   "Contributor" shall mean Licensor and any individual or Legal Entity
-   on behalf of whom a Contribution has been received by Licensor and
-   subsequently incorporated within the Work.
-
-2. Grant of Copyright License. Subject to the terms and conditions of
-   this License, each Contributor hereby grants to You a perpetual,
-   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-   copyright license to reproduce, prepare Derivative Works of,
-   publicly display, publicly perform, sublicense, and distribute the
-   Work and such Derivative Works in Source or Object form.
-
-3. Grant of Patent License. Subject to the terms and conditions of
-   this License, each Contributor hereby grants to You a perpetual,
-   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-   (except as stated in this section) patent license to make, have made,
-   use, offer to sell, sell, import, and otherwise transfer the Work,
-   where such license applies only to those patent claims licensable
-   by such Contributor that are necessarily infringed by their
-   Contribution(s) alone or by combination of their Contribution(s)
-   with the Work to which such Contribution(s) was submitted. If You
-   institute patent litigation against any entity (including a
-   cross-claim or counterclaim in a lawsuit) alleging that the Work
-   or a Contribution incorporated within the Work constitutes direct
-   or contributory patent infringement, then any patent licenses
-   granted to You under this License for that Work shall terminate
-   as of the date such litigation is filed.
-
-4. Redistribution. You may reproduce and distribute copies of the
-   Work or Derivative Works thereof in any medium, with or without
-   modifications, and in Source or Object form, provided that You
-   meet the following conditions:
-
-   (a) You must give any other recipients of the Work or
-       Derivative Works a copy of this License; and
-
-   (b) You must cause any modified files to carry prominent notices
-       stating that You changed the files; and
-
-   (c) You must retain, in the Source form of any Derivative Works
-       that You distribute, all copyright, patent, trademark, and
-       attribution notices from the Source form of the Work,
-       excluding those notices that do not pertain to any part of
-       the Derivative Works; and
-
-   (d) If the Work includes a "NOTICE" text file as part of its
-       distribution, then any Derivative Works that You distribute must
-       include a readable copy of the attribution notices contained
-       within such NOTICE file, excluding those notices that do not
-       pertain to any part of the Derivative Works, in at least one
-       of the following places: within a NOTICE text file distributed
-       as part of the Derivative Works; within the Source form or
-       documentation, if provided along with the Derivative Works; or,
-       within a display generated by the Derivative Works, if and
-       wherever such third-party notices normally appear. The contents
-       of the NOTICE file are for informational purposes only and
-       do not modify the License. You may add Your own attribution
-       notices within Derivative Works that You distribute, alongside
-       or as an addendum to the NOTICE text from the Work, provided
-       that such additional attribution notices cannot be construed
-       as modifying the License.
-
-   You may add Your own copyright statement to Your modifications and
-   may provide additional or different license terms and conditions
-   for use, reproduction, or distribution of Your modifications, or
-   for any such Derivative Works as a whole, provided Your use,
-   reproduction, and distribution of the Work otherwise complies with
-   the conditions stated in this License.
-
-5. Submission of Contributions. Unless You explicitly state otherwise,
-   any Contribution intentionally submitted for inclusion in the Work
-   by You to the Licensor shall be under the terms and conditions of
-   this License, without any additional terms or conditions.
-   Notwithstanding the above, nothing herein shall supersede or modify
-   the terms of any separate license agreement you may have executed
-   with Licensor regarding such Contributions.
-
-6. Trademarks. This License does not grant permission to use the trade
-   names, trademarks, service marks, or product names of the Licensor,
-   except as required for reasonable and customary use in describing the
-   origin of the Work and reproducing the content of the NOTICE file.
-
-7. Disclaimer of Warranty. Unless required by applicable law or
-   agreed to in writing, Licensor provides the Work (and each
-   Contributor provides its Contributions) on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-   implied, including, without limitation, any warranties or conditions
-   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-   PARTICULAR PURPOSE. You are solely responsible for determining the
-   appropriateness of using or redistributing the Work and assume any
-   risks associated with Your exercise of permissions under this License.
-
-8. Limitation of Liability. In no event and under no legal theory,
-   whether in tort (including negligence), contract, or otherwise,
-   unless required by applicable law (such as deliberate and grossly
-   negligent acts) or agreed to in writing, shall any Contributor be
-   liable to You for damages, including any direct, indirect, special,
-   incidental, or consequential damages of any character arising as a
-   result of this License or out of the use or inability to use the
-   Work (including but not limited to damages for loss of goodwill,
-   work stoppage, computer failure or malfunction, or any and all
-   other commercial damages or losses), even if such Contributor
-   has been advised of the possibility of such damages.
-
-9. Accepting Warranty or Additional Liability. While redistributing
-   the Work or Derivative Works thereof, You may choose to offer,
-   and charge a fee for, acceptance of support, warranty, indemnity,
-   or other liability obligations and/or rights consistent with this
-   License. However, in accepting such obligations, You may act only
-   on Your own behalf and on Your sole responsibility, not on behalf
-   of any other Contributor, and only if You agree to indemnify,
-   defend, and hold each Contributor harmless for any liability
-   incurred by, or claims asserted against, such Contributor by reason
-   of your accepting any such warranty or additional liability.
-
-END OF TERMS AND CONDITIONS
-
-APPENDIX: How to apply the Apache License to your work.
-
-   To apply the Apache License to your work, attach the following
-   boilerplate notice, with the fields enclosed by brackets "[]"
-   replaced with your own identifying information. (Don't include
-   the brackets!)  The text should be enclosed in the appropriate
-   comment syntax for the file format. We also recommend that a
-   file or class name and description of purpose be included on the
-   same "printed page" as the copyright notice for easier
-   identification within third-party archives.
-
-Copyright [yyyy] [name of copyright owner]
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-	http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
deleted file mode 100644
--- a/third_party/rust/num-derive-0.2.5/LICENSE-MIT
+++ /dev/null
@@ -1,25 +0,0 @@
-Copyright (c) 2014 The Rust Project Developers
-
-Permission is hereby granted, free of charge, to any
-person obtaining a copy of this software and associated
-documentation files (the "Software"), to deal in the
-Software without restriction, including without
-limitation the rights to use, copy, modify, merge,
-publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software
-is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice
-shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
deleted file mode 100644
--- a/third_party/rust/num-derive-0.2.5/README.md
+++ /dev/null
@@ -1,53 +0,0 @@
-# num-derive
-
-[![crate](https://img.shields.io/crates/v/num-derive.svg)](https://crates.io/crates/num-derive)
-[![documentation](https://docs.rs/num-derive/badge.svg)](https://docs.rs/num-derive)
-[![Travis status](https://travis-ci.org/rust-num/num-derive.svg?branch=master)](https://travis-ci.org/rust-num/num-derive)
-
-Procedural macros to derive numeric traits in Rust.
-
-## Usage
-
-Add this to your `Cargo.toml`:
-
-```toml
-[dependencies]
-num-traits = "0.2"
-num-derive = "0.2"
-```
-
-and this to your crate root:
-
-```rust
-#[macro_use]
-extern crate num_derive;
-```
-
-Then you can derive traits on your own types:
-
-```rust
-#[derive(FromPrimitive, ToPrimitive)]
-enum Color {
-    Red,
-    Blue,
-    Green,
-}
-```
-
-## Optional features
-
-- **`full-syntax`** — Enables `num-derive` to handle enum discriminants
-  represented by complex expressions. Usually can be avoided by
-  [utilizing constants], so only use this feature if namespace pollution is
-  undesired and [compile time doubling] is acceptable.
-
-[utilizing constants]: https://github.com/rust-num/num-derive/pull/3#issuecomment-359044704
-[compile time doubling]: https://github.com/rust-num/num-derive/pull/3#issuecomment-359172588
-
-## Releases
-
-Release notes are available in [RELEASES.md](RELEASES.md).
-
-## Compatibility
-
-The `num-derive` crate is tested for rustc 1.15 and greater.
deleted file mode 100644
--- a/third_party/rust/num-derive-0.2.5/RELEASES.md
+++ /dev/null
@@ -1,78 +0,0 @@
-# Release 0.2.5 (2019-04-23)
-
-- [Improved the masking of lints in derived code][23].
-
-[23]: https://github.com/rust-num/num-derive/pull/23
-
-# Release 0.2.4 (2019-01-25)
-
-- [Adjusted dependencies to allow no-std targets][22].
-
-[22]: https://github.com/rust-num/num-derive/pull/22
-
-# Release 0.2.3 (2018-10-03)
-
-- [Added newtype deriving][17] for `FromPrimitive`, `ToPrimitive`,
-  `NumOps<Self, Self>`, `NumCast`, `Zero`, `One`, `Num`, and `Float`.
-  Thanks @asayers!
-
-[17]: https://github.com/rust-num/num-derive/pull/17
-
-# Release 0.2.2 (2018-05-22)
-
-- [Updated dependencies][14].
-
-[14]: https://github.com/rust-num/num-derive/pull/14
-
-# Release 0.2.1 (2018-05-09)
-
-- [Updated dependencies][12] -- thanks @spearman!
-
-[12]: https://github.com/rust-num/num-derive/pull/12
-
-# Release 0.2.0 (2018-02-21)
-
-- [Discriminant matching is now simplified][10], casting values directly by
-  name, rather than trying to compute offsets from known values manually.
-- **breaking change**: [Derivations now import the traits from `num-traits`][11]
-  instead of the full `num` crate.  These are still compatible, but users need
-  to have an explicit `num-traits = "0.2"` dependency in their `Cargo.toml`.
-
-[10]: https://github.com/rust-num/num-derive/pull/10
-[11]: https://github.com/rust-num/num-derive/pull/11
-
-
-# Release 0.1.44 (2018-01-26)
-
-- [The derived code now explicitly allows `unused_qualifications`][9], so users
-  that globally deny that lint don't encounter an error.
-
-[9]: https://github.com/rust-num/num-derive/pull/9
-
-
-# Release 0.1.43 (2018-01-23)
-
-- [The derived code now explicitly allows `trivial_numeric_casts`][7], so users
-  that globally deny that lint don't encounter an error.
-
-[7]: https://github.com/rust-num/num-derive/pull/7
-
-
-# Release 0.1.42 (2018-01-22)
-
-- [num-derive now has its own source repository][num-356] at [rust-num/num-derive][home].
-- [The derivation macros have been updated][3] to using `syn` 0.12.  Support for complex
-  expressions in enum values can be enabled with the `full-syntax` feature.
-
-Thanks to @cuviper and @hcpl for their contributions!
-
-[home]: https://github.com/rust-num/num-derive
-[num-356]: https://github.com/rust-num/num/pull/356
-[3]: https://github.com/rust-num/num-derive/pull/3
-
-
-# Prior releases
-
-No prior release notes were kept.  Thanks all the same to the many
-contributors that have made this crate what it is!
-
deleted file mode 100644
--- a/third_party/rust/num-derive-0.2.5/build.rs
+++ /dev/null
@@ -1,35 +0,0 @@
-use std::env;
-use std::io::Write;
-use std::process::{Command, Stdio};
-
-fn main() {
-    if probe("fn main() { 0i128; }") {
-        println!("cargo:rustc-cfg=has_i128");
-    } else if env::var_os("CARGO_FEATURE_I128").is_some() {
-        panic!("i128 support was not detected!");
-    }
-}
-
-/// Test if a code snippet can be compiled
-fn probe(code: &str) -> bool {
-    let rustc = env::var_os("RUSTC").unwrap_or_else(|| "rustc".into());
-    let out_dir = env::var_os("OUT_DIR").expect("environment variable OUT_DIR");
-
-    let mut child = Command::new(rustc)
-        .arg("--out-dir")
-        .arg(out_dir)
-        .arg("--emit=obj")
-        .arg("-")
-        .stdin(Stdio::piped())
-        .spawn()
-        .expect("rustc probe");
-
-    child
-        .stdin
-        .as_mut()
-        .expect("rustc stdin")
-        .write_all(code.as_bytes())
-        .expect("write rustc stdin");
-
-    child.wait().expect("rustc probe").success()
-}
deleted file mode 100644
--- a/third_party/rust/num-derive-0.2.5/src/lib.rs
+++ /dev/null
@@ -1,797 +0,0 @@
-// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-#![crate_type = "proc-macro"]
-#![doc(html_root_url = "https://docs.rs/num-derive/0.2")]
-#![recursion_limit = "512"]
-
-//! Procedural macros to derive numeric traits in Rust.
-//!
-//! ## Usage
-//!
-//! Add this to your `Cargo.toml`:
-//!
-//! ```toml
-//! [dependencies]
-//! num-traits = "0.2"
-//! num-derive = "0.2"
-//! ```
-//!
-//! Then you can derive traits on your own types:
-//!
-//! ```rust
-//! #[macro_use]
-//! extern crate num_derive;
-//!
-//! #[derive(FromPrimitive, ToPrimitive)]
-//! enum Color {
-//!     Red,
-//!     Blue,
-//!     Green,
-//! }
-//! # fn main() {}
-//! ```
-
-extern crate proc_macro;
-
-extern crate proc_macro2;
-#[macro_use]
-extern crate quote;
-extern crate syn;
-
-use proc_macro::TokenStream;
-use proc_macro2::Span;
-
-use syn::{Data, Fields, Ident};
-
-// Within `exp`, you can bring things into scope with `extern crate`.
-//
-// We don't want to assume that `num_traits::` is in scope - the user may have imported it under a
-// different name, or may have imported it in a non-toplevel module (common when putting impls
-// behind a feature gate).
-//
-// Solution: let's just generate `extern crate num_traits as _num_traits` and then refer to
-// `_num_traits` in the derived code.  However, macros are not allowed to produce `extern crate`
-// statements at the toplevel.
-//
-// Solution: let's generate `mod _impl_foo` and import num_traits within that.  However, now we
-// lose access to private members of the surrounding module.  This is a problem if, for example,
-// we're deriving for a newtype, where the inner type is defined in the same module, but not
-// exported.
-//
-// Solution: use the dummy const trick.  For some reason, `extern crate` statements are allowed
-// here, but everything from the surrounding module is in scope.  This trick is taken from serde.
-fn dummy_const_trick<T: quote::ToTokens>(
-    trait_: &str,
-    name: &proc_macro2::Ident,
-    exp: T,
-) -> proc_macro2::TokenStream {
-    let dummy_const = Ident::new(
-        &format!("_IMPL_NUM_{}_FOR_{}", trait_, unraw(name)),
-        Span::call_site(),
-    );
-    quote! {
-        #[allow(non_upper_case_globals, unused_attributes, unused_qualifications)]
-        const #dummy_const: () = {
-            #[allow(unknown_lints)]
-            #[cfg_attr(feature = "cargo-clippy", allow(useless_attribute))]
-            #[allow(rust_2018_idioms)]
-            extern crate num_traits as _num_traits;
-            #exp
-        };
-    }
-}
-
-#[allow(deprecated)]
-fn unraw(ident: &proc_macro2::Ident) -> String {
-    // str::trim_start_matches was added in 1.30, trim_left_matches deprecated
-    // in 1.33. We currently support rustc back to 1.15 so we need to continue
-    // to use the deprecated one.
-    ident.to_string().trim_left_matches("r#").to_owned()
-}
-
-// If `data` is a newtype, return the type it's wrapping.
-fn newtype_inner(data: &syn::Data) -> Option<syn::Type> {
-    match *data {
-        Data::Struct(ref s) => {
-            match s.fields {
-                Fields::Unnamed(ref fs) => {
-                    if fs.unnamed.len() == 1 {
-                        Some(fs.unnamed[0].ty.clone())
-                    } else {
-                        None
-                    }
-                }
-                Fields::Named(ref fs) => {
-                    if fs.named.len() == 1 {
-                        panic!("num-derive doesn't know how to handle newtypes with named fields yet. \
-                           Please use a tuple-style newtype, or submit a PR!");
-                    }
-                    None
-                }
-                _ => None,
-            }
-        }
-        _ => None,
-    }
-}
-
-/// Derives [`num_traits::FromPrimitive`][from] for simple enums and newtypes.
-///
-/// [from]: https://docs.rs/num-traits/0.2/num_traits/cast/trait.FromPrimitive.html
-///
-/// # Examples
-///
-/// Simple enums can be derived:
-///
-/// ```rust
-/// # #[macro_use]
-/// # extern crate num_derive;
-///
-/// #[derive(FromPrimitive)]
-/// enum Color {
-///     Red,
-///     Blue,
-///     Green = 42,
-/// }
-/// # fn main() {}
-/// ```
-///
-/// Enums that contain data are not allowed:
-///
-/// ```compile_fail
-/// # #[macro_use]
-/// # extern crate num_derive;
-///
-/// #[derive(FromPrimitive)]
-/// enum Color {
-///     Rgb(u8, u8, u8),
-///     Hsv(u8, u8, u8),
-/// }
-/// # fn main() {}
-/// ```
-///
-/// Structs are not allowed:
-///
-/// ```compile_fail
-/// # #[macro_use]
-/// # extern crate num_derive;
-/// #[derive(FromPrimitive)]
-/// struct Color {
-///     r: u8,
-///     g: u8,
-///     b: u8,
-/// }
-/// # fn main() {}
-/// ```
-#[proc_macro_derive(FromPrimitive)]
-pub fn from_primitive(input: TokenStream) -> TokenStream {
-    let ast: syn::DeriveInput = syn::parse(input).unwrap();
-    let name = &ast.ident;
-
-    let impl_ = if let Some(inner_ty) = newtype_inner(&ast.data) {
-        let i128_fns = if cfg!(has_i128) {
-            quote! {
-                fn from_i128(n: i128) -> Option<Self> {
-                    <#inner_ty as _num_traits::FromPrimitive>::from_i128(n).map(#name)
-                }
-                fn from_u128(n: u128) -> Option<Self> {
-                    <#inner_ty as _num_traits::FromPrimitive>::from_u128(n).map(#name)
-                }
-            }
-        } else {
-            quote! {}
-        };
-
-        quote! {
-            impl _num_traits::FromPrimitive for #name {
-                fn from_i64(n: i64) -> Option<Self> {
-                    <#inner_ty as _num_traits::FromPrimitive>::from_i64(n).map(#name)
-                }
-                fn from_u64(n: u64) -> Option<Self> {
-                    <#inner_ty as _num_traits::FromPrimitive>::from_u64(n).map(#name)
-                }
-                fn from_isize(n: isize) -> Option<Self> {
-                    <#inner_ty as _num_traits::FromPrimitive>::from_isize(n).map(#name)
-                }
-                fn from_i8(n: i8) -> Option<Self> {
-                    <#inner_ty as _num_traits::FromPrimitive>::from_i8(n).map(#name)
-                }
-                fn from_i16(n: i16) -> Option<Self> {
-                    <#inner_ty as _num_traits::FromPrimitive>::from_i16(n).map(#name)
-                }
-                fn from_i32(n: i32) -> Option<Self> {
-                    <#inner_ty as _num_traits::FromPrimitive>::from_i32(n).map(#name)
-                }
-                fn from_usize(n: usize) -> Option<Self> {
-                    <#inner_ty as _num_traits::FromPrimitive>::from_usize(n).map(#name)
-                }
-                fn from_u8(n: u8) -> Option<Self> {
-                    <#inner_ty as _num_traits::FromPrimitive>::from_u8(n).map(#name)
-                }
-                fn from_u16(n: u16) -> Option<Self> {
-                    <#inner_ty as _num_traits::FromPrimitive>::from_u16(n).map(#name)
-                }
-                fn from_u32(n: u32) -> Option<Self> {
-                    <#inner_ty as _num_traits::FromPrimitive>::from_u32(n).map(#name)
-                }
-                fn from_f32(n: f32) -> Option<Self> {
-                    <#inner_ty as _num_traits::FromPrimitive>::from_f32(n).map(#name)
-                }
-                fn from_f64(n: f64) -> Option<Self> {
-                    <#inner_ty as _num_traits::FromPrimitive>::from_f64(n).map(#name)
-                }
-                #i128_fns
-            }
-        }
-    } else {
-        let variants = match ast.data {
-            Data::Enum(ref data_enum) => &data_enum.variants,
-            _ => panic!(
-                "`FromPrimitive` can be applied only to enums and newtypes, {} is neither",
-                name
-            ),
-        };
-
-        let from_i64_var = quote! { n };
-        let clauses: Vec<_> = variants
-            .iter()
-            .map(|variant| {
-                let ident = &variant.ident;
-                match variant.fields {
-                    Fields::Unit => (),
-                    _ => panic!(
-                        "`FromPrimitive` can be applied only to unitary enums and newtypes, \
-                         {}::{} is either struct or tuple",
-                        name, ident
-                    ),
-                }
-
-                quote! {
-                    if #from_i64_var == #name::#ident as i64 {
-                        Some(#name::#ident)
-                    }
-                }
-            })
-            .collect();
-
-        let from_i64_var = if clauses.is_empty() {
-            quote!(_)
-        } else {
-            from_i64_var
-        };
-
-        quote! {
-            impl _num_traits::FromPrimitive for #name {
-                #[allow(trivial_numeric_casts)]
-                fn from_i64(#from_i64_var: i64) -> Option<Self> {
-                    #(#clauses else)* {
-                        None
-                    }
-                }
-
-                fn from_u64(n: u64) -> Option<Self> {
-                    Self::from_i64(n as i64)
-                }
-            }
-        }
-    };
-
-    dummy_const_trick("FromPrimitive", &name, impl_).into()
-}
-
-/// Derives [`num_traits::ToPrimitive`][to] for simple enums and newtypes.
-///
-/// [to]: https://docs.rs/num-traits/0.2/num_traits/cast/trait.ToPrimitive.html
-///
-/// # Examples
-///
-/// Simple enums can be derived:
-///
-/// ```rust
-/// # #[macro_use]
-/// # extern crate num_derive;
-///
-/// #[derive(ToPrimitive)]
-/// enum Color {
-///     Red,
-///     Blue,
-///     Green = 42,
-/// }
-/// # fn main() {}
-/// ```
-///
-/// Enums that contain data are not allowed:
-///
-/// ```compile_fail
-/// # #[macro_use]
-/// # extern crate num_derive;
-///
-/// #[derive(ToPrimitive)]
-/// enum Color {
-///     Rgb(u8, u8, u8),
-///     Hsv(u8, u8, u8),
-/// }
-/// # fn main() {}
-/// ```
-///
-/// Structs are not allowed:
-///
-/// ```compile_fail
-/// # #[macro_use]
-/// # extern crate num_derive;
-/// #[derive(ToPrimitive)]
-/// struct Color {
-///     r: u8,
-///     g: u8,
-///     b: u8,
-/// }
-/// # fn main() {}
-/// ```
-#[proc_macro_derive(ToPrimitive)]
-pub fn to_primitive(input: TokenStream) -> TokenStream {
-    let ast: syn::DeriveInput = syn::parse(input).unwrap();
-    let name = &ast.ident;
-
-    let impl_ = if let Some(inner_ty) = newtype_inner(&ast.data) {
-        let i128_fns = if cfg!(has_i128) {
-            quote! {
-                fn to_i128(&self) -> Option<i128> {
-                    <#inner_ty as _num_traits::ToPrimitive>::to_i128(&self.0)
-                }
-                fn to_u128(&self) -> Option<u128> {
-                    <#inner_ty as _num_traits::ToPrimitive>::to_u128(&self.0)
-                }
-            }
-        } else {
-            quote! {}
-        };
-
-        quote! {
-            impl _num_traits::ToPrimitive for #name {
-                fn to_i64(&self) -> Option<i64> {
-                    <#inner_ty as _num_traits::ToPrimitive>::to_i64(&self.0)
-                }
-                fn to_u64(&self) -> Option<u64> {
-                    <#inner_ty as _num_traits::ToPrimitive>::to_u64(&self.0)
-                }
-                fn to_isize(&self) -> Option<isize> {
-                    <#inner_ty as _num_traits::ToPrimitive>::to_isize(&self.0)
-                }
-                fn to_i8(&self) -> Option<i8> {
-                    <#inner_ty as _num_traits::ToPrimitive>::to_i8(&self.0)
-                }
-                fn to_i16(&self) -> Option<i16> {
-                    <#inner_ty as _num_traits::ToPrimitive>::to_i16(&self.0)
-                }
-                fn to_i32(&self) -> Option<i32> {
-                    <#inner_ty as _num_traits::ToPrimitive>::to_i32(&self.0)
-                }
-                fn to_usize(&self) -> Option<usize> {
-                    <#inner_ty as _num_traits::ToPrimitive>::to_usize(&self.0)
-                }
-                fn to_u8(&self) -> Option<u8> {
-                    <#inner_ty as _num_traits::ToPrimitive>::to_u8(&self.0)
-                }
-                fn to_u16(&self) -> Option<u16> {
-                    <#inner_ty as _num_traits::ToPrimitive>::to_u16(&self.0)
-                }
-                fn to_u32(&self) -> Option<u32> {
-                    <#inner_ty as _num_traits::ToPrimitive>::to_u32(&self.0)
-                }
-                fn to_f32(&self) -> Option<f32> {
-                    <#inner_ty as _num_traits::ToPrimitive>::to_f32(&self.0)
-                }
-                fn to_f64(&self) -> Option<f64> {
-                    <#inner_ty as _num_traits::ToPrimitive>::to_f64(&self.0)
-                }
-                #i128_fns
-            }
-        }
-    } else {
-        let variants = match ast.data {
-            Data::Enum(ref data_enum) => &data_enum.variants,
-            _ => panic!(
-                "`ToPrimitive` can be applied only to enums and newtypes, {} is neither",
-                name
-            ),
-        };
-
-        let variants: Vec<_> = variants
-            .iter()
-            .map(|variant| {
-                let ident = &variant.ident;
-                match variant.fields {
-                    Fields::Unit => (),
-                    _ => {
-                        panic!("`ToPrimitive` can be applied only to unitary enums and newtypes, {}::{} is either struct or tuple", name, ident)
-                    },
-                }
-
-                // NB: We have to check each variant individually, because we'll only have `&self`
-                // for the input.  We can't move from that, and it might not be `Clone` or `Copy`.
-                // (Otherwise we could just do `*self as i64` without a `match` at all.)
-                quote!(#name::#ident => #name::#ident as i64)
-            })
-            .collect();
-
-        let match_expr = if variants.is_empty() {
-            // No variants found, so do not use Some to not to trigger `unreachable_code` lint
-            quote! {
-                match *self {}
-            }
-        } else {
-            quote! {
-                Some(match *self {
-                    #(#variants,)*
-                })
-            }
-        };
-
-        quote! {
-            impl _num_traits::ToPrimitive for #name {
-                #[allow(trivial_numeric_casts)]
-                fn to_i64(&self) -> Option<i64> {
-                    #match_expr
-                }
-
-                fn to_u64(&self) -> Option<u64> {
-                    self.to_i64().map(|x| x as u64)
-                }
-            }
-        }
-    };
-
-    dummy_const_trick("ToPrimitive", &name, impl_).into()
-}
-
-#[allow(renamed_and_removed_lints)]
-#[cfg_attr(feature = "cargo-clippy", allow(const_static_lifetime))]
-const NEWTYPE_ONLY: &'static str = "This trait can only be derived for newtypes";
-
-/// Derives [`num_traits::NumOps`][num_ops] for newtypes.  The inner type must already implement
-/// `NumOps`.
-///
-/// [num_ops]: https://docs.rs/num-traits/0.2/num_traits/trait.NumOps.html
-///
-/// Note that, since `NumOps` is really a trait alias for `Add + Sub + Mul + Div + Rem`, this macro
-/// generates impls for _those_ traits.  Furthermore, in all generated impls, `RHS=Self` and
-/// `Output=Self`.
-#[proc_macro_derive(NumOps)]
-pub fn num_ops(input: TokenStream) -> TokenStream {
-    let ast: syn::DeriveInput = syn::parse(input).unwrap();
-    let name = &ast.ident;
-    let inner_ty = newtype_inner(&ast.data).expect(NEWTYPE_ONLY);
-    dummy_const_trick(
-        "NumOps",
-        &name,
-        quote! {
-            impl ::std::ops::Add for #name {
-                type Output = Self;
-                fn add(self, other: Self) -> Self {
-                    #name(<#inner_ty as ::std::ops::Add>::add(self.0, other.0))
-                }
-            }
-            impl ::std::ops::Sub for #name {
-                type Output = Self;
-                fn sub(self, other: Self) -> Self {
-                    #name(<#inner_ty as ::std::ops::Sub>::sub(self.0, other.0))
-                }
-            }
-            impl ::std::ops::Mul for #name {
-                type Output = Self;
-                fn mul(self, other: Self) -> Self {
-                    #name(<#inner_ty as ::std::ops::Mul>::mul(self.0, other.0))
-                }
-            }
-            impl ::std::ops::Div for #name {
-                type Output = Self;
-                fn div(self, other: Self) -> Self {
-                    #name(<#inner_ty as ::std::ops::Div>::div(self.0, other.0))
-                }
-            }
-            impl ::std::ops::Rem for #name {
-                type Output = Self;
-                fn rem(self, other: Self) -> Self {
-                    #name(<#inner_ty as ::std::ops::Rem>::rem(self.0, other.0))
-                }
-            }
-        },
-    )
-    .into()
-}
-
-/// Derives [`num_traits::NumCast`][num_cast] for newtypes.  The inner type must already implement
-/// `NumCast`.
-///
-/// [num_cast]: https://docs.rs/num-traits/0.2/num_traits/cast/trait.NumCast.html
-#[proc_macro_derive(NumCast)]
-pub fn num_cast(input: TokenStream) -> TokenStream {
-    let ast: syn::DeriveInput = syn::parse(input).unwrap();
-    let name = &ast.ident;
-    let inner_ty = newtype_inner(&ast.data).expect(NEWTYPE_ONLY);
-    dummy_const_trick(
-        "NumCast",
-        &name,
-        quote! {
-            impl _num_traits::NumCast for #name {
-                fn from<T: _num_traits::ToPrimitive>(n: T) -> Option<Self> {
-                    <#inner_ty as _num_traits::NumCast>::from(n).map(#name)
-                }
-            }
-        },
-    )
-    .into()
-}
-
-/// Derives [`num_traits::Zero`][zero] for newtypes.  The inner type must already implement `Zero`.
-///
-/// [zero]: https://docs.rs/num-traits/0.2/num_traits/identities/trait.Zero.html
-#[proc_macro_derive(Zero)]
-pub fn zero(input: TokenStream) -> TokenStream {
-    let ast: syn::DeriveInput = syn::parse(input).unwrap();
-    let name = &ast.ident;
-    let inner_ty = newtype_inner(&ast.data).expect(NEWTYPE_ONLY);
-    dummy_const_trick(
-        "Zero",
-        &name,
-        quote! {
-            impl _num_traits::Zero for #name {
-                fn zero() -> Self {
-                    #name(<#inner_ty as _num_traits::Zero>::zero())
-                }
-                fn is_zero(&self) -> bool {
-                    <#inner_ty as _num_traits::Zero>::is_zero(&self.0)
-                }
-            }
-        },
-    )
-    .into()
-}
-
-/// Derives [`num_traits::One`][one] for newtypes.  The inner type must already implement `One`.
-///
-/// [one]: https://docs.rs/num-traits/0.2/num_traits/identities/trait.One.html
-#[proc_macro_derive(One)]
-pub fn one(input: TokenStream) -> TokenStream {
-    let ast: syn::DeriveInput = syn::parse(input).unwrap();
-    let name = &ast.ident;
-    let inner_ty = newtype_inner(&ast.data).expect(NEWTYPE_ONLY);
-    dummy_const_trick(
-        "One",
-        &name,
-        quote! {
-            impl _num_traits::One for #name {
-                fn one() -> Self {
-                    #name(<#inner_ty as _num_traits::One>::one())
-                }
-                fn is_one(&self) -> bool {
-                    <#inner_ty as _num_traits::One>::is_one(&self.0)
-                }
-            }
-        },
-    )
-    .into()
-}
-
-/// Derives [`num_traits::Num`][num] for newtypes.  The inner type must already implement `Num`.
-///
-/// [num]: https://docs.rs/num-traits/0.2/num_traits/trait.Num.html
-#[proc_macro_derive(Num)]
-pub fn num(input: TokenStream) -> TokenStream {
-    let ast: syn::DeriveInput = syn::parse(input).unwrap();
-    let name = &ast.ident;
-    let inner_ty = newtype_inner(&ast.data).expect(NEWTYPE_ONLY);
-    dummy_const_trick(
-        "Num",
-        &name,
-        quote! {
-            impl _num_traits::Num for #name {
-                type FromStrRadixErr = <#inner_ty as _num_traits::Num>::FromStrRadixErr;
-                fn from_str_radix(s: &str, radix: u32) -> Result<Self, Self::FromStrRadixErr> {
-                    <#inner_ty as _num_traits::Num>::from_str_radix(s, radix).map(#name)
-                }
-            }
-        },
-    )
-    .into()
-}
-
-/// Derives [`num_traits::Float`][float] for newtypes.  The inner type must already implement
-/// `Float`.
-///
-/// [float]: https://docs.rs/num-traits/0.2/num_traits/float/trait.Float.html
-#[proc_macro_derive(Float)]
-pub fn float(input: TokenStream) -> TokenStream {
-    let ast: syn::DeriveInput = syn::parse(input).unwrap();
-    let name = &ast.ident;
-    let inner_ty = newtype_inner(&ast.data).expect(NEWTYPE_ONLY);
-    dummy_const_trick(
-        "Float",
-        &name,
-        quote! {
-            impl _num_traits::Float for #name {
-                fn nan() -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::nan())
-                }
-                fn infinity() -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::infinity())
-                }
-                fn neg_infinity() -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::neg_infinity())
-                }
-                fn neg_zero() -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::neg_zero())
-                }
-                fn min_value() -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::min_value())
-                }
-                fn min_positive_value() -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::min_positive_value())
-                }
-                fn max_value() -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::max_value())
-                }
-                fn is_nan(self) -> bool {
-                    <#inner_ty as _num_traits::Float>::is_nan(self.0)
-                }
-                fn is_infinite(self) -> bool {
-                    <#inner_ty as _num_traits::Float>::is_infinite(self.0)
-                }
-                fn is_finite(self) -> bool {
-                    <#inner_ty as _num_traits::Float>::is_finite(self.0)
-                }
-                fn is_normal(self) -> bool {
-                    <#inner_ty as _num_traits::Float>::is_normal(self.0)
-                }
-                fn classify(self) -> ::std::num::FpCategory {
-                    <#inner_ty as _num_traits::Float>::classify(self.0)
-                }
-                fn floor(self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::floor(self.0))
-                }
-                fn ceil(self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::ceil(self.0))
-                }
-                fn round(self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::round(self.0))
-                }
-                fn trunc(self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::trunc(self.0))
-                }
-                fn fract(self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::fract(self.0))
-                }
-                fn abs(self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::abs(self.0))
-                }
-                fn signum(self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::signum(self.0))
-                }
-                fn is_sign_positive(self) -> bool {
-                    <#inner_ty as _num_traits::Float>::is_sign_positive(self.0)
-                }
-                fn is_sign_negative(self) -> bool {
-                    <#inner_ty as _num_traits::Float>::is_sign_negative(self.0)
-                }
-                fn mul_add(self, a: Self, b: Self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::mul_add(self.0, a.0, b.0))
-                }
-                fn recip(self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::recip(self.0))
-                }
-                fn powi(self, n: i32) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::powi(self.0, n))
-                }
-                fn powf(self, n: Self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::powf(self.0, n.0))
-                }
-                fn sqrt(self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::sqrt(self.0))
-                }
-                fn exp(self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::exp(self.0))
-                }
-                fn exp2(self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::exp2(self.0))
-                }
-                fn ln(self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::ln(self.0))
-                }
-                fn log(self, base: Self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::log(self.0, base.0))
-                }
-                fn log2(self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::log2(self.0))
-                }
-                fn log10(self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::log10(self.0))
-                }
-                fn max(self, other: Self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::max(self.0, other.0))
-                }
-                fn min(self, other: Self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::min(self.0, other.0))
-                }
-                fn abs_sub(self, other: Self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::abs_sub(self.0, other.0))
-                }
-                fn cbrt(self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::cbrt(self.0))
-                }
-                fn hypot(self, other: Self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::hypot(self.0, other.0))
-                }
-                fn sin(self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::sin(self.0))
-                }
-                fn cos(self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::cos(self.0))
-                }
-                fn tan(self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::tan(self.0))
-                }
-                fn asin(self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::asin(self.0))
-                }
-                fn acos(self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::acos(self.0))
-                }
-                fn atan(self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::atan(self.0))
-                }
-                fn atan2(self, other: Self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::atan2(self.0, other.0))
-                }
-                fn sin_cos(self) -> (Self, Self) {
-                    let (x, y) = <#inner_ty as _num_traits::Float>::sin_cos(self.0);
-                    (#name(x), #name(y))
-                }
-                fn exp_m1(self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::exp_m1(self.0))
-                }
-                fn ln_1p(self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::ln_1p(self.0))
-                }
-                fn sinh(self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::sinh(self.0))
-                }
-                fn cosh(self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::cosh(self.0))
-                }
-                fn tanh(self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::tanh(self.0))
-                }
-                fn asinh(self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::asinh(self.0))
-                }
-                fn acosh(self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::acosh(self.0))
-                }
-                fn atanh(self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::atanh(self.0))
-                }
-                fn integer_decode(self) -> (u64, i16, i8) {
-                    <#inner_ty as _num_traits::Float>::integer_decode(self.0)
-                }
-                fn epsilon() -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::epsilon())
-                }
-                fn to_degrees(self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::to_degrees(self.0))
-                }
-                fn to_radians(self) -> Self {
-                    #name(<#inner_ty as _num_traits::Float>::to_radians(self.0))
-                }
-            }
-        },
-    )
-    .into()
-}
deleted file mode 100644
--- a/third_party/rust/num-derive-0.2.5/tests/empty_enum.rs
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2013-2015 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-extern crate num as num_renamed;
-#[macro_use]
-extern crate num_derive;
-
-#[derive(Debug, PartialEq, FromPrimitive, ToPrimitive)]
-enum Color {}
-
-#[test]
-fn test_empty_enum() {
-    let v: [Option<Color>; 1] = [num_renamed::FromPrimitive::from_u64(0)];
-
-    assert_eq!(v, [None]);
-}
deleted file mode 100644
--- a/third_party/rust/num-derive-0.2.5/tests/issue-6.rs
+++ /dev/null
@@ -1,17 +0,0 @@
-#![deny(trivial_numeric_casts)]
-extern crate num;
-#[macro_use]
-extern crate num_derive;
-
-#[derive(FromPrimitive, ToPrimitive)]
-pub enum SomeEnum {
-    A = 1,
-}
-
-#[test]
-fn test_trivial_numeric_casts() {
-    use num::{FromPrimitive, ToPrimitive};
-    assert!(SomeEnum::from_u64(1).is_some());
-    assert!(SomeEnum::from_i64(-1).is_none());
-    assert_eq!(SomeEnum::A.to_u64(), Some(1));
-}
deleted file mode 100644
--- a/third_party/rust/num-derive-0.2.5/tests/issue-9.rs
+++ /dev/null
@@ -1,18 +0,0 @@
-#![deny(unused_qualifications)]
-extern crate num;
-#[macro_use]
-extern crate num_derive;
-use num::FromPrimitive;
-use num::ToPrimitive;
-
-#[derive(FromPrimitive, ToPrimitive)]
-pub enum SomeEnum {
-    A = 1,
-}
-
-#[test]
-fn test_unused_qualifications() {
-    assert!(SomeEnum::from_u64(1).is_some());
-    assert!(SomeEnum::from_i64(-1).is_none());
-    assert!(SomeEnum::A.to_i64().is_some());
-}
deleted file mode 100644
--- a/third_party/rust/num-derive-0.2.5/tests/newtype.rs
+++ /dev/null
@@ -1,91 +0,0 @@
-extern crate num as num_renamed;
-#[macro_use]
-extern crate num_derive;
-
-use num_renamed::{Float, FromPrimitive, Num, NumCast, One, ToPrimitive, Zero};
-use std::ops::Neg;
-
-#[derive(
-    Debug,
-    Clone,
-    Copy,
-    PartialEq,
-    PartialOrd,
-    ToPrimitive,
-    FromPrimitive,
-    NumOps,
-    NumCast,
-    One,
-    Zero,
-    Num,
-    Float,
-)]
-struct MyFloat(f64);
-
-impl Neg for MyFloat {
-    type Output = MyFloat;
-    fn neg(self) -> Self {
-        MyFloat(self.0.neg())
-    }
-}
-
-#[test]
-fn test_from_primitive() {
-    assert_eq!(MyFloat::from_u32(25), Some(MyFloat(25.0)));
-}
-
-#[test]
-#[cfg(has_i128)]
-fn test_from_primitive_128() {
-    assert_eq!(
-        MyFloat::from_i128(std::i128::MIN),
-        Some(MyFloat((-2.0).powi(127)))
-    );
-}
-
-#[test]
-fn test_to_primitive() {
-    assert_eq!(MyFloat(25.0).to_u32(), Some(25));
-}
-
-#[test]
-#[cfg(has_i128)]
-fn test_to_primitive_128() {
-    let f = MyFloat::from_f32(std::f32::MAX).unwrap();
-    assert_eq!(f.to_i128(), None);
-    assert_eq!(f.to_u128(), Some(0xffff_ff00_0000_0000_0000_0000_0000_0000));
-}
-
-#[test]
-fn test_num_ops() {
-    assert_eq!(MyFloat(25.0) + MyFloat(10.0), MyFloat(35.0));
-    assert_eq!(MyFloat(25.0) - MyFloat(10.0), MyFloat(15.0));
-    assert_eq!(MyFloat(25.0) * MyFloat(2.0), MyFloat(50.0));
-    assert_eq!(MyFloat(25.0) / MyFloat(10.0), MyFloat(2.5));
-    assert_eq!(MyFloat(25.0) % MyFloat(10.0), MyFloat(5.0));
-}
-
-#[test]
-fn test_num_cast() {
-    assert_eq!(<MyFloat as NumCast>::from(25u8), Some(MyFloat(25.0)));
-}
-
-#[test]
-fn test_zero() {
-    assert_eq!(MyFloat::zero(), MyFloat(0.0));
-}
-
-#[test]
-fn test_one() {
-    assert_eq!(MyFloat::one(), MyFloat(1.0));
-}
-
-#[test]
-fn test_num() {
-    assert_eq!(MyFloat::from_str_radix("25", 10).ok(), Some(MyFloat(25.0)));
-}
-
-#[test]
-fn test_float() {
-    assert_eq!(MyFloat(4.0).log(MyFloat(2.0)), MyFloat(2.0));
-}
deleted file mode 100644
--- a/third_party/rust/num-derive-0.2.5/tests/num_derive_without_num.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2013-2015 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-#[macro_use]
-extern crate num_derive;
-
-#[derive(Debug, FromPrimitive, ToPrimitive)]
-enum Direction {
-    Up,
-    Down,
-    Left,
-    Right,
-}
deleted file mode 100644
--- a/third_party/rust/num-derive-0.2.5/tests/trivial.rs
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2013-2015 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-extern crate num as num_renamed;
-#[macro_use]
-extern crate num_derive;
-
-#[derive(Debug, PartialEq, FromPrimitive, ToPrimitive)]
-enum Color {
-    Red,
-    Blue,
-    Green,
-}
-
-#[test]
-fn test_from_primitive_for_trivial_case() {
-    let v: [Option<Color>; 4] = [
-        num_renamed::FromPrimitive::from_u64(0),
-        num_renamed::FromPrimitive::from_u64(1),
-        num_renamed::FromPrimitive::from_u64(2),
-        num_renamed::FromPrimitive::from_u64(3),
-    ];
-
-    assert_eq!(
-        v,
-        [
-            Some(Color::Red),
-            Some(Color::Blue),
-            Some(Color::Green),
-            None
-        ]
-    );
-}
-
-#[test]
-fn test_to_primitive_for_trivial_case() {
-    let v: [Option<u64>; 3] = [
-        num_renamed::ToPrimitive::to_u64(&Color::Red),
-        num_renamed::ToPrimitive::to_u64(&Color::Blue),
-        num_renamed::ToPrimitive::to_u64(&Color::Green),
-    ];
-
-    assert_eq!(v, [Some(0), Some(1), Some(2)]);
-}
-
-#[test]
-fn test_reflexive_for_trivial_case() {
-    let before: [u64; 3] = [0, 1, 2];
-    let after: Vec<Option<u64>> = before
-        .iter()
-        .map(|&x| -> Option<Color> { num_renamed::FromPrimitive::from_u64(x) })
-        .map(|x| x.and_then(|x| num_renamed::ToPrimitive::to_u64(&x)))
-        .collect();
-    let before = before.iter().cloned().map(Some).collect::<Vec<_>>();
-
-    assert_eq!(before, after);
-}
deleted file mode 100644
--- a/third_party/rust/num-derive-0.2.5/tests/with_custom_values.rs
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2013-2015 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-#![cfg(feature = "full-syntax")]
-
-extern crate num as num_renamed;
-#[macro_use]
-extern crate num_derive;
-
-#[derive(Debug, PartialEq, FromPrimitive, ToPrimitive)]
-enum Color {
-    Red,
-    Blue = 5,
-    Green,
-    Alpha = (-3 - (-5isize)) - 10,
-}
-
-#[test]
-fn test_from_primitive_for_enum_with_custom_value() {
-    let v: [Option<Color>; 5] = [
-        num_renamed::FromPrimitive::from_u64(0),
-        num_renamed::FromPrimitive::from_u64(5),
-        num_renamed::FromPrimitive::from_u64(6),
-        num_renamed::FromPrimitive::from_u64(-8isize as u64),
-        num_renamed::FromPrimitive::from_u64(3),
-    ];
-
-    assert_eq!(
-        v,
-        [
-            Some(Color::Red),
-            Some(Color::Blue),
-            Some(Color::Green),
-            Some(Color::Alpha),
-            None
-        ]
-    );
-}
-
-#[test]
-fn test_to_primitive_for_enum_with_custom_value() {
-    let v: [Option<u64>; 4] = [
-        num_renamed::ToPrimitive::to_u64(&Color::Red),
-        num_renamed::ToPrimitive::to_u64(&Color::Blue),
-        num_renamed::ToPrimitive::to_u64(&Color::Green),
-        num_renamed::ToPrimitive::to_u64(&Color::Alpha),
-    ];
-
-    assert_eq!(v, [Some(0), Some(5), Some(6), Some(-8isize as u64)]);
-}
-
-#[test]
-fn test_reflexive_for_enum_with_custom_value() {
-    let before: [u64; 3] = [0, 5, 6];
-    let after: Vec<Option<u64>> = before
-        .iter()
-        .map(|&x| -> Option<Color> { num_renamed::FromPrimitive::from_u64(x) })
-        .map(|x| x.and_then(|x| num_renamed::ToPrimitive::to_u64(&x)))
-        .collect();
-    let before = before.into_iter().cloned().map(Some).collect::<Vec<_>>();
-
-    assert_eq!(before, after);
-}
deleted file mode 100644
--- a/third_party/rust/quote-0.6.11/.cargo-checksum.json
+++ /dev/null
@@ -1,1 +0,0 @@
-{"files":{"Cargo.toml":"68f4dc89836a05a2347086addab1849567ef8073c552ec0dfca8f96fd20550f9","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5","README.md":"d9392d4c7af3bf9714f0a95801d64de46ffd4558cdfeea0eb85b414e555abb72","src/ext.rs":"03919239a20f8393288783a21bf6fdee12e405d13d162c9faa6f8f5ce54b003b","src/lib.rs":"5345b4d2e6f923724cec35c62d7397e6f04d5503d2d813bff7bbaa7ffc39a9cf","src/to_tokens.rs":"0dcd15cba2aa83abeb47b9a1babce7a29643b5efa2fe620b070cb37bb21a84f1","tests/conditional/integer128.rs":"d83e21a91efbaa801a82ae499111bdda2d31edaa620e78c0199eba42d69c9ee6","tests/test.rs":"810013d7fd77b738abd0ace90ce2f2f3e219c757652eabab29bc1c0ce4a73b24"},"package":"cdd8e04bd9c52e0342b406469d494fcb033be4bdbe5c606016defbb1681411e1"}
\ No newline at end of file
deleted file mode 100644
--- a/third_party/rust/quote-0.6.11/Cargo.toml
+++ /dev/null
@@ -1,33 +0,0 @@
-# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
-#
-# 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
-#
-# 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]
-name = "quote"
-version = "0.6.11"
-authors = ["David Tolnay <dtolnay@gmail.com>"]
-include = ["Cargo.toml", "src/**/*.rs", "tests/**/*.rs", "README.md", "LICENSE-APACHE", "LICENSE-MIT"]
-description = "Quasi-quoting macro quote!(...)"
-documentation = "https://docs.rs/quote/"
-readme = "README.md"
-keywords = ["syn"]
-categories = ["development-tools::procedural-macro-helpers"]
-license = "MIT/Apache-2.0"
-repository = "https://github.com/dtolnay/quote"
-[dependencies.proc-macro2]
-version = "0.4.21"
-default-features = false
-
-[features]
-default = ["proc-macro"]
-proc-macro = ["proc-macro2/proc-macro"]
-[badges.travis-ci]
-repository = "dtolnay/quote"
deleted file mode 100644
--- a/third_party/rust/quote-0.6.11/LICENSE-APACHE
+++ /dev/null
@@ -1,201 +0,0 @@
-                              Apache License
-                        Version 2.0, January 2004
-                     http://www.apache.org/licenses/
-
-TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-1. Definitions.
-
-   "License" shall mean the terms and conditions for use, reproduction,
-   and distribution as defined by Sections 1 through 9 of this document.
-
-   "Licensor" shall mean the copyright owner or entity authorized by
-   the copyright owner that is granting the License.
-
-   "Legal Entity" shall mean the union of the acting entity and all
-   other entities that control, are controlled by, or are under common
-   control with that entity. For the purposes of this definition,
-   "control" means (i) the power, direct or indirect, to cause the
-   direction or management of such entity, whether by contract or
-   otherwise, or (ii) ownership of fifty percent (50%) or more of the
-   outstanding shares, or (iii) beneficial ownership of such entity.
-
-   "You" (or "Your") shall mean an individual or Legal Entity
-   exercising permissions granted by this License.
-
-   "Source" form shall mean the preferred form for making modifications,
-   including but not limited to software source code, documentation
-   source, and configuration files.
-
-   "Object" form shall mean any form resulting from mechanical
-   transformation or translation of a Source form, including but
-   not limited to compiled object code, generated documentation,
-   and conversions to other media types.
-
-   "Work" shall mean the work of authorship, whether in Source or
-   Object form, made available under the License, as indicated by a
-   copyright notice that is included in or attached to the work
-   (an example is provided in the Appendix below).
-
-   "Derivative Works" shall mean any work, whether in Source or Object
-   form, that is based on (or derived from) the Work and for which the
-   editorial revisions, annotations, elaborations, or other modifications
-   represent, as a whole, an original work of authorship. For the purposes
-   of this License, Derivative Works shall not include works that remain
-   separable from, or merely link (or bind by name) to the interfaces of,
-   the Work and Derivative Works thereof.
-
-   "Contribution" shall mean any work of authorship, including
-   the original version of the Work and any modifications or additions
-   to that Work or Derivative Works thereof, that is intentionally
-   submitted to Licensor for inclusion in the Work by the copyright owner
-   or by an individual or Legal Entity authorized to submit on behalf of
-   the copyright owner. For the purposes of this definition, "submitted"
-   means any form of electronic, verbal, or written communication sent
-   to the Licensor or its representatives, including but not limited to
-   communication on electronic mailing lists, source code control systems,
-   and issue tracking systems that are managed by, or on behalf of, the
-   Licensor for the purpose of discussing and improving the Work, but
-   excluding communication that is conspicuously marked or otherwise
-   designated in writing by the copyright owner as "Not a Contribution."
-
-   "Contributor" shall mean Licensor and any individual or Legal Entity
-   on behalf of whom a Contribution has been received by Licensor and
-   subsequently incorporated within the Work.
-
-2. Grant of Copyright License. Subject to the terms and conditions of
-   this License, each Contributor hereby grants to You a perpetual,
-   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-   copyright license to reproduce, prepare Derivative Works of,
-   publicly display, publicly perform, sublicense, and distribute the
-   Work and such Derivative Works in Source or Object form.
-
-3. Grant of Patent License. Subject to the terms and conditions of
-   this License, each Contributor hereby grants to You a perpetual,
-   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-   (except as stated in this section) patent license to make, have made,
-   use, offer to sell, sell, import, and otherwise transfer the Work,
-   where such license applies only to those patent claims licensable
-   by such Contributor that are necessarily infringed by their
-   Contribution(s) alone or by combination of their Contribution(s)
-   with the Work to which such Contribution(s) was submitted. If You
-   institute patent litigation against any entity (including a
-   cross-claim or counterclaim in a lawsuit) alleging that the Work
-   or a Contribution incorporated within the Work constitutes direct
-   or contributory patent infringement, then any patent licenses
-   granted to You under this License for that Work shall terminate
-   as of the date such litigation is filed.
-
-4. Redistribution. You may reproduce and distribute copies of the
-   Work or Derivative Works thereof in any medium, with or without
-   modifications, and in Source or Object form, provided that You
-   meet the following conditions:
-
-   (a) You must give any other recipients of the Work or
-       Derivative Works a copy of this License; and
-
-   (b) You must cause any modified files to carry prominent notices
-       stating that You changed the files; and
-
-   (c) You must retain, in the Source form of any Derivative Works
-       that You distribute, all copyright, patent, trademark, and
-       attribution notices from the Source form of the Work,
-       excluding those notices that do not pertain to any part of
-       the Derivative Works; and
-
-   (d) If the Work includes a "NOTICE" text file as part of its
-       distribution, then any Derivative Works that You distribute must
-       include a readable copy of the attribution notices contained
-       within such NOTICE file, excluding those notices that do not
-       pertain to any part of the Derivative Works, in at least one
-       of the following places: within a NOTICE text file distributed
-       as part of the Derivative Works; within the Source form or
-       documentation, if provided along with the Derivative Works; or,
-       within a display generated by the Derivative Works, if and
-       wherever such third-party notices normally appear. The contents
-       of the NOTICE file are for informational purposes only and
-       do not modify the License. You may add Your own attribution
-       notices within Derivative Works that You distribute, alongside
-       or as an addendum to the NOTICE text from the Work, provided
-       that such additional attribution notices cannot be construed
-       as modifying the License.
-
-   You may add Your own copyright statement to Your modifications and
-   may provide additional or different license terms and conditions
-   for use, reproduction, or distribution of Your modifications, or
-   for any such Derivative Works as a whole, provided Your use,
-   reproduction, and distribution of the Work otherwise complies with
-   the conditions stated in this License.
-
-5. Submission of Contributions. Unless You explicitly state otherwise,
-   any Contribution intentionally submitted for inclusion in the Work
-   by You to the Licensor shall be under the terms and conditions of
-   this License, without any additional terms or conditions.
-   Notwithstanding the above, nothing herein shall supersede or modify
-   the terms of any separate license agreement you may have executed
-   with Licensor regarding such Contributions.
-
-6. Trademarks. This License does not grant permission to use the trade
-   names, trademarks, service marks, or product names of the Licensor,
-   except as required for reasonable and customary use in describing the
-   origin of the Work and reproducing the content of the NOTICE file.
-
-7. Disclaimer of Warranty. Unless required by applicable law or
-   agreed to in writing, Licensor provides the Work (and each
-   Contributor provides its Contributions) on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-   implied, including, without limitation, any warranties or conditions
-   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-   PARTICULAR PURPOSE. You are solely responsible for determining the
-   appropriateness of using or redistributing the Work and assume any
-   risks associated with Your exercise of permissions under this License.
-
-8. Limitation of Liability. In no event and under no legal theory,
-   whether in tort (including negligence), contract, or otherwise,
-   unless required by applicable law (such as deliberate and grossly
-   negligent acts) or agreed to in writing, shall any Contributor be
-   liable to You for damages, including any direct, indirect, special,
-   incidental, or consequential damages of any character arising as a
-   result of this License or out of the use or inability to use the
-   Work (including but not limited to damages for loss of goodwill,
-   work stoppage, computer failure or malfunction, or any and all
-   other commercial damages or losses), even if such Contributor
-   has been advised of the possibility of such damages.
-
-9. Accepting Warranty or Additional Liability. While redistributing
-   the Work or Derivative Works thereof, You may choose to offer,
-   and charge a fee for, acceptance of support, warranty, indemnity,
-   or other liability obligations and/or rights consistent with this
-   License. However, in accepting such obligations, You may act only
-   on Your own behalf and on Your sole responsibility, not on behalf
-   of any other Contributor, and only if You agree to indemnify,
-   defend, and hold each Contributor harmless for any liability
-   incurred by, or claims asserted against, such Contributor by reason
-   of your accepting any such warranty or additional liability.
-
-END OF TERMS AND CONDITIONS
-
-APPENDIX: How to apply the Apache License to your work.
-
-   To apply the Apache License to your work, attach the following
-   boilerplate notice, with the fields enclosed by brackets "[]"
-   replaced with your own identifying information. (Don't include
-   the brackets!)  The text should be enclosed in the appropriate
-   comment syntax for the file format. We also recommend that a
-   file or class name and description of purpose be included on the
-   same "printed page" as the copyright notice for easier
-   identification within third-party archives.
-
-Copyright [yyyy] [name of copyright owner]
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-	http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
deleted file mode 100644
--- a/third_party/rust/quote-0.6.11/LICENSE-MIT
+++ /dev/null
@@ -1,25 +0,0 @@
-Copyright (c) 2016 The Rust Project Developers
-
-Permission is hereby granted, free of charge, to any
-person obtaining a copy of this software and associated
-documentation files (the "Software"), to deal in the
-Software without restriction, including without
-limitation the rights to use, copy, modify, merge,
-publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software
-is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice
-shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
deleted file mode 100644
--- a/third_party/rust/quote-0.6.11/README.md
+++ /dev/null
@@ -1,241 +0,0 @@
-Rust Quasi-Quoting
-==================
-
-[![Build Status](https://api.travis-ci.org/dtolnay/quote.svg?branch=master)](https://travis-ci.org/dtolnay/quote)
-[![Latest Version](https://img.shields.io/crates/v/quote.svg)](https://crates.io/crates/quote)
-[![Rust Documentation](https://img.shields.io/badge/api-rustdoc-blue.svg)](https://docs.rs/quote/)
-
-This crate provides the [`quote!`] macro for turning Rust syntax tree data
-structures into tokens of source code.
-
-[`quote!`]: https://docs.rs/quote/0.6/quote/macro.quote.html
-
-Procedural macros in Rust receive a stream of tokens as input, execute arbitrary
-Rust code to determine how to manipulate those tokens, and produce a stream of
-tokens to hand back to the compiler to compile into the caller's crate.
-Quasi-quoting is a solution to one piece of that -- producing tokens to return
-to the compiler.
-
-The idea of quasi-quoting is that we write *code* that we treat as *data*.
-Within the `quote!` macro, we can write what looks like code to our text editor
-or IDE. We get all the benefits of the editor's brace matching, syntax
-highlighting, indentation, and maybe autocompletion. But rather than compiling
-that as code into the current crate, we can treat it as data, pass it around,
-mutate it, and eventually hand it back to the compiler as tokens to compile into
-the macro caller's crate.
-
-This crate is motivated by the procedural macro use case, but is a
-general-purpose Rust quasi-quoting library and is not specific to procedural
-macros.
-
-*Version requirement: Quote supports any compiler version back to Rust's very
-first support for procedural macros in Rust 1.15.0.*
-
-[*Release notes*](https://github.com/dtolnay/quote/releases)
-
-```toml
-[dependencies]
-quote = "0.6"
-```
-
-## Syntax
-
-The quote crate provides a [`quote!`] macro within which you can write Rust code
-that gets packaged into a [`TokenStream`] and can be treated as data. You should
-think of `TokenStream` as representing a fragment of Rust source code.
-
-[`TokenStream`]: https://docs.rs/proc-macro2/0.4/proc_macro2/struct.TokenStream.html
-
-Within the `quote!` macro, interpolation is done with `#var`. Any type
-implementing the [`quote::ToTokens`] trait can be interpolated. This includes
-most Rust primitive types as well as most of the syntax tree types from [`syn`].
-
-[`quote::ToTokens`]: https://docs.rs/quote/0.6/quote/trait.ToTokens.html
-[`syn`]: https://github.com/dtolnay/syn
-
-```rust
-let tokens = quote! {
-    struct SerializeWith #generics #where_clause {
-        value: &'a #field_ty,
-        phantom: core::marker::PhantomData<#item_ty>,
-    }
-
-    impl #generics serde::Serialize for SerializeWith #generics #where_clause {
-        fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
-        where
-            S: serde::Serializer,
-        {
-            #path(self.value, serializer)
-        }
-    }
-
-    SerializeWith {
-        value: #value,
-        phantom: core::marker::PhantomData::<#item_ty>,
-    }
-};
-```
-
-## Repetition
-
-Repetition is done using `#(...)*` or `#(...),*` similar to `macro_rules!`. This
-iterates through the elements of any variable interpolated within the repetition
-and inserts a copy of the repetition body for each one. The variables in an
-interpolation may be anything that implements `IntoIterator`, including `Vec` or
-a pre-existing iterator.
-
-- `#(#var)*` — no separators
-- `#(#var),*` — the character before the asterisk is used as a separator
-- `#( struct #var; )*` — the repetition can contain other things
-- `#( #k => println!("{}", #v), )*` — even multiple interpolations
-
-Note that there is a difference between `#(#var ,)*` and `#(#var),*`—the latter
-does not produce a trailing comma. This matches the behavior of delimiters in
-`macro_rules!`.
-
-## Returning tokens to the compiler
-
-The `quote!` macro evaluates to an expression of type
-`proc_macro2::TokenStream`. Meanwhile Rust procedural macros are expected to
-return the type `proc_macro::TokenStream`.
-
-The difference between the two types is that `proc_macro` types are entirely
-specific to procedural macros and cannot ever exist in code outside of a
-procedural macro, while `proc_macro2` types may exist anywhere including tests
-and non-macro code like main.rs and build.rs. This is why even the procedural
-macro ecosystem is largely built around `proc_macro2`, because that ensures the
-libraries are unit testable and accessible in non-macro contexts.
-
-There is a [`From`]-conversion in both directions so returning the output of
-`quote!` from a procedural macro usually looks like `tokens.into()` or
-`proc_macro::TokenStream::from(tokens)`.
-
-[`From`]: https://doc.rust-lang.org/std/convert/trait.From.html
-
-## Examples
-
-### Combining quoted fragments
-
-Usually you don't end up constructing an entire final `TokenStream` in one
-piece. Different parts may come from different helper functions. The tokens
-produced by `quote!` themselves implement `ToTokens` and so can be interpolated
-into later `quote!` invocations to build up a final result.
-
-```rust
-let type_definition = quote! {...};
-let methods = quote! {...};
-
-let tokens = quote! {
-    #type_definition
-    #methods
-};
-```
-
-### Constructing identifiers
-
-Suppose we have an identifier `ident` which came from somewhere in a macro
-input and we need to modify it in some way for the macro output. Let's consider
-prepending the identifier with an underscore.
-
-Simply interpolating the identifier next to an underscore will not have the
-behavior of concatenating them. The underscore and the identifier will continue
-to be two separate tokens as if you had written `_ x`.
-
-```rust
-// incorrect
-quote! {
-    let mut _#ident = 0;
-}
-```
-
-The solution is to perform token-level manipulations using the APIs provided by
-Syn and proc-macro2.
-
-```rust
-let concatenated = format!("_{}", ident);
-let varname = syn::Ident::new(&concatenated, ident.span());
-quote! {
-    let mut #varname = 0;
-}
-```
-
-### Making method calls
-
-Let's say our macro requires some type specified in the macro input to have a
-constructor called `new`. We have the type in a variable called `field_type` of
-type `syn::Type` and want to invoke the constructor.
-
-```rust
-// incorrect
-quote! {
-    let value = #field_type::new();
-}
-```
-
-This works only sometimes. If `field_type` is `String`, the expanded code
-contains `String::new()` which is fine. But if `field_type` is something like
-`Vec<i32>` then the expanded code is `Vec<i32>::new()` which is invalid syntax.
-Ordinarily in handwritten Rust we would write `Vec::<i32>::new()` but for macros
-often the following is more convenient.
-
-```rust
-quote! {
-    let value = <#field_type>::new();
-}
-```
-
-This expands to `<Vec<i32>>::new()` which behaves correctly.
-
-A similar pattern is appropriate for trait methods.
-
-```rust
-quote! {
-    let value = <#field_type as core::default::Default>::default();
-}
-```
-
-## Hygiene
-
-Any interpolated tokens preserve the `Span` information provided by their
-`ToTokens` implementation. Tokens that originate within a `quote!` invocation
-are spanned with [`Span::call_site()`].
-
-[`Span::call_site()`]: https://docs.rs/proc-macro2/0.4/proc_macro2/struct.Span.html#method.call_site
-
-A different span can be provided explicitly through the [`quote_spanned!`]
-macro.
-
-[`quote_spanned!`]: https://docs.rs/quote/0.6/quote/macro.quote_spanned.html
-
-### Limitations
-
-- A non-repeating variable may not be interpolated inside of a repeating block
-  ([#7]).
-- The same variable may not be interpolated more than once inside of a repeating
-  block ([#8]).
-
-[#7]: https://github.com/dtolnay/quote/issues/7
-[#8]: https://github.com/dtolnay/quote/issues/8
-
-### Recursion limit
-
-The `quote!` macro relies on deep recursion so some large invocations may fail
-with "recursion limit reached" when you compile. If it fails, bump up the
-recursion limit by adding `#![recursion_limit = "128"]` to your crate. An even
-higher limit may be necessary for especially large invocations. You don't need
-this unless the compiler tells you that you need it.
-
-## License
-
-Licensed under either of
-
- * Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
- * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
-
-at your option.
-
-### Contribution
-
-Unless you explicitly state otherwise, any contribution intentionally submitted
-for inclusion in this crate by you, as defined in the Apache-2.0 license, shall
-be dual licensed as above, without any additional terms or conditions.
deleted file mode 100644
--- a/third_party/rust/quote-0.6.11/src/ext.rs
+++ /dev/null
@@ -1,112 +0,0 @@
-use super::ToTokens;
-
-use std::iter;
-
-use proc_macro2::{TokenStream, TokenTree};
-
-/// TokenStream extension trait with methods for appending tokens.
-///
-/// This trait is sealed and cannot be implemented outside of the `quote` crate.
-pub trait TokenStreamExt: private::Sealed {
-    /// For use by `ToTokens` implementations.
-    ///
-    /// Appends the token specified to this list of tokens.
-    fn append<U>(&mut self, token: U)
-    where
-        U: Into<TokenTree>;
-
-    /// For use by `ToTokens` implementations.
-    ///
-    /// ```edition2018
-    /// # use quote::{quote, TokenStreamExt, ToTokens};
-    /// # use proc_macro2::TokenStream;
-    /// #
-    /// struct X;
-    ///
-    /// impl ToTokens for X {
-    ///     fn to_tokens(&self, tokens: &mut TokenStream) {
-    ///         tokens.append_all(&[true, false]);
-    ///     }
-    /// }
-    ///
-    /// let tokens = quote!(#X);
-    /// assert_eq!(tokens.to_string(), "true false");
-    /// ```
-    fn append_all<T, I>(&mut self, iter: I)
-    where
-        T: ToTokens,
-        I: IntoIterator<Item = T>;
-
-    /// For use by `ToTokens` implementations.
-    ///
-    /// Appends all of the items in the iterator `I`, separated by the tokens
-    /// `U`.
-    fn append_separated<T, I, U>(&mut self, iter: I, op: U)
-    where
-        T: ToTokens,
-        I: IntoIterator<Item = T>,
-        U: ToTokens;
-
-    /// For use by `ToTokens` implementations.
-    ///
-    /// Appends all tokens in the iterator `I`, appending `U` after each
-    /// element, including after the last element of the iterator.
-    fn append_terminated<T, I, U>(&mut self, iter: I, term: U)
-    where
-        T: ToTokens,
-        I: IntoIterator<Item = T>,
-        U: ToTokens;
-}
-
-impl TokenStreamExt for TokenStream {
-    fn append<U>(&mut self, token: U)
-    where
-        U: Into<TokenTree>,
-    {
-        self.extend(iter::once(token.into()));
-    }
-
-    fn append_all<T, I>(&mut self, iter: I)
-    where
-        T: ToTokens,
-        I: IntoIterator<Item = T>,
-    {
-        for token in iter {
-            token.to_tokens(self);
-        }
-    }
-
-    fn append_separated<T, I, U>(&mut self, iter: I, op: U)
-    where
-        T: ToTokens,
-        I: IntoIterator<Item = T>,
-        U: ToTokens,
-    {
-        for (i, token) in iter.into_iter().enumerate() {
-            if i > 0 {
-                op.to_tokens(self);
-            }
-            token.to_tokens(self);
-        }
-    }
-
-    fn append_terminated<T, I, U>(&mut self, iter: I, term: U)
-    where
-        T: ToTokens,
-        I: IntoIterator<Item = T>,
-        U: ToTokens,
-    {
-        for token in iter {
-            token.to_tokens(self);
-            term.to_tokens(self);
-        }
-    }
-}
-
-mod private {
-    use proc_macro2::TokenStream;
-
-    pub trait Sealed {}
-
-    impl Sealed for TokenStream {}
-}
deleted file mode 100644
--- a/third_party/rust/quote-0.6.11/src/lib.rs
+++ /dev/null
@@ -1,969 +0,0 @@
-//! This crate provides the [`quote!`] macro for turning Rust syntax tree data
-//! structures into tokens of source code.
-//!
-//! [`quote!`]: macro.quote.html
-//!
-//! Procedural macros in Rust receive a stream of tokens as input, execute
-//! arbitrary Rust code to determine how to manipulate those tokens, and produce
-//! a stream of tokens to hand back to the compiler to compile into the caller's
-//! crate. Quasi-quoting is a solution to one piece of that -- producing tokens
-//! to return to the compiler.
-//!
-//! The idea of quasi-quoting is that we write *code* that we treat as *data*.
-//! Within the `quote!` macro, we can write what looks like code to our text
-//! editor or IDE. We get all the benefits of the editor's brace matching,
-//! syntax highlighting, indentation, and maybe autocompletion. But rather than
-//! compiling that as code into the current crate, we can treat it as data, pass
-//! it around, mutate it, and eventually hand it back to the compiler as tokens
-//! to compile into the macro caller's crate.
-//!
-//! This crate is motivated by the procedural macro use case, but is a
-//! general-purpose Rust quasi-quoting library and is not specific to procedural
-//! macros.
-//!
-//! *Version requirement: Quote supports any compiler version back to Rust's
-//! very first support for procedural macros in Rust 1.15.0.*
-//!
-//! ```toml
-//! [dependencies]
-//! quote = "0.6"
-//! ```
-//!
-//! # Example
-//!
-//! The following quasi-quoted block of code is something you might find in [a]
-//! procedural macro having to do with data structure serialization. The `#var`
-//! syntax performs interpolation of runtime variables into the quoted tokens.
-//! Check out the documentation of the [`quote!`] macro for more detail about
-//! the syntax. See also the [`quote_spanned!`] macro which is important for
-//! implementing hygienic procedural macros.
-//!
-//! [a]: https://serde.rs/
-//! [`quote_spanned!`]: macro.quote_spanned.html
-//!
-//! ```edition2018
-//! # use quote::quote;
-//! #
-//! # let generics = "";
-//! # let where_clause = "";
-//! # let field_ty = "";
-//! # let item_ty = "";
-//! # let path = "";
-//! # let value = "";
-//! #
-//! let tokens = quote! {
-//!     struct SerializeWith #generics #where_clause {
-//!         value: &'a #field_ty,
-//!         phantom: core::marker::PhantomData<#item_ty>,
-//!     }
-//!
-//!     impl #generics serde::Serialize for SerializeWith #generics #where_clause {
-//!         fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
-//!         where
-//!             S: serde::Serializer,
-//!         {
-//!             #path(self.value, serializer)
-//!         }
-//!     }
-//!
-//!     SerializeWith {
-//!         value: #value,
-//!         phantom: core::marker::PhantomData::<#item_ty>,
-//!     }
-//! };
-//! ```
-//!
-//! # Recursion limit
-//!
-//! The `quote!` macro relies on deep recursion so some large invocations may
-//! fail with "recursion limit reached" when you compile. If it fails, bump up
-//! the recursion limit by adding `#![recursion_limit = "128"]` to your crate.
-//! An even higher limit may be necessary for especially large invocations.
-
-// Quote types in rustdoc of other crates get linked to here.
-#![doc(html_root_url = "https://docs.rs/quote/0.6.11")]
-
-#[cfg(all(
-    not(all(target_arch = "wasm32", target_os = "unknown")),
-    feature = "proc-macro"
-))]
-extern crate proc_macro;
-extern crate proc_macro2;
-
-mod ext;
-pub use ext::TokenStreamExt;
-
-mod to_tokens;
-pub use to_tokens::ToTokens;
-
-// Not public API.
-#[doc(hidden)]
-pub mod __rt {
-    use ext::TokenStreamExt;
-    pub use proc_macro2::*;
-
-    fn is_ident_start(c: u8) -> bool {
-        (b'a' <= c && c <= b'z') || (b'A' <= c && c <= b'Z') || c == b'_'
-    }
-
-    fn is_ident_continue(c: u8) -> bool {
-        (b'a' <= c && c <= b'z')
-            || (b'A' <= c && c <= b'Z')
-            || c == b'_'
-            || (b'0' <= c && c <= b'9')
-    }
-
-    fn is_ident(token: &str) -> bool {
-        if token.bytes().all(|digit| digit >= b'0' && digit <= b'9') {
-            return false;
-        }
-
-        let mut bytes = token.bytes();
-        let first = bytes.next().unwrap();
-        if !is_ident_start(first) {
-            return false;
-        }
-        for ch in bytes {
-            if !is_ident_continue(ch) {
-                return false;
-            }
-        }
-        true
-    }
-
-    pub fn parse(tokens: &mut TokenStream, span: Span, s: &str) {
-        if is_ident(s) {
-            // Fast path, since idents are the most common token.
-            tokens.append(Ident::new(s, span));
-        } else {
-            let s: TokenStream = s.parse().expect("invalid token stream");
-            tokens.extend(s.into_iter().map(|mut t| {
-                t.set_span(span);
-                t
-            }));
-        }
-    }
-
-    macro_rules! push_punct {
-        ($name:ident $char1:tt) => {
-            pub fn $name(tokens: &mut TokenStream, span: Span) {
-                let mut punct = Punct::new($char1, Spacing::Alone);
-                punct.set_span(span);
-                tokens.append(punct);
-            }
-        };
-        ($name:ident $char1:tt $char2:tt) => {
-            pub fn $name(tokens: &mut TokenStream, span: Span) {
-                let mut punct = Punct::new($char1, Spacing::Joint);
-                punct.set_span(span);
-                tokens.append(punct);
-                let mut punct = Punct::new($char2, Spacing::Alone);
-                punct.set_span(span);
-                tokens.append(punct);
-            }
-        };
-        ($name:ident $char1:tt $char2:tt $char3:tt) => {
-            pub fn $name(tokens: &mut TokenStream, span: Span) {
-                let mut punct = Punct::new($char1, Spacing::Joint);
-                punct.set_span(span);
-                tokens.append(punct);
-                let mut punct = Punct::new($char2, Spacing::Joint);
-                punct.set_span(span);
-                tokens.append(punct);
-                let mut punct = Punct::new($char3, Spacing::Alone);
-                punct.set_span(span);
-                tokens.append(punct);
-            }
-        };
-    }
-
-    push_punct!(push_add '+');
-    push_punct!(push_add_eq '+' '=');
-    push_punct!(push_and '&');
-    push_punct!(push_and_and '&' '&');
-    push_punct!(push_and_eq '&' '=');
-    push_punct!(push_at '@');
-    push_punct!(push_bang '!');
-    push_punct!(push_caret '^');
-    push_punct!(push_caret_eq '^' '=');
-    push_punct!(push_colon ':');
-    push_punct!(push_colon2 ':' ':');
-    push_punct!(push_comma ',');
-    push_punct!(push_div '/');
-    push_punct!(push_div_eq '/' '=');
-    push_punct!(push_dot '.');
-    push_punct!(push_dot2 '.' '.');
-    push_punct!(push_dot3 '.' '.' '.');
-    push_punct!(push_dot_dot_eq '.' '.' '=');
-    push_punct!(push_eq '=');
-    push_punct!(push_eq_eq '=' '=');
-    push_punct!(push_ge '>' '=');
-    push_punct!(push_gt '>');
-    push_punct!(push_le '<' '=');
-    push_punct!(push_lt '<');
-    push_punct!(push_mul_eq '*' '=');
-    push_punct!(push_ne '!' '=');
-    push_punct!(push_or '|');
-    push_punct!(push_or_eq '|' '=');
-    push_punct!(push_or_or '|' '|');
-    push_punct!(push_pound '#');
-    push_punct!(push_question '?');
-    push_punct!(push_rarrow '-' '>');
-    push_punct!(push_larrow '<' '-');
-    push_punct!(push_rem '%');
-    push_punct!(push_rem_eq '%' '=');
-    push_punct!(push_fat_arrow '=' '>');
-    push_punct!(push_semi ';');
-    push_punct!(push_shl '<' '<');
-    push_punct!(push_shl_eq '<' '<' '=');
-    push_punct!(push_shr '>' '>');
-    push_punct!(push_shr_eq '>' '>' '=');
-    push_punct!(push_star '*');
-    push_punct!(push_sub '-');
-    push_punct!(push_sub_eq '-' '=');
-}
-
-/// The whole point.
-///
-/// Performs variable interpolation against the input and produces it as
-/// [`TokenStream`]. For returning tokens to the compiler in a procedural macro, use
-/// `into()` to build a `TokenStream`.
-///
-/// [`TokenStream`]: https://docs.rs/proc-macro2/0.4/proc_macro2/struct.TokenStream.html
-///
-/// # Interpolation
-///
-/// Variable interpolation is done with `#var` (similar to `$var` in
-/// `macro_rules!` macros). This grabs the `var` variable that is currently in
-/// scope and inserts it in that location in the output tokens. Any type
-/// implementing the [`ToTokens`] trait can be interpolated. This includes most
-/// Rust primitive types as well as most of the syntax tree types from the [Syn]
-/// crate.
-///
-/// [`ToTokens`]: trait.ToTokens.html
-/// [Syn]: https://github.com/dtolnay/syn
-///
-/// Repetition is done using `#(...)*` or `#(...),*` again similar to
-/// `macro_rules!`. This iterates through the elements of any variable
-/// interpolated within the repetition and inserts a copy of the repetition body
-/// for each one. The variables in an interpolation may be anything that
-/// implements `IntoIterator`, including `Vec` or a pre-existing iterator.
-///
-/// - `#(#var)*` — no separators
-/// - `#(#var),*` — the character before the asterisk is used as a separator
-/// - `#( struct #var; )*` — the repetition can contain other tokens
-/// - `#( #k => println!("{}", #v), )*` — even multiple interpolations
-///
-/// # Hygiene
-///
-/// Any interpolated tokens preserve the `Span` information provided by their
-/// `ToTokens` implementation. Tokens that originate within the `quote!`
-/// invocation are spanned with [`Span::call_site()`].
-///
-/// [`Span::call_site()`]: https://docs.rs/proc-macro2/0.4/proc_macro2/struct.Span.html#method.call_site
-///
-/// A different span can be provided through the [`quote_spanned!`] macro.
-///
-/// [`quote_spanned!`]: macro.quote_spanned.html
-///
-/// # Return type
-///
-/// The macro evaluates to an expression of type `proc_macro2::TokenStream`.
-/// Meanwhile Rust procedural macros are expected to return the type
-/// `proc_macro::TokenStream`.
-///
-/// The difference between the two types is that `proc_macro` types are entirely
-/// specific to procedural macros and cannot ever exist in code outside of a
-/// procedural macro, while `proc_macro2` types may exist anywhere including
-/// tests and non-macro code like main.rs and build.rs. This is why even the
-/// procedural macro ecosystem is largely built around `proc_macro2`, because
-/// that ensures the libraries are unit testable and accessible in non-macro
-/// contexts.
-///
-/// There is a [`From`]-conversion in both directions so returning the output of
-/// `quote!` from a procedural macro usually looks like `tokens.into()` or
-/// `proc_macro::TokenStream::from(tokens)`.
-///
-/// [`From`]: https://doc.rust-lang.org/std/convert/trait.From.html
-///
-/// # Examples
-///
-/// ## Procedural macro
-///
-/// The structure of a basic procedural macro is as follows. Refer to the [Syn]
-/// crate for further useful guidance on using `quote!` as part of a procedural
-/// macro.
-///
-/// [Syn]: https://github.com/dtolnay/syn
-///
-/// ```edition2018
-/// # #[cfg(any())]
-/// extern crate proc_macro;
-/// # use proc_macro2 as proc_macro;
-///
-/// use proc_macro::TokenStream;
-/// use quote::quote;
-///
-/// # const IGNORE_TOKENS: &'static str = stringify! {
-/// #[proc_macro_derive(HeapSize)]
-/// # };
-/// pub fn derive_heap_size(input: TokenStream) -> TokenStream {
-///     // Parse the input and figure out what implementation to generate...
-///     # const IGNORE_TOKENS: &'static str = stringify! {
-///     let name = /* ... */;
-///     let expr = /* ... */;
-///     # };
-///     #
-///     # let name = 0;
-///     # let expr = 0;
-///
-///     let expanded = quote! {
-///         // The generated impl.
-///         impl heapsize::HeapSize for #name {
-///             fn heap_size_of_children(&self) -> usize {
-///                 #expr
-///             }
-///         }
-///     };
-///
-///     // Hand the output tokens back to the compiler.
-///     TokenStream::from(expanded)
-/// }
-/// ```
-///
-/// ## Combining quoted fragments
-///
-/// Usually you don't end up constructing an entire final `TokenStream` in one
-/// piece. Different parts may come from different helper functions. The tokens
-/// produced by `quote!` themselves implement `ToTokens` and so can be
-/// interpolated into later `quote!` invocations to build up a final result.
-///
-/// ```edition2018
-/// # use quote::quote;
-/// #
-/// let type_definition = quote! {...};
-/// let methods = quote! {...};
-///
-/// let tokens = quote! {
-///     #type_definition
-///     #methods
-/// };
-/// ```
-///
-/// ## Constructing identifiers
-///
-/// Suppose we have an identifier `ident` which came from somewhere in a macro
-/// input and we need to modify it in some way for the macro output. Let's
-/// consider prepending the identifier with an underscore.
-///
-/// Simply interpolating the identifier next to an underscore will not have the
-/// behavior of concatenating them. The underscore and the identifier will
-/// continue to be two separate tokens as if you had written `_ x`.
-///
-/// ```edition2018
-/// # use proc_macro2::{self as syn, Span};
-/// # use quote::quote;
-/// #
-/// # let ident = syn::Ident::new("i", Span::call_site());
-/// #
-/// // incorrect
-/// quote! {
-///     let mut _#ident = 0;
-/// }
-/// # ;
-/// ```
-///
-/// The solution is to perform token-level manipulations using the APIs provided
-/// by Syn and proc-macro2.
-///
-/// ```edition2018
-/// # use proc_macro2::{self as syn, Span};
-/// # use quote::quote;
-/// #
-/// # let ident = syn::Ident::new("i", Span::call_site());
-/// #
-/// let concatenated = format!("_{}", ident);
-/// let varname = syn::Ident::new(&concatenated, ident.span());
-/// quote! {
-///     let mut #varname = 0;
-/// }
-/// # ;
-/// ```
-///
-/// ## Making method calls
-///
-/// Let's say our macro requires some type specified in the macro input to have
-/// a constructor called `new`. We have the type in a variable called
-/// `field_type` of type `syn::Type` and want to invoke the constructor.
-///
-/// ```edition2018
-/// # use quote::quote;
-/// #
-/// # let field_type = quote!(...);
-/// #
-/// // incorrect
-/// quote! {
-///     let value = #field_type::new();
-/// }
-/// # ;
-/// ```
-///
-/// This works only sometimes. If `field_type` is `String`, the expanded code
-/// contains `String::new()` which is fine. But if `field_type` is something
-/// like `Vec<i32>` then the expanded code is `Vec<i32>::new()` which is invalid
-/// syntax. Ordinarily in handwritten Rust we would write `Vec::<i32>::new()`
-/// but for macros often the following is more convenient.
-///
-/// ```edition2018
-/// # use quote::quote;
-/// #
-/// # let field_type = quote!(...);
-/// #
-/// quote! {
-///     let value = <#field_type>::new();
-/// }
-/// # ;
-/// ```
-///
-/// This expands to `<Vec<i32>>::new()` which behaves correctly.
-///
-/// A similar pattern is appropriate for trait methods.
-///
-/// ```edition2018
-/// # use quote::quote;
-/// #
-/// # let field_type = quote!(...);
-/// #
-/// quote! {
-///     let value = <#field_type as core::default::Default>::default();
-/// }
-/// # ;
-/// ```
-#[macro_export(local_inner_macros)]
-macro_rules! quote {
-    ($($tt:tt)*) => (quote_spanned!($crate::__rt::Span::call_site()=> $($tt)*));
-}
-
-/// Same as `quote!`, but applies a given span to all tokens originating within
-/// the macro invocation.
-///
-/// # Syntax
-///
-/// A span expression of type [`Span`], followed by `=>`, followed by the tokens
-/// to quote. The span expression should be brief -- use a variable for anything
-/// more than a few characters. There should be no space before the `=>` token.
-///
-/// [`Span`]: https://docs.rs/proc-macro2/0.4/proc_macro2/struct.Span.html
-///
-/// ```edition2018
-/// # use proc_macro2::Span;
-/// # use quote::quote_spanned;
-/// #
-/// # const IGNORE_TOKENS: &'static str = stringify! {
-/// let span = /* ... */;
-/// # };
-/// # let span = Span::call_site();
-/// # let init = 0;
-///
-/// // On one line, use parentheses.
-/// let tokens = quote_spanned!(span=> Box::into_raw(Box::new(#init)));
-///
-/// // On multiple lines, place the span at the top and use braces.
-/// let tokens = quote_spanned! {span=>
-///     Box::into_raw(Box::new(#init))
-/// };
-/// ```
-///
-/// The lack of space before the `=>` should look jarring to Rust programmers
-/// and this is intentional. The formatting is designed to be visibly
-/// off-balance and draw the eye a particular way, due to the span expression
-/// being evaluated in the context of the procedural macro and the remaining
-/// tokens being evaluated in the generated code.
-///
-/// # Hygiene
-///
-/// Any interpolated tokens preserve the `Span` information provided by their
-/// `ToTokens` implementation. Tokens that originate within the `quote_spanned!`
-/// invocation are spanned with the given span argument.
-///
-/// # Example
-///
-/// The following procedural macro code uses `quote_spanned!` to assert that a
-/// particular Rust type implements the [`Sync`] trait so that references can be
-/// safely shared between threads.
-///
-/// [`Sync`]: https://doc.rust-lang.org/std/marker/trait.Sync.html
-///
-/// ```edition2018
-/// # use quote::{quote_spanned, TokenStreamExt, ToTokens};
-/// # use proc_macro2::{Span, TokenStream};
-/// #
-/// # struct Type;
-/// #
-/// # impl Type {
-/// #     fn span(&self) -> Span {
-/// #         Span::call_site()
-/// #     }
-/// # }
-/// #
-/// # impl ToTokens for Type {
-/// #     fn to_tokens(&self, _tokens: &mut TokenStream) {}
-/// # }
-/// #
-/// # let ty = Type;
-/// # let call_site = Span::call_site();
-/// #
-/// let ty_span = ty.span();
-/// let assert_sync = quote_spanned! {ty_span=>
-///     struct _AssertSync where #ty: Sync;
-/// };
-/// ```
-///
-/// If the assertion fails, the user will see an error like the following. The
-/// input span of their type is hightlighted in the error.
-///
-/// ```text
-/// error[E0277]: the trait bound `*const (): std::marker::Sync` is not satisfied
-///   --> src/main.rs:10:21
-///    |
-/// 10 |     static ref PTR: *const () = &();
-///    |                     ^^^^^^^^^ `*const ()` cannot be shared between threads safely
-/// ```
-///
-/// In this example it is important for the where-clause to be spanned with the
-/// line/column information of the user's input type so that error messages are
-/// placed appropriately by the compiler. But it is also incredibly important
-/// that `Sync` resolves at the macro definition site and not the macro call
-/// site. If we resolve `Sync` at the same span that the user's type is going to
-/// be resolved, then they could bypass our check by defining their own trait
-/// named `Sync` that is implemented for their type.
-#[macro_export(local_inner_macros)]
-macro_rules! quote_spanned {
-    ($span:expr=> $($tt:tt)*) => {
-        {
-            let mut _s = $crate::__rt::TokenStream::new();
-            let _span = $span;
-            quote_each_token!(_s _span $($tt)*);
-            _s
-        }
-    };
-}
-
-// Extract the names of all #metavariables and pass them to the $finish macro.
-//
-// in:   pounded_var_names!(then () a #b c #( #d )* #e)
-// out:  then!(() b d e)
-#[macro_export(local_inner_macros)]
-#[doc(hidden)]
-macro_rules! pounded_var_names {
-    ($finish:ident ($($found:ident)*) # ( $($inner:tt)* ) $($rest:tt)*) => {
-        pounded_var_names!($finish ($($found)*) $($inner)* $($rest)*)
-    };
-
-    ($finish:ident ($($found:ident)*) # [ $($inner:tt)* ] $($rest:tt)*) => {
-        pounded_var_names!($finish ($($found)*) $($inner)* $($rest)*)
-    };
-
-    ($finish:ident ($($found:ident)*) # { $($inner:tt)* } $($rest:tt)*) => {
-        pounded_var_names!($finish ($($found)*) $($inner)* $($rest)*)
-    };
-
-    ($finish:ident ($($found:ident)*) # $first:ident $($rest:tt)*) => {
-        pounded_var_names!($finish ($($found)* $first) $($rest)*)
-    };
-
-    ($finish:ident ($($found:ident)*) ( $($inner:tt)* ) $($rest:tt)*) => {
-        pounded_var_names!($finish ($($found)*) $($inner)* $($rest)*)
-    };
-
-    ($finish:ident ($($found:ident)*) [ $($inner:tt)* ] $($rest:tt)*) => {
-        pounded_var_names!($finish ($($found)*) $($inner)* $($rest)*)
-    };
-
-    ($finish:ident ($($found:ident)*) { $($inner:tt)* } $($rest:tt)*) => {
-        pounded_var_names!($finish ($($found)*) $($inner)* $($rest)*)
-    };
-
-    ($finish:ident ($($found:ident)*) $ignore:tt $($rest:tt)*) => {
-        pounded_var_names!($finish ($($found)*) $($rest)*)
-    };
-
-    ($finish:ident ($($found:ident)*)) => {
-        $finish!(() $($found)*)
-    };
-}
-
-// in:   nested_tuples_pat!(() a b c d e)
-// out:  ((((a b) c) d) e)
-//
-// in:   nested_tuples_pat!(() a)
-// out:  a
-#[macro_export(local_inner_macros)]
-#[doc(hidden)]
-macro_rules! nested_tuples_pat {
-    (()) => {
-        &()
-    };
-
-    (() $first:ident $($rest:ident)*) => {
-        nested_tuples_pat!(($first) $($rest)*)
-    };
-
-    (($pat:pat) $first:ident $($rest:ident)*) => {
-        nested_tuples_pat!((($pat, $first)) $($rest)*)
-    };
-
-    (($done:pat)) => {
-        $done
-    };
-}
-
-// in:   multi_zip_expr!(() a b c d e)
-// out:  a.into_iter().zip(b).zip(c).zip(d).zip(e)
-//
-// in:   multi_zip_iter!(() a)
-// out:  a
-#[macro_export(local_inner_macros)]
-#[doc(hidden)]
-macro_rules! multi_zip_expr {
-    (()) => {
-        &[]
-    };
-
-    (() $single:ident) => {
-        $single
-    };
-
-    (() $first:ident $($rest:ident)*) => {
-        multi_zip_expr!(($first.into_iter()) $($rest)*)
-    };
-
-    (($zips:expr) $first:ident $($rest:ident)*) => {
-        multi_zip_expr!(($zips.zip($first)) $($rest)*)
-    };
-
-    (($done:expr)) => {
-        $done
-    };
-}
-
-#[macro_export(local_inner_macros)]
-#[doc(hidden)]
-macro_rules! quote_each_token {
-    ($tokens:ident $span:ident) => {};
-
-    ($tokens:ident $span:ident # ! $($rest:tt)*) => {
-        quote_each_token!($tokens $span #);
-        quote_each_token!($tokens $span !);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident # ( $($inner:tt)* ) * $($rest:tt)*) => {
-        for pounded_var_names!(nested_tuples_pat () $($inner)*)
-        in pounded_var_names!(multi_zip_expr () $($inner)*) {
-            quote_each_token!($tokens $span $($inner)*);
-        }
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident # ( $($inner:tt)* ) $sep:tt * $($rest:tt)*) => {
-        for (_i, pounded_var_names!(nested_tuples_pat () $($inner)*))
-        in pounded_var_names!(multi_zip_expr () $($inner)*).into_iter().enumerate() {
-            if _i > 0 {
-                quote_each_token!($tokens $span $sep);
-            }
-            quote_each_token!($tokens $span $($inner)*);
-        }
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident # [ $($inner:tt)* ] $($rest:tt)*) => {
-        quote_each_token!($tokens $span #);
-        $tokens.extend({
-            let mut g = $crate::__rt::Group::new(
-                $crate::__rt::Delimiter::Bracket,
-                quote_spanned!($span=> $($inner)*),
-            );
-            g.set_span($span);
-            Some($crate::__rt::TokenTree::from(g))
-        });
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident # $first:ident $($rest:tt)*) => {
-        $crate::ToTokens::to_tokens(&$first, &mut $tokens);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident ( $($first:tt)* ) $($rest:tt)*) => {
-        $tokens.extend({
-            let mut g = $crate::__rt::Group::new(
-                $crate::__rt::Delimiter::Parenthesis,
-                quote_spanned!($span=> $($first)*),
-            );
-            g.set_span($span);
-            Some($crate::__rt::TokenTree::from(g))
-        });
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident [ $($first:tt)* ] $($rest:tt)*) => {
-        $tokens.extend({
-            let mut g = $crate::__rt::Group::new(
-                $crate::__rt::Delimiter::Bracket,
-                quote_spanned!($span=> $($first)*),
-            );
-            g.set_span($span);
-            Some($crate::__rt::TokenTree::from(g))
-        });
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident { $($first:tt)* } $($rest:tt)*) => {
-        $tokens.extend({
-            let mut g = $crate::__rt::Group::new(
-                $crate::__rt::Delimiter::Brace,
-                quote_spanned!($span=> $($first)*),
-            );
-            g.set_span($span);
-            Some($crate::__rt::TokenTree::from(g))
-        });
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident + $($rest:tt)*) => {
-        $crate::__rt::push_add(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident += $($rest:tt)*) => {
-        $crate::__rt::push_add_eq(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident & $($rest:tt)*) => {
-        $crate::__rt::push_and(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident && $($rest:tt)*) => {
-        $crate::__rt::push_and_and(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident &= $($rest:tt)*) => {
-        $crate::__rt::push_and_eq(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident @ $($rest:tt)*) => {
-        $crate::__rt::push_at(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident ! $($rest:tt)*) => {
-        $crate::__rt::push_bang(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident ^ $($rest:tt)*) => {
-        $crate::__rt::push_caret(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident ^= $($rest:tt)*) => {
-        $crate::__rt::push_caret_eq(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident : $($rest:tt)*) => {
-        $crate::__rt::push_colon(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident :: $($rest:tt)*) => {
-        $crate::__rt::push_colon2(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident , $($rest:tt)*) => {
-        $crate::__rt::push_comma(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident / $($rest:tt)*) => {
-        $crate::__rt::push_div(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident /= $($rest:tt)*) => {
-        $crate::__rt::push_div_eq(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident . $($rest:tt)*) => {
-        $crate::__rt::push_dot(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident .. $($rest:tt)*) => {
-        $crate::__rt::push_dot2(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident ... $($rest:tt)*) => {
-        $crate::__rt::push_dot3(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident ..= $($rest:tt)*) => {
-        $crate::__rt::push_dot_dot_eq(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident = $($rest:tt)*) => {
-        $crate::__rt::push_eq(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident == $($rest:tt)*) => {
-        $crate::__rt::push_eq_eq(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident >= $($rest:tt)*) => {
-        $crate::__rt::push_ge(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident > $($rest:tt)*) => {
-        $crate::__rt::push_gt(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident <= $($rest:tt)*) => {
-        $crate::__rt::push_le(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident < $($rest:tt)*) => {
-        $crate::__rt::push_lt(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident *= $($rest:tt)*) => {
-        $crate::__rt::push_mul_eq(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident != $($rest:tt)*) => {
-        $crate::__rt::push_ne(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident | $($rest:tt)*) => {
-        $crate::__rt::push_or(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident |= $($rest:tt)*) => {
-        $crate::__rt::push_or_eq(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident || $($rest:tt)*) => {
-        $crate::__rt::push_or_or(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident # $($rest:tt)*) => {
-        $crate::__rt::push_pound(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident ? $($rest:tt)*) => {
-        $crate::__rt::push_question(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident -> $($rest:tt)*) => {
-        $crate::__rt::push_rarrow(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident <- $($rest:tt)*) => {
-        $crate::__rt::push_larrow(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident % $($rest:tt)*) => {
-        $crate::__rt::push_rem(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident %= $($rest:tt)*) => {
-        $crate::__rt::push_rem_eq(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident => $($rest:tt)*) => {
-        $crate::__rt::push_fat_arrow(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident ; $($rest:tt)*) => {
-        $crate::__rt::push_semi(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident << $($rest:tt)*) => {
-        $crate::__rt::push_shl(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident <<= $($rest:tt)*) => {
-        $crate::__rt::push_shl_eq(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident >> $($rest:tt)*) => {
-        $crate::__rt::push_shr(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident >>= $($rest:tt)*) => {
-        $crate::__rt::push_shr_eq(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident * $($rest:tt)*) => {
-        $crate::__rt::push_star(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident - $($rest:tt)*) => {
-        $crate::__rt::push_sub(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident -= $($rest:tt)*) => {
-        $crate::__rt::push_sub_eq(&mut $tokens, $span);
-        quote_each_token!($tokens $span $($rest)*);
-    };
-
-    ($tokens:ident $span:ident $first:tt $($rest:tt)*) => {
-        $crate::__rt::parse(&mut $tokens, $span, quote_stringify!($first));
-        quote_each_token!($tokens $span $($rest)*);
-    };
-}
-
-// Unhygienically invoke whatever `stringify` the caller has in scope i.e. not a
-// local macro. The macros marked `local_inner_macros` above cannot invoke
-// `stringify` directly.
-#[macro_export]
-#[doc(hidden)]
-macro_rules! quote_stringify {
-    ($tt:tt) => {
-        stringify!($tt)
-    };
-}
deleted file mode 100644
--- a/third_party/rust/quote-0.6.11/src/to_tokens.rs
+++ /dev/null
@@ -1,198 +0,0 @@
-use super::TokenStreamExt;
-
-use std::borrow::Cow;
-use std::iter;
-
-use proc_macro2::{Group, Ident, Literal, Punct, Span, TokenStream, TokenTree};
-
-/// Types that can be interpolated inside a [`quote!`] invocation.
-///
-/// [`quote!`]: macro.quote.html
-pub trait ToTokens {
-    /// Write `self` to the given `TokenStream`.
-    ///
-    /// The token append methods provided by the [`TokenStreamExt`] extension
-    /// trait may be useful for implementing `ToTokens`.
-    ///
-    /// [`TokenStreamExt`]: trait.TokenStreamExt.html
-    ///
-    /// # Example
-    ///
-    /// Example implementation for a struct representing Rust paths like
-    /// `std::cmp::PartialEq`:
-    ///
-    /// ```edition2018
-    /// use proc_macro2::{TokenTree, Spacing, Span, Punct, TokenStream};
-    /// use quote::{TokenStreamExt, ToTokens};
-    ///
-    /// pub struct Path {
-    ///     pub global: bool,
-    ///     pub segments: Vec<PathSegment>,
-    /// }
-    ///
-    /// impl ToTokens for Path {
-    ///     fn to_tokens(&self, tokens: &mut TokenStream) {
-    ///         for (i, segment) in self.segments.iter().enumerate() {
-    ///             if i > 0 || self.global {
-    ///                 // Double colon `::`
-    ///                 tokens.append(Punct::new(':', Spacing::Joint));
-    ///                 tokens.append(Punct::new(':', Spacing::Alone));
-    ///             }
-    ///             segment.to_tokens(tokens);
-    ///         }
-    ///     }
-    /// }
-    /// #
-    /// # pub struct PathSegment;
-    /// #
-    /// # impl ToTokens for PathSegment {
-    /// #     fn to_tokens(&self, tokens: &mut TokenStream) {
-    /// #         unimplemented!()
-    /// #     }
-    /// # }
-    /// ```
-    fn to_tokens(&self, tokens: &mut TokenStream);
-
-    /// Convert `self` directly into a `TokenStream` object.
-    ///
-    /// This method is implicitly implemented using `to_tokens`, and acts as a
-    /// convenience method for consumers of the `ToTokens` trait.
-    fn into_token_stream(self) -> TokenStream
-    where
-        Self: Sized,
-    {
-        let mut tokens = TokenStream::new();
-        self.to_tokens(&mut tokens);
-        tokens
-    }
-}
-
-impl<'a, T: ?Sized + ToTokens> ToTokens for &'a T {
-    fn to_tokens(&self, tokens: &mut TokenStream) {
-        (**self).to_tokens(tokens);
-    }
-}
-
-impl<'a, T: ?Sized + ToTokens> ToTokens for &'a mut T {
-    fn to_tokens(&self, tokens: &mut TokenStream) {
-        (**self).to_tokens(tokens);
-    }
-}
-
-impl<'a, T: ?Sized + ToOwned + ToTokens> ToTokens for Cow<'a, T> {
-    fn to_tokens(&self, tokens: &mut TokenStream) {
-        (**self).to_tokens(tokens);
-    }
-}
-
-impl<T: ?Sized + ToTokens> ToTokens for Box<T> {
-    fn to_tokens(&self, tokens: &mut TokenStream) {
-        (**self).to_tokens(tokens);
-    }
-}
-
-impl<T: ToTokens> ToTokens for Option<T> {
-    fn to_tokens(&self, tokens: &mut TokenStream) {
-        if let Some(ref t) = *self {
-            t.to_tokens(tokens);
-        }
-    }
-}
-
-impl ToTokens for str {
-    fn to_tokens(&self, tokens: &mut TokenStream) {
-        tokens.append(Literal::string(self));
-    }
-}
-
-impl ToTokens for String {
-    fn to_tokens(&self, tokens: &mut TokenStream) {
-        self.as_str().to_tokens(tokens);
-    }
-}
-
-macro_rules! primitive {
-    ($($t:ident => $name:ident)*) => ($(
-        impl ToTokens for $t {
-            fn to_tokens(&self, tokens: &mut TokenStream) {
-                tokens.append(Literal::$name(*self));
-            }
-        }
-    )*)
-}
-
-primitive! {
-    i8 => i8_suffixed
-    i16 => i16_suffixed
-    i32 => i32_suffixed
-    i64 => i64_suffixed
-    isize => isize_suffixed
-
-    u8 => u8_suffixed
-    u16 => u16_suffixed
-    u32 => u32_suffixed
-    u64 => u64_suffixed
-    usize => usize_suffixed
-
-    f32 => f32_suffixed
-    f64 => f64_suffixed
-}
-
-#[cfg(integer128)]
-primitive! {
-    i128 => i128_suffixed
-    u128 => u128_suffixed
-}
-
-impl ToTokens for char {
-    fn to_tokens(&self, tokens: &mut TokenStream) {
-        tokens.append(Literal::character(*self));
-    }
-}
-
-impl ToTokens for bool {
-    fn to_tokens(&self, tokens: &mut TokenStream) {
-        let word = if *self { "true" } else { "false" };
-        tokens.append(Ident::new(word, Span::call_site()));
-    }
-}
-
-impl ToTokens for Group {
-    fn to_tokens(&self, tokens: &mut TokenStream) {
-        tokens.append(self.clone());
-    }
-}
-
-impl ToTokens for Ident {
-    fn to_tokens(&self, tokens: &mut TokenStream) {
-        tokens.append(self.clone());
-    }
-}
-
-impl ToTokens for Punct {
-    fn to_tokens(&self, tokens: &mut TokenStream) {
-        tokens.append(self.clone());
-    }
-}
-
-impl ToTokens for Literal {
-    fn to_tokens(&self, tokens: &mut TokenStream) {
-        tokens.append(self.clone());
-    }
-}
-
-impl ToTokens for TokenTree {
-    fn to_tokens(&self, dst: &mut TokenStream) {
-        dst.append(self.clone());
-    }
-}
-
-impl ToTokens for TokenStream {
-    fn to_tokens(&self, dst: &mut TokenStream) {
-        dst.extend(iter::once(self.clone()));
-    }
-
-    fn into_token_stream(self) -> TokenStream {
-        self
-    }
-}
deleted file mode 100644
--- a/third_party/rust/quote-0.6.11/tests/conditional/integer128.rs
+++ /dev/null
@@ -1,11 +0,0 @@
-#[test]
-fn test_integer128() {
-    let ii128 = -1i128;
-    let uu128 = 1u128;
-
-    let tokens = quote! {
-        #ii128 #uu128
-    };
-    let expected = "-1i128 1u128";
-    assert_eq!(expected, tokens.to_string());
-}
deleted file mode 100644
--- a/third_party/rust/quote-0.6.11/tests/test.rs
+++ /dev/null
@@ -1,295 +0,0 @@
-#![cfg_attr(feature = "cargo-clippy", allow(blacklisted_name))]
-
-use std::borrow::Cow;
-
-extern crate proc_macro2;
-#[macro_use]
-extern crate quote;
-
-use proc_macro2::{Ident, Span, TokenStream};
-use quote::TokenStreamExt;
-
-mod conditional {
-    #[cfg(integer128)]
-    mod integer128;
-}
-
-struct X;
-
-impl quote::ToTokens for X {
-    fn to_tokens(&self, tokens: &mut TokenStream) {
-        tokens.append(Ident::new("X", Span::call_site()));
-    }
-}
-
-#[test]
-fn test_quote_impl() {
-    let tokens = quote! {
-        impl<'a, T: ToTokens> ToTokens for &'a T {
-            fn to_tokens(&self, tokens: &mut TokenStream) {
-                (**self).to_tokens(tokens)
-            }
-        }
-    };
-
-    let expected = concat!(
-        "impl < 'a , T : ToTokens > ToTokens for & 'a T { ",
-        "fn to_tokens ( & self , tokens : & mut TokenStream ) { ",
-        "( * * self ) . to_tokens ( tokens ) ",
-        "} ",
-        "}"
-    );
-
-    assert_eq!(expected, tokens.to_string());
-}
-
-#[test]
-fn test_substitution() {
-    let x = X;
-    let tokens = quote!(#x <#x> (#x) [#x] {#x});
-
-    let expected = "X < X > ( X ) [ X ] { X }";
-
-    assert_eq!(expected, tokens.to_string());
-}
-
-#[test]
-fn test_iter() {
-    let primes = &[X, X, X, X];
-
-    assert_eq!("X X X X", quote!(#(#primes)*).to_string());
-
-    assert_eq!("X , X , X , X ,", quote!(#(#primes,)*).to_string());
-
-    assert_eq!("X , X , X , X", quote!(#(#primes),*).to_string());
-}
-
-#[test]
-fn test_advanced() {
-    let generics = quote!( <'a, T> );
-
-    let where_clause = quote!( where T: Serialize );
-
-    let field_ty = quote!(String);
-
-    let item_ty = quote!(Cow<'a, str>);
-
-    let path = quote!(SomeTrait::serialize_with);
-
-    let value = quote!(self.x);
-
-    let tokens = quote! {
-        struct SerializeWith #generics #where_clause {
-            value: &'a #field_ty,
-            phantom: ::std::marker::PhantomData<#item_ty>,
-        }
-
-        impl #generics ::serde::Serialize for SerializeWith #generics #where_clause {
-            fn serialize<S>(&self, s: &mut S) -> Result<(), S::Error>
-                where S: ::serde::Serializer
-            {
-                #path(self.value, s)
-            }
-        }
-
-        SerializeWith {
-            value: #value,
-            phantom: ::std::marker::PhantomData::<#item_ty>,
-        }
-    };
-
-    let expected = concat!(
-        "struct SerializeWith < 'a , T > where T : Serialize { ",
-        "value : & 'a String , ",
-        "phantom : :: std :: marker :: PhantomData < Cow < 'a , str > > , ",
-        "} ",
-        "impl < 'a , T > :: serde :: Serialize for SerializeWith < 'a , T > where T : Serialize { ",
-        "fn serialize < S > ( & self , s : & mut S ) -> Result < ( ) , S :: Error > ",
-        "where S : :: serde :: Serializer ",
-        "{ ",
-        "SomeTrait :: serialize_with ( self . value , s ) ",
-        "} ",
-        "} ",
-        "SerializeWith { ",
-        "value : self . x , ",
-        "phantom : :: std :: marker :: PhantomData :: < Cow < 'a , str > > , ",
-        "}"
-    );
-
-    assert_eq!(expected, tokens.to_string());
-}
-
-#[test]
-fn test_integer() {
-    let ii8 = -1i8;
-    let ii16 = -1i16;
-    let ii32 = -1i32;
-    let ii64 = -1i64;
-    let iisize = -1isize;
-    let uu8 = 1u8;
-    let uu16 = 1u16;
-    let uu32 = 1u32;
-    let uu64 = 1u64;
-    let uusize = 1usize;
-
-    let tokens = quote! {
-        #ii8 #ii16 #ii32 #ii64 #iisize
-        #uu8 #uu16 #uu32 #uu64 #uusize
-    };
-    let expected = "-1i8 -1i16 -1i32 -1i64 -1isize 1u8 1u16 1u32 1u64 1usize";
-    assert_eq!(expected, tokens.to_string());
-}
-
-#[test]
-fn test_floating() {
-    let e32 = 2.345f32;
-
-    let e64 = 2.345f64;
-
-    let tokens = quote! {
-        #e32
-        #e64
-    };
-    let expected = concat!("2.345f32 2.345f64");
-    assert_eq!(expected, tokens.to_string());
-}
-
-#[test]
-fn test_char() {
-    let zero = '\0';
-    let pound = '#';
-    let quote = '"';
-    let apost = '\'';
-    let newline = '\n';
-    let heart = '\u{2764}';
-
-    let tokens = quote! {
-        #zero #pound #quote #apost #newline #heart
-    };
-    let expected = "'\\u{0}' '#' '\\\"' '\\'' '\\n' '\\u{2764}'";
-    assert_eq!(expected, tokens.to_string());
-}
-
-#[test]
-fn test_str() {
-    let s = "\0 a 'b \" c";
-    let tokens = quote!(#s);
-    let expected = "\"\\u{0} a \\'b \\\" c\"";
-    assert_eq!(expected, tokens.to_string());
-}
-
-#[test]
-fn test_string() {
-    let s = "\0 a 'b \" c".to_string();
-    let tokens = quote!(#s);
-    let expected = "\"\\u{0} a \\'b \\\" c\"";
-    assert_eq!(expected, tokens.to_string());
-}
-
-#[test]
-fn test_ident() {
-    let foo = Ident::new("Foo", Span::call_site());
-    let bar = Ident::new(&format!("Bar{}", 7), Span::call_site());
-    let tokens = quote!(struct #foo; enum #bar {});
-    let expected = "struct Foo ; enum Bar7 { }";
-    assert_eq!(expected, tokens.to_string());
-}
-
-#[test]
-fn test_duplicate() {
-    let ch = 'x';
-
-    let tokens = quote!(#ch #ch);
-
-    let expected = "'x' 'x'";
-    assert_eq!(expected, tokens.to_string());
-}
-
-#[test]
-fn test_fancy_repetition() {
-    let foo = vec!["a", "b"];
-    let bar = vec![true, false];
-
-    let tokens = quote! {
-        #(#foo: #bar),*
-    };
-
-    let expected = r#""a" : true , "b" : false"#;
-    assert_eq!(expected, tokens.to_string());
-}
-
-#[test]
-fn test_nested_fancy_repetition() {
-    let nested = vec![vec!['a', 'b', 'c'], vec!['x', 'y', 'z']];
-
-    let tokens = quote! {
-        #(
-            #(#nested)*
-        ),*
-    };
-
-    let expected = "'a' 'b' 'c' , 'x' 'y' 'z'";
-    assert_eq!(expected, tokens.to_string());
-}
-
-#[test]
-fn test_empty_repetition() {
-    let tokens = quote!(#(a b)* #(c d),*);
-    assert_eq!("", tokens.to_string());
-}
-
-#[test]
-fn test_variable_name_conflict() {
-    // The implementation of `#(...),*` uses the variable `_i` but it should be
-    // fine, if a little confusing when debugging.
-    let _i = vec!['a', 'b'];
-    let tokens = quote! { #(#_i),* };
-    let expected = "'a' , 'b'";
-    assert_eq!(expected, tokens.to_string());
-}
-
-#[test]
-fn test_empty_quote() {
-    let tokens = quote!();
-    assert_eq!("", tokens.to_string());
-}
-
-#[test]
-fn test_box_str() {
-    let b = "str".to_owned().into_boxed_str();
-    let tokens = quote! { #b };
-    assert_eq!("\"str\"", tokens.to_string());
-}
-
-#[test]
-fn test_cow() {
-    let owned: Cow<Ident> = Cow::Owned(Ident::new("owned", Span::call_site()));
-
-    let ident = Ident::new("borrowed", Span::call_site());
-    let borrowed = Cow::Borrowed(&ident);
-
-    let tokens = quote! { #owned #borrowed };
-    assert_eq!("owned borrowed", tokens.to_string());
-}
-
-#[test]
-fn test_closure() {
-    fn field_i(i: usize) -> Ident {
-        Ident::new(&format!("__field{}", i), Span::call_site())
-    }
-
-    let fields = (0usize..3)
-        .map(field_i as fn(_) -> _)
-        .map(|var| quote! { #var });
-
-    let tokens = quote! { #(#fields)* };
-    assert_eq!("__field0 __field1 __field2", tokens.to_string());
-}
-
-#[test]
-fn test_append_tokens() {
-    let mut a = quote!(a);
-    let b = quote!(b);
-    a.append_all(b);
-    assert_eq!("a b", a.to_string());
-}
deleted file mode 100644
--- a/third_party/rust/syn-0.15.30/.cargo-checksum.json
+++ /dev/null
@@ -1,1 +0,0 @@
-{"files":{"Cargo.toml":"ebf2c860a726b1210648f946b92b56a54414f2a009043d8affefdb1a0e4bd234","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"3f3d105c0f1bae3bdb5ed3cc32a8e5a02f3de6f62a9f17f5ba03af3f813d0881","build.rs":"9f3b0dc6ae4c0065c3cf001a40a2ff9c5a86cac5edf66fa0e80d0bcd37c0d4fc","src/attr.rs":"9210a8dc5fea0ee3004b14a9e2923142932c53986b56685d62d9aa115fe093b0","src/buffer.rs":"fac77febe022ab4982078c73ca502f9d698a402b3eca0f8e9c7a2796af01e5f4","src/data.rs":"54ee54c3c650bc5e200d4bea947d6e89093a39f2444cd43e8861f5852975e0bc","src/derive.rs":"eb041b47a73bace73c2872cd9a8e190de7e2b3b57cd57213770f088ec19ab3c6","src/error.rs":"0bcf09b0892c6d5f5f31f7f758866ded1e47463833cad60694329348ac1fb44a","src/export.rs":"1f7e017dac9426e91c796445e733c390c408c808ba9c21cb7df7799b67352fde","src/expr.rs":"c9000092a57412dcbef401cd51195b816ebfae96736deeebcece5bdc73471cdc","src/ext.rs":"1881179e634681cdd472ecac502192b5a5a7759056d1c49497706749fdab1bdf","src/file.rs":"abb9f5e71a8a6b52649c15da21d3f99e25a727d87c2f87d2744ac3970c1d683f","src/gen/fold.rs":"5507dde16c41e4f11b8903938a5f442fff9f94468afccbf0a37a4fa14f2eddde","src/gen/visit.rs":"4c8f499d1fd988b9c9ff820ef76c0c93b1e5ee91e6a94e0892298f5e6f424893","src/gen/visit_mut.rs":"d1f905b2b5afd685ace07532b6cbc67175e2d104508c7ed86ed4e9d1567c7c7b","src/gen_helper.rs":"644b1d31987919c0239891d8f90c09f3bf541a71fb85e744438e4814cc6dff89","src/generics.rs":"6ee5bba532b95f7de7c6bbe8caadabc6a71c45e7f8d7636d823075ff27f28937","src/group.rs":"03487f75d0abd302f06e50eb09d14ab83fb60c67e1f2602be53ca3f28a833b90","src/ident.rs":"bd7884de0031d942c556f929905532dd8799f8ca2450e65b8e4e8dfa78cf4fee","src/item.rs":"92b5ceca78590d9236dbdd008b97d817d051a16b10cb4dac8614199a09bda03e","src/keyword.rs":"aaca18ec0226f454ed5eecf8d99ef01afb8dd2457c9cae4f91b262accc0c0c41","src/lib.rs":"d36df1838b3454cd63a4ca214044c2be9281a33b533581f5da622bc66e2446d2","src/lifetime.rs":"7912a4c77ee805e912fb28c7f434836ea82540263d549877cd5edfbe32d1bf95","src/lit.rs":"bc034e4443a32f2066b41f62e05946143f60397fbbd05016c0020c4818e0a0f8","src/lookahead.rs":"5b3c55ae8c1b1d0ed813c296dc6fa586379a99e7792a3cb0d634ae6ca74f54b5","src/mac.rs":"a91623ed9c1de7b18ef752db79a242002e95156497a52a1790a75069915d22ee","src/macros.rs":"2f91e07a1aec4b385986c0a0f66274e8de1c1aa81f95d398a5cd364b3c451bb4","src/op.rs":"01edb1e07b6d60b266797ca4b30788b0a511452228e04073a11f0b61f106a0e7","src/parse.rs":"d907b9822943bafbcb1e005f09a145e46c162e7702fce703b57f9b7ccbdf85a2","src/parse_macro_input.rs":"8df7b4c1b361171f3fefb0490dec570ad29c024c04e35184b296725f97f2002c","src/parse_quote.rs":"d5e613fbba06900d882f2aaa042f10c1bee1b1dffaa1d9ee9a73d1e504a08fad","src/path.rs":"18b5c17b5acb7814a63517bbc473e1120895b4f7ff8f856279f31493663cc7fa","src/print.rs":"7ebb68123898f2ebbae12abf028747c05bea7b08f1e96b17164f1dcebdab7355","src/punctuated.rs":"3abae461aa47b71f00ede80e42691da5617a21c6f4864c40b2f984bb34a9a277","src/span.rs":"748c51c6feb223c26d3b1701f5bb98aee823666c775c98106cfa24fe29d8cec1","src/spanned.rs":"83b4ab1e2138ac9340eaa8234ad1d9f7468b450ddf3a852e574cac18e4f766b8","src/thread.rs":"ac3f4aa972b0dee5b9ae5202c5cd6bef46823fc91ff83787a3fe1bdfb8f79135","src/token.rs":"20868cd459ac8eea83e8891cf0b5d7c9dc179b0ff76953d5d0a2a29f17c0c7af","src/tt.rs":"b3d99cbd68cd50749f26f4afa138e6366d327099ed566b30c315ccb58fa26ded","src/ty.rs":"4ac9d1b84f9bf269516348e1b923b1c8e3f7562b98ec7ef66174c31fffb8dce5"},"package":"66c8865bf5a7cbb662d8b011950060b3c8743dca141b054bf7195b20d314d8e2"}
\ No newline at end of file
deleted file mode 100644
--- a/third_party/rust/syn-0.15.30/Cargo.toml
+++ /dev/null
@@ -1,71 +0,0 @@
-# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
-#
-# 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
-#
-# 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]
-name = "syn"
-version = "0.15.30"
-authors = ["David Tolnay <dtolnay@gmail.com>"]
-include = ["/build.rs", "/Cargo.toml", "/LICENSE-APACHE", "/LICENSE-MIT", "/README.md", "/src/**/*.rs"]
-description = "Parser for Rust source code"
-documentation = "https://docs.rs/syn"
-readme = "README.md"
-categories = ["development-tools::procedural-macro-helpers"]
-license = "MIT/Apache-2.0"
-repository = "https://github.com/dtolnay/syn"
-[package.metadata.docs.rs]
-all-features = true
-
-[package.metadata.playground]
-all-features = true
-
-[lib]
-name = "syn"
-[dependencies.proc-macro2]
-version = "0.4.4"
-default-features = false
-
-[dependencies.quote]
-version = "0.6"
-optional = true
-default-features = false
-
-[dependencies.unicode-xid]
-version = "0.1"
-[dev-dependencies.colored]
-version = "1.7"
-
-[dev-dependencies.insta]
-version = "0.7"
-
-[dev-dependencies.rayon]
-version = "1.0"
-
-[dev-dependencies.regex]
-version = "1.0"
-
-[dev-dependencies.walkdir]
-version = "2.1"
-
-[features]
-clone-impls = []
-default = ["derive", "parsing", "printing", "clone-impls", "proc-macro"]
-derive = []
-extra-traits = []
-fold = []
-full = []
-parsing = []
-printing = ["quote"]
-proc-macro = ["proc-macro2/proc-macro", "quote/proc-macro"]
-visit = []
-visit-mut = []
-[badges.travis-ci]
-repository = "dtolnay/syn"
deleted file mode 100644
--- a/third_party/rust/syn-0.15.30/LICENSE-APACHE
+++ /dev/null
@@ -1,201 +0,0 @@
-                              Apache License
-                        Version 2.0, January 2004
-                     http://www.apache.org/licenses/
-
-TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-1. Definitions.
-
-   "License" shall mean the terms and conditions for use, reproduction,
-   and distribution as defined by Sections 1 through 9 of this document.
-
-   "Licensor" shall mean the copyright owner or entity authorized by
-   the copyright owner that is granting the License.
-
-   "Legal Entity" shall mean the union of the acting entity and all
-   other entities that control, are controlled by, or are under common
-   control with that entity. For the purposes of this definition,
-   "control" means (i) the power, direct or indirect, to cause the
-   direction or management of such entity, whether by contract or
-   otherwise, or (ii) ownership of fifty percent (50%) or more of the
-   outstanding shares, or (iii) beneficial ownership of such entity.
-
-   "You" (or "Your") shall mean an individual or Legal Entity
-   exercising permissions granted by this License.
-
-   "Source" form shall mean the preferred form for making modifications,
-   including but not limited to software source code, documentation
-   source, and configuration files.
-
-   "Object" form shall mean any form resulting from mechanical
-   transformation or translation of a Source form, including but
-   not limited to compiled object code, generated documentation,
-   and conversions to other media types.
-
-   "Work" shall mean the work of authorship, whether in Source or
-   Object form, made available under the License, as indicated by a
-   copyright notice that is included in or attached to the work
-   (an example is provided in the Appendix below).
-
-   "Derivative Works" shall mean any work, whether in Source or Object
-   form, that is based on (or derived from) the Work and for which the
-   editorial revisions, annotations, elaborations, or other modifications
-   represent, as a whole, an original work of authorship. For the purposes
-   of this License, Derivative Works shall not include works that remain
-   separable from, or merely link (or bind by name) to the interfaces of,
-   the Work and Derivative Works thereof.
-
-   "Contribution" shall mean any work of authorship, including
-   the original version of the Work and any modifications or additions
-   to that Work or Derivative Works thereof, that is intentionally
-   submitted to Licensor for inclusion in the Work by the copyright owner
-   or by an individual or Legal Entity authorized to submit on behalf of
-   the copyright owner. For the purposes of this definition, "submitted"
-   means any form of electronic, verbal, or written communication sent
-   to the Licensor or its representatives, including but not limited to
-   communication on electronic mailing lists, source code control systems,
-   and issue tracking systems that are managed by, or on behalf of, the
-   Licensor for the purpose of discussing and improving the Work, but
-   excluding communication that is conspicuously marked or otherwise
-   designated in writing by the copyright owner as "Not a Contribution."
-
-   "Contributor" shall mean Licensor and any individual or Legal Entity
-   on behalf of whom a Contribution has been received by Licensor and
-   subsequently incorporated within the Work.
-
-2. Grant of Copyright License. Subject to the terms and conditions of
-   this License, each Contributor hereby grants to You a perpetual,
-   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-   copyright license to reproduce, prepare Derivative Works of,
-   publicly display, publicly perform, sublicense, and distribute the
-   Work and such Derivative Works in Source or Object form.
-
-3. Grant of Patent License. Subject to the terms and conditions of
-   this License, each Contributor hereby grants to You a perpetual,
-   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-   (except as stated in this section) patent license to make, have made,
-   use, offer to sell, sell, import, and otherwise transfer the Work,
-   where such license applies only to those patent claims licensable
-   by such Contributor that are necessarily infringed by their
-   Contribution(s) alone or by combination of their Contribution(s)
-   with the Work to which such Contribution(s) was submitted. If You
-   institute patent litigation against any entity (including a
-   cross-claim or counterclaim in a lawsuit) alleging that the Work
-   or a Contribution incorporated within the Work constitutes direct
-   or contributory patent infringement, then any patent licenses
-   granted to You under this License for that Work shall terminate
-   as of the date such litigation is filed.
-
-4. Redistribution. You may reproduce and distribute copies of the
-   Work or Derivative Works thereof in any medium, with or without
-   modifications, and in Source or Object form, provided that You
-   meet the following conditions:
-
-   (a) You must give any other recipients of the Work or
-       Derivative Works a copy of this License; and
-
-   (b) You must cause any modified files to carry prominent notices
-       stating that You changed the files; and
-
-   (c) You must retain, in the Source form of any Derivative Works
-       that You distribute, all copyright, patent, trademark, and
-       attribution notices from the Source form of the Work,
-       excluding those notices that do not pertain to any part of
-       the Derivative Works; and
-
-   (d) If the Work includes a "NOTICE" text file as part of its
-       distribution, then any Derivative Works that You distribute must
-       include a readable copy of the attribution notices contained
-       within such NOTICE file, excluding those notices that do not
-       pertain to any part of the Derivative Works, in at least one
-       of the following places: within a NOTICE text file distributed
-       as part of the Derivative Works; within the Source form or
-       documentation, if provided along with the Derivative Works; or,
-       within a display generated by the Derivative Works, if and
-       wherever such third-party notices normally appear. The contents
-       of the NOTICE file are for informational purposes only and
-       do not modify the License. You may add Your own attribution
-       notices within Derivative Works that You distribute, alongside
-       or as an addendum to the NOTICE text from the Work, provided
-       that such additional attribution notices cannot be construed
-       as modifying the License.
-
-   You may add Your own copyright statement to Your modifications and
-   may provide additional or different license terms and conditions
-   for use, reproduction, or distribution of Your modifications, or
-   for any such Derivative Works as a whole, provided Your use,
-   reproduction, and distribution of the Work otherwise complies with
-   the conditions stated in this License.
-
-5. Submission of Contributions. Unless You explicitly state otherwise,
-   any Contribution intentionally submitted for inclusion in the Work
-   by You to the Licensor shall be under the terms and conditions of
-   this License, without any additional terms or conditions.
-   Notwithstanding the above, nothing herein shall supersede or modify
-   the terms of any separate license agreement you may have executed
-   with Licensor regarding such Contributions.
-
-6. Trademarks. This License does not grant permission to use the trade
-   names, trademarks, service marks, or product names of the Licensor,
-   except as required for reasonable and customary use in describing the
-   origin of the Work and reproducing the content of the NOTICE file.
-
-7. Disclaimer of Warranty. Unless required by applicable law or
-   agreed to in writing, Licensor provides the Work (and each
-   Contributor provides its Contributions) on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-   implied, including, without limitation, any warranties or conditions
-   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-   PARTICULAR PURPOSE. You are solely responsible for determining the
-   appropriateness of using or redistributing the Work and assume any
-   risks associated with Your exercise of permissions under this License.
-
-8. Limitation of Liability. In no event and under no legal theory,
-   whether in tort (including negligence), contract, or otherwise,
-   unless required by applicable law (such as deliberate and grossly
-   negligent acts) or agreed to in writing, shall any Contributor be
-   liable to You for damages, including any direct, indirect, special,
-   incidental, or consequential damages of any character arising as a
-   result of this License or out of the use or inability to use the
-   Work (including but not limited to damages for loss of goodwill,
-   work stoppage, computer failure or malfunction, or any and all
-   other commercial damages or losses), even if such Contributor
-   has been advised of the possibility of such damages.
-
-9. Accepting Warranty or Additional Liability. While redistributing
-   the Work or Derivative Works thereof, You may choose to offer,
-   and charge a fee for, acceptance of support, warranty, indemnity,
-   or other liability obligations and/or rights consistent with this
-   License. However, in accepting such obligations, You may act only
-   on Your own behalf and on Your sole responsibility, not on behalf
-   of any other Contributor, and only if You agree to indemnify,
-   defend, and hold each Contributor harmless for any liability
-   incurred by, or claims asserted against, such Contributor by reason
-   of your accepting any such warranty or additional liability.
-
-END OF TERMS AND CONDITIONS
-
-APPENDIX: How to apply the Apache License to your work.
-
-   To apply the Apache License to your work, attach the following
-   boilerplate notice, with the fields enclosed by brackets "[]"
-   replaced with your own identifying information. (Don't include
-   the brackets!)  The text should be enclosed in the appropriate
-   comment syntax for the file format. We also recommend that a
-   file or class name and description of purpose be included on the
-   same "printed page" as the copyright notice for easier
-   identification within third-party archives.
-
-Copyright [yyyy] [name of copyright owner]
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-	http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
deleted file mode 100644
--- a/third_party/rust/syn-0.15.30/LICENSE-MIT
+++ /dev/null
@@ -1,23 +0,0 @@
-Permission is hereby granted, free of charge, to any
-person obtaining a copy of this software and associated
-documentation files (the "Software"), to deal in the
-Software without restriction, including without
-limitation the rights to use, copy, modify, merge,
-publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software
-is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice
-shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
deleted file mode 100644
--- a/third_party/rust/syn-0.15.30/README.md
+++ /dev/null
@@ -1,256 +0,0 @@
-Parser for Rust source code
-===========================
-
-[![Build Status](https://api.travis-ci.org/dtolnay/syn.svg?branch=master)](https://travis-ci.org/dtolnay/syn)
-[![Latest Version](https://img.shields.io/crates/v/syn.svg)](https://crates.io/crates/syn)
-[![Rust Documentation](https://img.shields.io/badge/api-rustdoc-blue.svg)](https://docs.rs/syn/0.15/syn/)
-[![Rustc Version 1.15+](https://img.shields.io/badge/rustc-1.15+-lightgray.svg)](https://blog.rust-lang.org/2017/02/02/Rust-1.15.html)
-
-Syn is a parsing library for parsing a stream of Rust tokens into a syntax tree
-of Rust source code.
-
-Currently this library is geared toward use in Rust procedural macros, but
-contains some APIs that may be useful more generally.
-
-[custom derive]: https://github.com/rust-lang/rfcs/blob/master/text/1681-macros-1.1.md
-
-- **Data structures** — Syn provides a complete syntax tree that can represent
-  any valid Rust source code. The syntax tree is rooted at [`syn::File`] which
-  represents a full source file, but there are other entry points that may be
-  useful to procedural macros including [`syn::Item`], [`syn::Expr`] and
-  [`syn::Type`].
-
-- **Custom derives** — Of particular interest to custom derives is
-  [`syn::DeriveInput`] which is any of the three legal input items to a derive
-  macro. An example below shows using this type in a library that can derive
-  implementations of a trait of your own.
-
-- **Parsing** — Parsing in Syn is built around [parser functions] with the
-  signature `fn(ParseStream) -> Result<T>`. Every syntax tree node defined by
-  Syn is individually parsable and may be used as a building block for custom
-  syntaxes, or you may dream up your own brand new syntax without involving any
-  of our syntax tree types.
-
-- **Location information** — Every token parsed by Syn is associated with a
-  `Span` that tracks line and column information back to the source of that
-  token. These spans allow a procedural macro to display detailed error messages
-  pointing to all the right places in the user's code. There is an example of
-  this below.
-
-- **Feature flags** — Functionality is aggressively feature gated so your
-  procedural macros enable only what they need, and do not pay in compile time
-  for all the rest.
-
-[`syn::File`]: https://docs.rs/syn/0.15/syn/struct.File.html
-[`syn::Item`]: https://docs.rs/syn/0.15/syn/enum.Item.html
-[`syn::Expr`]: https://docs.rs/syn/0.15/syn/enum.Expr.html
-[`syn::Type`]: https://docs.rs/syn/0.15/syn/enum.Type.html
-[`syn::DeriveInput`]: https://docs.rs/syn/0.15/syn/struct.DeriveInput.html
-[parser functions]: https://docs.rs/syn/0.15/syn/parse/index.html
-
-If you get stuck with anything involving procedural macros in Rust I am happy to
-provide help even if the issue is not related to Syn. Please file a ticket in
-this repo.
-
-*Version requirement: Syn supports any compiler version back to Rust's very
-first support for procedural macros in Rust 1.15.0. Some features especially
-around error reporting are only available in newer compilers or on the nightly
-channel.*
-
-[*Release notes*](https://github.com/dtolnay/syn/releases)
-
-## Example of a custom derive
-
-The canonical custom derive using Syn looks like this. We write an ordinary Rust
-function tagged with a `proc_macro_derive` attribute and the name of the trait
-we are deriving. Any time that derive appears in the user's code, the Rust
-compiler passes their data structure as tokens into our macro. We get to execute
-arbitrary Rust code to figure out what to do with those tokens, then hand some
-tokens back to the compiler to compile into the user's crate.
-
-[`TokenStream`]: https://doc.rust-lang.org/proc_macro/struct.TokenStream.html
-
-```toml
-[dependencies]
-syn = "0.15"
-quote = "0.6"
-
-[lib]
-proc-macro = true
-```
-
-```rust
-extern crate proc_macro;
-
-use proc_macro::TokenStream;
-use quote::quote;
-use syn::{parse_macro_input, DeriveInput};
-
-#[proc_macro_derive(MyMacro)]
-pub fn my_macro(input: TokenStream) -> TokenStream {
-    // Parse the input tokens into a syntax tree
-    let input = parse_macro_input!(input as DeriveInput);
-
-    // Build the output, possibly using quasi-quotation
-    let expanded = quote! {
-        // ...
-    };
-
-    // Hand the output tokens back to the compiler
-    TokenStream::from(expanded)
-}
-```
-
-The [`heapsize`] example directory shows a complete working Macros 1.1
-implementation of a custom derive. It works on any Rust compiler 1.15+. The
-example derives a `HeapSize` trait which computes an estimate of the amount of
-heap memory owned by a value.
-
-[`heapsize`]: examples/heapsize
-
-```rust
-pub trait HeapSize {
-    /// Total number of bytes of heap memory owned by `self`.
-    fn heap_size_of_children(&self) -> usize;
-}
-```
-
-The custom derive allows users to write `#[derive(HeapSize)]` on data structures
-in their program.
-
-```rust
-#[derive(HeapSize)]
-struct Demo<'a, T: ?Sized> {
-    a: Box<T>,
-    b: u8,
-    c: &'a str,
-    d: String,
-}
-```
-
-## Spans and error reporting
-
-The token-based procedural macro API provides great control over where the
-compiler's error messages are displayed in user code. Consider the error the
-user sees if one of their field types does not implement `HeapSize`.
-
-```rust
-#[derive(HeapSize)]
-struct Broken {
-    ok: String,
-    bad: std::thread::Thread,
-}
-```
-
-By tracking span information all the way through the expansion of a procedural
-macro as shown in the `heapsize` example, token-based macros in Syn are able to
-trigger errors that directly pinpoint the source of the problem.
-
-```
-error[E0277]: the trait bound `std::thread::Thread: HeapSize` is not satisfied
- --> src/main.rs:7:5
-  |
-7 |     bad: std::thread::Thread,
-  |     ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `HeapSize` is not implemented for `std::thread::Thread`
-```
-
-## Parsing a custom syntax
-
-The [`lazy-static`] example directory shows the implementation of a
-`functionlike!(...)` procedural macro in which the input tokens are parsed using
-Syn's parsing API.
-
-[`lazy-static`]: examples/lazy-static
-
-The example reimplements the popular `lazy_static` crate from crates.io as a
-procedural macro.
-
-```
-lazy_static! {
-    static ref USERNAME: Regex = Regex::new("^[a-z0-9_-]{3,16}$").unwrap();
-}
-```
-
-The implementation shows how to trigger custom warnings and error messages on
-the macro input.
-
-```
-warning: come on, pick a more creative name
-  --> src/main.rs:10:16
-   |
-10 |     static ref FOO: String = "lazy_static".to_owned();
-   |                ^^^
-```
-
-## Debugging
-
-When developing a procedural macro it can be helpful to look at what the
-generated code looks like. Use `cargo rustc -- -Zunstable-options
---pretty=expanded` or the [`cargo expand`] subcommand.
-
-[`cargo expand`]: https://github.com/dtolnay/cargo-expand
-
-To show the expanded code for some crate that uses your procedural macro, run
-`cargo expand` from that crate. To show the expanded code for one of your own
-test cases, run `cargo expand --test the_test_case` where the last argument is
-the name of the test file without the `.rs` extension.
-
-This write-up by Brandon W Maister discusses debugging in more detail:
-[Debugging Rust's new Custom Derive system][debugging].
-
-[debugging]: https://quodlibetor.github.io/posts/debugging-rusts-new-custom-derive-system/
-
-## Optional features
-
-Syn puts a lot of functionality behind optional features in order to optimize
-compile time for the most common use cases. The following features are
-available.
-
-- **`derive`** *(enabled by default)* — Data structures for representing the
-  possible input to a custom derive, including structs and enums and types.
-- **`full`** — Data structures for representing the syntax tree of all valid
-  Rust source code, including items and expressions.
-- **`parsing`** *(enabled by default)* — Ability to parse input tokens into a
-  syntax tree node of a chosen type.
-- **`printing`** *(enabled by default)* — Ability to print a syntax tree node as
-  tokens of Rust source code.
-- **`visit`** — Trait for traversing a syntax tree.
-- **`visit-mut`** — Trait for traversing and mutating in place a syntax tree.
-- **`fold`** — Trait for transforming an owned syntax tree.
-- **`clone-impls`** *(enabled by default)* — Clone impls for all syntax tree
-  types.
-- **`extra-traits`** — Debug, Eq, PartialEq, Hash impls for all syntax tree
-  types.
-- **`proc-macro`** *(enabled by default)* — Runtime dependency on the dynamic
-  library libproc_macro from rustc toolchain.
-
-## Proc macro shim
-
-Syn uses the [proc-macro2] crate to emulate the compiler's procedural macro API
-in a stable way that works all the way back to Rust 1.15.0. This shim makes it
-possible to write code without regard for whether the current compiler version
-supports the features we use.
-
-In general all of your code should be written against proc-macro2 rather than
-proc-macro. The one exception is in the signatures of procedural macro entry
-points, which are required by the language to use `proc_macro::TokenStream`.
-
-The proc-macro2 crate will automatically detect and use the compiler's data
-structures on sufficiently new compilers.
-
-[proc-macro2]: https://github.com/alexcrichton/proc-macro2
-
-## License
-
-Licensed under either of
-
- * Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
- * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
-
-at your option.
-
-### Contribution
-
-Unless you explicitly state otherwise, any contribution intentionally submitted
-for inclusion in this crate by you, as defined in the Apache-2.0 license, shall
-be dual licensed as above, without any additional terms or conditions.
deleted file mode 100644
--- a/third_party/rust/syn-0.15.30/build.rs
+++ /dev/null
@@ -1,68 +0,0 @@
-use std::env;
-use std::process::Command;
-use std::str::{self, FromStr};
-
-// The rustc-cfg strings below are *not* public API. Please let us know by
-// opening a GitHub issue if your build environment requires some way to enable
-// these cfgs other than by executing our build script.
-fn main() {
-    let compiler = match rustc_version() {
-        Some(compiler) => compiler,
-        None => return,
-    };
-
-    if compiler.minor >= 19 {
-        println!("cargo:rustc-cfg=syn_can_use_thread_id");
-    }
-
-    // Macro modularization allows re-exporting the `quote!` macro in 1.30+.
-    if compiler.minor >= 30 {
-        println!("cargo:rustc-cfg=syn_can_call_macro_by_path");
-    }
-
-    if !compiler.nightly {
-        println!("cargo:rustc-cfg=syn_disable_nightly_tests");
-    }
-}
-
-struct Compiler {
-    minor: u32,
-    nightly: bool,
-}
-
-fn rustc_version() -> Option<Compiler> {
-    let rustc = match env::var_os("RUSTC") {
-        Some(rustc) => rustc,
-        None => return None,
-    };
-
-    let output = match Command::new(rustc).arg("--version").output() {
-        Ok(output) => output,
-        Err(_) => return None,
-    };
-
-    let version = match str::from_utf8(&output.stdout) {
-        Ok(version) => version,
-        Err(_) => return None,
-    };
-
-    let mut pieces = version.split('.');
-    if pieces.next() != Some("rustc 1") {
-        return None;
-    }
-
-    let next = match pieces.next() {
-        Some(next) => next,
-        None => return None,
-    };
-
-    let minor = match u32::from_str(next) {
-        Ok(minor) => minor,
-        Err(_) => return None,
-    };
-
-    Some(Compiler {
-        minor: minor,
-        nightly: version.contains("nightly"),
-    })
-}
deleted file mode 100644
--- a/third_party/rust/syn-0.15.30/src/attr.rs
+++ /dev/null
@@ -1,681 +0,0 @@
-use super::*;
-use punctuated::Punctuated;
-
-use std::iter;
-
-use proc_macro2::TokenStream;
-#[cfg(not(feature = "parsing"))]
-use proc_macro2::{Delimiter, Spacing, TokenTree};
-
-#[cfg(feature = "parsing")]
-use parse::{ParseStream, Result};
-#[cfg(feature = "extra-traits")]
-use std::hash::{Hash, Hasher};
-#[cfg(feature = "extra-traits")]
-use tt::TokenStreamHelper;
-
-ast_struct! {
-    /// An attribute like `#[repr(transparent)]`.
-    ///
-    /// *This type is available if Syn is built with the `"derive"` or `"full"`
-    /// feature.*
-    ///
-    /// # Syntax
-    ///
-    /// Rust has six types of attributes.
-    ///
-    /// - Outer attributes like `#[repr(transparent)]`. These appear outside or
-    ///   in front of the item they describe.
-    /// - Inner attributes like `#![feature(proc_macro)]`. These appear inside
-    ///   of the item they describe, usually a module.
-    /// - Outer doc comments like `/// # Example`.
-    /// - Inner doc comments like `//! Please file an issue`.
-    /// - Outer block comments `/** # Example */`.
-    /// - Inner block comments `/*! Please file an issue */`.
-    ///
-    /// The `style` field of type `AttrStyle` distinguishes whether an attribute
-    /// is outer or inner. Doc comments and block comments are promoted to
-    /// attributes, as this is how they are processed by the compiler and by
-    /// `macro_rules!` macros.
-    ///
-    /// The `path` field gives the possibly colon-delimited path against which
-    /// the attribute is resolved. It is equal to `"doc"` for desugared doc
-    /// comments. The `tts` field contains the rest of the attribute body as
-    /// tokens.
-    ///
-    /// ```text
-    /// #[derive(Copy)]      #[crate::precondition x < 5]
-    ///   ^^^^^^~~~~~~         ^^^^^^^^^^^^^^^^^^^ ~~~~~
-    ///    path  tts                   path         tts
-    /// ```
-    ///
-    /// Use the [`parse_meta`] method to try parsing the tokens of an attribute
-    /// into the structured representation that is used by convention across
-    /// most Rust libraries.
-    ///
-    /// [`parse_meta`]: #method.parse_meta
-    ///
-    /// # Parsing
-    ///
-    /// This type does not implement the [`Parse`] trait and thus cannot be
-    /// parsed directly by [`ParseStream::parse`]. Instead use
-    /// [`ParseStream::call`] with one of the two parser functions
-    /// [`Attribute::parse_outer`] or [`Attribute::parse_inner`] depending on
-    /// which you intend to parse.
-    ///
-    /// [`Parse`]: parse/trait.Parse.html
-    /// [`ParseStream::parse`]: parse/struct.ParseBuffer.html#method.parse
-    /// [`ParseStream::call`]: parse/struct.ParseBuffer.html#method.call
-    /// [`Attribute::parse_outer`]: #method.parse_outer
-    /// [`Attribute::parse_inner`]: #method.parse_inner
-    ///
-    /// ```edition2018
-    /// use syn::{Attribute, Ident, Result, Token};
-    /// use syn::parse::{Parse, ParseStream};
-    ///
-    /// // Parses a unit struct with attributes.
-    /// //
-    /// //     #[path = "s.tmpl"]
-    /// //     struct S;
-    /// struct UnitStruct {
-    ///     attrs: Vec<Attribute>,
-    ///     struct_token: Token![struct],
-    ///     name: Ident,
-    ///     semi_token: Token![;],
-    /// }
-    ///
-    /// impl Parse for UnitStruct {
-    ///     fn parse(input: ParseStream) -> Result<Self> {
-    ///         Ok(UnitStruct {
-    ///             attrs: input.call(Attribute::parse_outer)?,
-    ///             struct_token: input.parse()?,
-    ///             name: input.parse()?,
-    ///             semi_token: input.parse()?,
-    ///         })
-    ///     }
-    /// }
-    /// ```
-    pub struct Attribute #manual_extra_traits {
-        pub pound_token: Token![#],
-        pub style: AttrStyle,
-        pub bracket_token: token::Bracket,
-        pub path: Path,
-        pub tts: TokenStream,
-    }
-}
-
-#[cfg(feature = "extra-traits")]
-impl Eq for Attribute {}
-
-#[cfg(feature = "extra-traits")]
-impl PartialEq for Attribute {
-    fn eq(&self, other: &Self) -> bool {
-        self.style == other.style
-            && self.pound_token == other.pound_token
-            && self.bracket_token == other.bracket_token
-            && self.path == other.path
-            && TokenStreamHelper(&self.tts) == TokenStreamHelper(&other.tts)
-    }
-}
-
-#[cfg(feature = "extra-traits")]
-impl Hash for Attribute {
-    fn hash<H>(&self, state: &mut H)
-    where
-        H: Hasher,
-    {
-        self.style.hash(state);
-        self.pound_token.hash(state);
-        self.bracket_token.hash(state);
-        self.path.hash(state);
-        TokenStreamHelper(&self.tts).hash(state);
-    }
-}
-
-impl Attribute {
-    /// Parses the tokens after the path as a [`Meta`](enum.Meta.html) if
-    /// possible.
-    ///
-    /// Deprecated; use `parse_meta` instead.
-    #[doc(hidden)]
-    pub fn interpret_meta(&self) -> Option<Meta> {
-        #[cfg(feature = "parsing")]
-        {
-            self.parse_meta().ok()
-        }
-
-        #[cfg(not(feature = "parsing"))]
-        {
-            let name = if self.path.segments.len() == 1 {
-                &self.path.segments.first().unwrap().value().ident
-            } else {
-                return None;
-            };
-
-            if self.tts.is_empty() {
-                return Some(Meta::Word(name.clone()));
-            }
-
-            let tts = self.tts.clone().into_iter().collect::<Vec<_>>();
-
-            if tts.len() == 1 {
-                if let Some(meta) = Attribute::extract_meta_list(name.clone(), &tts[0]) {
-                    return Some(meta);
-                }
-            }
-
-            if tts.len() == 2 {
-                if let Some(meta) = Attribute::extract_name_value(name.clone(), &tts[0], &tts[1]) {
-                    return Some(meta);
-                }
-            }
-
-            None
-        }
-    }
-
-    /// Parses the tokens after the path as a [`Meta`](enum.Meta.html) if
-    /// possible.
-    #[cfg(feature = "parsing")]
-    pub fn parse_meta(&self) -> Result<Meta> {
-        if let Some(ref colon) = self.path.leading_colon {
-            return Err(Error::new(colon.spans[0], "expected meta identifier"));
-        }
-
-        let first_segment = self
-            .path
-            .segments
-            .first()
-            .expect("paths have at least one segment");
-        if let Some(colon) = first_segment.punct() {
-            return Err(Error::new(colon.spans[0], "expected meta value"));
-        }
-        let ident = first_segment.value().ident.clone();
-
-        let parser = |input: ParseStream| parsing::parse_meta_after_ident(ident, input);
-        parse::Parser::parse2(parser, self.tts.clone())
-    }
-
-    /// Parses zero or more outer attributes from the stream.
-    ///
-    /// *This function is available if Syn is built with the `"parsing"`
-    /// feature.*
-    #[cfg(feature = "parsing")]
-    pub fn parse_outer(input: ParseStream) -> Result<Vec<Self>> {
-        let mut attrs = Vec::new();
-        while input.peek(Token![#]) {
-            attrs.push(input.call(parsing::single_parse_outer)?);
-        }
-        Ok(attrs)
-    }
-
-    /// Parses zero or more inner attributes from the stream.
-    ///
-    /// *This function is available if Syn is built with the `"parsing"`
-    /// feature.*
-    #[cfg(feature = "parsing")]
-    pub fn parse_inner(input: ParseStream) -> Result<Vec<Self>> {
-        let mut attrs = Vec::new();
-        while input.peek(Token![#]) && input.peek2(Token![!]) {
-            attrs.push(input.call(parsing::single_parse_inner)?);
-        }
-        Ok(attrs)
-    }
-
-    #[cfg(not(feature = "parsing"))]
-    fn extract_meta_list(ident: Ident, tt: &TokenTree) -> Option<Meta> {
-        let g = match *tt {
-            TokenTree::Group(ref g) => g,
-            _ => return None,
-        };
-        if g.delimiter() != Delimiter::Parenthesis {
-            return None;
-        }
-        let tokens = g.stream().clone().into_iter().collect::<Vec<_>>();
-        let nested = match list_of_nested_meta_items_from_tokens(&tokens) {
-            Some(n) => n,
-            None => return None,
-        };
-        Some(Meta::List(MetaList {
-            paren_token: token::Paren(g.span()),
-            ident: ident,
-            nested: nested,
-        }))
-    }
-
-    #[cfg(not(feature = "parsing"))]
-    fn extract_name_value(ident: Ident, a: &TokenTree, b: &TokenTree) -> Option<Meta> {
-        let a = match *a {
-            TokenTree::Punct(ref o) => o,
-            _ => return None,
-        };
-        if a.spacing() != Spacing::Alone {
-            return None;
-        }
-        if a.as_char() != '=' {
-            return None;
-        }
-
-        match *b {
-            TokenTree::Literal(ref l) if !l.to_string().starts_with('/') => {
-                Some(Meta::NameValue(MetaNameValue {
-                    ident: ident,
-                    eq_token: Token![=]([a.span()]),
-                    lit: Lit::new(l.clone()),
-                }))
-            }
-            TokenTree::Ident(ref v) => match &v.to_string()[..] {
-                v @ "true" | v @ "false" => Some(Meta::NameValue(MetaNameValue {
-                    ident: ident,
-                    eq_token: Token![=]([a.span()]),
-                    lit: Lit::Bool(LitBool {
-                        value: v == "true",
-                        span: b.span(),
-                    }),
-                })),
-                _ => None,
-            },
-            _ => None,
-        }
-    }
-}
-
-#[cfg(not(feature = "parsing"))]
-fn nested_meta_item_from_tokens(tts: &[TokenTree]) -> Option<(NestedMeta, &[TokenTree])> {
-    assert!(!tts.is_empty());
-
-    match tts[0] {
-        TokenTree::Literal(ref lit) => {
-            if lit.to_string().starts_with('/') {
-                None
-            } else {
-                let lit = Lit::new(lit.clone());
-                Some((NestedMeta::Literal(lit), &tts[1..]))
-            }
-        }
-
-        TokenTree::Ident(ref ident) => {
-            if tts.len() >= 3 {
-                if let Some(meta) = Attribute::extract_name_value(ident.clone(), &tts[1], &tts[2]) {
-                    return Some((NestedMeta::Meta(meta), &tts[3..]));
-                }
-            }
-
-            if tts.len() >= 2 {
-                if let Some(meta) = Attribute::extract_meta_list(ident.clone(), &tts[1]) {
-                    return Some((NestedMeta::Meta(meta), &tts[2..]));
-                }
-            }
-
-            let nested_meta = if ident == "true" || ident == "false" {
-                NestedMeta::Literal(Lit::Bool(LitBool {
-                    value: ident == "true",
-                    span: ident.span(),
-                }))
-            } else {
-                NestedMeta::Meta(Meta::Word(ident.clone()))
-            };
-            Some((nested_meta, &tts[1..]))
-        }
-
-        _ => None,
-    }
-}
-
-#[cfg(not(feature = "parsing"))]
-fn list_of_nested_meta_items_from_tokens(
-    mut tts: &[TokenTree],
-) -> Option<Punctuated<NestedMeta, Token![,]>> {
-    let mut nested_meta_items = Punctuated::new();
-    let mut first = true;
-
-    while !tts.is_empty() {
-        let prev_comma = if first {
-            first = false;
-            None
-        } else if let TokenTree::Punct(ref op) = tts[0] {
-            if op.spacing() != Spacing::Alone {
-                return None;
-            }
-            if op.as_char() != ',' {
-                return None;
-            }
-            let tok = Token![,]([op.span()]);
-            tts = &tts[1..];
-            if tts.is_empty() {
-                break;
-            }
-            Some(tok)
-        } else {
-            return None;
-        };
-        let (nested, rest) = match nested_meta_item_from_tokens(tts) {
-            Some(pair) => pair,
-            None => return None,
-        };
-        if let Some(comma) = prev_comma {
-            nested_meta_items.push_punct(comma);
-        }
-        nested_meta_items.push_value(nested);
-        tts = rest;
-    }
-
-    Some(nested_meta_items)
-}
-
-ast_enum! {
-    /// Distinguishes between attributes that decorate an item and attributes
-    /// that are contained within an item.
-    ///
-    /// *This type is available if Syn is built with the `"derive"` or `"full"`
-    /// feature.*
-    ///
-    /// # Outer attributes
-    ///
-    /// - `#[repr(transparent)]`
-    /// - `/// # Example`
-    /// - `/** Please file an issue */`
-    ///
-    /// # Inner attributes
-    ///
-    /// - `#![feature(proc_macro)]`
-    /// - `//! # Example`
-    /// - `/*! Please file an issue */`
-    #[cfg_attr(feature = "clone-impls", derive(Copy))]
-    pub enum AttrStyle {
-        Outer,
-        Inner(Token![!]),
-    }
-}
-
-ast_enum_of_structs! {
-    /// Content of a compile-time structured attribute.
-    ///
-    /// *This type is available if Syn is built with the `"derive"` or `"full"`
-    /// feature.*
-    ///
-    /// ## Word
-    ///
-    /// A meta word is like the `test` in `#[test]`.
-    ///
-    /// ## List
-    ///
-    /// A meta list is like the `derive(Copy)` in `#[derive(Copy)]`.
-    ///
-    /// ## NameValue
-    ///
-    /// A name-value meta is like the `path = "..."` in `#[path =
-    /// "sys/windows.rs"]`.
-    ///
-    /// # Syntax tree enum
-    ///
-    /// This type is a [syntax tree enum].
-    ///
-    /// [syntax tree enum]: enum.Expr.html#syntax-tree-enums
-    pub enum Meta {
-        pub Word(Ident),
-        /// A structured list within an attribute, like `derive(Copy, Clone)`.
-        ///
-        /// *This type is available if Syn is built with the `"derive"` or
-        /// `"full"` feature.*
-        pub List(MetaList {
-            pub ident: Ident,
-            pub paren_token: token::Paren,
-            pub nested: Punctuated<NestedMeta, Token![,]>,
-        }),
-        /// A name-value pair within an attribute, like `feature = "nightly"`.
-        ///
-        /// *This type is available if Syn is built with the `"derive"` or
-        /// `"full"` feature.*
-        pub NameValue(MetaNameValue {
-            pub ident: Ident,
-            pub eq_token: Token![=],
-            pub lit: Lit,
-        }),
-    }
-}
-
-impl Meta {
-    /// Returns the identifier that begins this structured meta item.
-    ///
-    /// For example this would return the `test` in `#[test]`, the `derive` in
-    /// `#[derive(Copy)]`, and the `path` in `#[path = "sys/windows.rs"]`.
-    pub fn name(&self) -> Ident {
-        match *self {
-            Meta::Word(ref meta) => meta.clone(),
-            Meta::List(ref meta) => meta.ident.clone(),
-            Meta::NameValue(ref meta) => meta.ident.clone(),
-        }
-    }
-}
-
-ast_enum_of_structs! {
-    /// Element of a compile-time attribute list.
-    ///
-    /// *This type is available if Syn is built with the `"derive"` or `"full"`
-    /// feature.*
-    pub enum NestedMeta {
-        /// A structured meta item, like the `Copy` in `#[derive(Copy)]` which
-        /// would be a nested `Meta::Word`.
-        pub Meta(Meta),
-
-        /// A Rust literal, like the `"new_name"` in `#[rename("new_name")]`.
-        pub Literal(Lit),
-    }
-}
-
-/// Conventional argument type associated with an invocation of an attribute
-/// macro.
-///
-/// For example if we are developing an attribute macro that is intended to be
-/// invoked on function items as follows:
-///
-/// ```edition2018
-/// # const IGNORE: &str = stringify! {
-/// #[my_attribute(path = "/v1/refresh")]
-/// # };
-/// pub fn refresh() {
-///     /* ... */
-/// }
-/// ```
-///
-/// The implementation of this macro would want to parse its attribute arguments
-/// as type `AttributeArgs`.
-///
-/// ```edition2018
-/// extern crate proc_macro;
-///
-/// use proc_macro::TokenStream;
-/// use syn::{parse_macro_input, AttributeArgs, ItemFn};
-///
-/// # const IGNORE: &str = stringify! {
-/// #[proc_macro_attribute]
-/// # };
-/// pub fn my_attribute(args: TokenStream, input: TokenStream) -> TokenStream {
-///     let args = parse_macro_input!(args as AttributeArgs);
-///     let input = parse_macro_input!(input as ItemFn);
-///
-///     /* ... */
-/// #   "".parse().unwrap()
-/// }
-/// ```
-pub type AttributeArgs = Vec<NestedMeta>;
-
-pub trait FilterAttrs<'a> {
-    type Ret: Iterator<Item = &'a Attribute>;
-
-    fn outer(self) -> Self::Ret;
-    fn inner(self) -> Self::Ret;
-}
-
-impl<'a, T> FilterAttrs<'a> for T
-where
-    T: IntoIterator<Item = &'a Attribute>,
-{
-    type Ret = iter::Filter<T::IntoIter, fn(&&Attribute) -> bool>;
-
-    fn outer(self) -> Self::Ret {
-        #[cfg_attr(feature = "cargo-clippy", allow(trivially_copy_pass_by_ref))]
-        fn is_outer(attr: &&Attribute) -> bool {
-            match attr.style {
-                AttrStyle::Outer => true,
-                _ => false,
-            }
-        }
-        self.into_iter().filter(is_outer)
-    }
-
-    fn inner(self) -> Self::Ret {
-        #[cfg_attr(feature = "cargo-clippy", allow(trivially_copy_pass_by_ref))]
-        fn is_inner(attr: &&Attribute) -> bool {
-            match attr.style {
-                AttrStyle::Inner(_) => true,
-                _ => false,
-            }
-        }
-        self.into_iter().filter(is_inner)
-    }
-}
-
-#[cfg(feature = "parsing")]
-pub mod parsing {
-    use super::*;
-
-    use ext::IdentExt;
-    use parse::{Parse, ParseStream, Result};
-    #[cfg(feature = "full")]
-    use private;
-
-    pub fn single_parse_inner(input: ParseStream) -> Result<Attribute> {
-        let content;
-        Ok(Attribute {
-            pound_token: input.parse()?,
-            style: AttrStyle::Inner(input.parse()?),
-            bracket_token: bracketed!(content in input),
-            path: content.call(Path::parse_mod_style)?,
-            tts: content.parse()?,
-        })
-    }
-
-    pub fn single_parse_outer(input: ParseStream) -> Result<Attribute> {
-        let content;
-        Ok(Attribute {
-            pound_token: input.parse()?,
-            style: AttrStyle::Outer,
-            bracket_token: bracketed!(content in input),
-            path: content.call(Path::parse_mod_style)?,
-            tts: content.parse()?,
-        })
-    }
-
-    #[cfg(feature = "full")]
-    impl private {
-        pub fn attrs(outer: Vec<Attribute>, inner: Vec<Attribute>) -> Vec<Attribute> {
-            let mut attrs = outer;
-            attrs.extend(inner);
-            attrs
-        }
-    }
-
-    impl Parse for Meta {
-        fn parse(input: ParseStream) -> Result<Self> {
-            let ident = input.call(Ident::parse_any)?;
-            parse_meta_after_ident(ident, input)
-        }
-    }
-
-    impl Parse for MetaList {
-        fn parse(input: ParseStream) -> Result<Self> {
-            let ident = input.call(Ident::parse_any)?;
-            parse_meta_list_after_ident(ident, input)
-        }
-    }
-
-    impl Parse for MetaNameValue {
-        fn parse(input: ParseStream) -> Result<Self> {
-            let ident = input.call(Ident::parse_any)?;
-            parse_meta_name_value_after_ident(ident, input)
-        }
-    }
-
-    impl Parse for NestedMeta {
-        fn parse(input: ParseStream) -> Result<Self> {
-            let ahead = input.fork();
-
-            if ahead.peek(Lit) && !(ahead.peek(LitBool) && ahead.peek2(Token![=])) {
-                input.parse().map(NestedMeta::Literal)
-            } else if ahead.call(Ident::parse_any).is_ok() {
-                input.parse().map(NestedMeta::Meta)
-            } else {
-                Err(input.error("expected identifier or literal"))
-            }
-        }
-    }
-
-    pub fn parse_meta_after_ident(ident: Ident, input: ParseStream) -> Result<Meta> {
-        if input.peek(token::Paren) {
-            parse_meta_list_after_ident(ident, input).map(Meta::List)
-        } else if input.peek(Token![=]) {
-            parse_meta_name_value_after_ident(ident, input).map(Meta::NameValue)
-        } else {
-            Ok(Meta::Word(ident))
-        }
-    }
-
-    fn parse_meta_list_after_ident(ident: Ident, input: ParseStream) -> Result<MetaList> {
-        let content;
-        Ok(MetaList {
-            ident: ident,
-            paren_token: parenthesized!(content in input),
-            nested: content.parse_terminated(NestedMeta::parse)?,
-        })
-    }
-
-    fn parse_meta_name_value_after_ident(
-        ident: Ident,
-        input: ParseStream,
-    ) -> Result<MetaNameValue> {
-        Ok(MetaNameValue {
-            ident: ident,
-            eq_token: input.parse()?,
-            lit: input.parse()?,
-        })
-    }
-}
-
-#[cfg(feature = "printing")]
-mod printing {
-    use super::*;
-    use proc_macro2::TokenStream;
-    use quote::ToTokens;
-
-    impl ToTokens for Attribute {
-        fn to_tokens(&self, tokens: &mut TokenStream) {
-            self.pound_token.to_tokens(tokens);
-            if let AttrStyle::Inner(ref b) = self.style {
-                b.to_tokens(tokens);
-            }
-            self.bracket_token.surround(tokens, |tokens| {
-                self.path.to_tokens(tokens);
-                self.tts.to_tokens(tokens);
-            });
-        }
-    }
-
-    impl ToTokens for MetaList {
-        fn to_tokens(&self, tokens: &mut TokenStream) {
-            self.ident.to_tokens(tokens);
-            self.paren_token.surround(tokens, |tokens| {
-                self.nested.to_tokens(tokens);
-            })
-        }
-    }
-
-    impl ToTokens for MetaNameValue {
-        fn to_tokens(&self, tokens: &mut TokenStream) {
-            self.ident.to_tokens(tokens);
-            self.eq_token.to_tokens(tokens);
-            self.lit.to_tokens(tokens);
-        }
-    }
-}
deleted file mode 100644
--- a/third_party/rust/syn-0.15.30/src/buffer.rs
+++ /dev/null
@@ -1,366 +0,0 @@
-//! A stably addressed token buffer supporting efficient traversal based on a
-//! cheaply copyable cursor.
-//!
-//! *This module is available if Syn is built with the `"parsing"` feature.*
-
-// This module is heavily commented as it contains most of the unsafe code in
-// Syn, and caution should be used when editing it. The public-facing interface
-// is 100% safe but the implementation is fragile internally.
-
-#[cfg(all(
-    not(all(target_arch = "wasm32", target_os = "unknown")),
-    feature = "proc-macro"
-))]
-use proc_macro as pm;
-use proc_macro2::{Delimiter, Group, Ident, Literal, Punct, Spacing, Span, TokenStream, TokenTree};
-
-use std::marker::PhantomData;
-use std::ptr;
-
-use private;
-use Lifetime;
-
-/// Internal type which is used instead of `TokenTree` to represent a token tree
-/// within a `TokenBuffer`.
-enum Entry {
-    // Mimicking types from proc-macro.
-    Group(Group, TokenBuffer),
-    Ident(Ident),
-    Punct(Punct),
-    Literal(Literal),
-    // End entries contain a raw pointer to the entry from the containing
-    // token tree, or null if this is the outermost level.
-    End(*const Entry),
-}
-
-/// A buffer that can be efficiently traversed multiple times, unlike
-/// `TokenStream` which requires a deep copy in order to traverse more than
-/// once.
-///
-/// *This type is available if Syn is built with the `"parsing"` feature.*
-pub struct TokenBuffer {
-    // NOTE: Do not derive clone on this - there are raw pointers inside which
-    // will be messed up. Moving the `TokenBuffer` itself is safe as the actual
-    // backing slices won't be moved.
-    data: Box<[Entry]>,
-}
-
-impl TokenBuffer {
-    // NOTE: DO NOT MUTATE THE `Vec` RETURNED FROM THIS FUNCTION ONCE IT
-    // RETURNS, THE ADDRESS OF ITS BACKING MEMORY MUST REMAIN STABLE.
-    fn inner_new(stream: TokenStream, up: *const Entry) -> TokenBuffer {
-        // Build up the entries list, recording the locations of any Groups
-        // in the list to be processed later.
-        let mut entries = Vec::new();
-        let mut seqs = Vec::new();
-        for tt in stream {
-            match tt {
-                TokenTree::Ident(sym) => {
-                    entries.push(Entry::Ident(sym));
-                }
-                TokenTree::Punct(op) => {
-                    entries.push(Entry::Punct(op));
-                }
-                TokenTree::Literal(l) => {
-                    entries.push(Entry::Literal(l));
-                }
-                TokenTree::Group(g) => {
-                    // Record the index of the interesting entry, and store an
-                    // `End(null)` there temporarially.
-                    seqs.push((entries.len(), g));
-                    entries.push(Entry::End(ptr::null()));
-                }
-            }
-        }
-        // Add an `End` entry to the end with a reference to the enclosing token
-        // stream which was passed in.
-        entries.push(Entry::End(up));
-
-        // NOTE: This is done to ensure that we don't accidentally modify the
-        // length of the backing buffer. The backing buffer must remain at a
-        // constant address after this point, as we are going to store a raw
-        // pointer into it.
-        let mut entries = entries.into_boxed_slice();
-        for (idx, group) in seqs {
-            // We know that this index refers to one of the temporary
-            // `End(null)` entries, and we know that the last entry is
-            // `End(up)`, so the next index is also valid.
-            let seq_up = &entries[idx + 1] as *const Entry;
-
-            // The end entry stored at the end of this Entry::Group should
-            // point to the Entry which follows the Group in the list.
-            let inner = Self::inner_new(group.stream(), seq_up);
-            entries[idx] = Entry::Group(group, inner);
-        }
-
-        TokenBuffer { data: entries }
-    }
-
-    /// Creates a `TokenBuffer` containing all the tokens from the input
-    /// `TokenStream`.
-    ///
-    /// *This method is available if Syn is built with both the `"parsing"` and
-    /// `"proc-macro"` features.*
-    #[cfg(all(
-        not(all(target_arch = "wasm32", target_os = "unknown")),
-        feature = "proc-macro"
-    ))]
-    pub fn new(stream: pm::TokenStream) -> TokenBuffer {
-        Self::new2(stream.into())
-    }
-
-    /// Creates a `TokenBuffer` containing all the tokens from the input
-    /// `TokenStream`.
-    pub fn new2(stream: TokenStream) -> TokenBuffer {
-        Self::inner_new(stream, ptr::null())
-    }
-
-    /// Creates a cursor referencing the first token in the buffer and able to
-    /// traverse until the end of the buffer.
-    pub fn begin(&self) -> Cursor {
-        unsafe { Cursor::create(&self.data[0], &self.data[self.data.len() - 1]) }
-    }
-}
-
-/// A cheaply copyable cursor into a `TokenBuffer`.
-///
-/// This cursor holds a shared reference into the immutable data which is used
-/// internally to represent a `TokenStream`, and can be efficiently manipulated
-/// and copied around.
-///
-/// An empty `Cursor` can be created directly, or one may create a `TokenBuffer`
-/// object and get a cursor to its first token with `begin()`.
-///
-/// Two cursors are equal if they have the same location in the same input
-/// stream, and have the same scope.
-///
-/// *This type is available if Syn is built with the `"parsing"` feature.*
-#[derive(Copy, Clone, Eq, PartialEq)]
-pub struct Cursor<'a> {
-    // The current entry which the `Cursor` is pointing at.
-    ptr: *const Entry,
-    // This is the only `Entry::End(..)` object which this cursor is allowed to
-    // point at. All other `End` objects are skipped over in `Cursor::create`.
-    scope: *const Entry,
-    // Cursor is covariant in 'a. This field ensures that our pointers are still
-    // valid.
-    marker: PhantomData<&'a Entry>,
-}
-
-impl<'a> Cursor<'a> {
-    /// Creates a cursor referencing a static empty TokenStream.
-    pub fn empty() -> Self {
-        // It's safe in this situation for us to put an `Entry` object in global
-        // storage, despite it not actually being safe to send across threads
-        // (`Ident` is a reference into a thread-local table). This is because
-        // this entry never includes a `Ident` object.
-        //
-        // This wrapper struct allows us to break the rules and put a `Sync`
-        // object in global storage.
-        struct UnsafeSyncEntry(Entry);
-        unsafe impl Sync for UnsafeSyncEntry {}
-        static EMPTY_ENTRY: UnsafeSyncEntry = UnsafeSyncEntry(Entry::End(0 as *const Entry));
-
-        Cursor {
-            ptr: &EMPTY_ENTRY.0,
-            scope: &EMPTY_ENTRY.0,
-            marker: PhantomData,
-        }
-    }
-
-    /// This create method intelligently exits non-explicitly-entered
-    /// `None`-delimited scopes when the cursor reaches the end of them,
-    /// allowing for them to be treated transparently.
-    unsafe fn create(mut ptr: *const Entry, scope: *const Entry) -> Self {
-        // NOTE: If we're looking at a `End(..)`, we want to advance the cursor
-        // past it, unless `ptr == scope`, which means that we're at the edge of
-        // our cursor's scope. We should only have `ptr != scope` at the exit
-        // from None-delimited groups entered with `ignore_none`.
-        while let Entry::End(exit) = *ptr {
-            if ptr == scope {
-                break;
-            }
-            ptr = exit;
-        }
-
-        Cursor {
-            ptr: ptr,
-            scope: scope,
-            marker: PhantomData,
-        }
-    }
-
-    /// Get the current entry.
-    fn entry(self) -> &'a Entry {
-        unsafe { &*self.ptr }
-    }
-
-    /// Bump the cursor to point at the next token after the current one. This
-    /// is undefined behavior if the cursor is currently looking at an
-    /// `Entry::End`.
-    unsafe fn bump(self) -> Cursor<'a> {
-        Cursor::create(self.ptr.offset(1), self.scope)
-    }
-
-    /// If the cursor is looking at a `None`-delimited group, move it to look at
-    /// the first token inside instead. If the group is empty, this will move
-    /// the cursor past the `None`-delimited group.
-    ///
-    /// WARNING: This mutates its argument.
-    fn ignore_none(&mut self) {
-        if let Entry::Group(ref group, ref buf) = *self.entry() {
-            if group.delimiter() == Delimiter::None {
-                // NOTE: We call `Cursor::create` here to make sure that
-                // situations where we should immediately exit the span after
-                // entering it are handled correctly.
-                unsafe {
-                    *self = Cursor::create(&buf.data[0], self.scope);
-                }
-            }
-        }
-    }
-
-    /// Checks whether the cursor is currently pointing at the end of its valid
-    /// scope.
-    #[inline]
-    pub fn eof(self) -> bool {
-        // We're at eof if we're at the end of our scope.
-        self.ptr == self.scope
-    }
-
-    /// If the cursor is pointing at a `Group` with the given delimiter, returns
-    /// a cursor into that group and one pointing to the next `TokenTree`.
-    pub fn group(mut self, delim: Delimiter) -> Option<(Cursor<'a>, Span, Cursor<'a>)> {
-        // If we're not trying to enter a none-delimited group, we want to
-        // ignore them. We have to make sure to _not_ ignore them when we want
-        // to enter them, of course. For obvious reasons.
-        if delim != Delimiter::None {
-            self.ignore_none();
-        }
-
-        if let Entry::Group(ref group, ref buf) = *self.entry() {
-            if group.delimiter() == delim {
-                return Some((buf.begin(), group.span(), unsafe { self.bump() }));
-            }
-        }
-
-        None
-    }
-
-    /// If the cursor is pointing at a `Ident`, returns it along with a cursor
-    /// pointing at the next `TokenTree`.
-    pub fn ident(mut self) -> Option<(Ident, Cursor<'a>)> {
-        self.ignore_none();
-        match *self.entry() {
-            Entry::Ident(ref ident) => Some((ident.clone(), unsafe { self.bump() })),
-            _ => None,
-        }
-    }
-
-    /// If the cursor is pointing at an `Punct`, returns it along with a cursor
-    /// pointing at the next `TokenTree`.
-    pub fn punct(mut self) -> Option<(Punct, Cursor<'a>)> {
-        self.ignore_none();
-        match *self.entry() {
-            Entry::Punct(ref op) if op.as_char() != '\'' => {
-                Some((op.clone(), unsafe { self.bump() }))
-            }
-            _ => None,
-        }
-    }
-
-    /// If the cursor is pointing at a `Literal`, return it along with a cursor
-    /// pointing at the next `TokenTree`.
-    pub fn literal(mut self) -> Option<(Literal, Cursor<'a>)> {
-        self.ignore_none();
-        match *self.entry() {
-            Entry::Literal(ref lit) => Some((lit.clone(), unsafe { self.bump() })),
-            _ => None,
-        }
-    }
-
-    /// If the cursor is pointing at a `Lifetime`, returns it along with a
-    /// cursor pointing at the next `TokenTree`.
-    pub fn lifetime(mut self) -> Option<(Lifetime, Cursor<'a>)> {
-        self.ignore_none();
-        match *self.entry() {
-            Entry::Punct(ref op) if op.as_char() == '\'' && op.spacing() == Spacing::Joint => {
-                let next = unsafe { self.bump() };
-                match next.ident() {
-                    Some((ident, rest)) => {
-                        let lifetime = Lifetime {
-                            apostrophe: op.span(),
-                            ident: ident,
-                        };
-                        Some((lifetime, rest))
-                    }
-                    None => None,
-                }
-            }
-            _ => None,
-        }
-    }
-
-    /// Copies all remaining tokens visible from this cursor into a
-    /// `TokenStream`.
-    pub fn token_stream(self) -> TokenStream {
-        let mut tts = Vec::new();
-        let mut cursor = self;
-        while let Some((tt, rest)) = cursor.token_tree() {
-            tts.push(tt);
-            cursor = rest;
-        }
-        tts.into_iter().collect()
-    }
-
-    /// If the cursor is pointing at a `TokenTree`, returns it along with a
-    /// cursor pointing at the next `TokenTree`.
-    ///
-    /// Returns `None` if the cursor has reached the end of its stream.
-    ///
-    /// This method does not treat `None`-delimited groups as transparent, and
-    /// will return a `Group(None, ..)` if the cursor is looking at one.
-    pub fn token_tree(self) -> Option<(TokenTree, Cursor<'a>)> {
-        let tree = match *self.entry() {
-            Entry::Group(ref group, _) => group.clone().into(),
-            Entry::Literal(ref lit) => lit.clone().into(),
-            Entry::Ident(ref ident) => ident.clone().into(),
-            Entry::Punct(ref op) => op.clone().into(),
-            Entry::End(..) => {
-                return None;
-            }
-        };
-
-        Some((tree, unsafe { self.bump() }))
-    }
-
-    /// Returns the `Span` of the current token, or `Span::call_site()` if this
-    /// cursor points to eof.
-    pub fn span(self) -> Span {
-        match *self.entry() {
-            Entry::Group(ref group, _) => group.span(),
-            Entry::Literal(ref l) => l.span(),
-            Entry::Ident(ref t) => t.span(),
-            Entry::Punct(ref o) => o.span(),
-            Entry::End(..) => Span::call_site(),
-        }
-    }
-}
-
-impl private {
-    #[cfg(procmacro2_semver_exempt)]
-    pub fn open_span_of_group(cursor: Cursor) -> Span {
-        match *cursor.entry() {
-            Entry::Group(ref group, _) => group.span_open(),
-            _ => cursor.span(),
-        }
-    }
-
-    #[cfg(procmacro2_semver_exempt)]
-    pub fn close_span_of_group(cursor: Cursor) -> Span {
-        match *cursor.entry() {
-            Entry::Group(ref group, _) => group.span_close(),
-            _ => cursor.span(),
-        }
-    }
-}
deleted file mode 100644
--- a/third_party/rust/syn-0.15.30/src/data.rs
+++ /dev/null
@@ -1,384 +0,0 @@
-use super::*;
-use punctuated::Punctuated;
-
-ast_struct! {
-    /// An enum variant.
-    ///
-    /// *This type is available if Syn is built with the `"derive"` or `"full"`
-    /// feature.*
-    pub struct Variant {
-        /// Attributes tagged on the variant.
-        pub attrs: Vec<Attribute>,
-
-        /// Name of the variant.
-        pub ident: Ident,
-
-        /// Content stored in the variant.
-        pub fields: Fields,
-
-        /// Explicit discriminant: `Variant = 1`
-        pub discriminant: Option<(Token![=], Expr)>,
-    }
-}
-
-ast_enum_of_structs! {
-    /// Data stored within an enum variant or struct.
-    ///
-    /// *This type is available if Syn is built with the `"derive"` or `"full"`
-    /// feature.*
-    ///
-    /// # Syntax tree enum
-    ///
-    /// This type is a [syntax tree enum].
-    ///
-    /// [syntax tree enum]: enum.Expr.html#syntax-tree-enums
-    pub enum Fields {
-        /// Named fields of a struct or struct variant such as `Point { x: f64,
-        /// y: f64 }`.
-        ///
-        /// *This type is available if Syn is built with the `"derive"` or
-        /// `"full"` feature.*
-        pub Named(FieldsNamed {
-            pub brace_token: token::Brace,
-            pub named: Punctuated<Field, Token![,]>,
-        }),
-
-        /// Unnamed fields of a tuple struct or tuple variant such as `Some(T)`.
-        ///
-        /// *This type is available if Syn is built with the `"derive"` or
-        /// `"full"` feature.*
-        pub Unnamed(FieldsUnnamed {
-            pub paren_token: token::Paren,
-            pub unnamed: Punctuated<Field, Token![,]>,
-        }),
-
-        /// Unit struct or unit variant such as `None`.
-        pub Unit,
-    }
-}
-
-impl Fields {
-    /// Get an iterator over the borrowed [`Field`] items in this object. This
-    /// iterator can be used to iterate over a named or unnamed struct or
-    /// variant's fields uniformly.
-    ///
-    /// [`Field`]: struct.Field.html
-    pub fn iter(&self) -> punctuated::Iter<Field> {
-        match *self {
-            Fields::Unit => private::empty_punctuated_iter(),
-            Fields::Named(ref f) => f.named.iter(),
-            Fields::Unnamed(ref f) => f.unnamed.iter(),
-        }
-    }
-
-    /// Get an iterator over the mutably borrowed [`Field`] items in this
-    /// object. This iterator can be used to iterate over a named or unnamed
-    /// struct or variant's fields uniformly.
-    ///
-    /// [`Field`]: struct.Field.html
-    pub fn iter_mut(&mut self) -> punctuated::IterMut<Field> {
-        match *self {
-            Fields::Unit => private::empty_punctuated_iter_mut(),
-            Fields::Named(ref mut f) => f.named.iter_mut(),
-            Fields::Unnamed(ref mut f) => f.unnamed.iter_mut(),
-        }
-    }
-}
-
-impl<'a> IntoIterator for &'a Fields {
-    type Item = &'a Field;
-    type IntoIter = punctuated::Iter<'a, Field>;
-
-    fn into_iter(self) -> Self::IntoIter {
-        self.iter()
-    }
-}
-
-impl<'a> IntoIterator for &'a mut Fields {
-    type Item = &'a mut Field;
-    type IntoIter = punctuated::IterMut<'a, Field>;
-
-    fn into_iter(self) -> Self::IntoIter {
-        self.iter_mut()
-    }
-}
-
-ast_struct! {
-    /// A field of a struct or enum variant.
-    ///
-    /// *This type is available if Syn is built with the `"derive"` or `"full"`
-    /// feature.*
-    pub struct Field {
-        /// Attributes tagged on the field.
-        pub attrs: Vec<Attribute>,
-
-        /// Visibility of the field.
-        pub vis: Visibility,
-
-        /// Name of the field, if any.
-        ///
-        /// Fields of tuple structs have no names.
-        pub ident: Option<Ident>,
-
-        pub colon_token: Option<Token![:]>,
-
-        /// Type of the field.
-        pub ty: Type,
-    }
-}
-
-ast_enum_of_structs! {
-    /// The visibility level of an item: inherited or `pub` or
-    /// `pub(restricted)`.
-    ///
-    /// *This type is available if Syn is built with the `"derive"` or `"full"`
-    /// feature.*
-    ///
-    /// # Syntax tree enum
-    ///
-    /// This type is a [syntax tree enum].
-    ///
-    /// [syntax tree enum]: enum.Expr.html#syntax-tree-enums
-    pub enum Visibility {
-        /// A public visibility level: `pub`.
-        ///
-        /// *This type is available if Syn is built with the `"derive"` or
-        /// `"full"` feature.*
-        pub Public(VisPublic {
-            pub pub_token: Token![pub],
-        }),
-
-        /// A crate-level visibility: `crate`.
-        ///
-        /// *This type is available if Syn is built with the `"derive"` or
-        /// `"full"` feature.*
-        pub Crate(VisCrate {
-            pub crate_token: Token![crate],
-        }),
-
-        /// A visibility level restricted to some path: `pub(self)` or
-        /// `pub(super)` or `pub(crate)` or `pub(in some::module)`.
-        ///
-        /// *This type is available if Syn is built with the `"derive"` or
-        /// `"full"` feature.*
-        pub Restricted(VisRestricted {
-            pub pub_token: Token![pub],
-            pub paren_token: token::Paren,
-            pub in_token: Option<Token![in]>,
-            pub path: Box<Path>,
-        }),
-
-        /// An inherited visibility, which usually means private.
-        pub Inherited,
-    }
-}
-
-#[cfg(feature = "parsing")]
-pub mod parsing {
-    use super::*;
-
-    use ext::IdentExt;
-    use parse::{Parse, ParseStream, Result};
-
-    impl Parse for Variant {
-        fn parse(input: ParseStream) -> Result<Self> {
-            Ok(Variant {
-                attrs: input.call(Attribute::parse_outer)?,
-                ident: input.parse()?,
-                fields: {
-                    if input.peek(token::Brace) {
-                        Fields::Named(input.parse()?)
-                    } else if input.peek(token::Paren) {
-                        Fields::Unnamed(input.parse()?)
-                    } else {
-                        Fields::Unit
-                    }
-                },
-                discriminant: {
-                    if input.peek(Token![=]) {
-                        let eq_token: Token![=] = input.parse()?;
-                        let discriminant: Expr = input.parse()?;
-                        Some((eq_token, discriminant))
-                    } else {
-                        None
-                    }
-                },
-            })
-        }
-    }
-
-    impl Parse for FieldsNamed {
-        fn parse(input: ParseStream) -> Result<Self> {
-            let content;
-            Ok(FieldsNamed {
-                brace_token: braced!(content in input),
-                named: content.parse_terminated(Field::parse_named)?,
-            })
-        }
-    }
-
-    impl Parse for FieldsUnnamed {
-        fn parse(input: ParseStream) -> Result<Self> {
-            let content;
-            Ok(FieldsUnnamed {
-                paren_token: parenthesized!(content in input),
-                unnamed: content.parse_terminated(Field::parse_unnamed)?,
-            })
-        }
-    }
-
-    impl Field {
-        /// Parses a named (braced struct) field.
-        pub fn parse_named(input: ParseStream) -> Result<Self> {
-            Ok(Field {
-                attrs: input.call(Attribute::parse_outer)?,
-                vis: input.parse()?,
-                ident: Some(input.parse()?),
-                colon_token: Some(input.parse()?),
-                ty: input.parse()?,
-            })
-        }
-
-        /// Parses an unnamed (tuple struct) field.
-        pub fn parse_unnamed(input: ParseStream) -> Result<Self> {
-            Ok(Field {
-                attrs: input.call(Attribute::parse_outer)?,
-                vis: input.parse()?,
-                ident: None,
-                colon_token: None,
-                ty: input.parse()?,
-            })
-        }
-    }
-
-    impl Parse for Visibility {
-        fn parse(input: ParseStream) -> Result<Self> {
-            if input.peek(Token![pub]) {
-                Self::parse_pub(input)
-            } else if input.peek(Token![crate]) {
-                Self::parse_crate(input)
-            } else {
-                Ok(Visibility::Inherited)
-            }
-        }
-    }
-
-    impl Visibility {
-        fn parse_pub(input: ParseStream) -> Result<Self> {
-            let pub_token = input.parse::<Token![pub]>()?;
-
-            if input.peek(token::Paren) {
-                let ahead = input.fork();
-                let mut content;
-                parenthesized!(content in ahead);
-
-                if content.peek(Token![crate])
-                    || content.peek(Token![self])
-                    || content.peek(Token![super])
-                {
-                    return Ok(Visibility::Restricted(VisRestricted {
-                        pub_token: pub_token,
-                        paren_token: parenthesized!(content in input),
-                        in_token: None,
-                        path: Box::new(Path::from(content.call(Ident::parse_any)?)),
-                    }));
-                } else if content.peek(Token![in]) {
-                    return Ok(Visibility::Restricted(VisRestricted {
-                        pub_token: pub_token,
-                        paren_token: parenthesized!(content in input),
-                        in_token: Some(content.parse()?),
-                        path: Box::new(content.call(Path::parse_mod_style)?),
-                    }));
-                }
-            }
-
-            Ok(Visibility::Public(VisPublic {
-                pub_token: pub_token,
-            }))
-        }
-
-        fn parse_crate(input: ParseStream) -> Result<Self> {
-            if input.peek2(Token![::]) {
-                Ok(Visibility::Inherited)
-            } else {
-                Ok(Visibility::Crate(VisCrate {
-                    crate_token: input.parse()?,
-                }))
-            }
-        }
-    }
-}
-
-#[cfg(feature = "printing")]
-mod printing {
-    use super::*;
-
-    use proc_macro2::TokenStream;
-    use quote::{ToTokens, TokenStreamExt};
-
-    use print::TokensOrDefault;
-
-    impl ToTokens for Variant {
-        fn to_tokens(&self, tokens: &mut TokenStream) {
-            tokens.append_all(&self.attrs);
-            self.ident.to_tokens(tokens);
-            self.fields.to_tokens(tokens);
-            if let Some((ref eq_token, ref disc)) = self.discriminant {
-                eq_token.to_tokens(tokens);
-                disc.to_tokens(tokens);
-            }
-        }
-    }
-
-    impl ToTokens for FieldsNamed {
-        fn to_tokens(&self, tokens: &mut TokenStream) {
-            self.brace_token.surround(tokens, |tokens| {
-                self.named.to_tokens(tokens);
-            });
-        }
-    }
-
-    impl ToTokens for FieldsUnnamed {
-        fn to_tokens(&self, tokens: &mut TokenStream) {
-            self.paren_token.surround(tokens, |tokens| {
-                self.unnamed.to_tokens(tokens);
-            });
-        }
-    }
-
-    impl ToTokens for Field {
-        fn to_tokens(&self, tokens: &mut TokenStream) {
-            tokens.append_all(&self.attrs);
-            self.vis.to_tokens(tokens);
-            if let Some(ref ident) = self.ident {
-                ident.to_tokens(tokens);
-                TokensOrDefault(&self.colon_token).to_tokens(tokens);
-            }
-            self.ty.to_tokens(tokens);
-        }
-    }
-
-    impl ToTokens for VisPublic {
-        fn to_tokens(&self, tokens: &mut TokenStream) {
-            self.pub_token.to_tokens(tokens)
-        }
-    }
-
-    impl ToTokens for VisCrate {
-        fn to_tokens(&self, tokens: &mut TokenStream) {
-            self.crate_token.to_tokens(tokens);
-        }
-    }
-
-    impl ToTokens for VisRestricted {
-        fn to_tokens(&self, tokens: &mut TokenStream) {
-            self.pub_token.to_tokens(tokens);
-            self.paren_token.surround(tokens, |tokens| {
-                // TODO: If we have a path which is not "self" or "super" or
-                // "crate", automatically add the "in" token.
-                self.in_token.to_tokens(tokens);
-                self.path.to_tokens(tokens);
-            });
-        }
-    }
-}
deleted file mode 100644
--- a/third_party/rust/syn-0.15.30/src/derive.rs
+++ /dev/null
@@ -1,255 +0,0 @@
-use super::*;
-use punctuated::Punctuated;
-
-ast_struct! {
-    /// Data structure sent to a `proc_macro_derive` macro.
-    ///
-    /// *This type is available if Syn is built with the `"derive"` feature.*
-    pub struct DeriveInput {
-        /// Attributes tagged on the whole struct or enum.
-        pub attrs: Vec<Attribute>,
-
-        /// Visibility of the struct or enum.
-        pub vis: Visibility,
-
-        /// Name of the struct or enum.
-        pub ident: Ident,
-
-        /// Generics required to complete the definition.
-        pub generics: Generics,
-
-        /// Data within the struct or enum.
-        pub data: Data,
-    }
-}
-
-ast_enum_of_structs! {
-    /// The storage of a struct, enum or union data structure.
-    ///
-    /// *This type is available if Syn is built with the `"derive"` feature.*
-    ///
-    /// # Syntax tree enum
-    ///
-    /// This type is a [syntax tree enum].
-    ///
-    /// [syntax tree enum]: enum.Expr.html#syntax-tree-enums
-    pub enum Data {
-        /// A struct input to a `proc_macro_derive` macro.
-        ///
-        /// *This type is available if Syn is built with the `"derive"`
-        /// feature.*
-        pub Struct(DataStruct {
-            pub struct_token: Token![struct],
-            pub fields: Fields,
-            pub semi_token: Option<Token![;]>,
-        }),
-
-        /// An enum input to a `proc_macro_derive` macro.
-        ///
-        /// *This type is available if Syn is built with the `"derive"`
-        /// feature.*
-        pub Enum(DataEnum {
-            pub enum_token: Token![enum],
-            pub brace_token: token::Brace,
-            pub variants: Punctuated<Variant, Token![,]>,
-        }),
-
-        /// A tagged union input to a `proc_macro_derive` macro.
-        ///
-        /// *This type is available if Syn is built with the `"derive"`
-        /// feature.*
-        pub Union(DataUnion {
-            pub union_token: Token![union],
-            pub fields: FieldsNamed,
-        }),
-    }
-
-    do_not_generate_to_tokens
-}
-
-#[cfg(feature = "parsing")]
-pub mod parsing {
-    use super::*;
-
-    use parse::{Parse, ParseStream, Result};
-
-    impl Parse for DeriveInput {
-        fn parse(input: ParseStream) -> Result<Self> {
-            let attrs = input.call(Attribute::parse_outer)?;
-            let vis = input.parse::<Visibility>()?;
-
-            let lookahead = input.lookahead1();
-            if lookahead.peek(Token![struct]) {
-                let struct_token = input.parse::<Token![struct]>()?;
-                let ident = input.parse::<Ident>()?;
-                let generics = input.parse::<Generics>()?;
-                let (where_clause, fields, semi) = data_struct(input)?;
-                Ok(DeriveInput {
-                    attrs: attrs,
-                    vis: vis,
-                    ident: ident,
-                    generics: Generics {
-                        where_clause: where_clause,
-                        ..generics
-                    },
-                    data: Data::Struct(DataStruct {
-                        struct_token: struct_token,
-                        fields: fields,
-                        semi_token: semi,
-                    }),
-                })
-            } else if lookahead.peek(Token![enum]) {
-                let enum_token = input.parse::<Token![enum]>()?;
-                let ident = input.parse::<Ident>()?;
-                let generics = input.parse::<Generics>()?;
-                let (where_clause, brace, variants) = data_enum(input)?;
-                Ok(DeriveInput {
-                    attrs: attrs,
-                    vis: vis,
-                    ident: ident,
-                    generics: Generics {
-                        where_clause: where_clause,
-                        ..generics
-                    },
-                    data: Data::Enum(DataEnum {
-                        enum_token: enum_token,
-                        brace_token: brace,
-                        variants: variants,
-                    }),
-                })
-            } else if lookahead.peek(Token![union]) {
-                let union_token = input.parse::<Token![union]>()?;
-                let ident = input.parse::<Ident>()?;
-                let generics = input.parse::<Generics>()?;
-                let (where_clause, fields) = data_union(input)?;
-                Ok(DeriveInput {
-                    attrs: attrs,
-                    vis: vis,
-                    ident: ident,
-                    generics: Generics {
-                        where_clause: where_clause,
-                        ..generics
-                    },
-                    data: Data::Union(DataUnion {
-                        union_token: union_token,
-                        fields: fields,
-                    }),
-                })
-            } else {
-                Err(lookahead.error())
-            }
-        }
-    }
-
-    pub fn data_struct(
-        input: ParseStream,
-    ) -> Result<(Option<WhereClause>, Fields, Option<Token![;]>)> {
-        let mut lookahead = input.lookahead1();
-        let mut where_clause = None;
-        if lookahead.peek(Token![where]) {
-            where_clause = Some(input.parse()?);
-            lookahead = input.lookahead1();
-        }
-
-        if where_clause.is_none() && lookahead.peek(token::Paren) {
-            let fields = input.parse()?;
-
-            lookahead = input.lookahead1();
-            if lookahead.peek(Token![where]) {
-                where_clause = Some(input.parse()?);
-                lookahead = input.lookahead1();
-            }
-
-            if lookahead.peek(Token![;]) {
-                let semi = input.parse()?;
-                Ok((where_clause, Fields::Unnamed(fields), Some(semi)))
-            } else {
-                Err(lookahead.error())
-            }
-        } else if lookahead.peek(token::Brace) {
-            let fields = input.parse()?;
-            Ok((where_clause, Fields::Named(fields), None))
-        } else if lookahead.peek(Token![;]) {
-            let semi = input.parse()?;
-            Ok((where_clause, Fields::Unit, Some(semi)))
-        } else {
-            Err(lookahead.error())
-        }
-    }
-
-    pub fn data_enum(
-        input: ParseStream,
-    ) -> Result<(
-        Option<WhereClause>,
-        token::Brace,
-        Punctuated<Variant, Token![,]>,
-    )> {
-        let where_clause = input.parse()?;
-
-        let content;
-        let brace = braced!(content in input);
-        let variants = content.parse_terminated(Variant::parse)?;
-
-        Ok((where_clause, brace, variants))
-    }
-
-    pub fn data_union(input: ParseStream) -> Result<(Option<WhereClause>, FieldsNamed)> {
-        let where_clause = input.parse()?;
-        let fields = input.parse()?;
-        Ok((where_clause, fields))
-    }
-}
-
-#[cfg(feature = "printing")]
-mod printing {
-    use super::*;
-
-    use proc_macro2::TokenStream;
-    use quote::ToTokens;
-
-    use attr::FilterAttrs;
-    use print::TokensOrDefault;
-
-    impl ToTokens for DeriveInput {
-        fn to_tokens(&self, tokens: &mut TokenStream) {
-            for attr in self.attrs.outer() {
-                attr.to_tokens(tokens);
-            }
-            self.vis.to_tokens(tokens);
-            match self.data {
-                Data::Struct(ref d) => d.struct_token.to_tokens(tokens),
-                Data::Enum(ref d) => d.enum_token.to_tokens(tokens),
-                Data::Union(ref d) => d.union_token.to_tokens(tokens),
-            }
-            self.ident.to_tokens(tokens);
-            self.generics.to_tokens(tokens);
-            match self.data {
-                Data::Struct(ref data) => match data.fields {
-                    Fields::Named(ref fields) => {
-                        self.generics.where_clause.to_tokens(tokens);
-                        fields.to_tokens(tokens);
-                    }
-                    Fields::Unnamed(ref fields) => {
-                        fields.to_tokens(tokens);
-                        self.generics.where_clause.to_tokens(tokens);
-                        TokensOrDefault(&data.semi_token).to_tokens(tokens);
-                    }
-                    Fields::Unit => {
-                        self.generics.where_clause.to_tokens(tokens);
-                        TokensOrDefault(&data.semi_token).to_tokens(tokens);
-                    }
-                },
-                Data::Enum(ref data) => {
-                    self.generics.where_clause.to_tokens(tokens);
-                    data.brace_token.surround(tokens, |tokens| {
-                        data.variants.to_tokens(tokens);
-                    });
-                }
-                Data::Union(ref data) => {
-                    self.generics.where_clause.to_tokens(tokens);
-                    data.fields.to_tokens(tokens);
-                }
-            }
-        }
-    }
-}
deleted file mode 100644
--- a/third_party/rust/syn-0.15.30/src/error.rs
+++ /dev/null
@@ -1,216 +0,0 @@
-use std;
-use std::fmt::{self, Display};
-use std::iter::FromIterator;
-
-use proc_macro2::{
-    Delimiter, Group, Ident, LexError, Literal, Punct, Spacing, Span, TokenStream, TokenTree,
-};
-#[cfg(feature = "printing")]
-use quote::ToTokens;
-
-#[cfg(feature = "parsing")]
-use buffer::Cursor;
-#[cfg(all(procmacro2_semver_exempt, feature = "parsing"))]
-use private;
-use thread::ThreadBound;
-
-/// The result of a Syn parser.
-pub type Result<T> = std::result::Result<T, Error>;
-
-/// Error returned when a Syn parser cannot parse the input tokens.
-///
-/// Refer to the [module documentation] for details about parsing in Syn.
-///
-/// [module documentation]: index.html
-///
-/// *This type is available if Syn is built with the `"parsing"` feature.*
-#[derive(Debug)]
-pub struct Error {
-    // Span is implemented as an index into a thread-local interner to keep the
-    // size small. It is not safe to access from a different thread. We want
-    // errors to be Send and Sync to play nicely with the Failure crate, so pin
-    // the span we're given to its original thread and assume it is
-    // Span::call_site if accessed from any other thread.
-    start_span: ThreadBound<Span>,
-    end_span: ThreadBound<Span>,
-    message: String,
-}
-
-#[cfg(test)]
-struct _Test
-where
-    Error: Send + Sync;
-
-impl Error {
-    /// Usually the [`ParseStream::error`] method will be used instead, which
-    /// automatically uses the correct span from the current position of the
-    /// parse stream.
-    ///
-    /// Use `Error::new` when the error needs to be triggered on some span other
-    /// than where the parse stream is currently positioned.
-    ///
-    /// [`ParseStream::error`]: struct.ParseBuffer.html#method.error
-    ///
-    /// # Example
-    ///
-    /// ```edition2018
-    /// use syn::{Error, Ident, LitStr, Result, Token};
-    /// use syn::parse::ParseStream;
-    ///
-    /// // Parses input that looks like `name = "string"` where the key must be
-    /// // the identifier `name` and the value may be any string literal.
-    /// // Returns the string literal.
-    /// fn parse_name(input: ParseStream) -> Result<LitStr> {
-    ///     let name_token: Ident = input.parse()?;
-    ///     if name_token != "name" {
-    ///         // Trigger an error not on the current position of the stream,
-    ///         // but on the position of the unexpected identifier.
-    ///         return Err(Error::new(name_token.span(), "expected `name`"));
-    ///     }
-    ///     input.parse::<Token![=]>()?;
-    ///     let s: LitStr = input.parse()?;
-    ///     Ok(s)
-    /// }
-    /// ```
-    pub fn new<T: Display>(span: Span, message: T) -> Self {
-        Error {
-            start_span: ThreadBound::new(span),
-            end_span: ThreadBound::new(span),
-            message: message.to_string(),
-        }
-    }
-
-    /// Creates an error with the specified message spanning the given syntax
-    /// tree node.
-    ///
-    /// Unlike the `Error::new` constructor, this constructor takes an argument
-    /// `tokens` which is a syntax tree node. This allows the resulting `Error`
-    /// to attempt to span all tokens inside of `tokens`. While you would
-    /// typically be able to use the `Spanned` trait with the above `Error::new`
-    /// constructor, implementation limitations today mean that
-    /// `Error::new_spanned` may provide a higher-quality error message on
-    /// stable Rust.
-    ///
-    /// When in doubt it's recommended to stick to `Error::new` (or
-    /// `ParseStream::error`)!
-    #[cfg(feature = "printing")]
-    pub fn new_spanned<T: ToTokens, U: Display>(tokens: T, message: U) -> Self {
-        let mut iter = tokens.into_token_stream().into_iter();
-        let start = iter.next().map_or_else(Span::call_site, |t| t.span());
-        let end = iter.last().map_or(start, |t| t.span());
-        Error {
-            start_span: ThreadBound::new(start),
-            end_span: ThreadBound::new(end),
-            message: message.to_string(),
-        }
-    }
-
-    /// The source location of the error.
-    ///
-    /// Spans are not thread-safe so this function returns `Span::call_site()`
-    /// if called from a different thread than the one on which the `Error` was
-    /// originally created.
-    pub fn span(&self) -> Span {
-        let start = match self.start_span.get() {
-            Some(span) => *span,
-            None => return Span::call_site(),
-        };
-
-        #[cfg(procmacro2_semver_exempt)]
-        {
-            let end = match self.end_span.get() {
-                Some(span) => *span,
-                None => return Span::call_site(),
-            };
-            start.join(end).unwrap_or(start)
-        }
-        #[cfg(not(procmacro2_semver_exempt))]
-        {
-            start
-        }
-    }
-
-    /// Render the error as an invocation of [`compile_error!`].
-    ///
-    /// The [`parse_macro_input!`] macro provides a convenient way to invoke
-    /// this method correctly in a procedural macro.
-    ///
-    /// [`compile_error!`]: https://doc.rust-lang.org/std/macro.compile_error.html
-    /// [`parse_macro_input!`]: ../macro.parse_macro_input.html
-    pub fn to_compile_error(&self) -> TokenStream {
-        let start = self
-            .start_span
-            .get()
-            .cloned()
-            .unwrap_or_else(Span::call_site);
-        let end = self.end_span.get().cloned().unwrap_or_else(Span::call_site);
-
-        // compile_error!($message)
-        TokenStream::from_iter(vec![
-            TokenTree::Ident(Ident::new("compile_error", start)),
-            TokenTree::Punct({
-                let mut punct = Punct::new('!', Spacing::Alone);
-                punct.set_span(start);
-                punct
-            }),
-            TokenTree::Group({
-                let mut group = Group::new(Delimiter::Brace, {
-                    TokenStream::from_iter(vec![TokenTree::Literal({
-                        let mut string = Literal::string(&self.message);
-                        string.set_span(end);
-                        string
-                    })])
-                });
-                group.set_span(end);
-                group
-            }),
-        ])
-    }
-}
-
-#[cfg(feature = "parsing")]
-pub fn new_at<T: Display>(scope: Span, cursor: Cursor, message: T) -> Error {
-    if cursor.eof() {
-        Error::new(scope, format!("unexpected end of input, {}", message))
-    } else {
-        #[cfg(procmacro2_semver_exempt)]
-        let span = private::open_span_of_group(cursor);
-        #[cfg(not(procmacro2_semver_exempt))]
-        let span = cursor.span();
-        Error::new(span, message)
-    }
-}
-
-impl Display for Error {
-    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
-        formatter.write_str(&self.message)
-    }
-}
-
-impl Clone for Error {
-    fn clone(&self) -> Self {
-        let start = self
-            .start_span
-            .get()
-            .cloned()
-            .unwrap_or_else(Span::call_site);
-        let end = self.end_span.get().cloned().unwrap_or_else(Span::call_site);
-        Error {
-            start_span: ThreadBound::new(start),
-            end_span: ThreadBound::new(end),
-            message: self.message.clone(),
-        }
-    }
-}
-
-impl std::error::Error for Error {
-    fn description(&self) -> &str {
-        "parse error"
-    }
-}
-
-impl From<LexError> for Error {
-    fn from(err: LexError) -> Self {
-        Error::new(Span::call_site(), format!("{:?}", err))
-    }
-}
deleted file mode 100644
--- a/third_party/rust/syn-0.15.30/src/export.rs
+++ /dev/null
@@ -1,35 +0,0 @@
-pub use std::clone::Clone;
-pub use std::cmp::{Eq, PartialEq};
-pub use std::convert::From;
-pub use std::default::Default;
-pub use std::fmt::{self, Debug, Formatter};
-pub use std::hash::{Hash, Hasher};
-pub use std::marker::Copy;
-pub use std::option::Option::{None, Some};
-pub use std::result::Result::{Err, Ok};
-
-#[cfg(feature = "printing")]
-pub extern crate quote;
-
-pub use proc_macro2::{Span, TokenStream as TokenStream2};
-
-pub use span::IntoSpans;
-
-#[cfg(all(
-    not(all(target_arch = "wasm32", target_os = "unknown")),
-    feature = "proc-macro"
-))]
-pub use proc_macro::TokenStream;
-
-#[cfg(feature = "printing")]
-pub use quote::{ToTokens, TokenStreamExt};
-
-#[allow(non_camel_case_types)]
-pub type bool = help::Bool;
-#[allow(non_camel_case_types)]
-pub type str = help::Str;
-
-mod help {
-    pub type Bool = bool;
-    pub type Str = str;
-}
deleted file mode 100644
--- a/third_party/rust/syn-0.15.30/src/expr.rs
+++ /dev/null
@@ -1,3768 +0,0 @@
-use super::*;
-use proc_macro2::{Span, TokenStream};
-use punctuated::Punctuated;
-#[cfg(feature = "extra-traits")]
-use std::hash::{Hash, Hasher};
-#[cfg(all(feature = "parsing", feature = "full"))]
-use std::mem;
-#[cfg(feature = "extra-traits")]
-use tt::TokenStreamHelper;
-
-ast_enum_of_structs! {
-    /// A Rust expression.
-    ///
-    /// *This type is available if Syn is built with the `"derive"` or `"full"`
-    /// feature.*
-    ///
-    /// # Syntax tree enums
-    ///
-    /// This type is a syntax tree enum. In Syn this and other syntax tree enums
-    /// are designed to be traversed using the following rebinding idiom.
-    ///
-    /// ```edition2018
-    /// # use syn::Expr;
-    /// #
-    /// # fn example(expr: Expr) {
-    /// # const IGNORE: &str = stringify! {
-    /// let expr: Expr = /* ... */;
-    /// # };
-    /// match expr {
-    ///     Expr::MethodCall(expr) => {
-    ///         /* ... */
-    ///     }
-    ///     Expr::Cast(expr) => {
-    ///         /* ... */
-    ///     }
-    ///     Expr::If(expr) => {
-    ///         /* ... */
-    ///     }
-    ///     /* ... */
-    ///     # _ => {}
-    /// }
-    /// # }
-    /// ```
-    ///
-    /// We begin with a variable `expr` of type `Expr` that has no fields
-    /// (because it is an enum), and by matching on it and rebinding a variable
-    /// with the same name `expr` we effectively imbue our variable with all of
-    /// the data fields provided by the variant that it turned out to be. So for
-    /// example above if we ended up in the `MethodCall` case then we get to use
-    /// `expr.receiver`, `expr.args` etc; if we ended up in the `If` case we get
-    /// to use `expr.cond`, `expr.then_branch`, `expr.else_branch`.
-    ///
-    /// The pattern is similar if the input expression is borrowed:
-    ///
-    /// ```edition2018
-    /// # use syn::Expr;
-    /// #
-    /// # fn example(expr: &Expr) {
-    /// match *expr {
-    ///     Expr::MethodCall(ref expr) => {
-    /// #   }
-    /// #   _ => {}
-    /// # }
-    /// # }
-    /// ```
-    ///
-    /// This approach avoids repeating the variant names twice on every line.
-    ///
-    /// ```edition2018
-    /// # use syn::{Expr, ExprMethodCall};
-    /// #
-    /// # fn example(expr: Expr) {
-    /// # match expr {
-    /// Expr::MethodCall(ExprMethodCall { method, args, .. }) => { // repetitive
-    /// # }
-    /// # _ => {}
-    /// # }
-    /// # }
-    /// ```
-    ///
-    /// In general, the name to which a syntax tree enum variant is bound should
-    /// be a suitable name for the complete syntax tree enum type.
-    ///
-    /// ```edition2018
-    /// # use syn::{Expr, ExprField};
-    /// #
-    /// # fn example(discriminant: &ExprField) {
-    /// // Binding is called `base` which is the name I would use if I were
-    /// // assigning `*discriminant.base` without an `if let`.
-    /// if let Expr::Tuple(ref base) = *discriminant.base {
-    /// # }
-    /// # }
-    /// ```
-    ///
-    /// A sign that you may not be choosing the right variable names is if you
-    /// see names getting repeated in your code, like accessing
-    /// `receiver.receiver` or `pat.pat` or `cond.cond`.
-    pub enum Expr {
-        /// A box expression: `box f`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Box(ExprBox #full {
-            pub attrs: Vec<Attribute>,
-            pub box_token: Token![box],
-            pub expr: Box<Expr>,
-        }),
-
-        /// A placement expression: `place <- value`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub InPlace(ExprInPlace #full {
-            pub attrs: Vec<Attribute>,
-            pub place: Box<Expr>,
-            pub arrow_token: Token![<-],
-            pub value: Box<Expr>,
-        }),
-
-        /// A slice literal expression: `[a, b, c, d]`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Array(ExprArray #full {
-            pub attrs: Vec<Attribute>,
-            pub bracket_token: token::Bracket,
-            pub elems: Punctuated<Expr, Token![,]>,
-        }),
-
-        /// A function call expression: `invoke(a, b)`.
-        ///
-        /// *This type is available if Syn is built with the `"derive"` or
-        /// `"full"` feature.*
-        pub Call(ExprCall {
-            pub attrs: Vec<Attribute>,
-            pub func: Box<Expr>,
-            pub paren_token: token::Paren,
-            pub args: Punctuated<Expr, Token![,]>,
-        }),
-
-        /// A method call expression: `x.foo::<T>(a, b)`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub MethodCall(ExprMethodCall #full {
-            pub attrs: Vec<Attribute>,
-            pub receiver: Box<Expr>,
-            pub dot_token: Token![.],
-            pub method: Ident,
-            pub turbofish: Option<MethodTurbofish>,
-            pub paren_token: token::Paren,
-            pub args: Punctuated<Expr, Token![,]>,
-        }),
-
-        /// A tuple expression: `(a, b, c, d)`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Tuple(ExprTuple #full {
-            pub attrs: Vec<Attribute>,
-            pub paren_token: token::Paren,
-            pub elems: Punctuated<Expr, Token![,]>,
-        }),
-
-        /// A binary operation: `a + b`, `a * b`.
-        ///
-        /// *This type is available if Syn is built with the `"derive"` or
-        /// `"full"` feature.*
-        pub Binary(ExprBinary {
-            pub attrs: Vec<Attribute>,
-            pub left: Box<Expr>,
-            pub op: BinOp,
-            pub right: Box<Expr>,
-        }),
-
-        /// A unary operation: `!x`, `*x`.
-        ///
-        /// *This type is available if Syn is built with the `"derive"` or
-        /// `"full"` feature.*
-        pub Unary(ExprUnary {
-            pub attrs: Vec<Attribute>,
-            pub op: UnOp,
-            pub expr: Box<Expr>,
-        }),
-
-        /// A literal in place of an expression: `1`, `"foo"`.
-        ///
-        /// *This type is available if Syn is built with the `"derive"` or
-        /// `"full"` feature.*
-        pub Lit(ExprLit {
-            pub attrs: Vec<Attribute>,
-            pub lit: Lit,
-        }),
-
-        /// A cast expression: `foo as f64`.
-        ///
-        /// *This type is available if Syn is built with the `"derive"` or
-        /// `"full"` feature.*
-        pub Cast(ExprCast {
-            pub attrs: Vec<Attribute>,
-            pub expr: Box<Expr>,
-            pub as_token: Token![as],
-            pub ty: Box<Type>,
-        }),
-
-        /// A type ascription expression: `foo: f64`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Type(ExprType #full {
-            pub attrs: Vec<Attribute>,
-            pub expr: Box<Expr>,
-            pub colon_token: Token![:],
-            pub ty: Box<Type>,
-        }),
-
-        /// A `let` guard: `let Some(x) = opt`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Let(ExprLet #full {
-            pub attrs: Vec<Attribute>,
-            pub let_token: Token![let],
-            pub pats: Punctuated<Pat, Token![|]>,
-            pub eq_token: Token![=],
-            pub expr: Box<Expr>,
-        }),
-
-        /// An `if` expression with an optional `else` block: `if expr { ... }
-        /// else { ... }`.
-        ///
-        /// The `else` branch expression may only be an `If` or `Block`
-        /// expression, not any of the other types of expression.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub If(ExprIf #full {
-            pub attrs: Vec<Attribute>,
-            pub if_token: Token![if],
-            pub cond: Box<Expr>,
-            pub then_branch: Block,
-            pub else_branch: Option<(Token![else], Box<Expr>)>,
-        }),
-
-        /// A while loop: `while expr { ... }`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub While(ExprWhile #full {
-            pub attrs: Vec<Attribute>,
-            pub label: Option<Label>,
-            pub while_token: Token![while],
-            pub cond: Box<Expr>,
-            pub body: Block,
-        }),
-
-        /// A for loop: `for pat in expr { ... }`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub ForLoop(ExprForLoop #full {
-            pub attrs: Vec<Attribute>,
-            pub label: Option<Label>,
-            pub for_token: Token![for],
-            pub pat: Box<Pat>,
-            pub in_token: Token![in],
-            pub expr: Box<Expr>,
-            pub body: Block,
-        }),
-
-        /// Conditionless loop: `loop { ... }`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Loop(ExprLoop #full {
-            pub attrs: Vec<Attribute>,
-            pub label: Option<Label>,
-            pub loop_token: Token![loop],
-            pub body: Block,
-        }),
-
-        /// A `match` expression: `match n { Some(n) => {}, None => {} }`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Match(ExprMatch #full {
-            pub attrs: Vec<Attribute>,
-            pub match_token: Token![match],
-            pub expr: Box<Expr>,
-            pub brace_token: token::Brace,
-            pub arms: Vec<Arm>,
-        }),
-
-        /// A closure expression: `|a, b| a + b`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Closure(ExprClosure #full {
-            pub attrs: Vec<Attribute>,
-            pub asyncness: Option<Token![async]>,
-            pub movability: Option<Token![static]>,
-            pub capture: Option<Token![move]>,
-            pub or1_token: Token![|],
-            pub inputs: Punctuated<FnArg, Token![,]>,
-            pub or2_token: Token![|],
-            pub output: ReturnType,
-            pub body: Box<Expr>,
-        }),
-
-        /// An unsafe block: `unsafe { ... }`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Unsafe(ExprUnsafe #full {
-            pub attrs: Vec<Attribute>,
-            pub unsafe_token: Token![unsafe],
-            pub block: Block,
-        }),
-
-        /// A blocked scope: `{ ... }`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Block(ExprBlock #full {
-            pub attrs: Vec<Attribute>,
-            pub label: Option<Label>,
-            pub block: Block,
-        }),
-
-        /// An assignment expression: `a = compute()`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Assign(ExprAssign #full {
-            pub attrs: Vec<Attribute>,
-            pub left: Box<Expr>,
-            pub eq_token: Token![=],
-            pub right: Box<Expr>,
-        }),
-
-        /// A compound assignment expression: `counter += 1`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub AssignOp(ExprAssignOp #full {
-            pub attrs: Vec<Attribute>,
-            pub left: Box<Expr>,
-            pub op: BinOp,
-            pub right: Box<Expr>,
-        }),
-
-        /// Access of a named struct field (`obj.k`) or unnamed tuple struct
-        /// field (`obj.0`).
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Field(ExprField {
-            pub attrs: Vec<Attribute>,
-            pub base: Box<Expr>,
-            pub dot_token: Token![.],
-            pub member: Member,
-        }),
-
-        /// A square bracketed indexing expression: `vector[2]`.
-        ///
-        /// *This type is available if Syn is built with the `"derive"` or
-        /// `"full"` feature.*
-        pub Index(ExprIndex {
-            pub attrs: Vec<Attribute>,
-            pub expr: Box<Expr>,
-            pub bracket_token: token::Bracket,
-            pub index: Box<Expr>,
-        }),
-
-        /// A range expression: `1..2`, `1..`, `..2`, `1..=2`, `..=2`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Range(ExprRange #full {
-            pub attrs: Vec<Attribute>,
-            pub from: Option<Box<Expr>>,
-            pub limits: RangeLimits,
-            pub to: Option<Box<Expr>>,
-        }),
-
-        /// A path like `std::mem::replace` possibly containing generic
-        /// parameters and a qualified self-type.
-        ///
-        /// A plain identifier like `x` is a path of length 1.
-        ///
-        /// *This type is available if Syn is built with the `"derive"` or
-        /// `"full"` feature.*
-        pub Path(ExprPath {
-            pub attrs: Vec<Attribute>,
-            pub qself: Option<QSelf>,
-            pub path: Path,
-        }),
-
-        /// A referencing operation: `&a` or `&mut a`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Reference(ExprReference #full {
-            pub attrs: Vec<Attribute>,
-            pub and_token: Token![&],
-            pub mutability: Option<Token![mut]>,
-            pub expr: Box<Expr>,
-        }),
-
-        /// A `break`, with an optional label to break and an optional
-        /// expression.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Break(ExprBreak #full {
-            pub attrs: Vec<Attribute>,
-            pub break_token: Token![break],
-            pub label: Option<Lifetime>,
-            pub expr: Option<Box<Expr>>,
-        }),
-
-        /// A `continue`, with an optional label.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Continue(ExprContinue #full {
-            pub attrs: Vec<Attribute>,
-            pub continue_token: Token![continue],
-            pub label: Option<Lifetime>,
-        }),
-
-        /// A `return`, with an optional value to be returned.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Return(ExprReturn #full {
-            pub attrs: Vec<Attribute>,
-            pub return_token: Token![return],
-            pub expr: Option<Box<Expr>>,
-        }),
-
-        /// A macro invocation expression: `format!("{}", q)`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Macro(ExprMacro #full {
-            pub attrs: Vec<Attribute>,
-            pub mac: Macro,
-        }),
-
-        /// A struct literal expression: `Point { x: 1, y: 1 }`.
-        ///
-        /// The `rest` provides the value of the remaining fields as in `S { a:
-        /// 1, b: 1, ..rest }`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Struct(ExprStruct #full {
-            pub attrs: Vec<Attribute>,
-            pub path: Path,
-            pub brace_token: token::Brace,
-            pub fields: Punctuated<FieldValue, Token![,]>,
-            pub dot2_token: Option<Token![..]>,
-            pub rest: Option<Box<Expr>>,
-        }),
-
-        /// An array literal constructed from one repeated element: `[0u8; N]`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Repeat(ExprRepeat #full {
-            pub attrs: Vec<Attribute>,
-            pub bracket_token: token::Bracket,
-            pub expr: Box<Expr>,
-            pub semi_token: Token![;],
-            pub len: Box<Expr>,
-        }),
-
-        /// A parenthesized expression: `(a + b)`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Paren(ExprParen {
-            pub attrs: Vec<Attribute>,
-            pub paren_token: token::Paren,
-            pub expr: Box<Expr>,
-        }),
-
-        /// An expression contained within invisible delimiters.
-        ///
-        /// This variant is important for faithfully representing the precedence
-        /// of expressions and is related to `None`-delimited spans in a
-        /// `TokenStream`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Group(ExprGroup #full {
-            pub attrs: Vec<Attribute>,
-            pub group_token: token::Group,
-            pub expr: Box<Expr>,
-        }),
-
-        /// A try-expression: `expr?`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Try(ExprTry #full {
-            pub attrs: Vec<Attribute>,
-            pub expr: Box<Expr>,
-            pub question_token: Token![?],
-        }),
-
-        /// An async block: `async { ... }`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Async(ExprAsync #full {
-            pub attrs: Vec<Attribute>,
-            pub async_token: Token![async],
-            pub capture: Option<Token![move]>,
-            pub block: Block,
-        }),
-
-        /// A try block: `try { ... }`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub TryBlock(ExprTryBlock #full {
-            pub attrs: Vec<Attribute>,
-            pub try_token: Token![try],
-            pub block: Block,
-        }),
-
-        /// A yield expression: `yield expr`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Yield(ExprYield #full {
-            pub attrs: Vec<Attribute>,
-            pub yield_token: Token![yield],
-            pub expr: Option<Box<Expr>>,
-        }),
-
-        /// Tokens in expression position not interpreted by Syn.
-        ///
-        /// *This type is available if Syn is built with the `"derive"` or
-        /// `"full"` feature.*
-        pub Verbatim(ExprVerbatim #manual_extra_traits {
-            pub tts: TokenStream,
-        }),
-    }
-}
-
-#[cfg(feature = "extra-traits")]
-impl Eq for ExprVerbatim {}
-
-#[cfg(feature = "extra-traits")]
-impl PartialEq for ExprVerbatim {
-    fn eq(&self, other: &Self) -> bool {
-        TokenStreamHelper(&self.tts) == TokenStreamHelper(&other.tts)
-    }
-}
-
-#[cfg(feature = "extra-traits")]
-impl Hash for ExprVerbatim {
-    fn hash<H>(&self, state: &mut H)
-    where
-        H: Hasher,
-    {
-        TokenStreamHelper(&self.tts).hash(state);
-    }
-}
-
-impl Expr {
-    #[cfg(all(feature = "parsing", feature = "full"))]
-    fn replace_attrs(&mut self, new: Vec<Attribute>) -> Vec<Attribute> {
-        match *self {
-            Expr::Box(ExprBox { ref mut attrs, .. })
-            | Expr::InPlace(ExprInPlace { ref mut attrs, .. })
-            | Expr::Array(ExprArray { ref mut attrs, .. })
-            | Expr::Call(ExprCall { ref mut attrs, .. })
-            | Expr::MethodCall(ExprMethodCall { ref mut attrs, .. })
-            | Expr::Tuple(ExprTuple { ref mut attrs, .. })
-            | Expr::Binary(ExprBinary { ref mut attrs, .. })
-            | Expr::Unary(ExprUnary { ref mut attrs, .. })
-            | Expr::Lit(ExprLit { ref mut attrs, .. })
-            | Expr::Cast(ExprCast { ref mut attrs, .. })
-            | Expr::Type(ExprType { ref mut attrs, .. })
-            | Expr::Let(ExprLet { ref mut attrs, .. })
-            | Expr::If(ExprIf { ref mut attrs, .. })
-            | Expr::While(ExprWhile { ref mut attrs, .. })
-            | Expr::ForLoop(ExprForLoop { ref mut attrs, .. })
-            | Expr::Loop(ExprLoop { ref mut attrs, .. })
-            | Expr::Match(ExprMatch { ref mut attrs, .. })
-            | Expr::Closure(ExprClosure { ref mut attrs, .. })
-            | Expr::Unsafe(ExprUnsafe { ref mut attrs, .. })
-            | Expr::Block(ExprBlock { ref mut attrs, .. })
-            | Expr::Assign(ExprAssign { ref mut attrs, .. })
-            | Expr::AssignOp(ExprAssignOp { ref mut attrs, .. })
-            | Expr::Field(ExprField { ref mut attrs, .. })
-            | Expr::Index(ExprIndex { ref mut attrs, .. })
-            | Expr::Range(ExprRange { ref mut attrs, .. })
-            | Expr::Path(ExprPath { ref mut attrs, .. })
-            | Expr::Reference(ExprReference { ref mut attrs, .. })
-            | Expr::Break(ExprBreak { ref mut attrs, .. })
-            | Expr::Continue(ExprContinue { ref mut attrs, .. })
-            | Expr::Return(ExprReturn { ref mut attrs, .. })
-            | Expr::Macro(ExprMacro { ref mut attrs, .. })
-            | Expr::Struct(ExprStruct { ref mut attrs, .. })
-            | Expr::Repeat(ExprRepeat { ref mut attrs, .. })
-            | Expr::Paren(ExprParen { ref mut attrs, .. })
-            | Expr::Group(ExprGroup { ref mut attrs, .. })
-            | Expr::Try(ExprTry { ref mut attrs, .. })
-            | Expr::Async(ExprAsync { ref mut attrs, .. })
-            | Expr::TryBlock(ExprTryBlock { ref mut attrs, .. })
-            | Expr::Yield(ExprYield { ref mut attrs, .. }) => mem::replace(attrs, new),
-            Expr::Verbatim(_) => Vec::new(),
-        }
-    }
-}
-
-ast_enum! {
-    /// A struct or tuple struct field accessed in a struct literal or field
-    /// expression.
-    ///
-    /// *This type is available if Syn is built with the `"derive"` or `"full"`
-    /// feature.*
-    pub enum Member {
-        /// A named field like `self.x`.
-        Named(Ident),
-        /// An unnamed field like `self.0`.
-        Unnamed(Index),
-    }
-}
-
-ast_struct! {
-    /// The index of an unnamed tuple struct field.
-    ///
-    /// *This type is available if Syn is built with the `"derive"` or `"full"`
-    /// feature.*
-    pub struct Index #manual_extra_traits {
-        pub index: u32,
-        pub span: Span,
-    }
-}
-
-impl From<usize> for Index {
-    fn from(index: usize) -> Index {
-        assert!(index < u32::max_value() as usize);
-        Index {
-            index: index as u32,
-            span: Span::call_site(),
-        }
-    }
-}
-
-#[cfg(feature = "extra-traits")]
-impl Eq for Index {}
-
-#[cfg(feature = "extra-traits")]
-impl PartialEq for Index {
-    fn eq(&self, other: &Self) -> bool {
-        self.index == other.index
-    }
-}
-
-#[cfg(feature = "extra-traits")]
-impl Hash for Index {
-    fn hash<H: Hasher>(&self, state: &mut H) {
-        self.index.hash(state);
-    }
-}
-
-#[cfg(feature = "full")]
-ast_struct! {
-    /// The `::<>` explicit type parameters passed to a method call:
-    /// `parse::<u64>()`.
-    ///
-    /// *This type is available if Syn is built with the `"full"` feature.*
-    pub struct MethodTurbofish {
-        pub colon2_token: Token![::],
-        pub lt_token: Token![<],
-        pub args: Punctuated<GenericMethodArgument, Token![,]>,
-        pub gt_token: Token![>],
-    }
-}
-
-#[cfg(feature = "full")]
-ast_enum! {
-    /// An individual generic argument to a method, like `T`.
-    ///
-    /// *This type is available if Syn is built with the `"full"` feature.*
-    pub enum GenericMethodArgument {
-        /// A type argument.
-        Type(Type),
-        /// A const expression. Must be inside of a block.
-        ///
-        /// NOTE: Identity expressions are represented as Type arguments, as
-        /// they are indistinguishable syntactically.
-        Const(Expr),
-    }
-}
-
-#[cfg(feature = "full")]
-ast_struct! {
-    /// A field-value pair in a struct literal.
-    ///
-    /// *This type is available if Syn is built with the `"full"` feature.*
-    pub struct FieldValue {
-        /// Attributes tagged on the field.
-        pub attrs: Vec<Attribute>,
-
-        /// Name or index of the field.
-        pub member: Member,
-
-        /// The colon in `Struct { x: x }`. If written in shorthand like
-        /// `Struct { x }`, there is no colon.
-        pub colon_token: Option<Token![:]>,
-
-        /// Value of the field.
-        pub expr: Expr,
-    }
-}
-
-#[cfg(feature = "full")]
-ast_struct! {
-    /// A lifetime labeling a `for`, `while`, or `loop`.
-    ///
-    /// *This type is available if Syn is built with the `"full"` feature.*
-    pub struct Label {
-        pub name: Lifetime,
-        pub colon_token: Token![:],
-    }
-}
-
-#[cfg(feature = "full")]
-ast_struct! {
-    /// A braced block containing Rust statements.
-    ///
-    /// *This type is available if Syn is built with the `"full"` feature.*
-    pub struct Block {
-        pub brace_token: token::Brace,
-        /// Statements in a block
-        pub stmts: Vec<Stmt>,
-    }
-}
-
-#[cfg(feature = "full")]
-ast_enum! {
-    /// A statement, usually ending in a semicolon.
-    ///
-    /// *This type is available if Syn is built with the `"full"` feature.*
-    pub enum Stmt {
-        /// A local (let) binding.
-        Local(Local),
-
-        /// An item definition.
-        Item(Item),
-
-        /// Expr without trailing semicolon.
-        Expr(Expr),
-
-        /// Expression with trailing semicolon.
-        Semi(Expr, Token![;]),
-    }
-}
-
-#[cfg(feature = "full")]
-ast_struct! {
-    /// A local `let` binding: `let x: u64 = s.parse()?`.
-    ///
-    /// *This type is available if Syn is built with the `"full"` feature.*
-    pub struct Local {
-        pub attrs: Vec<Attribute>,
-        pub let_token: Token![let],
-        pub pats: Punctuated<Pat, Token![|]>,
-        pub ty: Option<(Token![:], Box<Type>)>,
-        pub init: Option<(Token![=], Box<Expr>)>,
-        pub semi_token: Token![;],
-    }
-}
-
-#[cfg(feature = "full")]
-ast_enum_of_structs! {
-    /// A pattern in a local binding, function signature, match expression, or
-    /// various other places.
-    ///
-    /// *This type is available if Syn is built with the `"full"` feature.*
-    ///
-    /// # Syntax tree enum
-    ///
-    /// This type is a [syntax tree enum].
-    ///
-    /// [syntax tree enum]: enum.Expr.html#syntax-tree-enums
-    pub enum Pat {
-        /// A pattern that matches any value: `_`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Wild(PatWild {
-            pub underscore_token: Token![_],
-        }),
-
-        /// A pattern that binds a new variable: `ref mut binding @ SUBPATTERN`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Ident(PatIdent {
-            pub by_ref: Option<Token![ref]>,
-            pub mutability: Option<Token![mut]>,
-            pub ident: Ident,
-            pub subpat: Option<(Token![@], Box<Pat>)>,
-        }),
-
-        /// A struct or struct variant pattern: `Variant { x, y, .. }`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Struct(PatStruct {
-            pub path: Path,
-            pub brace_token: token::Brace,
-            pub fields: Punctuated<FieldPat, Token![,]>,
-            pub dot2_token: Option<Token![..]>,
-        }),
-
-        /// A tuple struct or tuple variant pattern: `Variant(x, y, .., z)`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub TupleStruct(PatTupleStruct {
-            pub path: Path,
-            pub pat: PatTuple,
-        }),
-
-        /// A path pattern like `Color::Red`, optionally qualified with a
-        /// self-type.
-        ///
-        /// Unqualified path patterns can legally refer to variants, structs,
-        /// constants or associated constants. Qualified path patterns like
-        /// `<A>::B::C` and `<A as Trait>::B::C` can only legally refer to
-        /// associated constants.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Path(PatPath {
-            pub qself: Option<QSelf>,
-            pub path: Path,
-        }),
-
-        /// A tuple pattern: `(a, b)`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Tuple(PatTuple {
-            pub paren_token: token::Paren,
-            pub front: Punctuated<Pat, Token![,]>,
-            pub dot2_token: Option<Token![..]>,
-            pub comma_token: Option<Token![,]>,
-            pub back: Punctuated<Pat, Token![,]>,
-        }),
-
-        /// A box pattern: `box v`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Box(PatBox {
-            pub box_token: Token![box],
-            pub pat: Box<Pat>,
-        }),
-
-        /// A reference pattern: `&mut (first, second)`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Ref(PatRef {
-            pub and_token: Token![&],
-            pub mutability: Option<Token![mut]>,
-            pub pat: Box<Pat>,
-        }),
-
-        /// A literal pattern: `0`.
-        ///
-        /// This holds an `Expr` rather than a `Lit` because negative numbers
-        /// are represented as an `Expr::Unary`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Lit(PatLit {
-            pub expr: Box<Expr>,
-        }),
-
-        /// A range pattern: `1..=2`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Range(PatRange {
-            pub lo: Box<Expr>,
-            pub limits: RangeLimits,
-            pub hi: Box<Expr>,
-        }),
-
-        /// A dynamically sized slice pattern: `[a, b, i.., y, z]`.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Slice(PatSlice {
-            pub bracket_token: token::Bracket,
-            pub front: Punctuated<Pat, Token![,]>,
-            pub middle: Option<Box<Pat>>,
-            pub dot2_token: Option<Token![..]>,
-            pub comma_token: Option<Token![,]>,
-            pub back: Punctuated<Pat, Token![,]>,
-        }),
-
-        /// A macro in expression position.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Macro(PatMacro {
-            pub mac: Macro,
-        }),
-
-        /// Tokens in pattern position not interpreted by Syn.
-        ///
-        /// *This type is available if Syn is built with the `"full"` feature.*
-        pub Verbatim(PatVerbatim #manual_extra_traits {
-            pub tts: TokenStream,
-        }),
-    }
-}
-
-#[cfg(all(feature = "full", feature = "extra-traits"))]
-impl Eq for PatVerbatim {}
-
-#[cfg(all(feature = "full", feature = "extra-traits"))]
-impl PartialEq for PatVerbatim {
-    fn eq(&self, other: &Self) -> bool {
-        TokenStreamHelper(&self.tts) == TokenStreamHelper(&other.tts)
-    }
-}
-
-#[cfg(all(feature = "full", feature = "extra-traits"))]
-impl Hash for PatVerbatim {
-    fn hash<H>(&self, state: &mut H)
-    where
-        H: Hasher,
-    {
-        TokenStreamHelper(&self.tts).hash(state);
-    }
-}
-
-#[cfg(feature = "full")]
-ast_struct! {
-    /// One arm of a `match` expression: `0...10 => { return true; }`.
-    ///
-    /// As in:
-    ///
-    /// ```edition2018
-    /// # fn f() -> bool {
-    /// #     let n = 0;
-    /// match n {
-    ///     0...10 => {
-    ///         return true;
-    ///     }
-    ///     // ...
-    ///     # _ => {}
-    /// }
-    /// #   false
-    /// # }
-    /// ```
-    ///
-    /// *This type is available if Syn is built with the `"full"` feature.*
-    pub struct Arm {
-        pub attrs: Vec<Attribute>,
-        pub leading_vert: Option<Token![|]>,
-        pub pats: Punctuated<Pat, Token![|]>,
-        pub guard: Option<(Token![if], Box<Expr>)>,
-        pub fat_arrow_token: Token![=>],
-        pub body: Box<Expr>,
-        pub comma: Option<Token![,]>,
-    }
-}
-
-#[cfg(feature = "full")]
-ast_enum! {
-    /// Limit types of a range, inclusive or exclusive.
-    ///
-    /// *This type is available if Syn is built with the `"full"` feature.*
-    #[cfg_attr(feature = "clone-impls", derive(Copy))]
-    pub enum RangeLimits {
-        /// Inclusive at the beginning, exclusive at the end.
-        HalfOpen(Token![..]),
-        /// Inclusive at the beginning and end.
-        Closed(Token![..=]),
-    }
-}
-
-#[cfg(feature = "full")]
-ast_struct! {
-    /// A single field in a struct pattern.
-    ///
-    /// Patterns like the fields of Foo `{ x, ref y, ref mut z }` are treated
-    /// the same as `x: x, y: ref y, z: ref mut z` but there is no colon token.
-    ///
-    /// *This type is available if Syn is built with the `"full"` feature.*
-    pub struct FieldPat {
-        pub attrs: Vec<Attribute>,
-        pub member: Member,
-        pub colon_token: Option<Token![:]>,
-        pub pat: Box<Pat>,
-    }
-}
-
-#[cfg(any(feature = "parsing", feature = "printing"))]
-#[cfg(feature = "full")]
-fn requires_terminator(expr: &Expr) -> bool {
-    // see https://github.com/rust-lang/rust/blob/eb8f2586e/src/libsyntax/parse/classify.rs#L17-L37
-    match *expr {
-        Expr::Unsafe(..)
-        | Expr::Block(..)
-        | Expr::If(..)
-        | Expr::Match(..)
-        | Expr::While(..)
-        | Expr::Loop(..)
-        | Expr::ForLoop(..)
-        | Expr::Async(..)
-        | Expr::TryBlock(..) => false,
-        _ => true,
-    }
-}
-
-#[cfg(feature = "parsing")]
-pub mod parsing {
-    use super::*;
-
-    #[cfg(feature = "full")]
-    use ext::IdentExt;
-    use parse::{Parse, ParseStream, Result};
-    use path;
-
-    // When we're parsing expressions which occur before blocks, like in an if
-    // statement's condition, we cannot parse a struct literal.
-    //
-    // Struct literals are ambiguous in certain positions
-    // https://github.com/rust-lang/rfcs/pull/92
-    #[derive(Copy, Clone)]
-    pub struct AllowStruct(bool);
-
-    #[derive(Copy, Clone, PartialEq, PartialOrd)]
-    enum Precedence {
-        Any,
-        Assign,
-        Placement,
-        Range,
-        Or,
-        And,
-        Compare,
-        BitOr,
-        BitXor,
-        BitAnd,
-        Shift,
-        Arithmetic,
-        Term,
-        Cast,
-    }
-
-    impl Precedence {
-        fn of(op: &BinOp) -> Self {
-            match *op {
-                BinOp::Add(_) | BinOp::Sub(_) => Precedence::Arithmetic,
-                BinOp::Mul(_) | BinOp::Div(_) | BinOp::Rem(_) => Precedence::Term,
-                BinOp::And(_) => Precedence::And,
-                BinOp::Or(_) => Precedence::Or,
-                BinOp::BitXor(_) => Precedence::BitXor,
-                BinOp::BitAnd(_) => Precedence::BitAnd,
-                BinOp::BitOr(_) => Precedence::BitOr,
-                BinOp::Shl(_) | BinOp::Shr(_) => Precedence::Shift,
-                BinOp::Eq(_)
-                | BinOp::Lt(_)
-                | BinOp::Le(_)
-                | BinOp::Ne(_)
-                | BinOp::Ge(_)
-                | BinOp::Gt(_) => Precedence::Compare,
-                BinOp::AddEq(_)
-                | BinOp::SubEq(_)
-                | BinOp::MulEq(_)
-                | BinOp::DivEq(_)
-                | BinOp::RemEq(_)
-                | BinOp::BitXorEq(_)
-                | BinOp::BitAndEq(_)
-                | BinOp::BitOrEq(_)
-                | BinOp::ShlEq(_)
-                | BinOp::ShrEq(_) => Precedence::Assign,
-            }
-        }
-    }
-
-    impl Parse for Expr {
-        fn parse(input: ParseStream) -> Result<Self> {
-            ambiguous_expr(input, AllowStruct(true))
-        }
-    }
-
-    #[cfg(feature = "full")]
-    fn expr_no_struct(input: ParseStream) -> Result<Expr> {
-        ambiguous_expr(input, AllowStruct(false))
-    }
-
-    #[cfg(feature = "full")]
-    fn parse_expr(
-        input: ParseStream,
-        mut lhs: Expr,
-        allow_struct: AllowStruct,
-        base: Precedence,
-    ) -> Result<Expr> {
-        loop {
-            if input
-                .fork()
-                .parse::<BinOp>()
-                .ok()
-                .map_or(false, |op| Precedence::of(&op) >= base)
-            {
-                let op: BinOp = input.parse()?;
-                let precedence = Precedence::of(&op);
-                let mut rhs = unary_expr(input, allow_struct)?;
-                loop {
-                    let next = peek_precedence(input);
-                    if next > precedence || next == precedence && precedence == Precedence::Assign {
-                        rhs = parse_expr(input, rhs, allow_struct, next)?;
-                    } else {
-                        break;
-                    }
-                }
-                lhs = if precedence == Precedence::Assign {
-                    Expr::AssignOp(ExprAssignOp {
-                        attrs: Vec::new(),
-                        left: Box::new(lhs),
-                        op: op,
-                        right: Box::new(rhs),
-                    })
-                } else {
-                    Expr::Binary(ExprBinary {
-                        attrs: Vec::new(),
-                        left: Box::new(lhs),
-                        op: op,
-                        right: Box::new(rhs),
-                    })
-                };
-            } else if Precedence::Assign >= base
-                && input.peek(Token![=])
-                && !input.peek(Token![==])
-                && !input.peek(Token![=>])
-            {
-                let eq_token: Token![=] = input.parse()?;
-                let mut rhs = unary_expr(input, allow_struct)?;
-                loop {
-                    let next = peek_precedence(input);
-                    if next >= Precedence::Assign {
-                        rhs = parse_expr(input, rhs, allow_struct, next)?;
-                    } else {
-                        break;
-                    }
-                }
-                lhs = Expr::Assign(ExprAssign {
-                    attrs: Vec::new(),
-                    left: Box::new(lhs),
-                    eq_token: eq_token,
-                    right: Box::new(rhs),
-                });
-            } else if Precedence::Placement >= base && input.peek(Token![<-]) {
-                let arrow_token: Token![<-] = input.parse()?;
-                let mut rhs = unary_expr(input, allow_struct)?;
-                loop {
-                    let next = peek_precedence(input);
-                    if next > Precedence::Placement {
-                        rhs = parse_expr(input, rhs, allow_struct, next)?;
-                    } else {
-                        break;
-                    }
-                }
-                lhs = Expr::InPlace(ExprInPlace {
-                    attrs: Vec::new(),
-                    place: Box::new(lhs),
-                    arrow_token: arrow_token,
-                    value: Box::new(rhs),
-                });
-            } else if Precedence::Range >= base && input.peek(Token![..]) {
-                let limits: RangeLimits = input.parse()?;
-                let rhs = if input.is_empty()
-                    || input.peek(Token![,])
-                    || input.peek(Token![;])
-                    || !allow_struct.0 && input.peek(token::Brace)
-                {
-                    None
-                } else {
-                    let mut rhs = unary_expr(input, allow_struct)?;
-                    loop {
-                        let next = peek_precedence(input);
-                        if next > Precedence::Range {
-                            rhs = parse_expr(input, rhs, allow_struct, next)?;
-                        } else {
-                            break;
-                        }
-                    }
-                    Some(rhs)
-                };
-                lhs = Expr::Range(ExprRange {
-                    attrs: Vec::new(),
-                    from: Some(Box::new(lhs)),
-                    limits: limits,
-                    to: rhs.map(Box::new),
-                });
-            } else if Precedence::Cast >= base && input.peek(Token![as]) {
-                let as_token: Token![as] = input.parse()?;
-                let ty = input.call(Type::without_plus)?;
-                lhs = Expr::Cast(ExprCast {
-                    attrs: Vec::new(),
-                    expr: Box::new(lhs),
-                    as_token: as_token,
-                    ty: Box::new(ty),
-                });
-            } else if Precedence::Cast >= base && input.peek(Token![:]) && !input.peek(Token![::]) {
-                let colon_token: Token![:] = input.parse()?;
-                let ty = input.call(Type::without_plus)?;
-                lhs = Expr::Type(ExprType {
-                    attrs: Vec::new(),
-                    expr: Box::new(lhs),
-                    colon_token: colon_token,
-                    ty: Box::new(ty),
-                });
-            } else {
-                break;
-            }
-        }
-        Ok(lhs)
-    }
-
-    #[cfg(not(feature = "full"))]
-    fn parse_expr(
-        input: ParseStream,
-        mut lhs: Expr,
-        allow_struct: AllowStruct,
-        base: Precedence,
-    ) -> Result<Expr> {
-        loop {
-            if input
-                .fork()
-                .parse::<BinOp>()
-                .ok()
-                .map_or(false, |op| Precedence::of(&op) >= base)
-            {
-                let op: BinOp = input.parse()?;
-                let precedence = Precedence::of(&op);
-                let mut rhs = unary_expr(input, allow_struct)?;
-                loop {
-                    let next = peek_precedence(input);
-                    if next > precedence || next == precedence && precedence == Precedence::Assign {
-                        rhs = parse_expr(input, rhs, allow_struct, next)?;
-                    } else {
-                        break;
-                    }
-                }
-                lhs = Expr::Binary(ExprBinary {
-                    attrs: Vec::new(),
-                    left: Box::new(lhs),
-                    op: op,
-                    right: Box::new(rhs),
-                });
-            } else if Precedence::Cast >= base && input.peek(Token![as]) {
-                let as_token: Token![as] = input.parse()?;
-                let ty = input.call(Type::without_plus)?;
-                lhs = Expr::Cast(ExprCast {
-                    attrs: Vec::new(),
-                    expr: Box::new(lhs),
-                    as_token: as_token,
-                    ty: Box::new(ty),
-                });
-            } else {
-                break;
-            }
-        }
-        Ok(lhs)
-    }
-
-    fn peek_precedence(input: ParseStream) -> Precedence {
-        if let Ok(op) = input.fork().parse() {
-            Precedence::of(&op)
-        } else if input.peek(Token![=]) && !input.peek(Token![=>]) {
-            Precedence::Assign
-        } else if input.peek(Token![<-]) {
-            Precedence::Placement
-        } else if input.peek(Token![..]) {
-            Precedence::Range
-        } else if input.peek(Token![as]) || input.peek(Token![:]) && !input.peek(Token![::]) {
-            Precedence::Cast
-        } else {
-            Precedence::Any
-        }
-    }
-
-    // Parse an arbitrary expression.
-    fn ambiguous_expr(input: ParseStream, allow_struct: AllowStruct) -> Result<Expr> {
-        let lhs = unary_expr(input, allow_struct)?;
-        parse_expr(input, lhs, allow_struct, Precedence::Any)
-    }
-
-    // <UnOp> <trailer>
-    // & <trailer>
-    // &mut <trailer>
-    // box <trailer>
-    #[cfg(feature = "full")]
-    fn unary_expr(input: ParseStream, allow_struct: AllowStruct) -> Result<Expr> {
-        let ahead = input.fork();
-        ahead.call(Attribute::parse_outer)?;
-        if ahead.peek(Token![&])
-            || ahead.peek(Token![box])
-            || ahead.peek(Token![*])
-            || ahead.peek(Token![!])
-            || ahead.peek(Token![-])
-        {
-            let attrs = input.call(Attribute::parse_outer)?;
-            if input.peek(Token![&]) {
-                Ok(Expr::Reference(ExprReference {
-                    attrs: attrs,
-                    and_token: input.parse()?,
-                    mutability: input.parse()?,
-                    expr: Box::new(unary_expr(input, allow_struct)?),
-                }))
-            } else if input.peek(Token![box]) {
-                Ok(Expr::Box(ExprBox {
-                    attrs: attrs,
-                    box_token: input.parse()?,
-                    expr: Box::new(unary_expr(input, allow_struct)?),
-                }))
-            } else {
-                Ok(Expr::Unary(ExprUnary {
-                    attrs: attrs,
-                    op: input.parse()?,
-                    expr: Box::new(unary_expr(input, allow_struct)?),
-                }))
-            }
-        } else {
-            trailer_expr(input, allow_struct)
-        }
-    }
-
-    #[cfg(not(feature = "full"))]
-    fn unary_expr(input: ParseStream, allow_struct: AllowStruct) -> Result<Expr> {
-        let ahead = input.fork();
-        ahead.call(Attribute::parse_outer)?;
-        if ahead.peek(Token![*]) || ahead.peek(Token![!]) || ahead.peek(Token![-]) {
-            Ok(Expr::Unary(ExprUnary {
-                attrs: input.call(Attribute::parse_outer)?,
-                op: input.parse()?,
-                expr: Box::new(unary_expr(input, allow_struct)?),
-            }))
-        } else {
-            trailer_expr(input, allow_struct)
-        }
-    }
-
-    // <atom> (..<args>) ...
-    // <atom> . <ident> (..<args>) ...
-    // <atom> . <ident> ...
-    // <atom> . <lit> ...
-    // <atom> [ <expr> ] ...
-    // <atom> ? ...
-    #[cfg(feature = "full")]
-    fn trailer_expr(input: ParseStream, allow_struct: AllowStruct) -> Result<Expr> {
-        if input.peek(token::Group) {
-            return input.call(expr_group).map(Expr::Group);
-        }
-
-        let outer_attrs = input.call(Attribute::parse_outer)?;
-
-        let atom = atom_expr(input, allow_struct)?;
-        let mut e = trailer_helper(input, atom)?;
-
-        let inner_attrs = e.replace_attrs(Vec::new());
-        let attrs = private::attrs(outer_attrs, inner_attrs);
-        e.replace_attrs(attrs);
-        Ok(e)
-    }
-
-    #[cfg(feature = "full")]
-    fn trailer_helper(input: ParseStream, mut e: Expr) -> Result<Expr> {
-        loop {
-            if input.peek(token::Paren) {
-                let content;
-                e = Expr::Call(ExprCall {
-                    attrs: Vec::new(),
-                    func: Box::new(e),
-                    paren_token: parenthesized!(content in input),
-                    args: content.parse_terminated(Expr::parse)?,
-                });
-            } else if input.peek(Token![.]) && !input.peek(Token![..]) {
-                let dot_token: Token![.] = input.parse()?;
-                let member: Member = input.parse()?;
-                let turbofish = if member.is_named() && input.peek(Token![::]) {
-                    Some(MethodTurbofish {
-                        colon2_token: input.parse()?,
-                        lt_token: input.parse()?,
-                        args: {
-                            let mut args = Punctuated::new();
-                            loop {
-                                if input.peek(Token![>]) {
-                                    break;
-                                }
-                                let value = input.call(generic_method_argument)?;
-                                args.push_value(value);
-                                if input.peek(Token![>]) {
-                                    break;
-                                }
-                                let punct = input.parse()?;
-                                args.push_punct(punct);
-                            }
-                            args
-                        },
-                        gt_token: input.parse()?,
-                    })
-                } else {
-                    None
-                };
-
-                if turbofish.is_some() || input.peek(token::Paren) {
-                    if let Member::Named(method) = member {
-                        let content;
-                        e = Expr::MethodCall(ExprMethodCall {
-                            attrs: Vec::new(),
-                            receiver: Box::new(e),
-                            dot_token: dot_token,
-                            method: method,
-                            turbofish: turbofish,
-                            paren_token: parenthesized!(content in input),
-                            args: content.parse_terminated(Expr::parse)?,
-                        });
-                        continue;
-                    }
-                }
-
-                e = Expr::Field(ExprField {
-                    attrs: Vec::new(),
-                    base: Box::new(e),
-                    dot_token: dot_token,
-                    member: member,
-                });
-            } else if input.peek(token::Bracket) {
-                let content;
-                e = Expr::Index(ExprIndex {
-                    attrs: Vec::new(),
-                    expr: Box::new(e),
-                    bracket_token: bracketed!(content in input),
-                    index: content.parse()?,
-                });
-            } else if input.peek(Token![?]) {
-                e = Expr::Try(ExprTry {
-                    attrs: Vec::new(),
-                    expr: Box::new(e),
-                    question_token: input.parse()?,
-                });
-            } else {
-                break;
-            }
-        }
-        Ok(e)
-    }
-
-    #[cfg(not(feature = "full"))]
-    fn trailer_expr(input: ParseStream, allow_struct: AllowStruct) -> Result<Expr> {
-        let mut e = atom_expr(input, allow_struct)?;
-
-        loop {
-            if input.peek(token::Paren) {
-                let content;
-                e = Expr::Call(ExprCall {
-                    attrs: Vec::new(),
-                    func: Box::new(e),
-                    paren_token: parenthesized!(content in input),
-                    args: content.parse_terminated(Expr::parse)?,
-                });
-            } else if input.peek(Token![.]) {
-                e = Expr::Field(ExprField {
-                    attrs: Vec::new(),
-                    base: Box::new(e),
-                    dot_token: input.parse()?,
-                    member: input.parse()?,
-                });
-            } else if input.peek(token::Bracket) {
-                let content;
-                e = Expr::Index(ExprIndex {
-                    attrs: Vec::new(),
-                    expr: Box::new(e),
-                    bracket_token: bracketed!(content in input),
-                    index: content.parse()?,
-                });
-            } else {
-                break;
-            }
-        }
-
-        Ok(e)
-    }
-
-    // Parse all atomic expressions which don't have to worry about precedence
-    // interactions, as they are fully contained.
-    #[cfg(feature = "full")]
-    fn atom_expr(input: ParseStream, allow_struct: AllowStruct) -> Result<Expr> {
-        if input.peek(token::Group) {
-            input.call(expr_group).map(Expr::Group)
-        } else if input.peek(Lit) {
-            input.call(expr_lit).map(Expr::Lit)
-        } else if input.peek(Token![async])
-            && (input.peek2(token::Brace) || input.peek2(Token![move]) && input.peek3(token::Brace))
-        {
-            input.call(expr_async).map(Expr::Async)
-        } else if input.peek(Token![try]) && input.peek2(token::Brace) {
-            input.call(expr_try_block).map(Expr::TryBlock)
-        } else if input.peek(Token![|])
-            || input.peek(Token![async]) && (input.peek2(Token![|]) || input.peek2(Token![move]))
-            || input.peek(Token![static])
-            || input.peek(Token![move])
-        {
-            expr_closure(input, allow_struct).map(Expr::Closure)
-        } else if input.peek(Ident)
-            || input.peek(Token![::])
-            || input.peek(Token![<])
-            || input.peek(Token![self])
-            || input.peek(Token![Self])
-            || input.peek(Token![super])
-            || input.peek(Token![extern])
-            || input.peek(Token![crate])
-        {
-            path_or_macro_or_struct(input, allow_struct)
-        } else if input.peek(token::Paren) {
-            paren_or_tuple(input)
-        } else if input.peek(Token![break]) {
-            expr_break(input, allow_struct).map(Expr::Break)
-        } else if input.peek(Token![continue]) {
-            input.call(expr_continue).map(Expr::Continue)
-        } else if input.peek(Token![return]) {
-            expr_ret(input, allow_struct).map(Expr::Return)
-        } else if input.peek(token::Bracket) {
-            array_or_repeat(input)
-        } else if input.peek(Token![let]) {
-            input.call(expr_let).map(Expr::Let)
-        } else if input.peek(Token![if]) {
-            input.call(expr_if).map(Expr::If)
-        } else if input.peek(Token![while]) {
-            input.call(expr_while).map(Expr::While)
-        } else if input.peek(Token![for]) {
-            input.call(expr_for_loop).map(Expr::ForLoop)
-        } else if input.peek(Token![loop]) {
-            input.call(expr_loop).map(Expr::Loop)
-        } else if input.peek(Token![match]) {
-            input.parse().map(Expr::Match)
-        } else if input.peek(Token![yield]) {
-            input.call(expr_yield).map(Expr::Yield)
-        } else if input.peek(Token![unsafe]) {
-            input.call(expr_unsafe).map(Expr::Unsafe)
-        } else if input.peek(token::Brace) {
-            input.call(expr_block).map(Expr::Block)
-        } else if input.peek(Token![..]) {
-            expr_range(input, allow_struct).map(Expr::Range)
-        } else if input.peek(Lifetime) {
-            let the_label: Label = input.parse()?;
-            let mut expr = if input.peek(Token![while]) {
-                Expr::While(input.call(expr_while)?)
-            } else if input.peek(Token![for]) {
-                Expr::ForLoop(input.call(expr_for_loop)?)
-            } else if input.peek(Token![loop]) {
-                Expr::Loop(input.call(expr_loop)?)
-            } else if input.peek(token::Brace) {
-                Expr::Block(input.call(expr_block)?)
-            } else {
-                return Err(input.error("expected loop or block expression"));
-            };
-            match expr {
-                Expr::While(ExprWhile { ref mut label, .. })
-                | Expr::ForLoop(ExprForLoop { ref mut label, .. })
-                | Expr::Loop(ExprLoop { ref mut label, .. })
-                | Expr::Block(ExprBlock { ref mut label, .. }) => *label = Some(the_label),
-                _ => unreachable!(),
-            }
-            Ok(expr)
-        } else {
-            Err(input.error("expected expression"))
-        }
-    }
-
-    #[cfg(not(feature = "full"))]
-    fn atom_expr(input: ParseStream, _allow_struct: AllowStruct) -> Result<Expr> {
-        if input.peek(Lit) {
-            input.call(expr_lit).map(Expr::Lit)
-        } else if input.peek(token::Paren) {
-            input.call(expr_paren).map(Expr::Paren)
-        } else if input.peek(Ident)
-            || input.peek(Token![::])
-            || input.peek(Token![<])
-            || input.peek(Token![self])
-            || input.peek(Token![Self])
-            || input.peek(Token![super])
-            || input.peek(Token![extern])
-            || input.peek(Token![crate])
-        {
-            input.parse().map(Expr::Path)
-        } else {
-            Err(input.error("unsupported expression; enable syn's features=[\"full\"]"))
-        }
-    }
-
-    #[cfg(feature = "full")]
-    fn path_or_macro_or_struct(input: ParseStream, allow_struct: AllowStruct) -> Result<Expr> {
-        let expr: ExprPath = input.parse()?;
-        if expr.qself.is_some() {
-            return Ok(Expr::Path(expr));
-        }
-
-        if input.peek(Token![!]) && !input.peek(Token![!=]) {
-            let mut contains_arguments = false;
-            for segment in &expr.path.segments {
-                match segment.arguments {
-                    PathArguments::None => {}
-                    PathArguments::AngleBracketed(_) | PathArguments::Parenthesized(_) => {
-                        contains_arguments = true;
-                    }
-                }
-            }
-
-            if !contains_arguments {
-                let bang_token: Token![!] = input.parse()?;
-                let (delimiter, tts) = mac::parse_delimiter(input)?;
-                return Ok(Expr::Macro(ExprMacro {
-                    attrs: Vec::new(),
-                    mac: Macro {
-                        path: expr.path,
-                        bang_token: bang_token,
-                        delimiter: delimiter,
-                        tts: tts,
-                    },
-                }));
-            }
-        }
-
-        if allow_struct.0 && input.peek(token::Brace) {
-            let outer_attrs = Vec::new();
-            expr_struct_helper(input, outer_attrs, expr.path).map(Expr::Struct)
-        } else {
-            Ok(Expr::Path(expr))
-        }
-    }
-
-    #[cfg(feature = "full")]
-    fn paren_or_tuple(input: ParseStream) -> Result<Expr> {
-        let content;
-        let paren_token = parenthesized!(content in input);
-        let inner_attrs = content.call(Attribute::parse_inner)?;
-        if content.is_empty() {
-            return Ok(Expr::Tuple(ExprTuple {
-                attrs: inner_attrs,
-                paren_token: paren_token,
-                elems: Punctuated::new(),
-            }));
-        }
-
-        let first: Expr = content.parse()?;
-        if content.is_empty() {
-            return Ok(Expr::Paren(ExprParen {
-                attrs: inner_attrs,
-                paren_token: paren_token,
-                expr: Box::new(first),
-            }));
-        }
-
-        let mut elems = Punctuated::new();
-        elems.push_value(first);
-        while !content.is_empty() {
-            let punct = content.parse()?;
-            elems.push_punct(punct);
-            if content.is_empty() {
-                break;
-            }
-            let value = content.parse()?;
-            elems.push_value(value);
-        }
-        Ok(Expr::Tuple(ExprTuple {
-            attrs: inner_attrs,
-            paren_token: paren_token,
-            elems: elems,
-        }))
-    }
-
-    #[cfg(feature = "full")]
-    fn array_or_repeat(input: ParseStream) -> Result<Expr> {
-        let content;
-        let bracket_token = bracketed!(content in input);
-        let inner_attrs = content.call(Attribute::parse_inner)?;
-        if content.is_empty() {
-            return Ok(Expr::Array(ExprArray {
-                attrs: inner_attrs,
-                bracket_token: bracket_token,
-                elems: Punctuated::new(),
-            }));
-        }
-
-        let first: Expr = content.parse()?;
-        if content.is_empty() || content.peek(Token![,]) {
-            let mut elems = Punctuated::new();
-            elems.push_value(first);
-            while !content.is_empty() {
-                let punct = content.parse()?;
-                elems.push_punct(punct);
-                if content.is_empty() {
-                    break;
-                }
-                let value = content.parse()?;
-                elems.push_value(value);
-            }
-            Ok(Expr::Array(ExprArray {
-                attrs: inner_attrs,
-                bracket_token: bracket_token,
-                elems: elems,
-            }))
-        } else if content.peek(Token![;]) {
-            let semi_token: Token![;] = content.parse()?;
-            let len: Expr = content.parse()?;
-            Ok(Expr::Repeat(ExprRepeat {
-                attrs: inner_attrs,
-                bracket_token: bracket_token,
-                expr: Box::new(first),
-                semi_token: semi_token,
-                len: Box::new(len),
-            }))
-        } else {
-            Err(content.error("expected `,` or `;`"))
-        }
-    }
-
-    #[cfg(feature = "full")]
-    fn expr_early(input: ParseStream) -> Result<Expr> {
-        let mut attrs = input.call(Attribute::parse_outer)?;
-        let mut expr = if input.peek(Token![if]) {
-            Expr::If(input.call(expr_if)?)
-        } else if input.peek(Token![while]) {
-            Expr::While(input.call(expr_while)?)
-        } else if input.peek(Token![for]) {
-            Expr::ForLoop(input.call(expr_for_loop)?)
-        } else if input.peek(Token![loop]) {
-            Expr::Loop(input.call(expr_loop)?)
-        } else if input.peek(Token![match]) {
-            Expr::Match(input.parse()?)
-        } else if input.peek(Token![try]) && input.peek2(token::Brace) {
-            Expr::TryBlock(input.call(expr_try_block)?)
-        } else if input.peek(Token![unsafe]) {
-            Expr::Unsafe(input.call(expr_unsafe)?)
-        } else if input.peek(token::Brace) {
-            Expr::Block(input.call(expr_block)?)
-        } else {
-            let allow_struct = AllowStruct(true);
-            let mut expr = unary_expr(input, allow_struct)?;
-
-            attrs.extend(expr.replace_attrs(Vec::new()));
-            expr.replace_attrs(attrs);
-
-            return parse_expr(input, expr, allow_struct, Precedence::Any);
-        };
-
-        if input.peek(Token![.]) || input.peek(Token![?]) {
-            expr = trailer_helper(input, expr)?;
-
-            attrs.extend(expr.replace_attrs(Vec::new()));
-            expr.replace_attrs(attrs);
-
-            let allow_struct = AllowStruct(true);
-            return parse_expr(input, expr, allow_struct, Precedence::Any);
-        }
-
-        attrs.extend(expr.replace_attrs(Vec::new()));
-        expr.replace_attrs(attrs);
-        Ok(expr)
-    }
-
-    pub fn expr_lit(input: ParseStream) -> Result<ExprLit> {
-        Ok(ExprLit {
-            attrs: Vec::new(),
-            lit: input.parse()?,
-        })
-    }
-
-    #[cfg(feature = "full")]
-    fn expr_group(input: ParseStream) -> Result<ExprGroup> {
-        let group = private::parse_group(input)?;
-        Ok(ExprGroup {
-            attrs: Vec::new(),
-            group_token: group.token,
-            expr: group.content.parse()?,
-        })
-    }
-
-    #[cfg(not(feature = "full"))]
-    fn expr_paren(input: ParseStream) -> Result<ExprParen> {
-        let content;
-        Ok(ExprParen {
-            attrs: Vec::new(),
-            paren_token: parenthesized!(content in input),
-            expr: content.parse()?,
-        })
-    }
-
-    #[cfg(feature = "full")]
-    fn generic_method_argument(input: ParseStream) -> Result<GenericMethodArgument> {
-        // TODO parse const generics as well
-        input.parse().map(GenericMethodArgument::Type)
-    }
-
-    #[cfg(feature = "full")]
-    fn expr_let(input: ParseStream) -> Result<ExprLet> {
-        Ok(ExprLet {
-            attrs: Vec::new(),
-            let_token: input.parse()?,
-            pats: {
-                let mut pats = Punctuated::new();
-                input.parse::<Option<Token![|]>>()?;
-                let value: Pat = input.parse()?;
-                pats.push_value(value);
-                while input.peek(Token![|]) && !input.peek(Token![||]) && !input.peek(Token![|=]) {
-                    let punct = input.parse()?;
-                    pats.push_punct(punct);
-                    let value: Pat = input.parse()?;
-                    pats.push_value(value);
-                }
-                pats
-            },
-            eq_token: input.parse()?,
-            expr: Box::new(input.call(expr_no_struct)?),
-        })
-    }
-
-    #[cfg(feature = "full")]
-    fn expr_if(input: ParseStream) -> Result<ExprIf> {
-        Ok(ExprIf {
-            attrs: Vec::new(),
-            if_token: input.parse()?,
-            cond: Box::new(input.call(expr_no_struct)?),
-            then_branch: input.parse()?,
-            else_branch: {
-                if input.peek(Token![else]) {
-                    Some(input.call(else_block)?)
-                } else {
-                    None
-                }
-            },
-        })
-    }
-
-    #[cfg(feature = "full")]
-    fn else_block(input: ParseStream) -> Result<(Token![else], Box<Expr>)> {
-        let else_token: Token![else] = input.parse()?;
-
-        let lookahead = input.lookahead1();
-        let else_branch = if input.peek(Token![if]) {
-            input.call(expr_if).map(Expr::If)?
-        } else if input.peek(token::Brace) {
-            Expr::Block(ExprBlock {
-                attrs: Vec::new(),
-                label: None,
-                block: input.parse()?,
-            })
-        } else {
-            return Err(lookahead.error());
-        };
-
-        Ok((else_token, Box::new(else_branch)))
-    }
-
-    #[cfg(feature = "full")]
-    fn expr_for_loop(input: ParseStream) -> Result<ExprForLoop> {
-        let label: Option<Label> = input.parse()?;
-        let for_token: Token![for] = input.parse()?;
-        let pat: Pat = input.parse()?;
-        let in_token: Token![in] = input.parse()?;
-        let expr: Expr = input.call(expr_no_struct)?;
-
-        let content;
-        let brace_token = braced!(content in input);
-        let inner_attrs = content.call(Attribute::parse_inner)?;
-        let stmts = content.call(Block::parse_within)?;
-
-        Ok(ExprForLoop {
-            attrs: inner_attrs,
-            label: label,
-            for_token: for_token,
-            pat: Box::new(pat),
-            in_token: in_token,
-            expr: Box::new(expr),
-            body: Block {
-                brace_token: brace_token,
-                stmts: stmts,
-            },
-        })
-    }
-
-    #[cfg(feature = "full")]
-    fn expr_loop(input: ParseStream) -> Result<ExprLoop> {
-        let label: Option<Label> = input.parse()?;
-        let loop_token: Token![loop] = input.parse()?;
-
-        let content;
-        let brace_token = braced!(content in input);
-        let inner_attrs = content.call(Attribute::parse_inner)?;
-        let stmts = content.call(Block::parse_within)?;
-
-        Ok(ExprLoop {
-            attrs: inner_attrs,
-            label: label,
-            loop_token: loop_token,
-            body: Block {
-                brace_token: brace_token,
-                stmts: stmts,
-            },
-        })
-    }
-
-    #[cfg(feature = "full")]
-    impl Parse for ExprMatch {
-        fn parse(input: ParseStream) -> Result<Self> {
-            let match_token: Token![match] = input.parse()?;
-            let expr = expr_no_struct(input)?;
-
-            let content;
-            let brace_token = braced!(content in input);
-            let inner_attrs = content.call(Attribute::parse_inner)?;
-
-            let mut arms = Vec::new();
-            while !content.is_empty() {
-                arms.push(content.call(Arm::parse)?);
-            }
-
-            Ok(ExprMatch {
-                attrs: inner_attrs,
-                match_token: match_token,
-                expr: Box::new(expr),
-                brace_token: brace_token,
-                arms: arms,
-            })
-        }
-    }
-
-    #[cfg(feature = "full")]
-    fn expr_try_block(input: ParseStream) -> Result<ExprTryBlock> {
-        Ok(ExprTryBlock {
-            attrs: Vec::new(),
-            try_token: input.parse()?,
-            block: input.parse()?,
-        })
-    }
-
-    #[cfg(feature = "full")]
-    fn expr_yield(input: ParseStream) -> Result<ExprYield> {
-        Ok(ExprYield {
-            attrs: Vec::new(),
-            yield_token: input.parse()?,
-            expr: {
-                if !input.is_empty() && !input.peek(Token![,]) && !input.peek(Token![;]) {
-                    Some(input.parse()?)
-                } else {
-                    None
-                }
-            },
-        })
-    }
-
-    #[cfg(feature = "full")]
-    fn expr_closure(input: ParseStream, allow_struct: AllowStruct) -> Result<ExprClosure> {
-        let asyncness: Option<Token![async]> = input.parse()?;
-        let movability: Option<Token![static]> = if asyncness.is_none() {
-            input.parse()?
-        } else {
-            None
-        };
-        let capture: Option<Token![move]> = input.parse()?;
-        let or1_token: Token![|] = input.parse()?;
-
-        let mut inputs = Punctuated::new();
-        loop {
-            if input.peek(Token![|]) {
-                break;
-            }
-            let value = fn_arg(input)?;
-            inputs.push_value(value);
-            if input.peek(Token![|]) {
-                break;
-            }
-            let punct: Token![,] = input.parse()?;
-            inputs.push_punct(punct);
-        }
-
-        let or2_token: Token![|] = input.parse()?;
-
-        let (output, body) = if input.peek(Token![->]) {
-            let arrow_token: Token![->] = input.parse()?;
-            let ty: Type = input.parse()?;
-            let body: Block = input.parse()?;
-            let output = ReturnType::Type(arrow_token, Box::new(ty));
-            let block = Expr::Block(ExprBlock {
-                attrs: Vec::new(),
-                label: None,
-                block: body,
-            });
-            (output, block)
-        } else {
-            let body = ambiguous_expr(input, allow_struct)?;
-            (ReturnType::Default, body)
-        };
-
-        Ok(ExprClosure {
-            attrs: Vec::new(),
-            asyncness: asyncness,
-            movability: movability,
-            capture: capture,
-            or1_token: or1_token,
-            inputs: inputs,
-            or2_token: or2_token,
-            output: output,
-            body: Box::new(body),
-        })
-    }
-
-    #[cfg(feature = "full")]
-    fn expr_async(input: ParseStream) -> Result<ExprAsync> {
-        Ok(ExprAsync {
-            attrs: Vec::new(),
-            async_token: input.parse()?,
-            capture: input.parse()?,
-            block: input.parse()?,
-        })
-    }
-
-    #[cfg(feature = "full")]
-    fn fn_arg(input: ParseStream) -> Result<FnArg> {
-        let pat: Pat = input.parse()?;
-
-        if input.peek(Token![:]) {
-            Ok(FnArg::Captured(ArgCaptured {
-                pat: pat,
-                colon_token: input.parse()?,
-                ty: input.parse()?,
-            }))
-        } else {
-            Ok(FnArg::Inferred(pat))
-        }
-    }
-
-    #[cfg(feature = "full")]
-    fn expr_while(input: ParseStream) -> Result<ExprWhile> {
-        let label: Option<Label> = input.parse()?;
-        let while_token: Token![while] = input.parse()?;
-        let cond = expr_no_struct(input)?;
-
-        let content;
-        let brace_token = braced!(content in input);
-        let inner_attrs = content.call(Attribute::parse_inner)?;
-        let stmts = content.call(Block::parse_within)?;
-
-        Ok(ExprWhile {
-            attrs: inner_attrs,
-            label: label,
-            while_token: while_token,
-            cond: Box::new(cond),
-            body: Block {
-                brace_token: brace_token,
-                stmts: stmts,
-            },
-        })
-    }
-
-    #[cfg(feature = "full")]
-    impl Parse for Label {
-        fn parse(input: ParseStream) -> Result<Self> {
-            Ok(Label {
-                name: input.parse()?,
-                colon_token: input.parse()?,
-            })
-        }
-    }
-
-    #[cfg(feature = "full")]
-    impl Parse for Option<Label> {
-        fn parse(input: ParseStream) -> Result<Self> {
-            if input.peek(Lifetime) {
-                input.parse().map(Some)
-            } else {
-                Ok(None)
-            }
-        }
-    }
-
-    #[cfg(feature = "full")]
-    fn expr_continue(input: ParseStream) -> Result<ExprContinue> {
-        Ok(ExprContinue {
-            attrs: Vec::new(),
-            continue_token: input.parse()?,
-            label: input.parse()?,
-        })
-    }
-
-    #[cfg(feature = "full")]
-    fn expr_break(input: ParseStream, allow_struct: AllowStruct) -> Result<ExprBreak> {
-        Ok(ExprBreak {
-            attrs: Vec::new(),
-            break_token: input.parse()?,
-            label: input.parse()?,
-            expr: {
-                if input.is_empty()
-                    || input.peek(Token![,])
-                    || input.peek(Token![;])
-                    || !allow_struct.0 && input.peek(token::Brace)
-                {
-                    None
-                } else {
-                    let expr = ambiguous_expr(input, allow_struct)?;
-                    Some(Box::new(expr))
-                }
-            },
-        })
-    }
-
-    #[cfg(feature = "full")]
-    fn expr_ret(input: ParseStream, allow_struct: AllowStruct) -> Result<ExprReturn> {
-        Ok(ExprReturn {
-            attrs: Vec::new(),
-            return_token: input.parse()?,
-            expr: {
-                if input.is_empty() || input.peek(Token![,]) || input.peek(Token![;]) {
-                    None
-                } else {
-                    // NOTE: return is greedy and eats blocks after it even when in a
-                    // position where structs are not allowed, such as in if statement
-                    // conditions. For example:
-                    //
-                    // if return { println!("A") } {} // Prints "A"
-                    let expr = ambiguous_expr(input, allow_struct)?;
-                    Some(Box::new(expr))
-                }
-            },
-        })
-    }
-
-    #[cfg(feature = "full")]
-    impl Parse for FieldValue {
-        fn parse(input: ParseStream) -> Result<Self> {
-            let member: Member = input.parse()?;
-            let (colon_token, value) = if input.peek(Token![:]) || !member.is_named() {
-                let colon_token: Token![:] = input.parse()?;
-                let value: Expr = input.parse()?;