ports/contrib (3.7): thunderbird: 102.2.2 -> 102.4.1
commit eababadb756f0a542f7c1d46457e1653ba396f51 Author: Tim Biermann <tbier@posteo.de> Date: Sat Oct 29 21:45:40 2022 +0000 thunderbird: 102.2.2 -> 102.4.1 diff --git a/thunderbird/.signature b/thunderbird/.signature index 373cb94ad..619220523 100644 --- a/thunderbird/.signature +++ b/thunderbird/.signature @@ -1,9 +1,6 @@ untrusted comment: verify with /etc/ports/contrib.pub -RWSagIOpLGJF38HbEpaIOWMVTtUXV6SoCQKuhiqYZXi6vhNI3OjRMbGVT3gfHxjX/Rh8EKOqaFRj2PU0bpdkJ+YdJk5Byz5ORwo= -SHA256 (Pkgfile) = efea3318e264663e6f4ff2671507dc2883bdce8515dbb84ecade8ff94d6d25e5 +RWSagIOpLGJF3/0bKpTOVJJcyM5QKYjYtTntiMaD+vgK2xhAvkDXyQLOSszsz05t6+YDzGmVF8pHffXnBWSCWRKy6yuWACfAwQg= +SHA256 (Pkgfile) = 1c43b21168863cf9feb8c638494d133b89427712d749ca20f3d13741fcbcb8e4 SHA256 (.footprint) = b4b411c70602919b2afe6fbf140755bd53ad1f77d2ff5013a899e0a3cf4543d2 -SHA256 (thunderbird-102.2.2.source.tar.xz) = 5d5f327ea450572ef2a135e5c849b3f38f7d54e897f41a1dec5223e184558f2b +SHA256 (thunderbird-102.4.1.source.tar.xz) = d3766bf809f9083c0da0a1ae035509a43a10f79c614563b3e4278ae3eb6974a0 SHA256 (thunderbird.desktop) = c6bc6a66f16951c4f7560d019dad48968169aef6587cef4e98380a300078299a -SHA256 (cbindgen-0.24.patch) = 4628d136c3beada292e83cd8e89502cac4aa3836851b34259a665582a7713978 -SHA256 (rustc_version-0.4.0.patch) = 4e7bb6d1205d9b0ed226f5636f6270afefc3e60eee1d8a2f6ede41e874728dc6 -SHA256 (packed_simd_2-0.3.8.patch) = 8a5654094f17358acf166a185e037a2a008ca47d63ee0130c797a079e437ae42 diff --git a/thunderbird/0038-bmo-1667736-Update-packed_simd-to-compile-on-Rust-1.patch b/thunderbird/0038-bmo-1667736-Update-packed_simd-to-compile-on-Rust-1.patch deleted file mode 100644 index eac8bf745..000000000 --- a/thunderbird/0038-bmo-1667736-Update-packed_simd-to-compile-on-Rust-1.patch +++ /dev/null @@ -1,3213 +0,0 @@ -From 5183a31a28c400f60914572ee3f9646ba313036f Mon Sep 17 00:00:00 2001 -From: Thomas Deutschmann <whissi@gentoo.org> -Date: Tue, 24 Nov 2020 18:56:40 +0100 -Subject: [PATCH 38/39] bmo#1667736: Update packed_simd to compile on Rust 1.48 - -Bug: https://bugs.gentoo.org/756334 -Signed-off-by: Thomas Deutschmann <whissi@gentoo.org> ---- - .cargo/config.in | 2 +- - Cargo.lock | 4 +- - Cargo.toml | 2 +- - .../rust/packed_simd/.cargo-checksum.json | 2 +- - third_party/rust/packed_simd/.travis.yml | 237 ++++------- - third_party/rust/packed_simd/Cargo.toml | 14 +- - .../rust/packed_simd/{readme.md => README.md} | 111 ++---- - third_party/rust/packed_simd/build.rs | 2 +- - third_party/rust/packed_simd/ci/all.sh | 2 +- - .../aarch64-unknown-linux-gnu/Dockerfile | 2 +- - .../arm-unknown-linux-gnueabi/Dockerfile | 2 +- - .../arm-unknown-linux-gnueabihf/Dockerfile | 2 +- - .../armv7-unknown-linux-gnueabihf/Dockerfile | 2 +- - .../docker/i586-unknown-linux-gnu/Dockerfile | 2 +- - .../docker/i686-unknown-linux-gnu/Dockerfile | 2 +- - .../docker/mips-unknown-linux-gnu/Dockerfile | 2 +- - .../mips64-unknown-linux-gnuabi64/Dockerfile | 2 +- - .../Dockerfile | 2 +- - .../mipsel-unknown-linux-musl/Dockerfile | 4 +- - .../powerpc-unknown-linux-gnu/Dockerfile | 3 +- - .../powerpc64-unknown-linux-gnu/Dockerfile | 2 +- - .../powerpc64le-unknown-linux-gnu/Dockerfile | 2 +- - .../Dockerfile | 2 +- - .../x86_64-unknown-linux-gnu/Dockerfile | 2 +- - third_party/rust/packed_simd/ci/dox.sh | 7 +- - third_party/rust/packed_simd/ci/run.sh | 6 +- - .../rust/packed_simd/ci/setup_benchmarks.sh | 3 - - third_party/rust/packed_simd/src/api.rs | 13 +- - .../rust/packed_simd/src/api/bit_manip.rs | 1 + - .../rust/packed_simd/src/api/bitmask.rs | 82 ++++ - .../rust/packed_simd/src/api/cast/v128.rs | 2 +- - .../rust/packed_simd/src/api/cast/v16.rs | 2 +- - .../rust/packed_simd/src/api/cast/v256.rs | 2 +- - .../rust/packed_simd/src/api/cast/v32.rs | 2 +- - .../rust/packed_simd/src/api/cast/v512.rs | 2 +- - .../rust/packed_simd/src/api/cast/v64.rs | 2 +- - .../rust/packed_simd/src/api/default.rs | 2 + - .../packed_simd/src/api/from/from_array.rs | 2 + - third_party/rust/packed_simd/src/api/hash.rs | 2 + - .../src/api/into_bits/arch_specific.rs | 3 +- - .../packed_simd/src/api/into_bits/v128.rs | 2 +- - .../rust/packed_simd/src/api/into_bits/v16.rs | 2 +- - .../packed_simd/src/api/into_bits/v256.rs | 2 +- - .../rust/packed_simd/src/api/into_bits/v32.rs | 2 +- - .../packed_simd/src/api/into_bits/v512.rs | 2 +- - .../rust/packed_simd/src/api/into_bits/v64.rs | 2 +- - .../rust/packed_simd/src/api/minimal/iuf.rs | 6 +- - .../rust/packed_simd/src/api/minimal/mask.rs | 6 +- - .../rust/packed_simd/src/api/minimal/ptr.rs | 28 +- - .../src/api/ops/vector_float_min_max.rs | 5 + - .../packed_simd/src/api/ptr/gather_scatter.rs | 36 +- - .../src/api/reductions/float_arithmetic.rs | 13 +- - .../packed_simd/src/api/reductions/min_max.rs | 4 + - .../packed_simd/src/api/slice/from_slice.rs | 6 +- - .../src/api/slice/write_to_slice.rs | 6 +- - third_party/rust/packed_simd/src/codegen.rs | 3 + - .../rust/packed_simd/src/codegen/bit_manip.rs | 2 +- - .../rust/packed_simd/src/codegen/llvm.rs | 8 + - .../src/codegen/reductions/mask/x86.rs | 8 +- - .../src/codegen/reductions/mask/x86/sse.rs | 32 -- - .../rust/packed_simd/src/codegen/shuffle.rs | 370 ++++++------------ - .../packed_simd/src/codegen/shuffle1_dyn.rs | 35 +- - .../rust/packed_simd/src/codegen/vPtr.rs | 2 + - third_party/rust/packed_simd/src/lib.rs | 29 +- - third_party/rust/packed_simd/src/masks.rs | 2 + - third_party/rust/packed_simd/src/sealed.rs | 15 +- - .../rust/packed_simd/src/testing/utils.rs | 25 +- - third_party/rust/packed_simd/src/v128.rs | 32 +- - third_party/rust/packed_simd/src/v16.rs | 6 +- - third_party/rust/packed_simd/src/v256.rs | 32 +- - third_party/rust/packed_simd/src/v32.rs | 12 +- - third_party/rust/packed_simd/src/v512.rs | 32 +- - third_party/rust/packed_simd/src/v64.rs | 26 +- - third_party/rust/packed_simd/src/vPtr.rs | 2 +- - third_party/rust/packed_simd/src/vSize.rs | 20 +- - .../rust/packed_simd/tests/endianness.rs | 62 +-- - 76 files changed, 618 insertions(+), 801 deletions(-) - rename third_party/rust/packed_simd/{readme.md => README.md} (54%) - create mode 100644 third_party/rust/packed_simd/src/api/bitmask.rs - -diff --git a/.cargo/config.in b/.cargo/config.in -index b1a1b35f77..1accd1ef72 100644 ---- a/.cargo/config.in -+++ b/.cargo/config.in -@@ -50,7 +50,7 @@ tag = "v0.3.0" - [source."https://github.com/hsivonen/packed_simd"] - git = "https://github.com/hsivonen/packed_simd" - replace-with = "vendored-sources" --rev = "3541e3818fdc7c2a24f87e3459151a4ce955a67a" -+rev = "0917fe780032a6bbb23d71be545f9c1834128d75" - - [source."https://github.com/djg/cubeb-pulse-rs"] - git = "https://github.com/djg/cubeb-pulse-rs" -diff --git a/Cargo.lock b/Cargo.lock -index 9f2b63582e..e7b0247088 100644 ---- a/Cargo.lock -+++ b/Cargo.lock -@@ -3425,8 +3425,8 @@ dependencies = [ - - [[package]] - name = "packed_simd" --version = "0.3.3" --source = "git+https://github.com/hsivonen/packed_simd?rev=3541e3818fdc7c2a24f87e3459151a4c..." -+version = "0.3.4" -+source = "git+https://github.com/hsivonen/packed_simd?rev=0917fe780032a6bbb23d71be545f9c18..." - dependencies = [ - "cfg-if", - ] -diff --git a/Cargo.toml b/Cargo.toml -index b723c1da2d..3173ef840c 100644 ---- a/Cargo.toml -+++ b/Cargo.toml -@@ -66,7 +66,7 @@ panic = "abort" - - [patch.crates-io] - libudev-sys = { path = "dom/webauthn/libudev-sys" } --packed_simd = { git = "https://github.com/hsivonen/packed_simd", rev="3541e3818fdc7c2a24f87e3459151a4ce955a67a" } -+packed_simd = { git = "https://github.com/hsivonen/packed_simd", rev="0917fe780032a6bbb23d71be545f9c1834128d75" } - rlbox_lucet_sandbox = { git = "https://github.com/PLSysSec/rlbox_lucet_sandbox/", rev="d510da5999a744c563b0acd18056069d1698273f" } - nix = { git = "https://github.com/shravanrn/nix/", rev="4af6c367603869a30fddb5ffb0aba2b9477ba92e" } - spirv_cross = { git = "https://github.com/kvark/spirv_cross", branch = "wgpu3" } -diff --git a/third_party/rust/packed_simd/.cargo-checksum.json b/third_party/rust/packed_simd/.cargo-checksum.json -index 01afcc1efd..1512803e57 100644 ---- a/third_party/rust/packed_simd/.cargo-checksum.json -+++ b/third_party/rust/packed_simd/.cargo-checksum.json -@@ -1 +1 @@ --{"files":{".appveyor.yml":"f1ed01850e0d725f9498f52a1a63ddf40702ad6e0bf5b2d7c4c04d76e96794a3",".travis.yml":"e9258d9a54fdaf4cbc12405fe5993ac4497eb2b29021691dbc91b19cb9b52227","Cargo.toml":"089941ba3c89ea111cbea3cc3abdcdcf2b9d0ae0db268d7269ee38226db950e5","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","bors.toml":"dee881dc69b9b7834e4eba5d95c3ed5a416d4628815a167d6a22d4cb4fb064b8","build.rs":"f3baefc5e5bb9b250e762a1466371b922fd7ee4243c217b2d014307603c2f57a","ci/all.sh":"a23d14e10cb26a0eb719e389c30eb955fa53cddcd436890646df09af640bd2eb","ci/android-install-ndk.sh":"0f1746108cc30bf9b9ba45bcde7b19fc1a8bdf5b0258035b4eb8dc69b75efac4","ci/android-install-sdk.sh":"3490432022c5c8f5a115c084f7a9aca1626f96c0c87ffb62019228c4346b47e4","ci/android-sysimage.sh":"ebf4e5daa1f0fe1b2092b79f0f3f161c4c4275cb744e52352c4d81ab451e4c5a","ci/benchmark.sh":"b61d19ef6b90deba8fb79dee74c8b062d94844676293da346da87bb78a9a49a4","ci/deploy_and_run_on_ios_simulator.rs":"ec8ecf82d92072676aa47f0d1a3d021b60a7ae3531153ef12d2ff4541fc294dc","ci/docker/aarch64-linux-android/Dockerfile":"ace2e7d33c87bc0f6d3962a4a3408c04557646f7f51ab99cfbf574906796b016","ci/docker/aarch64-unknown-linux-gnu/Dockerfile":"1ecdac757101d951794fb2ab0deaa278199cf25f2e08a15c7d40ff31a8556184","ci/docker/arm-linux-androideabi/Dockerfile":"370e55d3330a413a3ccf677b3afb3e0ef9018a5fab263faa97ae8ac017fc2286","ci/docker/arm-unknown-linux-gnueabi/Dockerfile":"e25d88f6c0c94aada3d2e3f08243f755feb7e869dc5dc505b3799719cb1af591","ci/docker/arm-unknown-linux-gnueabihf/Dockerfile":"f126f4c7bae8c11ab8b16df06ad997863f0838825a9c08c9899a3eedb6d570bd","ci/docker/armv7-unknown-linux-gnueabihf/Dockerfile":"b647545c158ee480a4c581dbdc1f57833aef056c8d498acc04b573e842bf803c","ci/docker/i586-unknown-linux-gnu/Dockerfile":"0d492759017307ccf74dc2aa4a8cf6623daf3dc728c708dc2b18fa7940800cba","ci/docker/i686-unknown-linux-gnu/Dockerfile":"0d492759017307ccf74dc2aa4a8cf6623daf3dc728c708dc2b18fa7940800cba","ci/docker/mips-unknown-linux-gnu/Dockerfile":"323776469bb7b160385f3621d66e3ee14c75242f8180f916e65af048a29d4ea0","ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile":"c647f6948a9a43b0be695cbed4eac752120d0faf28e5e69c718cb10406921dab","ci/docker/mips64el-unknown-linux-gnuabi64/Dockerfile":"77bfd00cc8639509be381b394f077e39b45a00158ad61b4e1656714c714665d1","ci/docker/mipsel-unknown-linux-musl/Dockerfile":"ec5bea6c98a3b626731fdb95f9ff2d1182639c76e8fb16d3271d0fc884901524","ci/docker/powerpc-unknown-linux-gnu/Dockerfile":"4f2b662de66e83d1354f650b7077692309637f786c2ea5516c31b5c2ee10af2d","ci/docker/powerpc64-unknown-linux-gnu/Dockerfile":"a9595402b772bc365982e22a0096a8988825d90b09b5faa97ab192e76072f71d","ci/docker/powerpc64le-unknown-linux-gnu/Dockerfile":"df3c381c157439695ae8cd10ab71664702c061e3b4ab22906a5ad6c2680acfed","ci/docker/s390x-unknown-linux-gnu/Dockerfile":"93fb44df3d7fd31ead158570667c97b5076a05c3d968af4a84bc13819a8f2db8","ci/docker/sparc64-unknown-linux-gnu/Dockerfile":"da1c39a3ff1fe22e41395fa7c8934e90b4c1788e551b9aec6e38bfd94effc437","ci/docker/thumbv7neon-linux-androideabi/Dockerfile":"c2decd5591bd7a09378901bef629cd944acf052eb55e4f35b79eb9cb4d62246a","ci/docker/thumbv7neon-unknown-linux-gnueabihf/Dockerfile":"75c0c56161c7382b439de74c00de1c0e3dc9d59560cd6720976a751034b78714","ci/docker/wasm32-unknown-unknown/Dockerfile":"3e5f294bc1e004aa599086c2af49d6f3e7459fa250f5fbdd60cf67d53db78758","ci/docker/x86_64-linux-android/Dockerfile":"685040273cf350d5509e580ac451555efa19790c8723ca2af066adadc6880ad2","ci/docker/x86_64-unknown-linux-gnu-emulated/Dockerfile":"44b6203d9290bfdc53d81219f0937e1110847a23dd982ec8c4de388354f01536","ci/docker/x86_64-unknown-linux-gnu/Dockerfile":"d253c86803b22da428fa9cc671a05f18d3318eca7733b8dccb4f7be1ddf524c5","ci/dox.sh":"5b61711be47a4e3dde0ddd15ba73d256ea95fd75af3897732c24db1dc7e66366","ci/linux-s390x.sh":"d6b732d7795b4ba131326aff893bca6228a7d2eb0e9402f135705413dbbe0dce","ci/linux-sparc64.sh":"c92966838b1ab7ad3b7a344833ee726aba6b647cf5952e56f0ad1ba420b13325","ci/lld-shim.rs":"3d7f71ec23a49e2b67f694a0168786f9a954dda15f5a138815d966643fd3fcc3","ci/max_line_width.sh":"0a1518bba4c9ecaa55694cb2e9930d0e19c265baabf73143f17f9cf285aaa5bb","ci/run-docker.sh":"92e036390ad9b0d16f109579df1b5ced2e72e9afea40c7d011400ebd3a2a90de","ci/run.sh":"63259e22a96ba539f53c06b1b39f53e3a78a71171652e7afc170836110ccd913","ci/run_examples.sh":"d1a23c6c35374a0678ba5114b9b8fefd8be0a79e774872a8bf0898d1baca18d0","ci/runtest-android.rs":"145a8e9799a5223975061fe7e586ade5669ee4877a7d7a4cf6b4ab48e8e36c7c","ci/setup_benchmarks.sh":"73fb981a8fdb1dcd54409d3c0fbbfb8f77a3ceabf8626a6b9bf9d21d6bc8ce72","ci/test-runner-linux":"c8aa6025cff5306f4f31d0c61dc5f9d4dd5a1d189ab613ef8d4c367c694d9ccd","contributing.md":"2cc8c9c560ae17867e69b06d09b758dbf7bc39eb774ada50a743724b10acc0a2","perf-guide/.gitignore":"fe82c7da551079d832cf74200b0b359b4df9828cb4a0416fa7384f07a2ae6a13","perf-guide/book.toml":"115a98284126c6b180178b44713314cc494f08a71662ee2ce15cf67f17a51064","perf-guide/src/SUMMARY.md":"3e03bffc991fdc2050f3d51842d72d9d21ea6abab56a3baf3b2d5973a78b89e1","perf-guide/src/ascii.css":"29afb08833b2fe2250f0412e1fa1161a2432a0820a14953c87124407417c741a","perf-guide/src/bound_checks.md":"5e4991ff58a183ef0cd9fdc1feb4cd12d083b44bdf87393bbb0927808ef3ce7d","perf-guide/src/float-math/approx.md":"8c09032fa2d795a0c5db1775826c850d28eb2627846d0965c60ee72de63735ad","perf-guide/src/float-math/fma.md":"311076ba4b741d604a82e74b83a8d7e8c318fcbd7f64c4392d1cf5af95c60243","perf-guide/src/float-math/fp.md":"04153e775ab6e4f0d7837bcc515230d327b04edfa34c84ce9c9e10ebaeef2be8","perf-guide/src/float-math/svml.md":"0798873b8eedaeda5fed62dc91645b57c20775a02d3cd74d8bd06958f1516506","perf-guide/src/introduction.md":"9f5a19e9e6751f25d2daad39891a0cc600974527ec4c8305843f9618910671bd","perf-guide/src/prof/linux.md":"447731eb5de7d69166728fdbc5ecb0c0c9db678ea493b45a592d67dd002184c0","perf-guide/src/prof/mca.md":"f56d54f3d20e7aa4d32052186e8237b03d65971eb5d112802b442570ff11d344","perf-guide/src/prof/profiling.md":"8a650c0fd6ede0964789bb6577557eeef1d8226a896788602ce61528e260e43c","perf-guide/src/target-feature/attribute.md":"615f88dca0a707b6c416fa605435dd6e1fb5361cc639429cbf68cd87624bd78b","perf-guide/src/target-feature/features.md":"17077760ff24c006b606dd21889c53d87228f4311f3ba3a574f9afdeacd86165","perf-guide/src/target-feature/inlining.md":"7ed1d7068d8173a00d84c16cfe5871cd68b9f04f8d0cca2d01ebc84957ebf2f6","perf-guide/src/target-feature/practice.md":"c4b371842e0086df178488fec97f20def8f0c62ee588bcd25fd948b9b1fa227e","perf-guide/src/target-feature/runtime.md":"835425f5ee597fb3e51d36e725a81ebee29f4561231d19563cd4da81dbb1cfcb","perf-guide/src/target-feature/rustflags.md":"ab49712e9293a65d74d540ba4784fcb57ff1119ec05a575d895c071f1a620f64","perf-guide/src/vert-hor-ops.md":"c6211c0ee91e60552ec592d89d9d957eedc21dee3cbd89e1ad6765ea06a27471","readme.md":"585a8f0e16877fb9abb00cd17a175fcb9d7857840c6c61209f1827ffab095070","rustfmt.toml":"de6101d0670bad65fb3b337d56957d2a024e017e5ab146ec784d77312daaf8ff","src/api.rs":"331a3a4abb19cee2df5f2df4ad7c3e88b45e62cf23fdacfc9bbaa633dc5cf788","src/api/bit_manip.rs":"e68290ee679cc5abc9c73afbe635c1035f8cbfe849e5c751a1680e459244c39e","src/api/cast.rs":"03b94a3d316ac7b7be7068810044911e965e889a0ace7bae762749ca74a92747","src/api/cast/macros.rs":"b0a14d0c83ad2ebb7a275180f6d9e3f2bc312ba57a7d3d6c39fad4e0f20f9408","src/api/cast/v128.rs":"63e28c6a3edf1a7a635f51b8d3c6adbb1d46f884d92a196b3d4a6e743d809416","src/api/cast/v16.rs":"2a584eeb57fd47baad6f3533764301b04aaaac23702b7a8db12598ac02899262","src/api/cast/v256.rs":"b91c15ed8d1536ecd97b4eb79ff9d5aba0552cd9b6f0ea6435b05f2273e23b3a","src/api/cast/v32.rs":"62ec89fcce7fa7f28497ee5770adc8f81d2d3a6b2925b02f7dc06504c40e8f38","src/api/cast/v512.rs":"d855cb943ae7106e9599ef38e30a3afb1c6bd5433178baca54cb128fd9a7d143","src/api/cast/v64.rs":"fe0f7dfaf4fc0c0c1a78c96fcfcdfdc2a1e2845843b11aa797a0c6fb52a8f774","src/api/cmp.rs":"357c3a2a09c6d4611c32dd7fa95be2fae933d513e229026ec9b44451a77b884e","src/api/cmp/eq.rs":"60f70f355bae4cb5b17db53204cacc3890f70670611c17df638d4c04f7cc8075","src/api/cmp/ord.rs":"589f7234761c294fa5df8f525bc4acd5a47cdb602207d524a0d4e19804cd9695","src/api/cmp/partial_eq.rs":"3ed23d2a930b0f9750c3a5309da766b03dc4f9c4d375b42ad3c50fe732693d15","src/api/cmp/partial_ord.rs":"e16b11805c94048acd058c93994b5bc74bb187f8d7e3b86a87df60e1601467f9","src/api/cmp/vertical.rs":"de3d62f38eba817299aa16f1e1939954c9a447e316509397465c2830852ba053","src/api/default.rs":"b61f92fc0e33a2633b3375eb405beba480da071cde03df4d437d8a6058afcd97","src/api/fmt.rs":"67fb804bb86b6cd77cf8cd492b5733ce437071b66fe3297278b8a6552c325dda","src/api/fmt/binary.rs":"35cb5c266197d6224d598fb3d286e5fe48ef0c01ed356c2ff6fe9ba946f96a92","src/api/fmt/debug.rs":"aa18eea443bf353fea3db8b1a025132bbcaf91e747ecfa43b8d9fce9af395a0c","src/api/fmt/lower_hex.rs":"69d5be366631af309f214e8031c8c20267fcc27a695eac6f45c6bc1df72a67e6","src/api/fmt/octal.rs":"9eb11ba3d990213f3c7f1ec25edba7ce997cb1320e16d308c83498ba6b9bfbd9","src/api/fmt/upper_hex.rs":"a4637d085b7bb20e759ce58e08435b510a563ba3dd468af2b03560fdc5511562","src/api/from.rs":"2e599d8329cb05eaf06224cc441355c4b7b51254fc19256619333be8c149d444","src/api/from/from_array.rs":"4151593c7bba7455821fffa5b59867005a77c95d32f1f0cc3fd87294000157d9","src/api/from/from_vector.rs":"9764371aa9e6005aace74dea14f59e5611a095b7cf42707940924749282c52f0","src/api/hash.rs":"562cfa3f1d8eb9a733c035a3665a599c2f1e341ee820d8fbdd102a4398a441bc","src/api/into_bits.rs":"82297f0697d67b5a015e904e7e6e7b2a7066ba825bc54b94b4ff3e22d7a1eefb","src/api/into_bits/arch_specific.rs":"1f925390b0ce7132587d95f2419c6e2ad3e1a9d17eb1d9c120a1c1c4bdf4277e","src/api/into_bits/macros.rs":"d762406de25aedff88d460dec7a80dc8e825a2a419d53218ce007efa6a1d3e04","src/api/into_bits/v128.rs":"ecdc5893664c71d7ab1ff3697c3fbe490d20d8748b9b76881d05e7625e40d74c","src/api/into_bits/v16.rs":"5459ec7dad1ad7bd30dc7e48374580b993abf23701d9c3cb22203fa0a9aabb6d","src/api/into_bits/v256.rs":"90ea351da0380ead1bf0f63b620afd40d01d638d09f7e7be31840bd2c1d9c663","src/api/into_bits/v32.rs":"ee1dc5a430050e16f51154b5fe85b1536f5feddf2ea23dd1d3859b67c4afc6fc","src/api/into_bits/v512.rs":"f72098ed1c9a23944f3d01abaf5e0f2d0e81d35a06fdadd2183e896d41b59867","src/api/into_bits/v64.rs":"6394462facdfe7827349c742b7801f1291e75a720dfb8c0b52100df46f371c98","src/api/math.rs":"8b2a2fc651917a850539f993aa0b9e5bf4da67b11685285b8de8cdca311719ec","src/api/math/float.rs":"61d2794d68262a1090ae473bd30793b5f65cf732f32a6694a3af2ce5d9225616","src/api/math/float/abs.rs":"5b6b2701e2e11135b7ce58a05052ea8120e10e4702c95d046b9d21b827b26bf8","src/api/math/float/consts.rs":"78acba000d3fa527111300b6327c1932de9c4c1e02d4174e1a5615c01463d38c","src/api/math/float/cos.rs":"4c2dd7173728ef189314f1576c9486e03be21b7da98843b2f9011282a7979e31","src/api/math/float/exp.rs":"7c6d5f1e304f498a01cfa23b92380c815d7da0ad94eae3483783bc377d287eef","src/api/math/float/ln.rs":"54c7583f3df793b39ff57534fade27b41bb992439e5dc178252f5ca3190a3e54","src/api/math/float/mul_add.rs":"62cac77660d20159276d4c9ef066eb90c81cbddb808e8e157182c607625ad2eb","src/api/math/float/mul_adde.rs":"bae056ee9f3a70df39ec3c3b2f6437c65303888a7b843ef1a5bcf1f5aca0e602","src/api/math/float/powf.rs":"9ddb938984b36d39d82a82f862f80df8f7fb013f1d222d45698d41d88472f568","src/api/math/float/recpre.rs":"589225794ff1dbf31158dff660e6d4509ecc8befbb57c633900dea5ac0b840d6","src/api/math/float/rsqrte.rs":"a32abdcc318d7ccc8448231f54d75b884b7cbeb03a7d595713ab6243036f4dbf","src/api/math/float/sin.rs":"cbd3622b7df74f19691743001c8cf747a201f8977ad90542fee915f37dcd1e49","src/api/math/float/sqrt.rs":"0c66d5d63fb08e4d99c6b82a8828e41173aff1ac9fa1a2764a11fac217ccf2ac","src/api/math/float/sqrte.rs":"731e1c9f321b662accdd27dacb3aac2e8043b7aecb2f2161dde733bd9f025362","src/api/minimal.rs":"1f22bcc528555444e76de569ec0ae2029b9ae9d04805efeafa93369c8098036b","src/api/minimal/iuf.rs":"c501a6696950cf5e521765f178de548af64fdfb6e10d026616d09fab93ca2d17","src/api/minimal/mask.rs":"42e415f536c5193d0218f5a754b34b87fd7c971bff068009f958712166ff056d","src/api/minimal/ptr.rs":"a9ee482d1dd1c956fb8f3f179e6e620b1de4e9d713961461d4c6923a4ef2e67c","src/api/ops.rs":"3e273b277a0f3019d42c3c59ca94a5afd4885d5ae6d2182e5089bbeec9de42ee","src/api/ops/scalar_arithmetic.rs":"d2d5ad897a59dd0787544f927e0e7ca4072c3e58b0f4a2324083312b0d5a21d7","src/api/ops/scalar_bitwise.rs":"482204e459ca6be79568e1c9f70adbe2d2151412ddf122fb2161be8ebb51c40c","src/api/ops/scalar_mask_bitwise.rs":"c250f52042e37b22d57256c80d4604104cfd2fbe2a2e127c676267270ca5d350","src/api/ops/scalar_shifts.rs":"987f8fdebeedc16e3d77c1b732e7826ef70633c541d16dfa290845d5c6289150","src/api/ops/vector_arithmetic.rs":"ddca15d09ddeef502c2ed66117a62300ca65d87e959e8b622d767bdf1c307910","src/api/ops/vector_bitwise.rs":"b3968f7005b649edcc22a54e2379b14d5ee19045f2e784029805781ae043b5ee","src/api/ops/vector_float_min_max.rs":"f5155dce75219f4ba11275b1f295d2fdcddd49d174a6f1fb2ace7ea42813ce41","src/api/ops/vector_int_min_max.rs":"a378789c6ff9b32a51fbd0a97ffd36ed102cd1fe6a067d2b02017c1df342def6","src/api/ops/vector_mask_bitwise.rs":"5052d18517d765415d40327e6e8e55a312daaca0a5e2aec959bfa54b1675f9c8","src/api/ops/vector_neg.rs":"5c62f6b0221983cdbd23cd0a3af3672e6ba1255f0dfe8b19aae6fbd6503e231b","src/api/ops/vector_rotates.rs":"03cbe8a400fd7c688e4ee771a990a6754f2031b1a59b19ae81158b21471167e5","src/api/ops/vector_shifts.rs":"9bf69d0087268f61009e39aea52e03a90f378910206b6a28e8393178b6a5d0e0","src/api/ptr.rs":"8a793251bed6130dcfb2f1519ceaa18b751bbb15875928d0fb6deb5a5e07523a","src/api/ptr/gather_scatter.rs":"9ddd960365e050674b25b2fd3116e24d94669b4375d74e71c03e3f1469576066","src/api/reductions.rs":"ae5baca81352ecd44526d6c30c0a1feeda475ec73ddd3c3ec6b14e944e5448ee","src/api/reductions/bitwise.rs":"8bf910ae226188bd15fc7e125f058cd2566b6186fcd0cd8fd020f352c39ce139","src/api/reductions/float_arithmetic.rs":"e58c8c87806a95df2b2b5b48ac5991036df024096d9d7c171a480fe9282896a4","src/api/reductions/integer_arithmetic.rs":"47471da1c5f859489680bb5d34ced3d3aa20081c16053a3af121a4496fcb57bf","src/api/reductions/mask.rs":"db83327a950e33a317f37fd33ca4e20c347fb415975ec024f3e23da8509425af","src/api/reductions/min_max.rs":"f27be3aa28e1c1f46de7890198db6e12f00c207085e89ef2de7e57ee443cdb98","src/api/select.rs":"a98e2ccf9fc6bdeed32d337c8675bc96c2fbe2cc34fbf149ad6047fb8e749774","src/api/shuffle.rs":"da58200790868c09659819322a489929a5b6e56c596ed07e6a44293ea02e7d09","src/api/shuffle1_dyn.rs":"bfea5a91905b31444e9ef7ca6eddb7a9606b7e22d3f71bb842eb2795a0346620","src/api/slice.rs":"ee87484e8af329547b9a5d4f2a69e8bed6ea10bbd96270d706083843d4eea2ac","src/api/slice/from_slice.rs":"4d4fe8a329c885fcb4fbcbedf99efb15a95296fe6b3f595056cc37037450d5ac","src/api/slice/write_to_slice.rs":"f5b23b2c4b91cfb26b713a9013a6c0da7f45eaefb79ba06dcbc27f3f23bda679","src/api/swap_bytes.rs":"4a6792a2e49a77475e1b237592b4b2804dbddb79c474331acd0dd71b36934259","src/codegen.rs":"c6eebc3d3665420aa6a2f317977e3c41a4f43e0550ac630cdbe8e4bbed5e2031","src/codegen/bit_manip.rs":"5559e095105a80003e0de35af1d19b0c65c9ab04eb743c7e01c5442d882eb34e","src/codegen/llvm.rs":"d1299c189abb17a6133f047574cffc7a6db4c1be37cb7d4785491cb5e8f8cf54","src/codegen/math.rs":"35f96e37a78fcf0cdb02146b7f27a45108fe06a37fc2a54d8851ce131a326178","src/codegen/math/float.rs":"dd86c0449e576c83b719700962ac017c332987fac08d91f2b7a2b1b883598170","src/codegen/math/float/abs.rs":"f56e2b4b8055ea861c1f5cbc6b6e1d8e7e5af163b62c13574ddee4e09513bfbc","src/codegen/math/float/cos.rs":"ef3b511a24d23045b310315e80348a9b7fedb576fc2de52d74290616a0abeb2a","src/codegen/math/float/cos_pi.rs":"4e7631a5d73dac21531e09ef1802d1180f8997509c2c8fa9f67f322194263a97","src/codegen/math/float/exp.rs":"61b691598c41b5622f24e4320c1bdd08701e612a516438bdddcc728fc3405c8c","src/codegen/math/float/ln.rs":"46b718b1ba8c9d99e1ad40f53d20dfde08a3063ca7bd2a9fdd6698e060da687e","src/codegen/math/float/macros.rs":"dd42135fff13f9aca4fd3a1a4e14c7e6c31aadc6d817d63b0d2fb9e62e062744","src/codegen/math/float/mul_add.rs":"a37bf764345d4b1714f97e83897b7cf0855fc2811704bcbc0012db91825339e1","src/codegen/math/float/mul_adde.rs":"c75702bfcb361de45964a93caf959a695ef2376bd069227600b8c6872665c755","src/codegen/math/float/powf.rs":"642346e982bc4c39203de0864d2149c4179cd7b21cf67a2951687932b4675872","src/codegen/math/float/sin.rs":"9d68164c90cdca6a85155040cdac42e27342ebe0b925273ef1593df721af4258","src/codegen/math/float/sin_cos_pi.rs":"9be02ad48585a1e8d99129382fbffbaed47852f15459256a708850b6b7a75405","src/codegen/math/float/sin_pi.rs":"9890347905b4d4a3c7341c3eb06406e46e60582bcf6960688bd727e5dadc6c57","src/codegen/math/float/sqrt.rs":"e3c60dcfb0c6d2fc62adabcc931b2d4040b83cab294dea36443fb4b89eb79e34","src/codegen/math/float/sqrte.rs":"f0f4ef9eb475ae41bcc7ec6a95ad744ba6b36925faa8b2c2814004396d196b63","src/codegen/pointer_sized_int.rs":"a70697169c28218b56fd2e8d5353f2e00671d1150d0c8cef77d613bdfacd84cb","src/codegen/reductions.rs":"645e2514746d01387ddd07f0aa4ffd8430cc9ab428d4fb13773ea319fa25dd95","src/codegen/reductions/mask.rs":"8f1afe6aabf096a3278e1fc3a30f736e04aa8b9ce96373cee22162d18cfe2702","src/codegen/reductions/mask/aarch64.rs":"cba6e17603d39795dcfe8339b6b7d8714c3e162a1f0a635979f037aa24fe4206","src/codegen/reductions/mask/arm.rs":"9447904818aa2c7c25d0963eead452a639a11ca7dbd6d21eedbfcaade07a0f33","src/codegen/reductions/mask/fallback.rs":"7a0ef9f7fd03ae318b495b95e121350cd61caffc5cc6ee17fabf130d5d933453","src/codegen/reductions/mask/fallback_impl.rs":"76547f396e55ef403327c77c314cf8db8c7a5c9b9819bfb925abeacf130249e5","src/codegen/reductions/mask/x86.rs":"14bd2c482071f2355beebcf7b7ecf950ff2dfcdb08c3ca50993092434a9de717","src/codegen/reductions/mask/x86/avx.rs":"b4913d87844c522903641cbbf10db4551addb1ce5e9e78278e21612fa65c733b","src/codegen/reductions/mask/x86/avx2.rs":"677aed3f056285285daa3adff8bc65e739630b4424defa6d9665e160f027507e","src/codegen/reductions/mask/x86/sse.rs":"226610b4ff88c676d5187114dd57b4a8800de6ce40884675e9198445b1ed0306","src/codegen/reductions/mask/x86/sse2.rs":"bc38e6c31cb4b3d62147eba6cac264e519e2a48e0f7ce9010cfa9ef0cf0ec9fd","src/codegen/shuffle.rs":"0abca97e92cdce49a58a39cc447eb09dc7d7715ef256c8dbd2181a186e61bb64","src/codegen/shuffle1_dyn.rs":"04523e9338133bdedb012dd076c2c564b79ce5593b0fc56d0fb6910e04190a81","src/codegen/swap_bytes.rs":"1d6cdc716eadddc92b4fd506b2445a821caa8dc00860447de09d7ebd69c2087f","src/codegen/v128.rs":"94226b31ec403d18d9d2fe06713f147c9c79e9b5f9105089088266313f843185","src/codegen/v16.rs":"ddec4ffb66b6f7aaffb9a1780c5ddba82557abd74f45073d335047e04cf74924","src/codegen/v256.rs":"6b63917f0444118d6b1595bff2045e59b97c4d24012bd575f69f1f0efc5a0241","src/codegen/v32.rs":"3477b3c5540aed86e61e2f5807dd31db947413cec9181c587d93ed6ec74f0eba","src/codegen/v512.rs":"5854f99d3aabc4cd42b28a20d9ce447756dc2ba024a409a69b6a8ae1f1842fc5","src/codegen/v64.rs":"e9e89caebfe63d10c0cbca61e4dfdba3b7e02ee0989170f80beed23237ddd950","src/codegen/vPtr.rs":"96d609a9eece4dcbbcc01ba0b8744d7f5958be12774176a2945bc676f4e6b5cb","src/codegen/vSize.rs":"eeee9858749aa82142b27bc120d1989bb74a6b82e1e4efbbeaccc9634dc9acfc","src/lib.rs":"1b5d419ff05ee0370d671810423ccc254708cc8d415c1dbac2a7a36be4bf63a8","src/masks.rs":"870f429967b2d7d5133f4d28d6c753fc5cef0570b27b29d4e966a066d22d2d0e","src/sealed.rs":"ff7f0324276408ae8249941cfa32c90b8835a54d750896b683efea857af19db2","src/testing.rs":"1d3a7862ef625e235a5734ad7204e68d350f902c0695182b1f08a0552432416e","src/testing/macros.rs":"6378856d7a40ba5ec5c7c0dad6327d79f0c77266921c24296d10aed6c68e9b98","src/testing/utils.rs":"d6fd5a5017f1f85d9d99585754f8f6ad06fc3d683b34083543e67a7cc6c1772c","src/v128.rs":"18fe263c4aa28cd06461c7070b0269f69f4a2e75749b8f142a83dfdfe4d22bf5","src/v16.rs":"e5c663c9fb3547eaeac78a5f7db9969f4d8b5ec96112bf2954602fff11f0aebd","src/v256.rs":"68732cd688ad12a56d8b4f8ddf279f77bdfe1be2943c7dc0c1b4f1a76798aa0f","src/v32.rs":"785b22a1ccb4a41bb53dfeb0670f624c0ce42e6cdf62d1747e3283777a1c70bd","src/v512.rs":"d1337bfe07f06a8f37f8e8fa7d4315b9307476ee435ad80dd5269eaed564fbfa","src/v64.rs":"3077468d65125b8f085e9454c8b2463a4d5225697464ba6a1300f8799528fd4b","src/vPtr.rs":"c9a53f41f466e17b6648a4ce390fd8f4d3a848d440eb8a9a803a11608d76eb05","src/vSize.rs":"5c46d3e8c3ee5863d9b6e37e681f871386e0efc254d6d84ba711edb529ce7b3c","tests/endianness.rs":"541a144be017e3dd7da7c8ea49d907dc02538245e8c5f3deb5bd43da92c929e1"},"package":null} -\ No newline at end of file -+{"files":{".appveyor.yml":"f1ed01850e0d725f9498f52a1a63ddf40702ad6e0bf5b2d7c4c04d76e96794a3",".travis.yml":"d56de6531d3c4880e3aada85ac8e6d7388e5d781871e181cb8ade2a746d5d5f5","Cargo.toml":"e94ccb82002e8b55680c2c5fec554a9e864c5f354e113278d0aa927df279330d","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"49d01e49a33393af64fa6c813b6a724f68a4d1abfbedcb96413651ed105aa820","bors.toml":"dee881dc69b9b7834e4eba5d95c3ed5a416d4628815a167d6a22d4cb4fb064b8","build.rs":"c3312e786c7fcb8f16c0785fe235ebbcf43fbeab6d7d683752f62043ca92d887","ci/all.sh":"2ae6b2445b4db83833e40b37efd0016c6b9879ee988b9b3ef94db5439a3e1606","ci/android-install-ndk.sh":"0f1746108cc30bf9b9ba45bcde7b19fc1a8bdf5b0258035b4eb8dc69b75efac4","ci/android-install-sdk.sh":"3490432022c5c8f5a115c084f7a9aca1626f96c0c87ffb62019228c4346b47e4","ci/android-sysimage.sh":"ebf4e5daa1f0fe1b2092b79f0f3f161c4c4275cb744e52352c4d81ab451e4c5a","ci/benchmark.sh":"b61d19ef6b90deba8fb79dee74c8b062d94844676293da346da87bb78a9a49a4","ci/deploy_and_run_on_ios_simulator.rs":"ec8ecf82d92072676aa47f0d1a3d021b60a7ae3531153ef12d2ff4541fc294dc","ci/docker/aarch64-linux-android/Dockerfile":"ace2e7d33c87bc0f6d3962a4a3408c04557646f7f51ab99cfbf574906796b016","ci/docker/aarch64-unknown-linux-gnu/Dockerfile":"da88c0d50f16dc08448c7fdf1fa5ed2cbe576acf9e7dd85b5b818621b2a8c702","ci/docker/arm-linux-androideabi/Dockerfile":"370e55d3330a413a3ccf677b3afb3e0ef9018a5fab263faa97ae8ac017fc2286","ci/docker/arm-unknown-linux-gnueabi/Dockerfile":"bb5f8ae890707c128652290ffc544447643bf12037ddd73c6ad6989f848cb380","ci/docker/arm-unknown-linux-gnueabihf/Dockerfile":"1afaefcbc05b740859acd4e067bc92439be6bcbe8f2e9678474fb434bcd398d9","ci/docker/armv7-unknown-linux-gnueabihf/Dockerfile":"8282ea707a94109beed47a57574755e2d58401735904a03f85fb64c578c53b4f","ci/docker/i586-unknown-linux-gnu/Dockerfile":"49792922269f371bd29da4727e9085101b27be67a6b97755d0196c63317f7abb","ci/docker/i686-unknown-linux-gnu/Dockerfile":"49792922269f371bd29da4727e9085101b27be67a6b97755d0196c63317f7abb","ci/docker/mips-unknown-linux-gnu/Dockerfile":"b2ebc25797612c4f8395fe9d407725156044955bfbcf442036b7f55b43a5f9da","ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile":"b0c1692ac65bc56dd30494b1993d8e929c48cc9c4b92029b7c7592af6d4f9220","ci/docker/mips64el-unknown-linux-gnuabi64/Dockerfile":"4e9249c179300138141d0b2b7401b11897f64aed69f541f078c1db4594df2827","ci/docker/mipsel-unknown-linux-musl/Dockerfile":"3164c52b0dcbb01afa78292b15b5c43503ccf0491cf6eb801ec2bf22ae274e52","ci/docker/powerpc-unknown-linux-gnu/Dockerfile":"786f799d0b56eb54d7b6c4b00e1aed4ce81776e14e44767e083c89d014b72004","ci/docker/powerpc64-unknown-linux-gnu/Dockerfile":"e8bc363837cd9c2d8b22402acb8c1c329efc11ba5d12170603d2fe2eae9da059","ci/docker/powerpc64le-unknown-linux-gnu/Dockerfile":"47998d45b781d797b9e6085ebe898d90de0c952b54537a8db4e8d7503eb032d9","ci/docker/s390x-unknown-linux-gnu/Dockerfile":"93fb44df3d7fd31ead158570667c97b5076a05c3d968af4a84bc13819a8f2db8","ci/docker/sparc64-unknown-linux-gnu/Dockerfile":"da1c39a3ff1fe22e41395fa7c8934e90b4c1788e551b9aec6e38bfd94effc437","ci/docker/thumbv7neon-linux-androideabi/Dockerfile":"c2decd5591bd7a09378901bef629cd944acf052eb55e4f35b79eb9cb4d62246a","ci/docker/thumbv7neon-unknown-linux-gnueabihf/Dockerfile":"51955a8bf3c4d440f47382af6f5426ebff94ab01a04da36175babda9a057740f","ci/docker/wasm32-unknown-unknown/Dockerfile":"3e5f294bc1e004aa599086c2af49d6f3e7459fa250f5fbdd60cf67d53db78758","ci/docker/x86_64-linux-android/Dockerfile":"685040273cf350d5509e580ac451555efa19790c8723ca2af066adadc6880ad2","ci/docker/x86_64-unknown-linux-gnu-emulated/Dockerfile":"44b6203d9290bfdc53d81219f0937e1110847a23dd982ec8c4de388354f01536","ci/docker/x86_64-unknown-linux-gnu/Dockerfile":"7f4e3ca5fa288ea70edb4d1f75309708cd30b192e2e4444e61c4d5b3b58f89cf","ci/dox.sh":"434e9611c52e389312d2b03564adf09429f10cc76fe66a8644adb104903b87b7","ci/linux-s390x.sh":"d6b732d7795b4ba131326aff893bca6228a7d2eb0e9402f135705413dbbe0dce","ci/linux-sparc64.sh":"c92966838b1ab7ad3b7a344833ee726aba6b647cf5952e56f0ad1ba420b13325","ci/lld-shim.rs":"3d7f71ec23a49e2b67f694a0168786f9a954dda15f5a138815d966643fd3fcc3","ci/max_line_width.sh":"0a1518bba4c9ecaa55694cb2e9930d0e19c265baabf73143f17f9cf285aaa5bb","ci/run-docker.sh":"92e036390ad9b0d16f109579df1b5ced2e72e9afea40c7d011400ebd3a2a90de","ci/run.sh":"41dd6a60efaaeae9661a01370cce98b631f78392859a0cf68c946c0a16edf5f7","ci/run_examples.sh":"d1a23c6c35374a0678ba5114b9b8fefd8be0a79e774872a8bf0898d1baca18d0","ci/runtest-android.rs":"145a8e9799a5223975061fe7e586ade5669ee4877a7d7a4cf6b4ab48e8e36c7c","ci/setup_benchmarks.sh":"fae3960023f6f3d1388cd2ad22fdbab4b075f1f29dd4292d7994a20783beb6cf","ci/test-runner-linux":"c8aa6025cff5306f4f31d0c61dc5f9d4dd5a1d189ab613ef8d4c367c694d9ccd","contributing.md":"2cc8c9c560ae17867e69b06d09b758dbf7bc39eb774ada50a743724b10acc0a2","perf-guide/.gitignore":"fe82c7da551079d832cf74200b0b359b4df9828cb4a0416fa7384f07a2ae6a13","perf-guide/book.toml":"115a98284126c6b180178b44713314cc494f08a71662ee2ce15cf67f17a51064","perf-guide/src/SUMMARY.md":"3e03bffc991fdc2050f3d51842d72d9d21ea6abab56a3baf3b2d5973a78b89e1","perf-guide/src/ascii.css":"29afb08833b2fe2250f0412e1fa1161a2432a0820a14953c87124407417c741a","perf-guide/src/bound_checks.md":"5e4991ff58a183ef0cd9fdc1feb4cd12d083b44bdf87393bbb0927808ef3ce7d","perf-guide/src/float-math/approx.md":"8c09032fa2d795a0c5db1775826c850d28eb2627846d0965c60ee72de63735ad","perf-guide/src/float-math/fma.md":"311076ba4b741d604a82e74b83a8d7e8c318fcbd7f64c4392d1cf5af95c60243","perf-guide/src/float-math/fp.md":"04153e775ab6e4f0d7837bcc515230d327b04edfa34c84ce9c9e10ebaeef2be8","perf-guide/src/float-math/svml.md":"0798873b8eedaeda5fed62dc91645b57c20775a02d3cd74d8bd06958f1516506","perf-guide/src/introduction.md":"9f5a19e9e6751f25d2daad39891a0cc600974527ec4c8305843f9618910671bd","perf-guide/src/prof/linux.md":"447731eb5de7d69166728fdbc5ecb0c0c9db678ea493b45a592d67dd002184c0","perf-guide/src/prof/mca.md":"f56d54f3d20e7aa4d32052186e8237b03d65971eb5d112802b442570ff11d344","perf-guide/src/prof/profiling.md":"8a650c0fd6ede0964789bb6577557eeef1d8226a896788602ce61528e260e43c","perf-guide/src/target-feature/attribute.md":"615f88dca0a707b6c416fa605435dd6e1fb5361cc639429cbf68cd87624bd78b","perf-guide/src/target-feature/features.md":"17077760ff24c006b606dd21889c53d87228f4311f3ba3a574f9afdeacd86165","perf-guide/src/target-feature/inlining.md":"7ed1d7068d8173a00d84c16cfe5871cd68b9f04f8d0cca2d01ebc84957ebf2f6","perf-guide/src/target-feature/practice.md":"c4b371842e0086df178488fec97f20def8f0c62ee588bcd25fd948b9b1fa227e","perf-guide/src/target-feature/runtime.md":"835425f5ee597fb3e51d36e725a81ebee29f4561231d19563cd4da81dbb1cfcb","perf-guide/src/target-feature/rustflags.md":"ab49712e9293a65d74d540ba4784fcb57ff1119ec05a575d895c071f1a620f64","perf-guide/src/vert-hor-ops.md":"c6211c0ee91e60552ec592d89d9d957eedc21dee3cbd89e1ad6765ea06a27471","rustfmt.toml":"de6101d0670bad65fb3b337d56957d2a024e017e5ab146ec784d77312daaf8ff","src/api.rs":"f6e92f056565e6fd93f98829a408aee9e790251e0cbd8a8bc30c8662b4d6fabb","src/api/bit_manip.rs":"c47a4d0f7451f7e35d07715e4f39a472e07457fd456fdb726864a4f6887252a3","src/api/bitmask.rs":"6d2beefd62ee5d9c8eb060bee6abc641616bf828c99f82abf97b21bf004e894b","src/api/cast.rs":"03b94a3d316ac7b7be7068810044911e965e889a0ace7bae762749ca74a92747","src/api/cast/macros.rs":"b0a14d0c83ad2ebb7a275180f6d9e3f2bc312ba57a7d3d6c39fad4e0f20f9408","src/api/cast/v128.rs":"2107ea6a426a0fe37a0aa6a03a579ff0bdeb5a1599ea76e2d81734a82f41276d","src/api/cast/v16.rs":"d785cf93b8e61200c9ae1c32b9f5e9d9518e87c261c56bcaf92f2e47b0009eb4","src/api/cast/v256.rs":"b81fcfd367a5de532d922dedf18579e53666facef7957c0e1bc827825e500ae6","src/api/cast/v32.rs":"2aac9ec0a67a97328ba908b13a1ff98da3dcd7781910d592d31f9207cbd9a7d2","src/api/cast/v512.rs":"33b33de818f8d4eccc982bc2f3951a8b3d03e9762ec02789b3df82e3f5ed3fc3","src/api/cast/v64.rs":"ec878917d52a8c952633251b3a938a2cbe0a63fee6d12c15840d9f1343d1f394","src/api/cmp.rs":"357c3a2a09c6d4611c32dd7fa95be2fae933d513e229026ec9b44451a77b884e","src/api/cmp/eq.rs":"60f70f355bae4cb5b17db53204cacc3890f70670611c17df638d4c04f7cc8075","src/api/cmp/ord.rs":"589f7234761c294fa5df8f525bc4acd5a47cdb602207d524a0d4e19804cd9695","src/api/cmp/partial_eq.rs":"3ed23d2a930b0f9750c3a5309da766b03dc4f9c4d375b42ad3c50fe732693d15","src/api/cmp/partial_ord.rs":"e16b11805c94048acd058c93994b5bc74bb187f8d7e3b86a87df60e1601467f9","src/api/cmp/vertical.rs":"de3d62f38eba817299aa16f1e1939954c9a447e316509397465c2830852ba053","src/api/default.rs":"67bf21c134127d12a7028c8b88a57f0ceee8ccbd74976da8ca74eb9f16a174d5","src/api/fmt.rs":"67fb804bb86b6cd77cf8cd492b5733ce437071b66fe3297278b8a6552c325dda","src/api/fmt/binary.rs":"35cb5c266197d6224d598fb3d286e5fe48ef0c01ed356c2ff6fe9ba946f96a92","src/api/fmt/debug.rs":"aa18eea443bf353fea3db8b1a025132bbcaf91e747ecfa43b8d9fce9af395a0c","src/api/fmt/lower_hex.rs":"69d5be366631af309f214e8031c8c20267fcc27a695eac6f45c6bc1df72a67e6","src/api/fmt/octal.rs":"9eb11ba3d990213f3c7f1ec25edba7ce997cb1320e16d308c83498ba6b9bfbd9","src/api/fmt/upper_hex.rs":"a4637d085b7bb20e759ce58e08435b510a563ba3dd468af2b03560fdc5511562","src/api/from.rs":"2e599d8329cb05eaf06224cc441355c4b7b51254fc19256619333be8c149d444","src/api/from/from_array.rs":"dd3fc64fb17d6184bb60343f8da26a05edf0e5f3c14caf55d49fa15e21d948dc","src/api/from/from_vector.rs":"9764371aa9e6005aace74dea14f59e5611a095b7cf42707940924749282c52f0","src/api/hash.rs":"5076ece87969592c876486f5b1ea8affbeaec379d1a14a30859e0aa5592019de","src/api/into_bits.rs":"82297f0697d67b5a015e904e7e6e7b2a7066ba825bc54b94b4ff3e22d7a1eefb","src/api/into_bits/arch_specific.rs":"4acab22af90112072a2608fafc66fccf18cbf2e641b72af28404d30833cfe5c6","src/api/into_bits/macros.rs":"d762406de25aedff88d460dec7a80dc8e825a2a419d53218ce007efa6a1d3e04","src/api/into_bits/v128.rs":"3c502b9ce85bfcc727d6f053d49030b0ba9f46bd8e9fa5aa109382a2033f9f87","src/api/into_bits/v16.rs":"f4f4f61ba88aa51b158ec56ca3dce234349aea0daf2b3029a14ab5125d1e41e5","src/api/into_bits/v256.rs":"c24c3676707a0feb868dabe00766d74deab176794f905f79056337198c7cf790","src/api/into_bits/v32.rs":"905ba683d342fa32f4202b80bb46530807bd0a5b588f6c2e8c9f475223c47775","src/api/into_bits/v512.rs":"7cd89005215a9326eed8a742125dcbf981cba1aca72a313478eabf3df71b1160","src/api/into_bits/v64.rs":"d6238022ccff7b92e55b3f6017fc269acb6f36330a6d7e8fb389853a0f1b6478","src/api/math.rs":"8b2a2fc651917a850539f993aa0b9e5bf4da67b11685285b8de8cdca311719ec","src/api/math/float.rs":"61d2794d68262a1090ae473bd30793b5f65cf732f32a6694a3af2ce5d9225616","src/api/math/float/abs.rs":"5b6b2701e2e11135b7ce58a05052ea8120e10e4702c95d046b9d21b827b26bf8","src/api/math/float/consts.rs":"78acba000d3fa527111300b6327c1932de9c4c1e02d4174e1a5615c01463d38c","src/api/math/float/cos.rs":"4c2dd7173728ef189314f1576c9486e03be21b7da98843b2f9011282a7979e31","src/api/math/float/exp.rs":"7c6d5f1e304f498a01cfa23b92380c815d7da0ad94eae3483783bc377d287eef","src/api/math/float/ln.rs":"54c7583f3df793b39ff57534fade27b41bb992439e5dc178252f5ca3190a3e54","src/api/math/float/mul_add.rs":"62cac77660d20159276d4c9ef066eb90c81cbddb808e8e157182c607625ad2eb","src/api/math/float/mul_adde.rs":"bae056ee9f3a70df39ec3c3b2f6437c65303888a7b843ef1a5bcf1f5aca0e602","src/api/math/float/powf.rs":"9ddb938984b36d39d82a82f862f80df8f7fb013f1d222d45698d41d88472f568","src/api/math/float/recpre.rs":"589225794ff1dbf31158dff660e6d4509ecc8befbb57c633900dea5ac0b840d6","src/api/math/float/rsqrte.rs":"a32abdcc318d7ccc8448231f54d75b884b7cbeb03a7d595713ab6243036f4dbf","src/api/math/float/sin.rs":"cbd3622b7df74f19691743001c8cf747a201f8977ad90542fee915f37dcd1e49","src/api/math/float/sqrt.rs":"0c66d5d63fb08e4d99c6b82a8828e41173aff1ac9fa1a2764a11fac217ccf2ac","src/api/math/float/sqrte.rs":"731e1c9f321b662accdd27dacb3aac2e8043b7aecb2f2161dde733bd9f025362","src/api/minimal.rs":"1f22bcc528555444e76de569ec0ae2029b9ae9d04805efeafa93369c8098036b","src/api/minimal/iuf.rs":"819cff26d3e196f807645bcc1d79eb27d9f175edb89910f2274d52a1e913cd11","src/api/minimal/mask.rs":"0cae10ae1fc65f5070e686c0c79bfba27b86b33d6c399367bd4848fb367dcec4","src/api/minimal/ptr.rs":"f65ebf21866a863485344432d9a7a9b7418f7fad5fdf841a4e2fa56ec0766ad0","src/api/ops.rs":"3e273b277a0f3019d42c3c59ca94a5afd4885d5ae6d2182e5089bbeec9de42ee","src/api/ops/scalar_arithmetic.rs":"d2d5ad897a59dd0787544f927e0e7ca4072c3e58b0f4a2324083312b0d5a21d7","src/api/ops/scalar_bitwise.rs":"482204e459ca6be79568e1c9f70adbe2d2151412ddf122fb2161be8ebb51c40c","src/api/ops/scalar_mask_bitwise.rs":"c250f52042e37b22d57256c80d4604104cfd2fbe2a2e127c676267270ca5d350","src/api/ops/scalar_shifts.rs":"987f8fdebeedc16e3d77c1b732e7826ef70633c541d16dfa290845d5c6289150","src/api/ops/vector_arithmetic.rs":"ddca15d09ddeef502c2ed66117a62300ca65d87e959e8b622d767bdf1c307910","src/api/ops/vector_bitwise.rs":"b3968f7005b649edcc22a54e2379b14d5ee19045f2e784029805781ae043b5ee","src/api/ops/vector_float_min_max.rs":"76bf8cb607e2c442923c1da1061a6b80d742d607408033c2a3761161114cf2a0","src/api/ops/vector_int_min_max.rs":"a378789c6ff9b32a51fbd0a97ffd36ed102cd1fe6a067d2b02017c1df342def6","src/api/ops/vector_mask_bitwise.rs":"5052d18517d765415d40327e6e8e55a312daaca0a5e2aec959bfa54b1675f9c8","src/api/ops/vector_neg.rs":"5c62f6b0221983cdbd23cd0a3af3672e6ba1255f0dfe8b19aae6fbd6503e231b","src/api/ops/vector_rotates.rs":"03cbe8a400fd7c688e4ee771a990a6754f2031b1a59b19ae81158b21471167e5","src/api/ops/vector_shifts.rs":"9bf69d0087268f61009e39aea52e03a90f378910206b6a28e8393178b6a5d0e0","src/api/ptr.rs":"8a793251bed6130dcfb2f1519ceaa18b751bbb15875928d0fb6deb5a5e07523a","src/api/ptr/gather_scatter.rs":"138b02b0fa1fdd785b95fc7048488be7e3ef277e0bc6ac5affb26af6a11d41a6","src/api/reductions.rs":"ae5baca81352ecd44526d6c30c0a1feeda475ec73ddd3c3ec6b14e944e5448ee","src/api/reductions/bitwise.rs":"8bf910ae226188bd15fc7e125f058cd2566b6186fcd0cd8fd020f352c39ce139","src/api/reductions/float_arithmetic.rs":"3997125f87c7bac07fffda3a1d814e0e6c77ca83099546a9e2fb8dc92231129f","src/api/reductions/integer_arithmetic.rs":"47471da1c5f859489680bb5d34ced3d3aa20081c16053a3af121a4496fcb57bf","src/api/reductions/mask.rs":"db83327a950e33a317f37fd33ca4e20c347fb415975ec024f3e23da8509425af","src/api/reductions/min_max.rs":"d40ccad10220ae5982785015bef92e4b0749583c2b060cad0aa4f92d99491c3b","src/api/select.rs":"a98e2ccf9fc6bdeed32d337c8675bc96c2fbe2cc34fbf149ad6047fb8e749774","src/api/shuffle.rs":"da58200790868c09659819322a489929a5b6e56c596ed07e6a44293ea02e7d09","src/api/shuffle1_dyn.rs":"bfea5a91905b31444e9ef7ca6eddb7a9606b7e22d3f71bb842eb2795a0346620","src/api/slice.rs":"ee87484e8af329547b9a5d4f2a69e8bed6ea10bbd96270d706083843d4eea2ac","src/api/slice/from_slice.rs":"53691dc9958dec4180004a42d140552b405e8cd875caa282e89af378dd63c8bc","src/api/slice/write_to_slice.rs":"3dd2e511af43dc6fa911dd0b12f6f00323e0acd1202a01365db400557d52a89b","src/api/swap_bytes.rs":"4a6792a2e49a77475e1b237592b4b2804dbddb79c474331acd0dd71b36934259","src/codegen.rs":"a29d38fa0a85eaf787fb49989e625bf64effd5f39c126fbb2a24be206d2a3917","src/codegen/bit_manip.rs":"17ecebcff1f080e712fea5eb51602a73f4201ed56a198220342c8eb55bb92692","src/codegen/llvm.rs":"b1f24237f61b7c5ddb8d47f3943aab79a95ce0e75af87ab2d1c88d842faffd39","src/codegen/math.rs":"35f96e37a78fcf0cdb02146b7f27a45108fe06a37fc2a54d8851ce131a326178","src/codegen/math/float.rs":"dd86c0449e576c83b719700962ac017c332987fac08d91f2b7a2b1b883598170","src/codegen/math/float/abs.rs":"f56e2b4b8055ea861c1f5cbc6b6e1d8e7e5af163b62c13574ddee4e09513bfbc","src/codegen/math/float/cos.rs":"ef3b511a24d23045b310315e80348a9b7fedb576fc2de52d74290616a0abeb2a","src/codegen/math/float/cos_pi.rs":"4e7631a5d73dac21531e09ef1802d1180f8997509c2c8fa9f67f322194263a97","src/codegen/math/float/exp.rs":"61b691598c41b5622f24e4320c1bdd08701e612a516438bdddcc728fc3405c8c","src/codegen/math/float/ln.rs":"46b718b1ba8c9d99e1ad40f53d20dfde08a3063ca7bd2a9fdd6698e060da687e","src/codegen/math/float/macros.rs":"dd42135fff13f9aca4fd3a1a4e14c7e6c31aadc6d817d63b0d2fb9e62e062744","src/codegen/math/float/mul_add.rs":"a37bf764345d4b1714f97e83897b7cf0855fc2811704bcbc0012db91825339e1","src/codegen/math/float/mul_adde.rs":"c75702bfcb361de45964a93caf959a695ef2376bd069227600b8c6872665c755","src/codegen/math/float/powf.rs":"642346e982bc4c39203de0864d2149c4179cd7b21cf67a2951687932b4675872","src/codegen/math/float/sin.rs":"9d68164c90cdca6a85155040cdac42e27342ebe0b925273ef1593df721af4258","src/codegen/math/float/sin_cos_pi.rs":"9be02ad48585a1e8d99129382fbffbaed47852f15459256a708850b6b7a75405","src/codegen/math/float/sin_pi.rs":"9890347905b4d4a3c7341c3eb06406e46e60582bcf6960688bd727e5dadc6c57","src/codegen/math/float/sqrt.rs":"e3c60dcfb0c6d2fc62adabcc931b2d4040b83cab294dea36443fb4b89eb79e34","src/codegen/math/float/sqrte.rs":"f0f4ef9eb475ae41bcc7ec6a95ad744ba6b36925faa8b2c2814004396d196b63","src/codegen/pointer_sized_int.rs":"a70697169c28218b56fd2e8d5353f2e00671d1150d0c8cef77d613bdfacd84cb","src/codegen/reductions.rs":"645e2514746d01387ddd07f0aa4ffd8430cc9ab428d4fb13773ea319fa25dd95","src/codegen/reductions/mask.rs":"8f1afe6aabf096a3278e1fc3a30f736e04aa8b9ce96373cee22162d18cfe2702","src/codegen/reductions/mask/aarch64.rs":"cba6e17603d39795dcfe8339b6b7d8714c3e162a1f0a635979f037aa24fe4206","src/codegen/reductions/mask/arm.rs":"9447904818aa2c7c25d0963eead452a639a11ca7dbd6d21eedbfcaade07a0f33","src/codegen/reductions/mask/fallback.rs":"7a0ef9f7fd03ae318b495b95e121350cd61caffc5cc6ee17fabf130d5d933453","src/codegen/reductions/mask/fallback_impl.rs":"76547f396e55ef403327c77c314cf8db8c7a5c9b9819bfb925abeacf130249e5","src/codegen/reductions/mask/x86.rs":"4c0457b6276f9809223590092a4c77e73812330326cdabd28df06820de10a310","src/codegen/reductions/mask/x86/avx.rs":"b4913d87844c522903641cbbf10db4551addb1ce5e9e78278e21612fa65c733b","src/codegen/reductions/mask/x86/avx2.rs":"677aed3f056285285daa3adff8bc65e739630b4424defa6d9665e160f027507e","src/codegen/reductions/mask/x86/sse.rs":"5a827c6f8e1074e324f6e4c778942badb6c09d747a7142de01cadec1240b3428","src/codegen/reductions/mask/x86/sse2.rs":"bc38e6c31cb4b3d62147eba6cac264e519e2a48e0f7ce9010cfa9ef0cf0ec9fd","src/codegen/shuffle.rs":"99a0b52c2470097b028af134221099baba383446a01c7dc3ae560209880bcdb7","src/codegen/shuffle1_dyn.rs":"abbc95305dad815ab2ded3e8357791bcff080414668b55a4d397558a1d202d01","src/codegen/swap_bytes.rs":"1d6cdc716eadddc92b4fd506b2445a821caa8dc00860447de09d7ebd69c2087f","src/codegen/v128.rs":"94226b31ec403d18d9d2fe06713f147c9c79e9b5f9105089088266313f843185","src/codegen/v16.rs":"ddec4ffb66b6f7aaffb9a1780c5ddba82557abd74f45073d335047e04cf74924","src/codegen/v256.rs":"6b63917f0444118d6b1595bff2045e59b97c4d24012bd575f69f1f0efc5a0241","src/codegen/v32.rs":"3477b3c5540aed86e61e2f5807dd31db947413cec9181c587d93ed6ec74f0eba","src/codegen/v512.rs":"5854f99d3aabc4cd42b28a20d9ce447756dc2ba024a409a69b6a8ae1f1842fc5","src/codegen/v64.rs":"e9e89caebfe63d10c0cbca61e4dfdba3b7e02ee0989170f80beed23237ddd950","src/codegen/vPtr.rs":"711c753a08d53a2879c4fb87a0762c46ce4e34c22f0ca88d2e4c557a0f679969","src/codegen/vSize.rs":"eeee9858749aa82142b27bc120d1989bb74a6b82e1e4efbbeaccc9634dc9acfc","src/lib.rs":"b842b5e47008b9bd59af4d2e309b84204d90a53d36595684082adc46b6934987","src/masks.rs":"be05e923ac58fe6eb61311561b5583cd306574f206dc09fe8e3c7de3dd0c1433","src/sealed.rs":"ae7fdeaf5d84cd7710ed730ca72ca7eaba93df6cb0acb183e5c0a7327acf197f","src/testing.rs":"1d3a7862ef625e235a5734ad7204e68d350f902c0695182b1f08a0552432416e","src/testing/macros.rs":"6378856d7a40ba5ec5c7c0dad6327d79f0c77266921c24296d10aed6c68e9b98","src/testing/utils.rs":"5ec6a47b836f364ec6dede19750a19eaac704162327d03041eb0f007d5f8d75c","src/v128.rs":"16cf9a8e7156b899ee9b9cd3f2dba9d13ec63289bea8c3ee9ae2e43ad9510288","src/v16.rs":"cb6465cf1e00bf530183af1819b9fe3d7eec978f8765d5e85d9b58a39a4b4045","src/v256.rs":"fe235017da18c7f3c361831c60e3173ad304d8ea1e95d64ebebc79da2d708511","src/v32.rs":"145d347855bac59b2de6508f9e594654e6c330423af9edc0e2ac8f4d1abdf45e","src/v512.rs":"f372f277f3e62eb5c945bb1c460333fdb17b6974fcc876633788ff53bded9599","src/v64.rs":"0b8079881b71575e3414be0b7f8f7eaba65281ba6732f2b2f61f73e95b6f48f7","src/vPtr.rs":"8b3e433d487180bb4304ff71245ecad90f0010f43e139a72027b672abe58facc","src/vSize.rs":"eda5aa020706cbf94d15bada41a0c2a35fc8f3f37cb7c2cd6f34d201399a495e","tests/endianness.rs":"7db22078f31fe1421fc2d21f2e6b9df5eb0bdc99c10f6985d3a74c0df8f205dc"},"package":null} -\ No newline at end of file -diff --git a/third_party/rust/packed_simd/.travis.yml b/third_party/rust/packed_simd/.travis.yml -index 8d8ed54ab7..be3fb23693 100644 ---- a/third_party/rust/packed_simd/.travis.yml -+++ b/third_party/rust/packed_simd/.travis.yml -@@ -1,192 +1,129 @@ - language: rust --sudo: false - rust: nightly -+os: linux -+dist: focal - - stages: - - tools -- - linux-tier1 -- - osx-tier1 -- - osx-tier2 -- - linux-tier2 -- - android -+ - build-test-verify # Passes full test suite, permit no regressions (unless it's rustup :/) -+ - 32bit-tier1 -+ - 64bit-tier2 -+ - 32bit-tier2 - --matrix: -- fast_finish: true -+jobs: -+ fast_finish: true - include: - # Android: -- - env: TARGET=x86_64-linux-android NOVERIFY=1 -+ - env: TARGET=x86_64-linux-android - name: "x86_64-unknown-linux-android + SSE2" -- stage: android -+ stage: build-test-verify - - env: TARGET=arm-linux-androideabi - name: "arm-linux-androideabi" -- stage: android -+ stage: build-test-verify - - env: TARGET=arm-linux-androideabi RUSTFLAGS="-C target-feature=+v7,+neon" - name: "arm-linux-androideabi + NEON" -- stage: android -- - env: TARGET=aarch64-linux-android -- name: "aarch64-unknown-linux-android" -- stage: android -- - env: TARGET=aarch64-linux-android RUSTFLAGS="-C target-feature=+neon" -- name: "aarch64-unknown-linux-android + NEON" -- stage: android -+ stage: build-test-verify -+ - name: "aarch64-unknown-linux-android + NEON" -+ env: TARGET=aarch64-linux-android RUSTFLAGS="-C target-feature=+neon" -+ stage: build-test-verify - - env: TARGET="thumbv7neon-linux-androideabi" - name: "thumbv7neon-linux-androideabi" -- stage: android -+ stage: 32bit-tier2 - # Linux: - - env: TARGET=i586-unknown-linux-gnu - name: "i586-unknown-linux-gnu" -- stage: linux-tier2 -+ stage: 32bit-tier2 - - env: TARGET=i586-unknown-linux-gnu RUSTFLAGS="-C target-feature=+sse" - name: "i586-unknown-linux-gnu + SSE" -- stage: linux-tier2 -+ stage: 32bit-tier2 - - env: TARGET=i586-unknown-linux-gnu RUSTFLAGS="-C target-feature=+sse2" - name: "i586-unknown-linux-gnu + SSE2" -- stage: linux-tier2 -+ stage: 32bit-tier2 - - env: TARGET=i686-unknown-linux-gnu - name: "i686-unknown-linux-gnu + SSE2" -- stage: linux-tier1 -+ stage: 32bit-tier1 - - env: TARGET=i686-unknown-linux-gnu RUSTFLAGS="-C target-feature=+sse4.2" - name: "i686-unknown-linux-gnu + SSE4.2" -- stage: linux-tier1 -+ stage: 32bit-tier1 - - env: TARGET=i686-unknown-linux-gnu RUSTFLAGS="-C target-feature=+avx2" - name: "i686-unknown-linux-gnu + AVX2" -- stage: linux-tier1 -- - env: TARGET=x86_64-unknown-linux-gnu -- name: "x86_64-unknown-linux-gnu + SSE2" -- install: rustup component add rustfmt-preview -- stage: linux-tier1 -+ stage: 32bit-tier1 - - env: TARGET=x86_64-unknown-linux-gnu RUSTFLAGS="-C target-feature=+sse4.2" - name: "x86_64-unknown-linux-gnu + SSE4.2" - install: rustup component add rustfmt-preview -- stage: linux-tier1 -- - env: TARGET=x86_64-unknown-linux-gnu RUSTFLAGS="-C target-feature=+avx" -- name: "x86_64-unknown-linux-gnu + AVX" -- install: rustup component add rustfmt-preview -- stage: linux-tier1 -+ stage: build-test-verify - - env: TARGET=x86_64-unknown-linux-gnu RUSTFLAGS="-C target-feature=+avx2" - name: "x86_64-unknown-linux-gnu + AVX2" - install: rustup component add rustfmt-preview -- stage: linux-tier1 -- - env: TARGET=x86_64-unknown-linux-gnu-emulated -- name: "Intel SDE + SSE2" -- install: true -- stage: linux-tier1 -- - env: TARGET=x86_64-unknown-linux-gnu-emulated RUSTFLAGS="-C target-feature=+sse4.2" -- name: "Intel SDE + SSE4.2" -- install: true -- stage: linux-tier1 -- - env: TARGET=x86_64-unknown-linux-gnu-emulated RUSTFLAGS="-C target-feature=+avx" -- name: "Intel SDE + AVX" -- install: true -- stage: linux-tier1 -- - env: TARGET=x86_64-unknown-linux-gnu-emulated RUSTFLAGS="-C target-feature=+avx2" -- name: "Intel SDE + AVX2" -- install: true -- stage: linux-tier1 -- - env: TARGET=x86_64-unknown-linux-gnu-emulated RUSTFLAGS="-C target-feature=+avx-512f" -- name: "Intel SDE + AVX-512" -- install: true -- stage: linux-tier1 -- - env: TARGET=arm-unknown-linux-gnueabi -- name: "arm-unknown-linux-gnueabi" -- stage: linux-tier2 -+ stage: build-test-verify - - env: TARGET=arm-unknown-linux-gnueabi RUSTFLAGS="-C target-feature=+v7,+neon" - name: "arm-unknown-linux-gnueabi + NEON" -- stage: linux-tier2 -+ stage: build-test-verify - - env: TARGET=arm-unknown-linux-gnueabihf - name: "arm-unknown-linux-gnueabihf" -- stage: linux-tier2 -+ stage: build-test-verify - - env: TARGET=arm-unknown-linux-gnueabihf RUSTFLAGS="-C target-feature=+v7,+neon" - name: "arm-unknown-linux-gnueabihf + NEON" -- stage: linux-tier2 -+ stage: build-test-verify - - env: TARGET=armv7-unknown-linux-gnueabihf - name: "armv7-unknown-linux-gnueabihf" -- stage: linux-tier2 -+ stage: build-test-verify - - env: TARGET=armv7-unknown-linux-gnueabihf RUSTFLAGS="-C target-feature=+neon" - name: "armv7-unknown-linux-gnueabihf + NEON" -- stage: linux-tier2 -+ stage: build-test-verify - - env: TARGET="thumbv7neon-unknown-linux-gnueabihf" - name: "thumbv7neon-unknown-linux-gnueabihf" -- stage: linux-tier2 -- - env: TARGET=aarch64-unknown-linux-gnu -- name: "aarch64-unknown-linux-gnu" -- stage: linux-tier2 -- - env: TARGET=aarch64-unknown-linux-gnu RUSTFLAGS="-C target-feature=+neon" -- name: "aarch64-unknown-linux-gnu + NEON" -- stage: linux-tier2 -+ stage: 32bit-tier2 -+ - name: "aarch64-unknown-linux-gnu + NEON" -+ env: TARGET=aarch64-unknown-linux-gnu RUSTFLAGS="-C target-feature=+neon" -+ stage: build-test-verify - - env: TARGET=mips-unknown-linux-gnu - name: "mips-unknown-linux-gnu" -- stage: linux-tier2 -+ stage: 32bit-tier2 - - env: TARGET=mipsel-unknown-linux-musl - name: "mipsel-unknown-linux-musl" -- stage: linux-tier2 -+ stage: 32bit-tier2 - - env: TARGET=mips64-unknown-linux-gnuabi64 - name: "mips64-unknown-linux-gnuabi64" -- stage: linux-tier2 -+ stage: 64bit-tier2 - - env: TARGET=mips64el-unknown-linux-gnuabi64 - name: "mips64el-unknown-linux-gnuabi64" -- stage: linux-tier2 -+ stage: 64bit-tier2 - # FIXME: https://github.com/rust-lang-nursery/packed_simd/issues/18 - # env: TARGET=mips64el-unknown-linux-gnuabi64 RUSTFLAGS="-C target-feature=+msa -C target-cpu=mips64r6" - - env: TARGET=powerpc-unknown-linux-gnu - name: "powerpc-unknown-linux-gnu" -- stage: linux-tier2 -+ stage: 32bit-tier2 - - env: TARGET=powerpc64-unknown-linux-gnu - name: "powerpc64-unknown-linux-gnu" -- stage: linux-tier2 -- - env: TARGET=powerpc64le-unknown-linux-gnu -- name: "powerpc64le-unknown-linux-gnu" -- stage: linux-tier2 -- - env: TARGET=powerpc64le-unknown-linux-gnu RUSTFLAGS="-C target-feature=+altivec" -- name: "powerpc64le-unknown-linux-gnu + ALTIVEC" -- stage: linux-tier2 -- - env: TARGET=powerpc64le-unknown-linux-gnu RUSTFLAGS="-C target-feature=+vsx" -- name: "powerpc64le-unknown-linux-gnu + VSX" -- stage: linux-tier2 -- - env: TARGET=s390x-unknown-linux-gnu -- name: "s390x-unknown-linux-gnu" -- stage: linux-tier2 -+ stage: 64bit-tier2 -+ - name: "powerpc64le-unknown-linux-gnu" -+ env: TARGET=powerpc64le-unknown-linux-gnu -+ stage: build-test-verify -+ - name: "powerpc64le-unknown-linux-gnu + ALTIVEC" -+ env: TARGET=powerpc64le-unknown-linux-gnu RUSTFLAGS="-C target-feature=+altivec" -+ stage: build-test-verify -+ - name: "powerpc64le-unknown-linux-gnu + VSX" -+ env: TARGET=powerpc64le-unknown-linux-gnu RUSTFLAGS="-C target-feature=+vsx" -+ stage: build-test-verify -+ - name: "s390x-unknown-linux-gnu" -+ env: TARGET=s390x-unknown-linux-gnu -+ stage: 64bit-tier2 - - env: TARGET=sparc64-unknown-linux-gnu - name: "sparc64-unknown-linux-gnu" -- stage: linux-tier2 -+ stage: 64bit-tier2 - # WebAssembly: - - env: TARGET=wasm32-unknown-unknown - name: "wasm32-unknown-unknown" -- stage: osx-tier1 # For now -+ stage: 32bit-tier2 - # MacOSX: -- - os: osx -- env: TARGET=i686-apple-darwin -- name: "i686-apple-darwin + SSE2" -- script: ci/run.sh -- osx_image: xcode10 -- stage: osx-tier1 -- - os: osx -- env: TARGET=i686-apple-darwin RUSTFLAGS="-C target-feature=+sse4.2" -- name: "i686-apple-darwin + SSE4.2" -- script: ci/run.sh -- osx_image: xcode10 -- stage: osx-tier1 -- # Travis-CI OSX build bots do not support AVX2: -- - os: osx -- env: TARGET=i686-apple-darwin RUSTFLAGS="-C target-feature=+avx" -- name: "i686-apple-darwin + AVX" -- script: ci/run.sh -- osx_image: xcode10 -- stage: osx-tier1 -- - os: osx -- env: TARGET=x86_64-apple-darwin -- name: "x86_64-apple-darwin + SSE2" -- install: true -- script: ci/run.sh -- osx_image: xcode10 -- stage: osx-tier1 - - os: osx - env: TARGET=x86_64-apple-darwin RUSTFLAGS="-C target-feature=+sse4.2" - name: "x86_64-apple-darwin + SSE4.2" - install: true - script: ci/run.sh - osx_image: xcode10 -- stage: osx-tier1 -+ stage: build-test-verify - # Travis-CI OSX build bots do not support AVX2: - - os: osx - env: TARGET=x86_64-apple-darwin RUSTFLAGS="-C target-feature=+avx" -@@ -194,7 +131,7 @@ matrix: - install: true - script: ci/run.sh - osx_image: xcode10 -- stage: osx-tier1 -+ stage: build-test-verify - # *BSDs: - #- env: TARGET=i686-unknown-freebsd NORUN=1 - # script: ci/run.sh -@@ -206,81 +143,75 @@ matrix: - #- env: TARGET=x86_64-sun-solaris NORUN=1 - # script: ci/run.sh - # iOS: -- - os: osx -- env: TARGET=i386-apple-ios -- name: "i386-apple-ios" -- script: ci/run.sh -- osx_image: xcode9.4 -- stage: osx-tier2 - - os: osx - env: TARGET=x86_64-apple-ios - name: "x86_64-apple-ios + SSE2" - script: ci/run.sh - osx_image: xcode9.4 -- stage: osx-tier2 -- - os: osx -- env: TARGET=armv7-apple-ios NORUN=1 -- name: "armv7-apple-ios [Build only]" -- script: ci/run.sh -+ stage: 64bit-tier2 -+ - name: "aarch64-apple-ios + NEON" -+ env: TARGET=aarch64-apple-ios RUSTFLAGS="-C target-feature=+neon" -+ os: osx - osx_image: xcode9.4 -- stage: osx-tier2 -- - os: osx -- env: TARGET=aarch64-apple-ios NORUN=1 -- name: "aarch64-apple-ios [Build only]" - script: ci/run.sh -- osx_image: xcode9.4 -- stage: osx-tier2 -+ stage: 64bit-tier2 - # BENCHMARKS: - - name: "Benchmarks - x86_64-unknown-linux-gnu" - install: TARGET=x86_64-unknown-linux-gnu ./ci/setup_benchmarks.sh -- script: PATH=$(pwd):$PATH NORUN=1 VERIFY=1 FEATURES=core_arch,ispc,sleef-sys ci/benchmark.sh -+ # FIXME: Use `core_arch,sleef-sys` features once they works again -+ script: PATH=$(pwd):$PATH NORUN=1 VERIFY=1 FEATURES=ispc ci/benchmark.sh - stage: tools - - name: "Benchmarks - x86_64-apple-darwin" - install: TARGET=x86_64-apple-darwin ./ci/setup_benchmarks.sh -- script: PATH=$(pwd):$PATH NORUN=1 VERIFY=1 FEATURES=core_arch,ispc,sleef-sys ci/benchmark.sh -+ # FIXME: Use `core_arch,sleef-sys` features once they works again -+ script: PATH=$(pwd):$PATH NORUN=1 VERIFY=1 FEATURES=ispc ci/benchmark.sh - os: osx - osx_image: xcode9.4 - stage: tools - # TOOLS: - - name: "Documentation" -- install: cargo install mdbook -+ before_install: -+ - sudo add-apt-repository -y ppa:deadsnakes/ppa -+ - sudo apt-get update -y -+ - sudo apt-get install -y python3.9 -+ install: -+ - cargo install mdbook - script: ci/dox.sh - stage: tools - - name: "rustfmt" - install: true -- before_script: rustup component add rustfmt-preview -- script: ci/all.sh check_fmt || true -+ script: | -+ if rustup component add rustfmt-preview ; then -+ ci/all.sh check_fmt || true -+ fi - stage: tools - - name: "clippy" - install: true -- before_script: rustup component add clippy-preview -- script: ci/all.sh clippy -+ script: | -+ if rustup component add clippy-preview ; then -+ ci/all.sh clippy -+ fi - stage: tools - - allow_failures: - # FIXME: ISPC cannot be found? - - name: "Benchmarks - x86_64-apple-darwin" -- # FIXME: TBD -- - env: TARGET=powerpc-unknown-linux-gnu -- - env: TARGET=powerpc64-unknown-linux-gnu -- - env: TARGET=powerpc64le-unknown-linux-gnu -- - env: TARGET=powerpc64le-unknown-linux-gnu RUSTFLAGS="-C target-feature=+altivec" -- - env: TARGET=powerpc64le-unknown-linux-gnu RUSTFLAGS="-C target-feature=+vsx" -+ # FIXME: i686 fails in inlining, apparently -+ - stage: 32bit-tier1 - #- env: TARGET=i686-unknown-freebsd NORUN=1 - #- env: TARGET=x86_64-unknown-freebsd NORUN=1 - #- env: TARGET=x86_64-unknown-netbsd NORUN=1 - #- env: TARGET=x86_64-sun-solaris NORUN=1 - - # FIXME: TBD -- - env: TARGET=arm-linux-androideabi -- - env: TARGET=arm-linux-androideabi RUSTFLAGS="-C target-feature=+v7,+neon" -- - env: TARGET=aarch64-linux-android -- - env: TARGET=aarch64-linux-android RUSTFLAGS="-C target-feature=+neon" -+ - stage: 64bit-tier2 -+ - stage: 32bit-tier2 - - # FIXME: iOS - # https://github.com/rust-lang-nursery/packed_simd/issues/26 -- - env: TARGET=i386-apple-ios - - env: TARGET=x86_64-apple-ios -+ # Is this related to the above? Mysterious test failure -+ - name: "aarch64-apple-ios + NEON" - - # FIXME: https://github.com/rust-lang-nursery/packed_simd/issues/182 - - env: TARGET=arm-unknown-linux-gnueabi RUSTFLAGS="-C target-feature=+v7,+neon" -diff --git a/third_party/rust/packed_simd/Cargo.toml b/third_party/rust/packed_simd/Cargo.toml -index 3db9354c94..70bbf26ed2 100644 ---- a/third_party/rust/packed_simd/Cargo.toml -+++ b/third_party/rust/packed_simd/Cargo.toml -@@ -1,6 +1,6 @@ - [package] - name = "packed_simd" --version = "0.3.3" -+version = "0.3.4" - authors = ["Gonzalo Brito Gadeschi <gonzalobg88@gmail.com>"] - description = "Portable Packed SIMD vectors" - documentation = "https://docs.rs/crate/packed_simd/" -@@ -21,8 +21,8 @@ is-it-maintained-open-issues = { repository = "rust-lang-nursery/packed_simd" } - maintenance = { status = "experimental" } - - [dependencies] --cfg-if = "^0.1.6" --core_arch = { version = "^0.1.3", optional = true } -+cfg-if = "0.1.10" -+core_arch = { version = "0.1.5", optional = true } - - [features] - default = [] -@@ -31,12 +31,12 @@ libcore_neon = [] - - [dev-dependencies] - paste = "^0.1.3" --arrayvec = { version = "^0.4", default-features = false } -+arrayvec = { version = "^0.5", default-features = false } - - [target.'cfg(target_arch = "x86_64")'.dependencies.sleef-sys] --version = "^0.1.2" -+version = "0.1.2" - optional = true - - [target.wasm32-unknown-unknown.dev-dependencies] --wasm-bindgen = "=0.2.19" --wasm-bindgen-test = "=0.2.19" -\ No newline at end of file -+wasm-bindgen = "=0.2.52" -+wasm-bindgen-test = "=0.3.2" -diff --git a/third_party/rust/packed_simd/readme.md b/third_party/rust/packed_simd/README.md -similarity index 54% -rename from third_party/rust/packed_simd/readme.md -rename to third_party/rust/packed_simd/README.md -index 3b27a2bba0..ad4f3f2709 100644 ---- a/third_party/rust/packed_simd/readme.md -+++ b/third_party/rust/packed_simd/README.md -@@ -4,16 +4,14 @@ - - [![Travis-CI Status]][travis] [![Appveyor Status]][appveyor] [![Latest Version]][crates.io] [![docs]][master_docs] - --> This aims to be a 100% conforming implementation of Rust RFC 2366 for stabilization. -- --**WARNING**: this crate only supports the most recent nightly Rust toolchain. -+**WARNING**: this crate only supports the most recent nightly Rust toolchain -+and will be superceded by [stdsimd](https://github.com/rust-lang/stdsimd). - - ## Documentation - - * [API docs (`master` branch)][master_docs] - * [Performance guide][perf_guide] --* [API docs (`docs.rs`)][docs.rs]: **CURRENTLY DOWN** due to -- https://github.com/rust-lang-nursery/packed_simd/issues/110 -+* [API docs (`docs.rs`)][docs.rs] - * [RFC2366 `std::simd`][rfc2366]: - contains motivation, design rationale, - discussion, etc. - -@@ -39,17 +37,6 @@ Most of the examples come with both a scalar and a vectorized implementation. - vector type as those of another vector type safely by just using the - `.into_bits()` method. - --* `core_arch` (default: disabled): enable this feature to recompile `core::arch` -- for the target-features enabled. `packed_simd` includes optimizations for some -- target feature combinations that are enabled by this feature. Note, however, -- that this is an unstable dependency, that rustc might break at any time. -- --* `sleef-sys` (default: disabled - `x86_64` only): internally uses the [SLEEF] -- short-vector math library when profitable via the [`sleef-sys`][sleef_sys] -- crate. [SLEEF] is licensed under the [Boost Software License -- v1.0][boost_license], an extremely permissive license, and can be statically -- linked without issues. -- - ## Performance - - The following [ISPC] examples are also part of `packed_simd`'s -@@ -75,60 +62,40 @@ slowdown: - - ## Platform support - --The following table describes the supported platforms: `build` shows whether the --library compiles without issues for a given target, while `run` shows whether --the full testsuite passes on the target. -- --| Linux targets: | build | run | --|-----------------------------------|-----------|---------| --| `i586-unknown-linux-gnu` | ✓ | ✓ | --| `i686-unknown-linux-gnu` | ✓ | ✓ | --| `x86_64-unknown-linux-gnu` | ✓ | ✓ | --| `arm-unknown-linux-gnueabi` | ✗ | ✗ | --| `arm-unknown-linux-gnueabihf` | ✓ | ✓ | --| `armv7-unknown-linux-gnueabi` | ✓ | ✓ | --| `aarch64-unknown-linux-gnu` | ✓ | ✓ | --| `mips-unknown-linux-gnu` | ✓ | ✓ | --| `mipsel-unknown-linux-musl` | ✓ | ✓ | --| `mips64-unknown-linux-gnuabi64` | ✓ | ✓ | --| `mips64el-unknown-linux-gnuabi64` | ✓ | ✓ | --| `powerpc-unknown-linux-gnu` | ✗ | ✗ | --| `powerpc64-unknown-linux-gnu` | ✗ | ✗ | --| `powerpc64le-unknown-linux-gnu` | ✗ | ✗ | --| `s390x-unknown-linux-gnu` | ✓ | ✓* | --| `sparc64-unknown-linux-gnu` | ✓ | ✓* | --| `thumbv7neon-unknown-linux-gnueabihf` | ✓ | ✓ | --| **MacOSX targets:** | **build** | **run** | --| `x86_64-apple-darwin` | ✓ | ✓ | --| `i686-apple-darwin` | ✓ | ✓ | --| **Windows targets:** | **build** | **run** | --| `x86_64-pc-windows-msvc` | ✓ | ✓ | --| `i686-pc-windows-msvc` | ✓ | ✓ | --| `x86_64-pc-windows-gnu` | ✗ | ✗ | --| `i686-pc-windows-gnu` | ✗ | ✗ | --| **WebAssembly targets:** | **build** | **run** | --| `wasm32-unknown-unknown` | ✓ | ✓ | --| **Android targets:** | **build** | **run** | --| `x86_64-linux-android` | ✓ | ✓ | --| `arm-linux-androideabi` | ✓ | ✓ | --| `aarch64-linux-android` | ✓ | ✗ | --| `thumbv7neon-linux-androideabi` | ✓ | ✓ | --| **iOS targets:** | **build** | **run** | --| `i386-apple-ios` | ✓ | ✗ | --| `x86_64-apple-ios` | ✓ | ✗ | --| `armv7-apple-ios` | ✓ | ✗** | --| `aarch64-apple-ios` | ✓ | ✗** | --| **xBSD targets:** | **build** | **run** | --| `i686-unknown-freebsd` | ✗ | ✗** | --| `x86_64-unknown-freebsd` | ✗ | ✗** | --| `x86_64-unknown-netbsd` | ✗ | ✗** | --| **Solaris targets:** | **build** | **run** | --| `x86_64-sun-solaris` | ✗ | ✗** | -- --[*] most of the test suite passes correctly on these platform but --there are correctness bugs open in the issue tracker. -- --[**] it is currently not easily possible to run these platforms on CI. -+The following table describes the supported platforms: `build` shows whether -+the library compiles without issues for a given target, while `run` shows -+whether the test suite passes for a given target. -+ -+| **Linux** | **build** | **run** | -+|---------------------------------------|-----------|---------| -+| `i586-unknown-linux-gnu` | ✓ | ✗ | -+| `i686-unknown-linux-gnu` | ✓ | ✗ | -+| `x86_64-unknown-linux-gnu` | ✓ | ✓ | -+| `arm-unknown-linux-gnueabi` | ✗ | ✗ | -+| `arm-unknown-linux-gnueabihf` | ✓ | ✓ | -+| `armv7-unknown-linux-gnueabi` | ✓ | ✓ | -+| `aarch64-unknown-linux-gnu` | ✓ | ✓ | -+| `mips-unknown-linux-gnu` | ✓ | ✗ | -+| `mipsel-unknown-linux-musl` | ✓ | ✗ | -+| `mips64-unknown-linux-gnuabi64` | ✓ | ✗ | -+| `mips64el-unknown-linux-gnuabi64` | ✓ | ✗ | -+| `powerpc-unknown-linux-gnu` | ✗ | ✗ | -+| `powerpc64-unknown-linux-gnu` | ✗ | ✗ | -+| `powerpc64le-unknown-linux-gnu` | ✓ | ✓ | -+| `s390x-unknown-linux-gnu` | ✗ | ✗ | -+| `sparc64-unknown-linux-gnu` | ✓ | ✗ | -+| `thumbv7neon-unknown-linux-gnueabihf` | ✓ | ✓ | -+| **MacOSX** | **build** | **run** | -+| `x86_64-apple-darwin` | ✓ | ✓ | -+| **Android** | **build** | **run** | -+| `x86_64-linux-android` | ✓ | ✓ | -+| `arm-linux-androideabi` | ✓ | ✓ | -+| `aarch64-linux-android` | ✓ | ✓ | -+| `thumbv7neon-linux-androideabi` | ✗ | ✗ | -+| **iOS** | **build** | **run** | -+| `x86_64-apple-ios` | ✓ | ✗ | -+| `aarch64-apple-ios` | ✓ | ✗ | -+ - - ## Machine code verification - -@@ -162,8 +129,8 @@ Unless you explicitly state otherwise, any contribution intentionally submitted - for inclusion in `packed_simd` by you, as defined in the Apache-2.0 license, shall be - dual licensed as above, without any additional terms or conditions. - --[travis]: https://travis-ci.org/rust-lang-nursery/packed_simd --[Travis-CI Status]: https://travis-ci.org/rust-lang-nursery/packed_simd.svg?branch=master -+[travis]: https://travis-ci.com/rust-lang-nursery/packed_simd -+[Travis-CI Status]: https://travis-ci.com/rust-lang-nursery/packed_simd.svg?branch=master - [appveyor]: https://ci.appveyor.com/project/gnzlbg/packed-simd - [Appveyor Status]: https://ci.appveyor.com/api/projects/status/hd7v9dvr442hgdix?svg=true - [Latest Version]: https://img.shields.io/crates/v/packed_simd.svg -diff --git a/third_party/rust/packed_simd/build.rs b/third_party/rust/packed_simd/build.rs -index 85639ff9d0..5958b9b785 100644 ---- a/third_party/rust/packed_simd/build.rs -+++ b/third_party/rust/packed_simd/build.rs -@@ -1,5 +1,5 @@ - fn main() { -- println!("cargo:rustc-env=RUSTC_BOOTSTRAP=1"); -+ println!("cargo:rustc-env=RUSTC_BOOTSTRAP=1"); - let target = std::env::var("TARGET") - .expect("TARGET environment variable not defined"); - if target.contains("neon") { -diff --git a/third_party/rust/packed_simd/ci/all.sh b/third_party/rust/packed_simd/ci/all.sh -index 273562d4a9..55a1fa2efe 100755 ---- a/third_party/rust/packed_simd/ci/all.sh -+++ b/third_party/rust/packed_simd/ci/all.sh -@@ -21,7 +21,7 @@ cargo_fmt() { - } - - cargo_clippy() { -- cargo clippy --all -- -D clippy::pedantic -+ cargo clippy --all -- -D clippy::perf - } - - CMD="-1" -diff --git a/third_party/rust/packed_simd/ci/docker/aarch64-unknown-linux-gnu/Dockerfile b/third_party/rust/packed_simd/ci/docker/aarch64-unknown-linux-gnu/Dockerfile -index 68261a2f03..41ff4729ac 100644 ---- a/third_party/rust/packed_simd/ci/docker/aarch64-unknown-linux-gnu/Dockerfile -+++ b/third_party/rust/packed_simd/ci/docker/aarch64-unknown-linux-gnu/Dockerfile -@@ -1,4 +1,4 @@ --FROM ubuntu:17.10 -+FROM ubuntu:18.04 - RUN apt-get update && apt-get install -y --no-install-recommends \ - gcc \ - ca-certificates \ -diff --git a/third_party/rust/packed_simd/ci/docker/arm-unknown-linux-gnueabi/Dockerfile b/third_party/rust/packed_simd/ci/docker/arm-unknown-linux-gnueabi/Dockerfile -index cb4de6a57e..e1c591dd97 100644 ---- a/third_party/rust/packed_simd/ci/docker/arm-unknown-linux-gnueabi/Dockerfile -+++ b/third_party/rust/packed_simd/ci/docker/arm-unknown-linux-gnueabi/Dockerfile -@@ -1,4 +1,4 @@ --FROM ubuntu:17.10 -+FROM ubuntu:18.04 - RUN apt-get update && apt-get install -y --no-install-recommends \ - gcc \ - ca-certificates \ -diff --git a/third_party/rust/packed_simd/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile b/third_party/rust/packed_simd/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile -index c7bd61f0a7..757b79e7ec 100644 ---- a/third_party/rust/packed_simd/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile -+++ b/third_party/rust/packed_simd/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile -@@ -1,4 +1,4 @@ --FROM ubuntu:17.10 -+FROM ubuntu:18.04 - RUN apt-get update && apt-get install -y --no-install-recommends \ - gcc \ - ca-certificates \ -diff --git a/third_party/rust/packed_simd/ci/docker/armv7-unknown-linux-gnueabihf/Dockerfile b/third_party/rust/packed_simd/ci/docker/armv7-unknown-linux-gnueabihf/Dockerfile -index e01b87afdf..2539062933 100644 ---- a/third_party/rust/packed_simd/ci/docker/armv7-unknown-linux-gnueabihf/Dockerfile -+++ b/third_party/rust/packed_simd/ci/docker/armv7-unknown-linux-gnueabihf/Dockerfile -@@ -1,4 +1,4 @@ --FROM ubuntu:17.10 -+FROM ubuntu:18.04 - RUN apt-get update && apt-get install -y --no-install-recommends \ - gcc \ - ca-certificates \ -diff --git a/third_party/rust/packed_simd/ci/docker/i586-unknown-linux-gnu/Dockerfile b/third_party/rust/packed_simd/ci/docker/i586-unknown-linux-gnu/Dockerfile -index 857974a858..01093698f6 100644 ---- a/third_party/rust/packed_simd/ci/docker/i586-unknown-linux-gnu/Dockerfile -+++ b/third_party/rust/packed_simd/ci/docker/i586-unknown-linux-gnu/Dockerfile -@@ -1,4 +1,4 @@ --FROM ubuntu:17.10 -+FROM ubuntu:18.04 - RUN apt-get update && apt-get install -y --no-install-recommends \ - gcc-multilib \ - libc6-dev \ -diff --git a/third_party/rust/packed_simd/ci/docker/i686-unknown-linux-gnu/Dockerfile b/third_party/rust/packed_simd/ci/docker/i686-unknown-linux-gnu/Dockerfile -index 857974a858..01093698f6 100644 ---- a/third_party/rust/packed_simd/ci/docker/i686-unknown-linux-gnu/Dockerfile -+++ b/third_party/rust/packed_simd/ci/docker/i686-unknown-linux-gnu/Dockerfile -@@ -1,4 +1,4 @@ --FROM ubuntu:17.10 -+FROM ubuntu:18.04 - RUN apt-get update && apt-get install -y --no-install-recommends \ - gcc-multilib \ - libc6-dev \ -diff --git a/third_party/rust/packed_simd/ci/docker/mips-unknown-linux-gnu/Dockerfile b/third_party/rust/packed_simd/ci/docker/mips-unknown-linux-gnu/Dockerfile -index 4711cead37..3bd471e87d 100644 ---- a/third_party/rust/packed_simd/ci/docker/mips-unknown-linux-gnu/Dockerfile -+++ b/third_party/rust/packed_simd/ci/docker/mips-unknown-linux-gnu/Dockerfile -@@ -1,4 +1,4 @@ --FROM ubuntu:17.10 -+FROM ubuntu:18.04 - - RUN apt-get update && apt-get install -y --no-install-recommends \ - gcc libc6-dev qemu-user ca-certificates \ -diff --git a/third_party/rust/packed_simd/ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile b/third_party/rust/packed_simd/ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile -index 1422e8c809..f26f1f38eb 100644 ---- a/third_party/rust/packed_simd/ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile -+++ b/third_party/rust/packed_simd/ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile -@@ -1,4 +1,4 @@ --FROM ubuntu:17.10 -+FROM ubuntu:18.04 - - RUN apt-get update && apt-get install -y --no-install-recommends \ - gcc libc6-dev qemu-user ca-certificates \ -diff --git a/third_party/rust/packed_simd/ci/docker/mips64el-unknown-linux-gnuabi64/Dockerfile b/third_party/rust/packed_simd/ci/docker/mips64el-unknown-linux-gnuabi64/Dockerfile -index d94deb5b20..7d9f0bd992 100644 ---- a/third_party/rust/packed_simd/ci/docker/mips64el-unknown-linux-gnuabi64/Dockerfile -+++ b/third_party/rust/packed_simd/ci/docker/mips64el-unknown-linux-gnuabi64/Dockerfile -@@ -1,4 +1,4 @@ --FROM ubuntu:17.10 -+FROM ubuntu:18.04 - - RUN apt-get update && apt-get install -y --no-install-recommends \ - gcc libc6-dev qemu-user ca-certificates \ -diff --git a/third_party/rust/packed_simd/ci/docker/mipsel-unknown-linux-musl/Dockerfile b/third_party/rust/packed_simd/ci/docker/mipsel-unknown-linux-musl/Dockerfile -index 40ac50675b..7488662ef2 100644 ---- a/third_party/rust/packed_simd/ci/docker/mipsel-unknown-linux-musl/Dockerfile -+++ b/third_party/rust/packed_simd/ci/docker/mipsel-unknown-linux-musl/Dockerfile -@@ -16,10 +16,10 @@ RUN mkdir /toolchain - - # Note that this originally came from: - # https://downloads.openwrt.org/snapshots/trunk/malta/generic/OpenWrt-Toolchai... --RUN curl -L https://s3-us-west-1.amazonaws.com/rust-lang-ci2/libc/OpenWrt-Toolchain-malt... | \ -+RUN curl -L https://ci-mirrors.rust-lang.org/libc/OpenWrt-Toolchain-malta-le_gcc-5.3.0_m... | \ - tar xjf - -C /toolchain --strip-components=2 - - ENV PATH=$PATH:/rust/bin:/toolchain/bin \ - CC_mipsel_unknown_linux_musl=mipsel-openwrt-linux-gcc \ - CARGO_TARGET_MIPSEL_UNKNOWN_LINUX_MUSL_LINKER=mipsel-openwrt-linux-gcc \ -- CARGO_TARGET_MIPSEL_UNKNOWN_LINUX_MUSL_RUNNER="qemu-mipsel -L /toolchain" -\ No newline at end of file -+ CARGO_TARGET_MIPSEL_UNKNOWN_LINUX_MUSL_RUNNER="qemu-mipsel -L /toolchain" -diff --git a/third_party/rust/packed_simd/ci/docker/powerpc-unknown-linux-gnu/Dockerfile b/third_party/rust/packed_simd/ci/docker/powerpc-unknown-linux-gnu/Dockerfile -index 43b174ed87..80cfee8ab5 100644 ---- a/third_party/rust/packed_simd/ci/docker/powerpc-unknown-linux-gnu/Dockerfile -+++ b/third_party/rust/packed_simd/ci/docker/powerpc-unknown-linux-gnu/Dockerfile -@@ -1,4 +1,4 @@ --FROM ubuntu:17.10 -+FROM ubuntu:18.04 - - RUN apt-get update && apt-get install -y --no-install-recommends \ - gcc libc6-dev qemu-user ca-certificates \ -@@ -9,4 +9,5 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ - - ENV CARGO_TARGET_POWERPC_UNKNOWN_LINUX_GNU_LINKER=powerpc-linux-gnu-gcc \ - CARGO_TARGET_POWERPC_UNKNOWN_LINUX_GNU_RUNNER="qemu-ppc -cpu Vger -L /usr/powerpc-linux-gnu" \ -+ CC=powerpc-linux-gnu-gcc \ - OBJDUMP=powerpc-linux-gnu-objdump -diff --git a/third_party/rust/packed_simd/ci/docker/powerpc64-unknown-linux-gnu/Dockerfile b/third_party/rust/packed_simd/ci/docker/powerpc64-unknown-linux-gnu/Dockerfile -index 7757ad28a4..74031a2a3e 100644 ---- a/third_party/rust/packed_simd/ci/docker/powerpc64-unknown-linux-gnu/Dockerfile -+++ b/third_party/rust/packed_simd/ci/docker/powerpc64-unknown-linux-gnu/Dockerfile -@@ -1,4 +1,4 @@ --FROM ubuntu:17.10 -+FROM ubuntu:18.04 - - RUN apt-get update && apt-get install -y --no-install-recommends \ - gcc \ -diff --git a/third_party/rust/packed_simd/ci/docker/powerpc64le-unknown-linux-gnu/Dockerfile b/third_party/rust/packed_simd/ci/docker/powerpc64le-unknown-linux-gnu/Dockerfile -index 0b0c214fdf..471a7d9651 100644 ---- a/third_party/rust/packed_simd/ci/docker/powerpc64le-unknown-linux-gnu/Dockerfile -+++ b/third_party/rust/packed_simd/ci/docker/powerpc64le-unknown-linux-gnu/Dockerfile -@@ -1,4 +1,4 @@ --FROM ubuntu:17.10 -+FROM ubuntu:18.04 - - RUN apt-get update && apt-get install -y --no-install-recommends \ - gcc libc6-dev qemu-user ca-certificates \ -diff --git a/third_party/rust/packed_simd/ci/docker/thumbv7neon-unknown-linux-gnueabihf/Dockerfile b/third_party/rust/packed_simd/ci/docker/thumbv7neon-unknown-linux-gnueabihf/Dockerfile -index 696cb6c3fb..588d23c65a 100644 ---- a/third_party/rust/packed_simd/ci/docker/thumbv7neon-unknown-linux-gnueabihf/Dockerfile -+++ b/third_party/rust/packed_simd/ci/docker/thumbv7neon-unknown-linux-gnueabihf/Dockerfile -@@ -1,4 +1,4 @@ --FROM ubuntu:17.10 -+FROM ubuntu:18.04 - RUN apt-get update && apt-get install -y --no-install-recommends \ - gcc \ - ca-certificates \ -diff --git a/third_party/rust/packed_simd/ci/docker/x86_64-unknown-linux-gnu/Dockerfile b/third_party/rust/packed_simd/ci/docker/x86_64-unknown-linux-gnu/Dockerfile -index e6b000d051..ce5bb88e62 100644 ---- a/third_party/rust/packed_simd/ci/docker/x86_64-unknown-linux-gnu/Dockerfile -+++ b/third_party/rust/packed_simd/ci/docker/x86_64-unknown-linux-gnu/Dockerfile -@@ -1,4 +1,4 @@ --FROM ubuntu:17.10 -+FROM ubuntu:18.04 - RUN apt-get update && apt-get install -y --no-install-recommends \ - gcc \ - libc6-dev \ -diff --git a/third_party/rust/packed_simd/ci/dox.sh b/third_party/rust/packed_simd/ci/dox.sh -index 1743366407..560eaadcc8 100755 ---- a/third_party/rust/packed_simd/ci/dox.sh -+++ b/third_party/rust/packed_simd/ci/dox.sh -@@ -18,7 +18,10 @@ cp -r perf-guide/book target/doc/perf-guide - - # If we're on travis, not a PR, and on the right branch, publish! - if [ "$TRAVIS_PULL_REQUEST" = "false" ] && [ "$TRAVIS_BRANCH" = "master" ]; then -- pip install ghp_import --install-option="--prefix=$HOME/.local" -- $HOME/.local/bin/ghp-import -n target/doc -+ python3 -vV -+ pip -vV -+ python3.9 -vV -+ pip install ghp_import --user -+ ghp-import -n target/doc - git push -qf https://${GH_PAGES}@github.com/${TRAVIS_REPO_SLUG}.git gh-pages - fi -diff --git a/third_party/rust/packed_simd/ci/run.sh b/third_party/rust/packed_simd/ci/run.sh -index 7bb8258836..428a5d8902 100755 ---- a/third_party/rust/packed_simd/ci/run.sh -+++ b/third_party/rust/packed_simd/ci/run.sh -@@ -78,9 +78,11 @@ fi - - if [[ "${TARGET}" == "x86_64-unknown-linux-gnu" ]] || [[ "${TARGET}" == "x86_64-pc-windows-msvc" ]]; then - # use sleef on linux and windows x86_64 builds -- cargo_test_impl --release --features=into_bits,core_arch,sleef-sys -+ # FIXME: Use `core_arch,sleef-sys` features once they works again -+ cargo_test_impl --release --features=into_bits - else -- cargo_test_impl --release --features=into_bits,core_arch -+ # FIXME: Use `core_arch` feature once it works again -+ cargo_test_impl --release --features=into_bits - fi - - # Verify code generation -diff --git a/third_party/rust/packed_simd/ci/setup_benchmarks.sh b/third_party/rust/packed_simd/ci/setup_benchmarks.sh -index ddc4765d5c..cd41a78513 100755 ---- a/third_party/rust/packed_simd/ci/setup_benchmarks.sh -+++ b/third_party/rust/packed_simd/ci/setup_benchmarks.sh -@@ -5,6 +5,3 @@ set -ex - # Get latest ISPC binary for the target and put it in the path - git clone https://github.com/gnzlbg/ispc-binaries - cp ispc-binaries/ispc-${TARGET} ispc -- --# Rust-bindgen requires RUSTFMT --rustup component add rustfmt-preview -diff --git a/third_party/rust/packed_simd/src/api.rs b/third_party/rust/packed_simd/src/api.rs -index 9959a052ae..4e9c4292e0 100644 ---- a/third_party/rust/packed_simd/src/api.rs -+++ b/third_party/rust/packed_simd/src/api.rs -@@ -1,5 +1,7 @@ - //! Implements the Simd<[T; N]> APIs - -+#[macro_use] -+mod bitmask; - crate mod cast; - #[macro_use] - mod cmp; -@@ -39,7 +41,7 @@ crate mod into_bits; - - macro_rules! impl_i { - ([$elem_ty:ident; $elem_n:expr]: $tuple_id:ident, $mask_ty:ident -- | $ielem_ty:ident | $test_tt:tt | $($elem_ids:ident),* -+ | $ielem_ty:ident, $ibitmask_ty:ident | $test_tt:tt | $($elem_ids:ident),* - | From: $($from_vec_ty:ident),* | $(#[$doc:meta])*) => { - impl_minimal_iuf!([$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt - | $($elem_ids),* | $(#[$doc])*); -@@ -93,6 +95,7 @@ macro_rules! impl_i { - ); - impl_cmp_partial_ord!([$elem_ty; $elem_n]: $tuple_id | $test_tt); - impl_cmp_ord!([$elem_ty; $elem_n]: $tuple_id | $test_tt | (0, 1)); -+ impl_bitmask!($tuple_id | $ibitmask_ty | (-1, 0) | $test_tt); - - test_select!($elem_ty, $mask_ty, $tuple_id, (1, 2) | $test_tt); - test_cmp_partial_ord_int!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -@@ -102,7 +105,7 @@ macro_rules! impl_i { - - macro_rules! impl_u { - ([$elem_ty:ident; $elem_n:expr]: $tuple_id:ident, $mask_ty:ident -- | $ielem_ty:ident | $test_tt:tt | $($elem_ids:ident),* -+ | $ielem_ty:ident, $ibitmask_ty:ident | $test_tt:tt | $($elem_ids:ident),* - | From: $($from_vec_ty:ident),* | $(#[$doc:meta])*) => { - impl_minimal_iuf!([$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt - | $($elem_ids),* | $(#[$doc])*); -@@ -155,6 +158,8 @@ macro_rules! impl_u { - ); - impl_cmp_partial_ord!([$elem_ty; $elem_n]: $tuple_id | $test_tt); - impl_cmp_ord!([$elem_ty; $elem_n]: $tuple_id | $test_tt | (0, 1)); -+ impl_bitmask!($tuple_id | $ibitmask_ty | ($ielem_ty::max_value(), 0) | -+ $test_tt); - - test_select!($elem_ty, $mask_ty, $tuple_id, (1, 2) | $test_tt); - test_cmp_partial_ord_int!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -@@ -222,7 +227,8 @@ macro_rules! impl_f { - } - - macro_rules! impl_m { -- ([$elem_ty:ident; $elem_n:expr]: $tuple_id:ident | $ielem_ty:ident -+ ([$elem_ty:ident; $elem_n:expr]: $tuple_id:ident -+ | $ielem_ty:ident, $ibitmask_ty:ident - | $test_tt:tt | $($elem_ids:ident),* | From: $($from_vec_ty:ident),* - | $(#[$doc:meta])*) => { - impl_minimal_mask!( -@@ -265,6 +271,7 @@ macro_rules! impl_m { - [$elem_ty; $elem_n]: $tuple_id | $test_tt | (false, true) - ); - impl_shuffle1_dyn!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -+ impl_bitmask!($tuple_id | $ibitmask_ty | (true, false) | $test_tt); - - test_cmp_partial_ord_mask!([$elem_ty; $elem_n]: $tuple_id | $test_tt); - test_shuffle1_dyn_mask!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -diff --git a/third_party/rust/packed_simd/src/api/bit_manip.rs b/third_party/rust/packed_simd/src/api/bit_manip.rs -index 3d3c4eb885..6d8865706d 100644 ---- a/third_party/rust/packed_simd/src/api/bit_manip.rs -+++ b/third_party/rust/packed_simd/src/api/bit_manip.rs -@@ -37,6 +37,7 @@ macro_rules! impl_bit_manip { - paste::item_with_macros! { - #[allow(overflowing_literals)] - pub mod [<$id _bit_manip>] { -+ #![allow(const_item_mutation)] - use super::*; - - const LANE_WIDTH: usize = mem::size_of::<$elem_ty>() * 8; -diff --git a/third_party/rust/packed_simd/src/api/bitmask.rs b/third_party/rust/packed_simd/src/api/bitmask.rs -new file mode 100644 -index 0000000000..a06ff0fab1 ---- /dev/null -+++ b/third_party/rust/packed_simd/src/api/bitmask.rs -@@ -0,0 +1,82 @@ -+//! Bitmask API -+ -+macro_rules! impl_bitmask { -+ ($id:ident | $ibitmask_ty:ident | ($set:expr, $clear:expr) -+ | $test_tt:tt) => { -+ impl $id { -+ /// Creates a bitmask with the MSB of each vector lane. -+ /// -+ /// If the vector has less than 8 lanes, the bits that do not -+ /// correspond to any vector lanes are cleared. -+ #[inline] -+ pub fn bitmask(self) -> $ibitmask_ty { -+ unsafe { codegen::llvm::simd_bitmask(self.0) } -+ } -+ } -+ -+ test_if! { -+ $test_tt: -+ paste::item! { -+ #[cfg(not(any( -+ // FIXME: https://github.com/rust-lang-nursery/packed_simd/issues/210 -+ all(target_arch = "mips", target_endian = "big"), -+ all(target_arch = "mips64", target_endian = "big"), -+ target_arch = "sparc64", -+ target_arch = "s390x", -+ )))] -+ pub mod [<$id _bitmask>] { -+ use super::*; -+ #[cfg_attr(not(target_arch = "wasm32"), test)] -+ #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -+ fn bitmask() { -+ // clear all lanes -+ let vec = $id::splat($clear as _); -+ let bitmask: $ibitmask_ty = 0; -+ assert_eq!(vec.bitmask(), bitmask); -+ -+ // set even lanes -+ let mut vec = $id::splat($clear as _); -+ for i in 0..$id::lanes() { -+ if i % 2 == 0 { -+ vec = vec.replace(i, $set as _); -+ } -+ } -+ // create bitmask with even lanes set: -+ let mut bitmask: $ibitmask_ty = 0; -+ for i in 0..$id::lanes() { -+ if i % 2 == 0 { -+ bitmask |= 1 << i; -+ } -+ } -+ assert_eq!(vec.bitmask(), bitmask); -+ -+ -+ // set odd lanes -+ let mut vec = $id::splat($clear as _); -+ for i in 0..$id::lanes() { -+ if i % 2 != 0 { -+ vec = vec.replace(i, $set as _); -+ } -+ } -+ // create bitmask with odd lanes set: -+ let mut bitmask: $ibitmask_ty = 0; -+ for i in 0..$id::lanes() { -+ if i % 2 != 0 { -+ bitmask |= 1 << i; -+ } -+ } -+ assert_eq!(vec.bitmask(), bitmask); -+ -+ // set all lanes -+ let vec = $id::splat($set as _); -+ let mut bitmask: $ibitmask_ty = 0; -+ for i in 0..$id::lanes() { -+ bitmask |= 1 << i; -+ } -+ assert_eq!(vec.bitmask(), bitmask); -+ } -+ } -+ } -+ } -+ }; -+} -diff --git a/third_party/rust/packed_simd/src/api/cast/v128.rs b/third_party/rust/packed_simd/src/api/cast/v128.rs -index 78c07f3a55..ab47ddc006 100644 ---- a/third_party/rust/packed_simd/src/api/cast/v128.rs -+++ b/third_party/rust/packed_simd/src/api/cast/v128.rs -@@ -1,5 +1,5 @@ - //! `FromCast` and `IntoCast` implementations for portable 128-bit wide vectors --#![rustfmt::skip] -+#[rustfmt::skip] - - use crate::*; - -diff --git a/third_party/rust/packed_simd/src/api/cast/v16.rs b/third_party/rust/packed_simd/src/api/cast/v16.rs -index d292936baa..cf974bb08e 100644 ---- a/third_party/rust/packed_simd/src/api/cast/v16.rs -+++ b/third_party/rust/packed_simd/src/api/cast/v16.rs -@@ -1,5 +1,5 @@ - //! `FromCast` and `IntoCast` implementations for portable 16-bit wide vectors --#![rustfmt::skip] -+#[rustfmt::skip] - - use crate::*; - -diff --git a/third_party/rust/packed_simd/src/api/cast/v256.rs b/third_party/rust/packed_simd/src/api/cast/v256.rs -index 0a669e0bee..9389dcb4c7 100644 ---- a/third_party/rust/packed_simd/src/api/cast/v256.rs -+++ b/third_party/rust/packed_simd/src/api/cast/v256.rs -@@ -1,5 +1,5 @@ - //! `FromCast` and `IntoCast` implementations for portable 256-bit wide vectors --#![rustfmt::skip] -+#[rustfmt::skip] - - use crate::*; - -diff --git a/third_party/rust/packed_simd/src/api/cast/v32.rs b/third_party/rust/packed_simd/src/api/cast/v32.rs -index 65050cdacb..2b254ba0cf 100644 ---- a/third_party/rust/packed_simd/src/api/cast/v32.rs -+++ b/third_party/rust/packed_simd/src/api/cast/v32.rs -@@ -1,5 +1,5 @@ - //! `FromCast` and `IntoCast` implementations for portable 32-bit wide vectors --#![rustfmt::skip] -+#[rustfmt::skip] - - use crate::*; - -diff --git a/third_party/rust/packed_simd/src/api/cast/v512.rs b/third_party/rust/packed_simd/src/api/cast/v512.rs -index 9ae1caed35..5a10ab0666 100644 ---- a/third_party/rust/packed_simd/src/api/cast/v512.rs -+++ b/third_party/rust/packed_simd/src/api/cast/v512.rs -@@ -1,5 +1,5 @@ - //! `FromCast` and `IntoCast` implementations for portable 512-bit wide vectors --#![rustfmt::skip] -+#[rustfmt::skip] - - use crate::*; - -diff --git a/third_party/rust/packed_simd/src/api/cast/v64.rs b/third_party/rust/packed_simd/src/api/cast/v64.rs -index 0e2f78f733..192a4638a3 100644 ---- a/third_party/rust/packed_simd/src/api/cast/v64.rs -+++ b/third_party/rust/packed_simd/src/api/cast/v64.rs -@@ -1,5 +1,5 @@ - //! `FromCast` and `IntoCast` implementations for portable 64-bit wide vectors --#![rustfmt::skip] -+#[rustfmt::skip] - - use crate::*; - -diff --git a/third_party/rust/packed_simd/src/api/default.rs b/third_party/rust/packed_simd/src/api/default.rs -index 843d51bcc4..7af55ea77a 100644 ---- a/third_party/rust/packed_simd/src/api/default.rs -+++ b/third_party/rust/packed_simd/src/api/default.rs -@@ -12,6 +12,8 @@ macro_rules! impl_default { - test_if!{ - $test_tt: - paste::item! { -+ // Comparisons use integer casts within mantissa^1 range. -+ #[allow(clippy::float_cmp)] - pub mod [<$id _default>] { - use super::*; - #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -diff --git a/third_party/rust/packed_simd/src/api/from/from_array.rs b/third_party/rust/packed_simd/src/api/from/from_array.rs -index 964d1501df..b83f938162 100644 ---- a/third_party/rust/packed_simd/src/api/from/from_array.rs -+++ b/third_party/rust/packed_simd/src/api/from/from_array.rs -@@ -56,6 +56,8 @@ macro_rules! impl_from_array { - test_if! { - $test_tt: - paste::item! { -+ // Comparisons use integer casts within mantissa^1 range. -+ #[allow(clippy::float_cmp)] - mod [<$id _from>] { - use super::*; - #[test] -diff --git a/third_party/rust/packed_simd/src/api/hash.rs b/third_party/rust/packed_simd/src/api/hash.rs -index 08d42496ea..ee80eff939 100644 ---- a/third_party/rust/packed_simd/src/api/hash.rs -+++ b/third_party/rust/packed_simd/src/api/hash.rs -@@ -36,6 +36,8 @@ macro_rules! impl_hash { - let mut v_hash = a_hash.clone(); - a.hash(&mut a_hash); - -+ // Integer within mantissa^1 range. -+ #[allow(clippy::float_cmp)] - let v = $id::splat(42 as $elem_ty); - v.hash(&mut v_hash); - assert_eq!(a_hash.finish(), v_hash.finish()); -diff --git a/third_party/rust/packed_simd/src/api/into_bits/arch_specific.rs b/third_party/rust/packed_simd/src/api/into_bits/arch_specific.rs -index 6cc2fa37b7..fee6140052 100644 ---- a/third_party/rust/packed_simd/src/api/into_bits/arch_specific.rs -+++ b/third_party/rust/packed_simd/src/api/into_bits/arch_specific.rs -@@ -1,6 +1,6 @@ - //! `FromBits` and `IntoBits` between portable vector types and the - //! architecture-specific vector types. --#![rustfmt::skip] -+#[rustfmt::skip] - - // FIXME: MIPS FromBits/IntoBits - -@@ -84,7 +84,6 @@ macro_rules! impl_arch { - // FIXME: 64-bit single element types - // FIXME: arm/aarch float16x4_t missing - impl_arch!( -- [x86["x86"]: __m64], [x86_64["x86_64"]: __m64], - [arm["arm"]: int8x8_t, uint8x8_t, poly8x8_t, int16x4_t, uint16x4_t, - poly16x4_t, int32x2_t, uint32x2_t, float32x2_t, int64x1_t, - uint64x1_t], -diff --git a/third_party/rust/packed_simd/src/api/into_bits/v128.rs b/third_party/rust/packed_simd/src/api/into_bits/v128.rs -index 804dbf282d..e32cd7f9f0 100644 ---- a/third_party/rust/packed_simd/src/api/into_bits/v128.rs -+++ b/third_party/rust/packed_simd/src/api/into_bits/v128.rs -@@ -1,5 +1,5 @@ - //! `FromBits` and `IntoBits` implementations for portable 128-bit wide vectors --#![rustfmt::skip] -+#[rustfmt::skip] - - #[allow(unused)] // wasm_bindgen_test - use crate::*; -diff --git a/third_party/rust/packed_simd/src/api/into_bits/v16.rs b/third_party/rust/packed_simd/src/api/into_bits/v16.rs -index 1162a62e5b..e44d0e7f9a 100644 ---- a/third_party/rust/packed_simd/src/api/into_bits/v16.rs -+++ b/third_party/rust/packed_simd/src/api/into_bits/v16.rs -@@ -1,5 +1,5 @@ - //! `FromBits` and `IntoBits` implementations for portable 16-bit wide vectors --#![rustfmt::skip] -+#[rustfmt::skip] - - #[allow(unused)] // wasm_bindgen_test - use crate::*; -diff --git a/third_party/rust/packed_simd/src/api/into_bits/v256.rs b/third_party/rust/packed_simd/src/api/into_bits/v256.rs -index cc7a6646b5..c4c373e0d0 100644 ---- a/third_party/rust/packed_simd/src/api/into_bits/v256.rs -+++ b/third_party/rust/packed_simd/src/api/into_bits/v256.rs -@@ -1,5 +1,5 @@ - //! `FromBits` and `IntoBits` implementations for portable 256-bit wide vectors --#![rustfmt::skip] -+#[rustfmt::skip] - - #[allow(unused)] // wasm_bindgen_test - use crate::*; -diff --git a/third_party/rust/packed_simd/src/api/into_bits/v32.rs b/third_party/rust/packed_simd/src/api/into_bits/v32.rs -index 2c183ecf1c..5dba38a179 100644 ---- a/third_party/rust/packed_simd/src/api/into_bits/v32.rs -+++ b/third_party/rust/packed_simd/src/api/into_bits/v32.rs -@@ -1,5 +1,5 @@ - //! `FromBits` and `IntoBits` implementations for portable 32-bit wide vectors --#![rustfmt::skip] -+#[rustfmt::skip] - - #[allow(unused)] // wasm_bindgen_test - use crate::*; -diff --git a/third_party/rust/packed_simd/src/api/into_bits/v512.rs b/third_party/rust/packed_simd/src/api/into_bits/v512.rs -index 8dec6a7f63..4a771962c3 100644 ---- a/third_party/rust/packed_simd/src/api/into_bits/v512.rs -+++ b/third_party/rust/packed_simd/src/api/into_bits/v512.rs -@@ -1,5 +1,5 @@ - //! `FromBits` and `IntoBits` implementations for portable 512-bit wide vectors --#![rustfmt::skip] -+#[rustfmt::skip] - - #[allow(unused)] // wasm_bindgen_test - use crate::*; -diff --git a/third_party/rust/packed_simd/src/api/into_bits/v64.rs b/third_party/rust/packed_simd/src/api/into_bits/v64.rs -index 8999d98e13..5b065f1bd5 100644 ---- a/third_party/rust/packed_simd/src/api/into_bits/v64.rs -+++ b/third_party/rust/packed_simd/src/api/into_bits/v64.rs -@@ -1,5 +1,5 @@ - //! `FromBits` and `IntoBits` implementations for portable 64-bit wide vectors --#![rustfmt::skip] -+#[rustfmt::skip] - - #[allow(unused)] // wasm_bindgen_test - use crate::*; -diff --git a/third_party/rust/packed_simd/src/api/minimal/iuf.rs b/third_party/rust/packed_simd/src/api/minimal/iuf.rs -index 58ffabab99..a155ac178a 100644 ---- a/third_party/rust/packed_simd/src/api/minimal/iuf.rs -+++ b/third_party/rust/packed_simd/src/api/minimal/iuf.rs -@@ -53,7 +53,7 @@ macro_rules! impl_minimal_iuf { - - /// Extracts the value at `index`. - /// -- /// # Precondition -+ /// # Safety - /// - /// If `index >= Self::lanes()` the behavior is undefined. - #[inline] -@@ -80,7 +80,7 @@ macro_rules! impl_minimal_iuf { - - /// Returns a new vector where the value at `index` is replaced by `new_value`. - /// -- /// # Precondition -+ /// # Safety - /// - /// If `index >= Self::lanes()` the behavior is undefined. - #[inline] -@@ -101,6 +101,8 @@ macro_rules! impl_minimal_iuf { - test_if!{ - $test_tt: - paste::item! { -+ // Comparisons use integer casts within mantissa^1 range. -+ #[allow(clippy::float_cmp)] - pub mod [<$id _minimal>] { - use super::*; - #[cfg_attr(not(target_arch = "wasm32"), test)] -diff --git a/third_party/rust/packed_simd/src/api/minimal/mask.rs b/third_party/rust/packed_simd/src/api/minimal/mask.rs -index e65be95db1..a420060b42 100644 ---- a/third_party/rust/packed_simd/src/api/minimal/mask.rs -+++ b/third_party/rust/packed_simd/src/api/minimal/mask.rs -@@ -58,6 +58,8 @@ macro_rules! impl_minimal_mask { - - /// Extracts the value at `index`. - /// -+ /// # Safety -+ /// - /// If `index >= Self::lanes()` the behavior is undefined. - #[inline] - pub unsafe fn extract_unchecked(self, index: usize) -> bool { -@@ -85,9 +87,9 @@ macro_rules! impl_minimal_mask { - /// Returns a new vector where the value at `index` is replaced by - /// `new_value`. - /// -- /// # Panics -+ /// # Safety - /// -- /// If `index >= Self::lanes()`. -+ /// If `index >= Self::lanes()` the behavior is undefined. - #[inline] - #[must_use = "replace_unchecked does not modify the original value - \ - it returns a new vector with the value at `index` \ -diff --git a/third_party/rust/packed_simd/src/api/minimal/ptr.rs b/third_party/rust/packed_simd/src/api/minimal/ptr.rs -index 75e5aad5c0..c3d61fbf6d 100644 ---- a/third_party/rust/packed_simd/src/api/minimal/ptr.rs -+++ b/third_party/rust/packed_simd/src/api/minimal/ptr.rs -@@ -68,7 +68,7 @@ macro_rules! impl_minimal_p { - - /// Extracts the value at `index`. - /// -- /// # Precondition -+ /// # Safety - /// - /// If `index >= Self::lanes()` the behavior is undefined. - #[inline] -@@ -96,7 +96,7 @@ macro_rules! impl_minimal_p { - - /// Returns a new vector where the value at `index` is replaced by `new_value`. - /// -- /// # Precondition -+ /// # Safety - /// - /// If `index >= Self::lanes()` the behavior is undefined. - #[inline] -@@ -215,7 +215,7 @@ macro_rules! impl_minimal_p { - f, - "{}<{}>(", - stringify!($id), -- unsafe { crate::intrinsics::type_name::<T>() } -+ crate::intrinsics::type_name::<T>() - )?; - for i in 0..$elem_count { - if i > 0 { -@@ -550,11 +550,7 @@ macro_rules! impl_minimal_p { - ]; - - for i in 0..$elem_count { -- let ptr = unsafe { -- crate::mem::transmute( -- &values[i] as *const i32 -- ) -- }; -+ let ptr = &values[i] as *const i32 as *mut i32; - vec = vec.replace(i, ptr); - array[i] = ptr; - } -@@ -611,7 +607,7 @@ macro_rules! impl_minimal_p { - - /// Instantiates a new vector with the values of the `slice`. - /// -- /// # Precondition -+ /// # Safety - /// - /// If `slice.len() < Self::lanes()` or `&slice[0]` is not aligned - /// to an `align_of::<Self>()` boundary, the behavior is undefined. -@@ -624,7 +620,7 @@ macro_rules! impl_minimal_p { - - /// Instantiates a new vector with the values of the `slice`. - /// -- /// # Precondition -+ /// # Safety - /// - /// If `slice.len() < Self::lanes()` the behavior is undefined. - #[inline] -@@ -827,7 +823,7 @@ macro_rules! impl_minimal_p { - - /// Writes the values of the vector to the `slice`. - /// -- /// # Precondition -+ /// # Safety - /// - /// If `slice.len() < Self::lanes()` or `&slice[0]` is not - /// aligned to an `align_of::<Self>()` boundary, the behavior is -@@ -843,7 +839,7 @@ macro_rules! impl_minimal_p { - - /// Writes the values of the vector to the `slice`. - /// -- /// # Precondition -+ /// # Safety - /// - /// If `slice.len() < Self::lanes()` the behavior is undefined. - #[inline] -@@ -1025,11 +1021,7 @@ macro_rules! impl_minimal_p { - ]; - - for i in 0..$elem_count { -- let ptr = unsafe { -- crate::mem::transmute( -- &values[i] as *const i32 -- ) -- }; -+ let ptr = &values[i] as *const i32 as *mut i32; - vec = vec.replace(i, ptr); - array[i] = ptr; - } -@@ -1151,7 +1143,7 @@ macro_rules! impl_minimal_p { - /// As such, memory acquired directly from allocators or memory - /// mapped files may be too large to handle with this function. - /// -- /// Consider using wrapping_offset_from instead if these constraints -+ /// Consider using `wrapping_offset_from` instead if these constraints - /// are difficult to satisfy. The only advantage of this method is - /// that it enables more aggressive compiler optimizations. - #[inline] -diff --git a/third_party/rust/packed_simd/src/api/ops/vector_float_min_max.rs b/third_party/rust/packed_simd/src/api/ops/vector_float_min_max.rs -index 4126e87042..8310667b7a 100644 ---- a/third_party/rust/packed_simd/src/api/ops/vector_float_min_max.rs -+++ b/third_party/rust/packed_simd/src/api/ops/vector_float_min_max.rs -@@ -26,6 +26,11 @@ macro_rules! impl_ops_vector_float_min_max { - test_if!{ - $test_tt: - paste::item! { -+ #[cfg(not(any( -+ // FIXME: https://github.com/rust-lang-nursery/packed_simd/issues/223 -+ all(target_arch = "mips", target_endian = "big"), -+ target_arch = "mips64", -+ )))] - pub mod [<$id _ops_vector_min_max>] { - use super::*; - #[cfg_attr(not(target_arch = "wasm32"), test)] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] -diff --git a/third_party/rust/packed_simd/src/api/ptr/gather_scatter.rs b/third_party/rust/packed_simd/src/api/ptr/gather_scatter.rs -index 9d8e113bb4..4304356209 100644 ---- a/third_party/rust/packed_simd/src/api/ptr/gather_scatter.rs -+++ b/third_party/rust/packed_simd/src/api/ptr/gather_scatter.rs -@@ -49,9 +49,9 @@ macro_rules! impl_ptr_read { - let mut ptr = $id::<i32>::null(); - - for i in 0..$elem_count { -- ptr = ptr.replace(i, unsafe { -- crate::mem::transmute(&v[i] as *const i32) -- }); -+ ptr = ptr.replace(i, -+ &v[i] as *const i32 as *mut i32 -+ ); - } - - // all mask elements are true: -@@ -135,32 +135,8 @@ macro_rules! impl_ptr_write { - M: sealed::Mask, - [M; $elem_count]: sealed::SimdArray, - { -- // FIXME: -- // https://github.com/rust-lang-nursery/packed_simd/issues/85 -- #[cfg(not(target_arch = "mips"))] -- { -- use crate::llvm::simd_scatter; -- simd_scatter(value.0, self.0, mask.0) -- } -- #[cfg(target_arch = "mips")] -- { -- let m_ptr = -- &mask as *const Simd<[M; $elem_count]> as *const M; -- for i in 0..$elem_count { -- let m = ptr::read(m_ptr.add(i)); -- if m.test() { -- let t_ptr = &self -- as *const Simd<[*mut T; $elem_count]> -- as *mut *mut T; -- let v_ptr = &value as *const Simd<[T; $elem_count]> -- as *const T; -- ptr::write( -- ptr::read(t_ptr.add(i)), -- ptr::read(v_ptr.add(i)), -- ); -- } -- } -- } -+ use crate::llvm::simd_scatter; -+ simd_scatter(value.0, self.0, mask.0) - } - } - -@@ -185,7 +161,7 @@ macro_rules! impl_ptr_write { - let mut ptr = $id::<i32>::null(); - for i in 0..$elem_count { - ptr = ptr.replace(i, unsafe { -- crate::mem::transmute(arr.as_ptr().add(i)) -+ arr.as_ptr().add(i) as *mut i32 - }); - } - // ptr = [&arr[0], &arr[1], ...] -diff --git a/third_party/rust/packed_simd/src/api/reductions/float_arithmetic.rs b/third_party/rust/packed_simd/src/api/reductions/float_arithmetic.rs -index dd722ae25f..4a47452e50 100644 ---- a/third_party/rust/packed_simd/src/api/reductions/float_arithmetic.rs -+++ b/third_party/rust/packed_simd/src/api/reductions/float_arithmetic.rs -@@ -93,6 +93,8 @@ macro_rules! impl_reduction_float_arithmetic { - test_if! { - $test_tt: - paste::item! { -+ // Comparisons use integer casts within mantissa^1 range. -+ #[allow(clippy::float_cmp)] - pub mod [<$id _reduction_float_arith>] { - use super::*; - fn alternating(x: usize) -> $id { -@@ -225,7 +227,7 @@ macro_rules! impl_reduction_float_arithmetic { - let mut v = $id::splat(0. as $elem_ty); - for i in 0..$id::lanes() { - let c = if i % 2 == 0 { 1e3 } else { -1. }; -- start *= 3.14 * c; -+ start *= ::core::$elem_ty::consts::PI * c; - scalar_reduction += start; - v = v.replace(i, start); - } -@@ -257,6 +259,7 @@ macro_rules! impl_reduction_float_arithmetic { - #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] - #[allow(unused, dead_code)] - fn product_roundoff() { -+ use ::core::convert::TryInto; - // Performs a tree-reduction - fn tree_reduce_product(a: &[$elem_ty]) -> $elem_ty { - assert!(!a.is_empty()); -@@ -278,7 +281,7 @@ macro_rules! impl_reduction_float_arithmetic { - let mut v = $id::splat(0. as $elem_ty); - for i in 0..$id::lanes() { - let c = if i % 2 == 0 { 1e3 } else { -1. }; -- start *= 3.14 * c; -+ start *= ::core::$elem_ty::consts::PI * c; - scalar_reduction *= start; - v = v.replace(i, start); - } -@@ -288,7 +291,9 @@ macro_rules! impl_reduction_float_arithmetic { - v.write_to_slice_unaligned(&mut a); - let tree_reduction = tree_reduce_product(&a); - -- // tolerate 1 ULP difference: -+ // FIXME: Too imprecise, even only for product(f32x8). -+ // Figure out how to narrow this down. -+ let ulp_limit = $id::lanes() / 2; - let red_bits = simd_reduction.to_bits(); - let tree_bits = tree_reduction.to_bits(); - assert!( -@@ -296,7 +301,7 @@ macro_rules! impl_reduction_float_arithmetic { - red_bits - tree_bits - } else { - tree_bits - red_bits -- } < 2, -+ } < ulp_limit.try_into().unwrap(), - "vector: {:?} | simd_reduction: {:?} | \ - tree_reduction: {} | scalar_reduction: {}", - v, -diff --git a/third_party/rust/packed_simd/src/api/reductions/min_max.rs b/third_party/rust/packed_simd/src/api/reductions/min_max.rs -index c4d3aa10f1..c4c1400a8f 100644 ---- a/third_party/rust/packed_simd/src/api/reductions/min_max.rs -+++ b/third_party/rust/packed_simd/src/api/reductions/min_max.rs -@@ -76,6 +76,8 @@ macro_rules! impl_reduction_min_max { - } - test_if! {$test_tt: - paste::item! { -+ // Comparisons use integer casts within mantissa^1 range. -+ #[allow(clippy::float_cmp)] - pub mod [<$id _reduction_min_max>] { - use super::*; - #[cfg_attr(not(target_arch = "wasm32"), test)] -@@ -124,6 +126,8 @@ macro_rules! test_reduction_float_min_max { - test_if!{ - $test_tt: - paste::item! { -+ // Comparisons use integer casts within mantissa^1 range. -+ #[allow(clippy::float_cmp)] - pub mod [<$id _reduction_min_max_nan>] { - use super::*; - #[cfg_attr(not(target_arch = "wasm32"), test)] -diff --git a/third_party/rust/packed_simd/src/api/slice/from_slice.rs b/third_party/rust/packed_simd/src/api/slice/from_slice.rs -index 109cd1f10b..25082d1e68 100644 ---- a/third_party/rust/packed_simd/src/api/slice/from_slice.rs -+++ b/third_party/rust/packed_simd/src/api/slice/from_slice.rs -@@ -38,7 +38,7 @@ macro_rules! impl_slice_from_slice { - - /// Instantiates a new vector with the values of the `slice`. - /// -- /// # Precondition -+ /// # Safety - /// - /// If `slice.len() < Self::lanes()` or `&slice[0]` is not aligned - /// to an `align_of::<Self>()` boundary, the behavior is undefined. -@@ -59,7 +59,7 @@ macro_rules! impl_slice_from_slice { - - /// Instantiates a new vector with the values of the `slice`. - /// -- /// # Precondition -+ /// # Safety - /// - /// If `slice.len() < Self::lanes()` the behavior is undefined. - #[inline] -@@ -84,6 +84,8 @@ macro_rules! impl_slice_from_slice { - test_if! { - $test_tt: - paste::item! { -+ // Comparisons use integer casts within mantissa^1 range. -+ #[allow(clippy::float_cmp)] - pub mod [<$id _slice_from_slice>] { - use super::*; - use crate::iter::Iterator; -diff --git a/third_party/rust/packed_simd/src/api/slice/write_to_slice.rs b/third_party/rust/packed_simd/src/api/slice/write_to_slice.rs -index fcb288da70..b634d98b99 100644 ---- a/third_party/rust/packed_simd/src/api/slice/write_to_slice.rs -+++ b/third_party/rust/packed_simd/src/api/slice/write_to_slice.rs -@@ -39,7 +39,7 @@ macro_rules! impl_slice_write_to_slice { - - /// Writes the values of the vector to the `slice`. - /// -- /// # Precondition -+ /// # Safety - /// - /// If `slice.len() < Self::lanes()` or `&slice[0]` is not - /// aligned to an `align_of::<Self>()` boundary, the behavior is -@@ -64,7 +64,7 @@ macro_rules! impl_slice_write_to_slice { - - /// Writes the values of the vector to the `slice`. - /// -- /// # Precondition -+ /// # Safety - /// - /// If `slice.len() < Self::lanes()` the behavior is undefined. - #[inline] -@@ -86,6 +86,8 @@ macro_rules! impl_slice_write_to_slice { - test_if! { - $test_tt: - paste::item! { -+ // Comparisons use integer casts within mantissa^1 range. -+ #[allow(clippy::float_cmp)] - pub mod [<$id _slice_write_to_slice>] { - use super::*; - use crate::iter::Iterator; -diff --git a/third_party/rust/packed_simd/src/codegen.rs b/third_party/rust/packed_simd/src/codegen.rs -index b7ccd83860..9d1517e203 100644 ---- a/third_party/rust/packed_simd/src/codegen.rs -+++ b/third_party/rust/packed_simd/src/codegen.rs -@@ -16,6 +16,8 @@ macro_rules! impl_simd_array { - pub struct $tuple_id($(crate $elem_tys),*); - //^^^^^^^ leaked through SimdArray - -+ impl crate::sealed::Seal for [$elem_ty; $elem_count] {} -+ - impl crate::sealed::SimdArray for [$elem_ty; $elem_count] { - type Tuple = $tuple_id; - type T = $elem_ty; -@@ -23,6 +25,7 @@ macro_rules! impl_simd_array { - type NT = [u32; $elem_count]; - } - -+ impl crate::sealed::Seal for $tuple_id {} - impl crate::sealed::Simd for $tuple_id { - type Element = $elem_ty; - const LANES: usize = $elem_count; -diff --git a/third_party/rust/packed_simd/src/codegen/bit_manip.rs b/third_party/rust/packed_simd/src/codegen/bit_manip.rs -index 947266f5bc..83c7d1987c 100644 ---- a/third_party/rust/packed_simd/src/codegen/bit_manip.rs -+++ b/third_party/rust/packed_simd/src/codegen/bit_manip.rs -@@ -1,5 +1,5 @@ - //! LLVM bit manipulation intrinsics. --#![rustfmt::skip] -+#[rustfmt::skip] - - use crate::*; - -diff --git a/third_party/rust/packed_simd/src/codegen/llvm.rs b/third_party/rust/packed_simd/src/codegen/llvm.rs -index 91c2b0758d..93c6ce6b77 100644 ---- a/third_party/rust/packed_simd/src/codegen/llvm.rs -+++ b/third_party/rust/packed_simd/src/codegen/llvm.rs -@@ -10,31 +10,37 @@ extern "platform-intrinsic" { - // FIXME: Passing this intrinsics an `idx` array with an index that is - // out-of-bounds will produce a monomorphization-time error. - // https://github.com/rust-lang-nursery/packed_simd/issues/21 -+ #[rustc_args_required_const(2)] - pub fn simd_shuffle2<T, U>(x: T, y: T, idx: [u32; 2]) -> U - where - T: Simd, - <T as Simd>::Element: Shuffle<[u32; 2], Output = U>; - -+ #[rustc_args_required_const(2)] - pub fn simd_shuffle4<T, U>(x: T, y: T, idx: [u32; 4]) -> U - where - T: Simd, - <T as Simd>::Element: Shuffle<[u32; 4], Output = U>; - -+ #[rustc_args_required_const(2)] - pub fn simd_shuffle8<T, U>(x: T, y: T, idx: [u32; 8]) -> U - where - T: Simd, - <T as Simd>::Element: Shuffle<[u32; 8], Output = U>; - -+ #[rustc_args_required_const(2)] - pub fn simd_shuffle16<T, U>(x: T, y: T, idx: [u32; 16]) -> U - where - T: Simd, - <T as Simd>::Element: Shuffle<[u32; 16], Output = U>; - -+ #[rustc_args_required_const(2)] - pub fn simd_shuffle32<T, U>(x: T, y: T, idx: [u32; 32]) -> U - where - T: Simd, - <T as Simd>::Element: Shuffle<[u32; 32], Output = U>; - -+ #[rustc_args_required_const(2)] - pub fn simd_shuffle64<T, U>(x: T, y: T, idx: [u32; 64]) -> U - where - T: Simd, -@@ -96,4 +102,6 @@ extern "platform-intrinsic" { - - crate fn simd_gather<T, P, M>(value: T, pointers: P, mask: M) -> T; - crate fn simd_scatter<T, P, M>(value: T, pointers: P, mask: M); -+ -+ crate fn simd_bitmask<T, U>(value: T) -> U; - } -diff --git a/third_party/rust/packed_simd/src/codegen/reductions/mask/x86.rs b/third_party/rust/packed_simd/src/codegen/reductions/mask/x86.rs -index 2ae4ed81c4..bcfb1a6e17 100644 ---- a/third_party/rust/packed_simd/src/codegen/reductions/mask/x86.rs -+++ b/third_party/rust/packed_simd/src/codegen/reductions/mask/x86.rs -@@ -19,13 +19,7 @@ mod avx2; - /// x86 64-bit m8x8 implementation - macro_rules! x86_m8x8_impl { - ($id:ident) => { -- cfg_if! { -- if #[cfg(all(target_arch = "x86_64", target_feature = "sse"))] { -- x86_m8x8_sse_impl!($id); -- } else { -- fallback_impl!($id); -- } -- } -+ fallback_impl!($id); - }; - } - -diff --git a/third_party/rust/packed_simd/src/codegen/reductions/mask/x86/sse.rs b/third_party/rust/packed_simd/src/codegen/reductions/mask/x86/sse.rs -index 7482f9430a..eb1ef7fac9 100644 ---- a/third_party/rust/packed_simd/src/codegen/reductions/mask/x86/sse.rs -+++ b/third_party/rust/packed_simd/src/codegen/reductions/mask/x86/sse.rs -@@ -34,35 +34,3 @@ macro_rules! x86_m32x4_sse_impl { - } - }; - } -- --macro_rules! x86_m8x8_sse_impl { -- ($id:ident) => { -- impl All for $id { -- #[inline] -- #[target_feature(enable = "sse")] -- unsafe fn all(self) -> bool { -- #[cfg(target_arch = "x86")] -- use crate::arch::x86::_mm_movemask_pi8; -- #[cfg(target_arch = "x86_64")] -- use crate::arch::x86_64::_mm_movemask_pi8; -- // _mm_movemask_pi8(a) creates an 8bit mask containing the most -- // significant bit of each byte of `a`. If all bits are set, -- // then all 8 lanes of the mask are true. -- _mm_movemask_pi8(crate::mem::transmute(self)) -- == u8::max_value() as i32 -- } -- } -- impl Any for $id { -- #[inline] -- #[target_feature(enable = "sse")] -- unsafe fn any(self) -> bool { -- #[cfg(target_arch = "x86")] -- use crate::arch::x86::_mm_movemask_pi8; -- #[cfg(target_arch = "x86_64")] -- use crate::arch::x86_64::_mm_movemask_pi8; -- -- _mm_movemask_pi8(crate::mem::transmute(self)) != 0 -- } -- } -- }; --} -diff --git a/third_party/rust/packed_simd/src/codegen/shuffle.rs b/third_party/rust/packed_simd/src/codegen/shuffle.rs -index 35a9db9053..d92c9ee224 100644 ---- a/third_party/rust/packed_simd/src/codegen/shuffle.rs -+++ b/third_party/rust/packed_simd/src/codegen/shuffle.rs -@@ -2,301 +2,149 @@ - //! lanes and vector element types. - - use crate::masks::*; --use crate::sealed::Shuffle; -- --impl Shuffle<[u32; 2]> for i8 { -- type Output = crate::codegen::i8x2; --} --impl Shuffle<[u32; 4]> for i8 { -- type Output = crate::codegen::i8x4; --} --impl Shuffle<[u32; 8]> for i8 { -- type Output = crate::codegen::i8x8; --} --impl Shuffle<[u32; 16]> for i8 { -- type Output = crate::codegen::i8x16; --} --impl Shuffle<[u32; 32]> for i8 { -- type Output = crate::codegen::i8x32; --} --impl Shuffle<[u32; 64]> for i8 { -- type Output = crate::codegen::i8x64; --} -- --impl Shuffle<[u32; 2]> for u8 { -- type Output = crate::codegen::u8x2; --} --impl Shuffle<[u32; 4]> for u8 { -- type Output = crate::codegen::u8x4; --} --impl Shuffle<[u32; 8]> for u8 { -- type Output = crate::codegen::u8x8; --} --impl Shuffle<[u32; 16]> for u8 { -- type Output = crate::codegen::u8x16; --} --impl Shuffle<[u32; 32]> for u8 { -- type Output = crate::codegen::u8x32; --} --impl Shuffle<[u32; 64]> for u8 { -- type Output = crate::codegen::u8x64; --} -- --impl Shuffle<[u32; 2]> for m8 { -- type Output = crate::codegen::m8x2; --} --impl Shuffle<[u32; 4]> for m8 { -- type Output = crate::codegen::m8x4; --} --impl Shuffle<[u32; 8]> for m8 { -- type Output = crate::codegen::m8x8; --} --impl Shuffle<[u32; 16]> for m8 { -- type Output = crate::codegen::m8x16; --} --impl Shuffle<[u32; 32]> for m8 { -- type Output = crate::codegen::m8x32; --} --impl Shuffle<[u32; 64]> for m8 { -- type Output = crate::codegen::m8x64; --} -- --impl Shuffle<[u32; 2]> for i16 { -- type Output = crate::codegen::i16x2; --} --impl Shuffle<[u32; 4]> for i16 { -- type Output = crate::codegen::i16x4; --} --impl Shuffle<[u32; 8]> for i16 { -- type Output = crate::codegen::i16x8; --} --impl Shuffle<[u32; 16]> for i16 { -- type Output = crate::codegen::i16x16; --} --impl Shuffle<[u32; 32]> for i16 { -- type Output = crate::codegen::i16x32; --} -- --impl Shuffle<[u32; 2]> for u16 { -- type Output = crate::codegen::u16x2; --} --impl Shuffle<[u32; 4]> for u16 { -- type Output = crate::codegen::u16x4; --} --impl Shuffle<[u32; 8]> for u16 { -- type Output = crate::codegen::u16x8; --} --impl Shuffle<[u32; 16]> for u16 { -- type Output = crate::codegen::u16x16; --} --impl Shuffle<[u32; 32]> for u16 { -- type Output = crate::codegen::u16x32; --} -- --impl Shuffle<[u32; 2]> for m16 { -- type Output = crate::codegen::m16x2; --} --impl Shuffle<[u32; 4]> for m16 { -- type Output = crate::codegen::m16x4; --} --impl Shuffle<[u32; 8]> for m16 { -- type Output = crate::codegen::m16x8; --} --impl Shuffle<[u32; 16]> for m16 { -- type Output = crate::codegen::m16x16; --} --impl Shuffle<[u32; 32]> for m16 { -- type Output = crate::codegen::m16x32; --} -- --impl Shuffle<[u32; 2]> for i32 { -- type Output = crate::codegen::i32x2; --} --impl Shuffle<[u32; 4]> for i32 { -- type Output = crate::codegen::i32x4; --} --impl Shuffle<[u32; 8]> for i32 { -- type Output = crate::codegen::i32x8; --} --impl Shuffle<[u32; 16]> for i32 { -- type Output = crate::codegen::i32x16; --} -- --impl Shuffle<[u32; 2]> for u32 { -- type Output = crate::codegen::u32x2; --} --impl Shuffle<[u32; 4]> for u32 { -- type Output = crate::codegen::u32x4; --} --impl Shuffle<[u32; 8]> for u32 { -- type Output = crate::codegen::u32x8; --} --impl Shuffle<[u32; 16]> for u32 { -- type Output = crate::codegen::u32x16; --} -- --impl Shuffle<[u32; 2]> for f32 { -- type Output = crate::codegen::f32x2; --} --impl Shuffle<[u32; 4]> for f32 { -- type Output = crate::codegen::f32x4; --} --impl Shuffle<[u32; 8]> for f32 { -- type Output = crate::codegen::f32x8; --} --impl Shuffle<[u32; 16]> for f32 { -- type Output = crate::codegen::f32x16; --} -- --impl Shuffle<[u32; 2]> for m32 { -- type Output = crate::codegen::m32x2; --} --impl Shuffle<[u32; 4]> for m32 { -- type Output = crate::codegen::m32x4; --} --impl Shuffle<[u32; 8]> for m32 { -- type Output = crate::codegen::m32x8; --} --impl Shuffle<[u32; 16]> for m32 { -- type Output = crate::codegen::m32x16; --} -+use crate::sealed::{Shuffle, Seal}; -+ -+macro_rules! impl_shuffle { -+ ($array:ty, $base:ty, $out:ty) => { -+ impl Seal<$array> for $base {} -+ impl Shuffle<$array> for $base { -+ type Output = $out; -+ } -+ } -+} -+ -+impl_shuffle! { [u32; 2], i8, crate::codegen::i8x2 } -+impl_shuffle! { [u32; 4], i8, crate::codegen::i8x4 } -+impl_shuffle! { [u32; 8], i8, crate::codegen::i8x8 } -+impl_shuffle! { [u32; 16], i8, crate::codegen::i8x16 } -+impl_shuffle! { [u32; 32], i8, crate::codegen::i8x32 } -+impl_shuffle! { [u32; 64], i8, crate::codegen::i8x64 } -+ -+impl_shuffle! { [u32; 2], u8, crate::codegen::u8x2 } -+impl_shuffle! { [u32; 4], u8, crate::codegen::u8x4 } -+impl_shuffle! { [u32; 8], u8, crate::codegen::u8x8 } -+impl_shuffle! { [u32; 16], u8, crate::codegen::u8x16 } -+impl_shuffle! { [u32; 32], u8, crate::codegen::u8x32 } -+impl_shuffle! { [u32; 64], u8, crate::codegen::u8x64 } -+ -+impl_shuffle! { [u32; 2], m8, crate::codegen::m8x2 } -+impl_shuffle! { [u32; 4], m8, crate::codegen::m8x4 } -+impl_shuffle! { [u32; 8], m8, crate::codegen::m8x8 } -+impl_shuffle! { [u32; 16], m8, crate::codegen::m8x16 } -+impl_shuffle! { [u32; 32], m8, crate::codegen::m8x32 } -+impl_shuffle! { [u32; 64], m8, crate::codegen::m8x64 } -+ -+impl_shuffle! { [u32; 2], i16, crate::codegen::i16x2 } -+impl_shuffle! { [u32; 4], i16, crate::codegen::i16x4 } -+impl_shuffle! { [u32; 8], i16, crate::codegen::i16x8 } -+impl_shuffle! { [u32; 16], i16, crate::codegen::i16x16 } -+impl_shuffle! { [u32; 32], i16, crate::codegen::i16x32 } -+ -+impl_shuffle! { [u32; 2], u16, crate::codegen::u16x2 } -+impl_shuffle! { [u32; 4], u16, crate::codegen::u16x4 } -+impl_shuffle! { [u32; 8], u16, crate::codegen::u16x8 } -+impl_shuffle! { [u32; 16], u16, crate::codegen::u16x16 } -+impl_shuffle! { [u32; 32], u16, crate::codegen::u16x32 } -+ -+impl_shuffle! { [u32; 2], m16, crate::codegen::m16x2 } -+impl_shuffle! { [u32; 4], m16, crate::codegen::m16x4 } -+impl_shuffle! { [u32; 8], m16, crate::codegen::m16x8 } -+impl_shuffle! { [u32; 16], m16, crate::codegen::m16x16 } -+ -+impl_shuffle! { [u32; 2], i32, crate::codegen::i32x2 } -+impl_shuffle! { [u32; 4], i32, crate::codegen::i32x4 } -+impl_shuffle! { [u32; 8], i32, crate::codegen::i32x8 } -+impl_shuffle! { [u32; 16], i32, crate::codegen::i32x16 } -+ -+impl_shuffle! { [u32; 2], u32, crate::codegen::u32x2 } -+impl_shuffle! { [u32; 4], u32, crate::codegen::u32x4 } -+impl_shuffle! { [u32; 8], u32, crate::codegen::u32x8 } -+impl_shuffle! { [u32; 16], u32, crate::codegen::u32x16 } -+ -+impl_shuffle! { [u32; 2], f32, crate::codegen::f32x2 } -+impl_shuffle! { [u32; 4], f32, crate::codegen::f32x4 } -+impl_shuffle! { [u32; 8], f32, crate::codegen::f32x8 } -+impl_shuffle! { [u32; 16], f32, crate::codegen::f32x16 } -+ -+impl_shuffle! { [u32; 2], m32, crate::codegen::m32x2 } -+impl_shuffle! { [u32; 4], m32, crate::codegen::m32x4 } -+impl_shuffle! { [u32; 8], m32, crate::codegen::m32x8 } -+impl_shuffle! { [u32; 16], m32, crate::codegen::m32x16 } - - /* FIXME: 64-bit single element vector --impl Shuffle<[u32; 1]> for i64 { -- type Output = crate::codegen::i64x1; --} -+impl_shuffle! { [u32; 1], i64, crate::codegen::i64x1 } - */ --impl Shuffle<[u32; 2]> for i64 { -- type Output = crate::codegen::i64x2; --} --impl Shuffle<[u32; 4]> for i64 { -- type Output = crate::codegen::i64x4; --} --impl Shuffle<[u32; 8]> for i64 { -- type Output = crate::codegen::i64x8; --} -+impl_shuffle! { [u32; 2], i64, crate::codegen::i64x2 } -+impl_shuffle! { [u32; 4], i64, crate::codegen::i64x4 } -+impl_shuffle! { [u32; 8], i64, crate::codegen::i64x8 } - - /* FIXME: 64-bit single element vector --impl Shuffle<[u32; 1]> for u64 { -- type Output = crate::codegen::u64x1; --} -+impl_shuffle! { [u32; 1], i64, crate::codegen::i64x1 } - */ --impl Shuffle<[u32; 2]> for u64 { -- type Output = crate::codegen::u64x2; --} --impl Shuffle<[u32; 4]> for u64 { -- type Output = crate::codegen::u64x4; --} --impl Shuffle<[u32; 8]> for u64 { -- type Output = crate::codegen::u64x8; --} -+impl_shuffle! { [u32; 2], u64, crate::codegen::u64x2 } -+impl_shuffle! { [u32; 4], u64, crate::codegen::u64x4 } -+impl_shuffle! { [u32; 8], u64, crate::codegen::u64x8 } - - /* FIXME: 64-bit single element vector --impl Shuffle<[u32; 1]> for f64 { -- type Output = crate::codegen::f64x1; --} -+impl_shuffle! { [u32; 1], i64, crate::codegen::i64x1 } - */ --impl Shuffle<[u32; 2]> for f64 { -- type Output = crate::codegen::f64x2; --} --impl Shuffle<[u32; 4]> for f64 { -- type Output = crate::codegen::f64x4; --} --impl Shuffle<[u32; 8]> for f64 { -- type Output = crate::codegen::f64x8; --} -+impl_shuffle! { [u32; 2], f64, crate::codegen::f64x2 } -+impl_shuffle! { [u32; 4], f64, crate::codegen::f64x4 } -+impl_shuffle! { [u32; 8], f64, crate::codegen::f64x8 } - - /* FIXME: 64-bit single element vector --impl Shuffle<[u32; 1]> for m64 { -- type Output = crate::codegen::m64x1; --} -+impl_shuffle! { [u32; 1], i64, crate::codegen::i64x1 } - */ --impl Shuffle<[u32; 2]> for m64 { -- type Output = crate::codegen::m64x2; --} --impl Shuffle<[u32; 4]> for m64 { -- type Output = crate::codegen::m64x4; --} --impl Shuffle<[u32; 8]> for m64 { -- type Output = crate::codegen::m64x8; --} -+impl_shuffle! { [u32; 2], m64, crate::codegen::m64x2 } -+impl_shuffle! { [u32; 4], m64, crate::codegen::m64x4 } -+impl_shuffle! { [u32; 8], m64, crate::codegen::m64x8 } - --impl Shuffle<[u32; 2]> for isize { -- type Output = crate::codegen::isizex2; --} --impl Shuffle<[u32; 4]> for isize { -- type Output = crate::codegen::isizex4; --} --impl Shuffle<[u32; 8]> for isize { -- type Output = crate::codegen::isizex8; --} -+impl_shuffle! { [u32; 2], isize, crate::codegen::isizex2 } -+impl_shuffle! { [u32; 4], isize, crate::codegen::isizex4 } -+impl_shuffle! { [u32; 8], isize, crate::codegen::isizex8 } - --impl Shuffle<[u32; 2]> for usize { -- type Output = crate::codegen::usizex2; --} --impl Shuffle<[u32; 4]> for usize { -- type Output = crate::codegen::usizex4; --} --impl Shuffle<[u32; 8]> for usize { -- type Output = crate::codegen::usizex8; --} -+impl_shuffle! { [u32; 2], usize, crate::codegen::usizex2 } -+impl_shuffle! { [u32; 4], usize, crate::codegen::usizex4 } -+impl_shuffle! { [u32; 8], usize, crate::codegen::usizex8 } - -+impl_shuffle! { [u32; 2], msize, crate::codegen::msizex2 } -+impl_shuffle! { [u32; 4], msize, crate::codegen::msizex4 } -+impl_shuffle! { [u32; 8], msize, crate::codegen::msizex8 } -+ -+impl<T> Seal<[u32; 2]> for *const T {} - impl<T> Shuffle<[u32; 2]> for *const T { - type Output = crate::codegen::cptrx2<T>; - } -+impl<T> Seal<[u32; 4]> for *const T {} - impl<T> Shuffle<[u32; 4]> for *const T { - type Output = crate::codegen::cptrx4<T>; - } -+impl<T> Seal<[u32; 8]> for *const T {} - impl<T> Shuffle<[u32; 8]> for *const T { - type Output = crate::codegen::cptrx8<T>; - } - -+impl<T> Seal<[u32; 2]> for *mut T {} - impl<T> Shuffle<[u32; 2]> for *mut T { - type Output = crate::codegen::mptrx2<T>; - } -+impl<T> Seal<[u32; 4]> for *mut T {} - impl<T> Shuffle<[u32; 4]> for *mut T { - type Output = crate::codegen::mptrx4<T>; - } -+impl<T> Seal<[u32; 8]> for *mut T {} - impl<T> Shuffle<[u32; 8]> for *mut T { - type Output = crate::codegen::mptrx8<T>; - } - --impl Shuffle<[u32; 2]> for msize { -- type Output = crate::codegen::msizex2; --} --impl Shuffle<[u32; 4]> for msize { -- type Output = crate::codegen::msizex4; --} --impl Shuffle<[u32; 8]> for msize { -- type Output = crate::codegen::msizex8; --} -+impl_shuffle! { [u32; 1], i128, crate::codegen::i128x1 } -+impl_shuffle! { [u32; 2], i128, crate::codegen::i128x2 } -+impl_shuffle! { [u32; 4], i128, crate::codegen::i128x4 } - --impl Shuffle<[u32; 1]> for i128 { -- type Output = crate::codegen::i128x1; --} --impl Shuffle<[u32; 2]> for i128 { -- type Output = crate::codegen::i128x2; --} --impl Shuffle<[u32; 4]> for i128 { -- type Output = crate::codegen::i128x4; --} -+impl_shuffle! { [u32; 1], u128, crate::codegen::u128x1 } -+impl_shuffle! { [u32; 2], u128, crate::codegen::u128x2 } -+impl_shuffle! { [u32; 4], u128, crate::codegen::u128x4 } - --impl Shuffle<[u32; 1]> for u128 { -- type Output = crate::codegen::u128x1; --} --impl Shuffle<[u32; 2]> for u128 { -- type Output = crate::codegen::u128x2; --} --impl Shuffle<[u32; 4]> for u128 { -- type Output = crate::codegen::u128x4; --} -- --impl Shuffle<[u32; 1]> for m128 { -- type Output = crate::codegen::m128x1; --} --impl Shuffle<[u32; 2]> for m128 { -- type Output = crate::codegen::m128x2; --} --impl Shuffle<[u32; 4]> for m128 { -- type Output = crate::codegen::m128x4; --} -+impl_shuffle! { [u32; 1], m128, crate::codegen::m128x1 } -+impl_shuffle! { [u32; 2], m128, crate::codegen::m128x2 } -+impl_shuffle! { [u32; 4], m128, crate::codegen::m128x4 } -diff --git a/third_party/rust/packed_simd/src/codegen/shuffle1_dyn.rs b/third_party/rust/packed_simd/src/codegen/shuffle1_dyn.rs -index 1e9f581637..a5403a06bb 100644 ---- a/third_party/rust/packed_simd/src/codegen/shuffle1_dyn.rs -+++ b/third_party/rust/packed_simd/src/codegen/shuffle1_dyn.rs -@@ -28,31 +28,10 @@ macro_rules! impl_fallback { - macro_rules! impl_shuffle1_dyn { - (u8x8) => { - cfg_if! { -- if #[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), -- target_feature = "ssse3"))] { -- impl Shuffle1Dyn for u8x8 { -- type Indices = Self; -- #[inline] -- fn shuffle1_dyn(self, indices: Self::Indices) -> Self { -- #[cfg(target_arch = "x86")] -- use crate::arch::x86::_mm_shuffle_pi8; -- #[cfg(target_arch = "x86_64")] -- use crate::arch::x86_64::_mm_shuffle_pi8; -- -- unsafe { -- crate::mem::transmute( -- _mm_shuffle_pi8( -- crate::mem::transmute(self.0), -- crate::mem::transmute(indices.0) -- ) -- ) -- } -- } -- } -- } else if #[cfg(all( -+ if #[cfg(all( - any( -- all(target_aarch = "aarch64", target_feature = "neon"), -- all(target_aarch = "arm", target_feature = "v7", -+ all(target_arch = "aarch64", target_feature = "neon"), -+ all(target_arch = "doesnotexist", target_feature = "v7", - target_feature = "neon") - ), - any(feature = "core_arch", libcore_neon) -@@ -62,9 +41,9 @@ macro_rules! impl_shuffle1_dyn { - type Indices = Self; - #[inline] - fn shuffle1_dyn(self, indices: Self::Indices) -> Self { -- #[cfg(targt_arch = "aarch64")] -+ #[cfg(target_arch = "aarch64")] - use crate::arch::aarch64::vtbl1_u8; -- #[cfg(targt_arch = "arm")] -+ #[cfg(target_arch = "doesnotexist")] - use crate::arch::arm::vtbl1_u8; - - // This is safe because the binary is compiled with -@@ -106,7 +85,7 @@ macro_rules! impl_shuffle1_dyn { - } - } - } -- } else if #[cfg(all(target_aarch = "aarch64", target_feature = "neon", -+ } else if #[cfg(all(target_arch = "aarch64", target_feature = "neon", - any(feature = "core_arch", libcore_neon)))] { - impl Shuffle1Dyn for u8x16 { - type Indices = Self; -@@ -125,7 +104,7 @@ macro_rules! impl_shuffle1_dyn { - } - } - } -- } else if #[cfg(all(target_aarch = "arm", target_feature = "v7", -+ } else if #[cfg(all(target_arch = "doesnotexist", target_feature = "v7", - target_feature = "neon", - any(feature = "core_arch", libcore_neon)))] { - impl Shuffle1Dyn for u8x16 { -diff --git a/third_party/rust/packed_simd/src/codegen/vPtr.rs b/third_party/rust/packed_simd/src/codegen/vPtr.rs -index 1f2bc7714d..cf47655381 100644 ---- a/third_party/rust/packed_simd/src/codegen/vPtr.rs -+++ b/third_party/rust/packed_simd/src/codegen/vPtr.rs -@@ -8,6 +8,7 @@ macro_rules! impl_simd_ptr { - pub struct $tuple_id<$ty>($(crate $tys),*); - //^^^^^^^ leaked through SimdArray - -+ impl<$ty> crate::sealed::Seal for [$ptr_ty; $elem_count] {} - impl<$ty> crate::sealed::SimdArray for [$ptr_ty; $elem_count] { - type Tuple = $tuple_id<$ptr_ty>; - type T = $ptr_ty; -@@ -15,6 +16,7 @@ macro_rules! impl_simd_ptr { - type NT = [u32; $elem_count]; - } - -+ impl<$ty> crate::sealed::Seal for $tuple_id<$ptr_ty> {} - impl<$ty> crate::sealed::Simd for $tuple_id<$ptr_ty> { - type Element = $ptr_ty; - const LANES: usize = $elem_count; -diff --git a/third_party/rust/packed_simd/src/lib.rs b/third_party/rust/packed_simd/src/lib.rs -index d73645e72f..b0b56d4d74 100644 ---- a/third_party/rust/packed_simd/src/lib.rs -+++ b/third_party/rust/packed_simd/src/lib.rs -@@ -201,6 +201,7 @@ - - #![feature( - repr_simd, -+ rustc_attrs, - const_fn, - platform_intrinsics, - stdsimd, -@@ -209,22 +210,26 @@ - link_llvm_intrinsics, - core_intrinsics, - stmt_expr_attributes, -- align_offset, -- mmx_target_feature, - crate_visibility_modifier, - custom_inner_attributes - )] - #![allow(non_camel_case_types, non_snake_case, -- clippy::cast_possible_truncation, -- clippy::cast_lossless, -- clippy::cast_possible_wrap, -- clippy::cast_precision_loss, -- // This lint is currently broken for generic code -- // See https://github.com/rust-lang/rust-clippy/issues/3410 -- clippy::use_self -+ // FIXME: these types are unsound in C FFI already -+ // See https://github.com/rust-lang/rust/issues/53346 -+ improper_ctypes_definitions, -+ clippy::cast_possible_truncation, -+ clippy::cast_lossless, -+ clippy::cast_possible_wrap, -+ clippy::cast_precision_loss, -+ // TODO: manually add the `#[must_use]` attribute where appropriate -+ clippy::must_use_candidate, -+ // This lint is currently broken for generic code -+ // See https://github.com/rust-lang/rust-clippy/issues/3410 -+ clippy::use_self, -+ clippy::wrong_self_convention, - )] - #![cfg_attr(test, feature(hashmap_internals))] --#![deny(warnings, rust_2018_idioms, clippy::missing_inline_in_public_items)] -+#![deny(rust_2018_idioms, clippy::missing_inline_in_public_items)] - #![no_std] - - use cfg_if::cfg_if; -@@ -256,6 +261,8 @@ mod api; - mod codegen; - mod sealed; - -+pub use crate::sealed::{Simd as SimdVector, Shuffle, SimdArray, Mask}; -+ - /// Packed SIMD vector type. - /// - /// # Examples -@@ -276,6 +283,8 @@ pub struct Simd<A: sealed::SimdArray>( - #[doc(hidden)] pub <A as sealed::SimdArray>::Tuple, - ); - -+impl<A: sealed::SimdArray> sealed::Seal for Simd<A> {} -+ - /// Wrapper over `T` implementing a lexicoraphical order via the `PartialOrd` - /// and/or `Ord` traits. - #[repr(transparent)] -diff --git a/third_party/rust/packed_simd/src/masks.rs b/third_party/rust/packed_simd/src/masks.rs -index f83c4da957..aeb36d2328 100644 ---- a/third_party/rust/packed_simd/src/masks.rs -+++ b/third_party/rust/packed_simd/src/masks.rs -@@ -6,7 +6,9 @@ macro_rules! impl_mask_ty { - #[derive(Copy, Clone)] - pub struct $id($elem_ty); - -+ impl crate::sealed::Seal for $id {} - impl crate::sealed::Mask for $id { -+ #[inline] - fn test(&self) -> bool { - $id::test(self) - } -diff --git a/third_party/rust/packed_simd/src/sealed.rs b/third_party/rust/packed_simd/src/sealed.rs -index 832acd3f1d..0ec20300fd 100644 ---- a/third_party/rust/packed_simd/src/sealed.rs -+++ b/third_party/rust/packed_simd/src/sealed.rs -@@ -1,8 +1,11 @@ - //! Sealed traits - -+/// A sealed trait, this is logically private to the crate -+/// and will prevent implementations from outside the crate -+pub trait Seal<T = ()> {} -+ - /// Trait implemented by arrays that can be SIMD types. --#[doc(hidden)] --pub trait SimdArray { -+pub trait SimdArray: Seal { - /// The type of the #[repr(simd)] type. - type Tuple: Copy + Clone; - /// The element type of the vector. -@@ -16,7 +19,7 @@ pub trait SimdArray { - /// This traits is used to constraint the arguments - /// and result type of the portable shuffles. - #[doc(hidden)] --pub trait Shuffle<Lanes> { -+pub trait Shuffle<Lanes>: Seal<Lanes> { - // Lanes is a `[u32; N]` where `N` is the number of vector lanes - - /// The result type of the shuffle. -@@ -24,8 +27,7 @@ pub trait Shuffle<Lanes> { - } - - /// This trait is implemented by all SIMD vector types. --#[doc(hidden)] --pub trait Simd { -+pub trait Simd: Seal { - /// Element type of the SIMD vector - type Element; - /// The number of elements in the SIMD vector. -@@ -35,7 +37,6 @@ pub trait Simd { - } - - /// This trait is implemented by all mask types --#[doc(hidden)] --pub trait Mask { -+pub trait Mask: Seal { - fn test(&self) -> bool; - } -diff --git a/third_party/rust/packed_simd/src/testing/utils.rs b/third_party/rust/packed_simd/src/testing/utils.rs -index 7b8f21ac1c..21f27aae54 100644 ---- a/third_party/rust/packed_simd/src/testing/utils.rs -+++ b/third_party/rust/packed_simd/src/testing/utils.rs -@@ -1,6 +1,8 @@ - //! Testing utilities - - #![allow(dead_code)] -+// FIXME: Or don't. But it's true this is a problematic comparison. -+#![allow(clippy::neg_cmp_op_on_partial_ord)] - - use crate::{cmp::PartialOrd, fmt::Debug, LexicographicallyOrdered}; - -@@ -19,14 +21,19 @@ pub fn test_lt<T>( - assert!(a <= b, "{:?}, {:?}", a, b); - assert!(b >= a, "{:?}, {:?}", a, b); - -- // Irreflexivity -- assert!(!(a < a), "{:?}, {:?}", a, b); -- assert!(!(b < b), "{:?}, {:?}", a, b); -- assert!(!(a > a), "{:?}, {:?}", a, b); -- assert!(!(b > b), "{:?}, {:?}", a, b); -+ // The elegance of the mathematical expression of irreflexivity is more -+ // than clippy can handle. -+ #[allow(clippy::eq_op)] -+ { -+ // Irreflexivity -+ assert!(!(a < a), "{:?}, {:?}", a, b); -+ assert!(!(b < b), "{:?}, {:?}", a, b); -+ assert!(!(a > a), "{:?}, {:?}", a, b); -+ assert!(!(b > b), "{:?}, {:?}", a, b); - -- assert!(a <= a, "{:?}, {:?}", a, b); -- assert!(b <= b, "{:?}, {:?}", a, b); -+ assert!(a <= a, "{:?}, {:?}", a, b); -+ assert!(b <= b, "{:?}, {:?}", a, b); -+ } - } - - /// Tests PartialOrd for `a` and `b` where `a <= b` is true. -@@ -38,8 +45,8 @@ pub fn test_le<T>( - assert!(a <= b, "{:?}, {:?}", a, b); - assert!(b >= a, "{:?}, {:?}", a, b); - -- assert!(a == b || a < b, "{:?}, {:?}", a, b); -- assert!(a == b || b > a, "{:?}, {:?}", a, b); -+ assert!(a <= b, "{:?}, {:?}", a, b); -+ assert!(b >= a, "{:?}, {:?}", a, b); - - if a == b { - assert!(!(a < b), "{:?}, {:?}", a, b); -diff --git a/third_party/rust/packed_simd/src/v128.rs b/third_party/rust/packed_simd/src/v128.rs -index 1d0282dc42..7949f6619a 100644 ---- a/third_party/rust/packed_simd/src/v128.rs -+++ b/third_party/rust/packed_simd/src/v128.rs -@@ -1,42 +1,42 @@ - //! 128-bit wide vector types --#![rustfmt::skip] -+#[rustfmt::skip] - - use crate::*; - --impl_i!([i8; 16]: i8x16, m8x16 | i8 | test_v128 | -+impl_i!([i8; 16]: i8x16, m8x16 | i8, u16 | test_v128 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 | - From: | - /// A 128-bit vector with 16 `i8` lanes. - ); --impl_u!([u8; 16]: u8x16, m8x16 | u8 | test_v128 | -+impl_u!([u8; 16]: u8x16, m8x16 | u8, u16 | test_v128 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 | - From: | - /// A 128-bit vector with 16 `u8` lanes. - ); --impl_m!([m8; 16]: m8x16 | i8 | test_v128 | -+impl_m!([m8; 16]: m8x16 | i8, u16 | test_v128 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 | - From: m16x16 | - /// A 128-bit vector mask with 16 `m8` lanes. - ); - --impl_i!([i16; 8]: i16x8, m16x8 | i16 | test_v128 | x0, x1, x2, x3, x4, x5, x6, x7 | -+impl_i!([i16; 8]: i16x8, m16x8 | i16, u8 | test_v128 | x0, x1, x2, x3, x4, x5, x6, x7 | - From: i8x8, u8x8 | - /// A 128-bit vector with 8 `i16` lanes. - ); --impl_u!([u16; 8]: u16x8, m16x8 | u16| test_v128 | x0, x1, x2, x3, x4, x5, x6, x7 | -+impl_u!([u16; 8]: u16x8, m16x8 | u16, u8 | test_v128 | x0, x1, x2, x3, x4, x5, x6, x7 | - From: u8x8 | - /// A 128-bit vector with 8 `u16` lanes. - ); --impl_m!([m16; 8]: m16x8 | i16 | test_v128 | x0, x1, x2, x3, x4, x5, x6, x7 | -+impl_m!([m16; 8]: m16x8 | i16, u8 | test_v128 | x0, x1, x2, x3, x4, x5, x6, x7 | - From: m8x8, m32x8 | - /// A 128-bit vector mask with 8 `m16` lanes. - ); - --impl_i!([i32; 4]: i32x4, m32x4 | i32 | test_v128 | x0, x1, x2, x3 | -+impl_i!([i32; 4]: i32x4, m32x4 | i32, u8 | test_v128 | x0, x1, x2, x3 | - From: i8x4, u8x4, i16x4, u16x4 | - /// A 128-bit vector with 4 `i32` lanes. - ); --impl_u!([u32; 4]: u32x4, m32x4 | u32| test_v128 | x0, x1, x2, x3 | -+impl_u!([u32; 4]: u32x4, m32x4 | u32, u8 | test_v128 | x0, x1, x2, x3 | - From: u8x4, u16x4 | - /// A 128-bit vector with 4 `u32` lanes. - ); -@@ -44,16 +44,16 @@ impl_f!([f32; 4]: f32x4, m32x4 | f32 | test_v128 | x0, x1, x2, x3 | - From: i8x4, u8x4, i16x4, u16x4 | - /// A 128-bit vector with 4 `f32` lanes. - ); --impl_m!([m32; 4]: m32x4 | i32 | test_v128 | x0, x1, x2, x3 | -+impl_m!([m32; 4]: m32x4 | i32, u8 | test_v128 | x0, x1, x2, x3 | - From: m8x4, m16x4, m64x4 | - /// A 128-bit vector mask with 4 `m32` lanes. - ); - --impl_i!([i64; 2]: i64x2, m64x2 | i64 | test_v128 | x0, x1 | -+impl_i!([i64; 2]: i64x2, m64x2 | i64, u8 | test_v128 | x0, x1 | - From: i8x2, u8x2, i16x2, u16x2, i32x2, u32x2 | - /// A 128-bit vector with 2 `i64` lanes. - ); --impl_u!([u64; 2]: u64x2, m64x2 | u64 | test_v128 | x0, x1 | -+impl_u!([u64; 2]: u64x2, m64x2 | u64, u8 | test_v128 | x0, x1 | - From: u8x2, u16x2, u32x2 | - /// A 128-bit vector with 2 `u64` lanes. - ); -@@ -61,20 +61,20 @@ impl_f!([f64; 2]: f64x2, m64x2 | f64 | test_v128 | x0, x1 | - From: i8x2, u8x2, i16x2, u16x2, i32x2, u32x2, f32x2 | - /// A 128-bit vector with 2 `f64` lanes. - ); --impl_m!([m64; 2]: m64x2 | i64 | test_v128 | x0, x1 | -+impl_m!([m64; 2]: m64x2 | i64, u8 | test_v128 | x0, x1 | - From: m8x2, m16x2, m32x2, m128x2 | - /// A 128-bit vector mask with 2 `m64` lanes. - ); - --impl_i!([i128; 1]: i128x1, m128x1 | i128 | test_v128 | x0 | -+impl_i!([i128; 1]: i128x1, m128x1 | i128, u8 | test_v128 | x0 | - From: /*i8x1, u8x1, i16x1, u16x1, i32x1, u32x1, i64x1, u64x1 */ | // FIXME: unary small vector types - /// A 128-bit vector with 1 `i128` lane. - ); --impl_u!([u128; 1]: u128x1, m128x1 | u128 | test_v128 | x0 | -+impl_u!([u128; 1]: u128x1, m128x1 | u128, u8 | test_v128 | x0 | - From: /*u8x1, u16x1, u32x1, u64x1 */ | // FIXME: unary small vector types - /// A 128-bit vector with 1 `u128` lane. - ); --impl_m!([m128; 1]: m128x1 | i128 | test_v128 | x0 | -+impl_m!([m128; 1]: m128x1 | i128, u8 | test_v128 | x0 | - From: /*m8x1, m16x1, m32x1, m64x1 */ | // FIXME: unary small vector types - /// A 128-bit vector mask with 1 `m128` lane. - ); -diff --git a/third_party/rust/packed_simd/src/v16.rs b/third_party/rust/packed_simd/src/v16.rs -index 67a3832d25..4ca5afb2a7 100644 ---- a/third_party/rust/packed_simd/src/v16.rs -+++ b/third_party/rust/packed_simd/src/v16.rs -@@ -2,15 +2,15 @@ - - use crate::*; - --impl_i!([i8; 2]: i8x2, m8x2 | i8 | test_v16 | x0, x1 | -+impl_i!([i8; 2]: i8x2, m8x2 | i8, u8 | test_v16 | x0, x1 | - From: | - /// A 16-bit vector with 2 `i8` lanes. - ); --impl_u!([u8; 2]: u8x2, m8x2 | u8 | test_v16 | x0, x1 | -+impl_u!([u8; 2]: u8x2, m8x2 | u8, u8 | test_v16 | x0, x1 | - From: | - /// A 16-bit vector with 2 `u8` lanes. - ); --impl_m!([m8; 2]: m8x2 | i8 | test_v16 | x0, x1 | -+impl_m!([m8; 2]: m8x2 | i8, u8 | test_v16 | x0, x1 | - From: m16x2, m32x2, m64x2, m128x2 | - /// A 16-bit vector mask with 2 `m8` lanes. - ); -diff --git a/third_party/rust/packed_simd/src/v256.rs b/third_party/rust/packed_simd/src/v256.rs -index 6b59336f68..f0c3bc2813 100644 ---- a/third_party/rust/packed_simd/src/v256.rs -+++ b/third_party/rust/packed_simd/src/v256.rs -@@ -1,48 +1,48 @@ - //! 256-bit wide vector types --#![rustfmt::skip] -+#[rustfmt::skip] - - use crate::*; - --impl_i!([i8; 32]: i8x32, m8x32 | i8 | test_v256 | -+impl_i!([i8; 32]: i8x32, m8x32 | i8, u32 | test_v256 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, - x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31 | - From: | - /// A 256-bit vector with 32 `i8` lanes. - ); --impl_u!([u8; 32]: u8x32, m8x32 | u8 | test_v256 | -+impl_u!([u8; 32]: u8x32, m8x32 | u8, u32 | test_v256 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, - x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31 | - From: | - /// A 256-bit vector with 32 `u8` lanes. - ); --impl_m!([m8; 32]: m8x32 | i8 | test_v256 | -+impl_m!([m8; 32]: m8x32 | i8, u32 | test_v256 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, - x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31 | - From: | - /// A 256-bit vector mask with 32 `m8` lanes. - ); - --impl_i!([i16; 16]: i16x16, m16x16 | i16 | test_v256 | -+impl_i!([i16; 16]: i16x16, m16x16 | i16, u16 | test_v256 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 | - From: i8x16, u8x16 | - /// A 256-bit vector with 16 `i16` lanes. - ); --impl_u!([u16; 16]: u16x16, m16x16 | u16 | test_v256 | -+impl_u!([u16; 16]: u16x16, m16x16 | u16, u16 | test_v256 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 | - From: u8x16 | - /// A 256-bit vector with 16 `u16` lanes. - ); --impl_m!([m16; 16]: m16x16 | i16 | test_v256 | -+impl_m!([m16; 16]: m16x16 | i16, u16 | test_v256 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 | - From: m8x16 | - /// A 256-bit vector mask with 16 `m16` lanes. - ); - --impl_i!([i32; 8]: i32x8, m32x8 | i32 | test_v256 | x0, x1, x2, x3, x4, x5, x6, x7 | -+impl_i!([i32; 8]: i32x8, m32x8 | i32, u8 | test_v256 | x0, x1, x2, x3, x4, x5, x6, x7 | - From: i8x8, u8x8, i16x8, u16x8 | - /// A 256-bit vector with 8 `i32` lanes. - ); --impl_u!([u32; 8]: u32x8, m32x8 | u32 | test_v256 | x0, x1, x2, x3, x4, x5, x6, x7 | -+impl_u!([u32; 8]: u32x8, m32x8 | u32, u8 | test_v256 | x0, x1, x2, x3, x4, x5, x6, x7 | - From: u8x8, u16x8 | - /// A 256-bit vector with 8 `u32` lanes. - ); -@@ -50,16 +50,16 @@ impl_f!([f32; 8]: f32x8, m32x8 | f32 | test_v256 | x0, x1, x2, x3, x4, x5, x6, x - From: i8x8, u8x8, i16x8, u16x8 | - /// A 256-bit vector with 8 `f32` lanes. - ); --impl_m!([m32; 8]: m32x8 | i32 | test_v256 | x0, x1, x2, x3, x4, x5, x6, x7 | -+impl_m!([m32; 8]: m32x8 | i32, u8 | test_v256 | x0, x1, x2, x3, x4, x5, x6, x7 | - From: m8x8, m16x8 | - /// A 256-bit vector mask with 8 `m32` lanes. - ); - --impl_i!([i64; 4]: i64x4, m64x4 | i64 | test_v256 | x0, x1, x2, x3 | -+impl_i!([i64; 4]: i64x4, m64x4 | i64, u8 | test_v256 | x0, x1, x2, x3 | - From: i8x4, u8x4, i16x4, u16x4, i32x4, u32x4 | - /// A 256-bit vector with 4 `i64` lanes. - ); --impl_u!([u64; 4]: u64x4, m64x4 | u64 | test_v256 | x0, x1, x2, x3 | -+impl_u!([u64; 4]: u64x4, m64x4 | u64, u8 | test_v256 | x0, x1, x2, x3 | - From: u8x4, u16x4, u32x4 | - /// A 256-bit vector with 4 `u64` lanes. - ); -@@ -67,20 +67,20 @@ impl_f!([f64; 4]: f64x4, m64x4 | f64 | test_v256 | x0, x1, x2, x3 | - From: i8x4, u8x4, i16x4, u16x4, i32x4, u32x4, f32x4 | - /// A 256-bit vector with 4 `f64` lanes. - ); --impl_m!([m64; 4]: m64x4 | i64 | test_v256 | x0, x1, x2, x3 | -+impl_m!([m64; 4]: m64x4 | i64, u8 | test_v256 | x0, x1, x2, x3 | - From: m8x4, m16x4, m32x4 | - /// A 256-bit vector mask with 4 `m64` lanes. - ); - --impl_i!([i128; 2]: i128x2, m128x2 | i128 | test_v256 | x0, x1 | -+impl_i!([i128; 2]: i128x2, m128x2 | i128, u8 | test_v256 | x0, x1 | - From: i8x2, u8x2, i16x2, u16x2, i32x2, u32x2, i64x2, u64x2 | - /// A 256-bit vector with 2 `i128` lanes. - ); --impl_u!([u128; 2]: u128x2, m128x2 | u128 | test_v256 | x0, x1 | -+impl_u!([u128; 2]: u128x2, m128x2 | u128, u8 | test_v256 | x0, x1 | - From: u8x2, u16x2, u32x2, u64x2 | - /// A 256-bit vector with 2 `u128` lanes. - ); --impl_m!([m128; 2]: m128x2 | i128 | test_v256 | x0, x1 | -+impl_m!([m128; 2]: m128x2 | i128, u8 | test_v256 | x0, x1 | - From: m8x2, m16x2, m32x2, m64x2 | - /// A 256-bit vector mask with 2 `m128` lanes. - ); -diff --git a/third_party/rust/packed_simd/src/v32.rs b/third_party/rust/packed_simd/src/v32.rs -index 09cef9bdd4..75a1838e5e 100644 ---- a/third_party/rust/packed_simd/src/v32.rs -+++ b/third_party/rust/packed_simd/src/v32.rs -@@ -2,28 +2,28 @@ - - use crate::*; - --impl_i!([i8; 4]: i8x4, m8x4 | i8 | test_v32 | x0, x1, x2, x3 | -+impl_i!([i8; 4]: i8x4, m8x4 | i8, u8 | test_v32 | x0, x1, x2, x3 | - From: | - /// A 32-bit vector with 4 `i8` lanes. - ); --impl_u!([u8; 4]: u8x4, m8x4 | u8 | test_v32 | x0, x1, x2, x3 | -+impl_u!([u8; 4]: u8x4, m8x4 | u8, u8 | test_v32 | x0, x1, x2, x3 | - From: | - /// A 32-bit vector with 4 `u8` lanes. - ); --impl_m!([m8; 4]: m8x4 | i8 | test_v32 | x0, x1, x2, x3 | -+impl_m!([m8; 4]: m8x4 | i8, u8 | test_v32 | x0, x1, x2, x3 | - From: m16x4, m32x4, m64x4 | - /// A 32-bit vector mask with 4 `m8` lanes. - ); - --impl_i!([i16; 2]: i16x2, m16x2 | i16 | test_v32 | x0, x1 | -+impl_i!([i16; 2]: i16x2, m16x2 | i16, u8 | test_v32 | x0, x1 | - From: i8x2, u8x2 | - /// A 32-bit vector with 2 `i16` lanes. - ); --impl_u!([u16; 2]: u16x2, m16x2 | u16 | test_v32 | x0, x1 | -+impl_u!([u16; 2]: u16x2, m16x2 | u16, u8 | test_v32 | x0, x1 | - From: u8x2 | - /// A 32-bit vector with 2 `u16` lanes. - ); --impl_m!([m16; 2]: m16x2 | i16 | test_v32 | x0, x1 | -+impl_m!([m16; 2]: m16x2 | i16, u8 | test_v32 | x0, x1 | - From: m8x2, m32x2, m64x2, m128x2 | - /// A 32-bit vector mask with 2 `m16` lanes. - ); -diff --git a/third_party/rust/packed_simd/src/v512.rs b/third_party/rust/packed_simd/src/v512.rs -index b1714aded3..4c8c71338a 100644 ---- a/third_party/rust/packed_simd/src/v512.rs -+++ b/third_party/rust/packed_simd/src/v512.rs -@@ -1,9 +1,9 @@ - //! 512-bit wide vector types --#![rustfmt::skip] -+#[rustfmt::skip] - - use crate::*; - --impl_i!([i8; 64]: i8x64, m8x64 | i8 | test_v512 | -+impl_i!([i8; 64]: i8x64, m8x64 | i8, u64 | test_v512 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, - x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, - x32, x33, x34, x35, x36, x37, x38, x39, x40, x41, x42, x43, x44, x45, x46, x47, -@@ -11,7 +11,7 @@ impl_i!([i8; 64]: i8x64, m8x64 | i8 | test_v512 | - From: | - /// A 512-bit vector with 64 `i8` lanes. - ); --impl_u!([u8; 64]: u8x64, m8x64 | u8 | test_v512 | -+impl_u!([u8; 64]: u8x64, m8x64 | u8, u64 | test_v512 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, - x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, - x32, x33, x34, x35, x36, x37, x38, x39, x40, x41, x42, x43, x44, x45, x46, x47, -@@ -19,7 +19,7 @@ impl_u!([u8; 64]: u8x64, m8x64 | u8 | test_v512 | - From: | - /// A 512-bit vector with 64 `u8` lanes. - ); --impl_m!([m8; 64]: m8x64 | i8 | test_v512 | -+impl_m!([m8; 64]: m8x64 | i8, u64 | test_v512 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, - x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, - x32, x33, x34, x35, x36, x37, x38, x39, x40, x41, x42, x43, x44, x45, x46, x47, -@@ -28,31 +28,31 @@ impl_m!([m8; 64]: m8x64 | i8 | test_v512 | - /// A 512-bit vector mask with 64 `m8` lanes. - ); - --impl_i!([i16; 32]: i16x32, m16x32 | i16 | test_v512 | -+impl_i!([i16; 32]: i16x32, m16x32 | i16, u32 | test_v512 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, - x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31 | - From: i8x32, u8x32 | - /// A 512-bit vector with 32 `i16` lanes. - ); --impl_u!([u16; 32]: u16x32, m16x32 | u16 | test_v512 | -+impl_u!([u16; 32]: u16x32, m16x32 | u16, u32 | test_v512 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, - x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31 | - From: u8x32 | - /// A 512-bit vector with 32 `u16` lanes. - ); --impl_m!([m16; 32]: m16x32 | i16 | test_v512 | -+impl_m!([m16; 32]: m16x32 | i16, u32 | test_v512 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, - x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31 | - From: m8x32 | - /// A 512-bit vector mask with 32 `m16` lanes. - ); - --impl_i!([i32; 16]: i32x16, m32x16 | i32 | test_v512 | -+impl_i!([i32; 16]: i32x16, m32x16 | i32, u16 | test_v512 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 | - From: i8x16, u8x16, i16x16, u16x16 | - /// A 512-bit vector with 16 `i32` lanes. - ); --impl_u!([u32; 16]: u32x16, m32x16 | u32 | test_v512 | -+impl_u!([u32; 16]: u32x16, m32x16 | u32, u16 | test_v512 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 | - From: u8x16, u16x16 | - /// A 512-bit vector with 16 `u32` lanes. -@@ -62,17 +62,17 @@ impl_f!([f32; 16]: f32x16, m32x16 | f32 | test_v512 | - From: i8x16, u8x16, i16x16, u16x16 | - /// A 512-bit vector with 16 `f32` lanes. - ); --impl_m!([m32; 16]: m32x16 | i32 | test_v512 | -+impl_m!([m32; 16]: m32x16 | i32, u16 | test_v512 | - x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15 | - From: m8x16, m16x16 | - /// A 512-bit vector mask with 16 `m32` lanes. - ); - --impl_i!([i64; 8]: i64x8, m64x8 | i64 | test_v512 | x0, x1, x2, x3, x4, x5, x6, x7 | -+impl_i!([i64; 8]: i64x8, m64x8 | i64, u8 | test_v512 | x0, x1, x2, x3, x4, x5, x6, x7 | - From: i8x8, u8x8, i16x8, u16x8, i32x8, u32x8 | - /// A 512-bit vector with 8 `i64` lanes. - ); --impl_u!([u64; 8]: u64x8, m64x8 | u64 | test_v512 | x0, x1, x2, x3, x4, x5, x6, x7 | -+impl_u!([u64; 8]: u64x8, m64x8 | u64, u8 | test_v512 | x0, x1, x2, x3, x4, x5, x6, x7 | - From: u8x8, u16x8, u32x8 | - /// A 512-bit vector with 8 `u64` lanes. - ); -@@ -80,20 +80,20 @@ impl_f!([f64; 8]: f64x8, m64x8 | f64 | test_v512 | x0, x1, x2, x3, x4, x5, x6, x - From: i8x8, u8x8, i16x8, u16x8, i32x8, u32x8, f32x8 | - /// A 512-bit vector with 8 `f64` lanes. - ); --impl_m!([m64; 8]: m64x8 | i64 | test_v512 | x0, x1, x2, x3, x4, x5, x6, x7 | -+impl_m!([m64; 8]: m64x8 | i64, u8 | test_v512 | x0, x1, x2, x3, x4, x5, x6, x7 | - From: m8x8, m16x8, m32x8 | - /// A 512-bit vector mask with 8 `m64` lanes. - ); - --impl_i!([i128; 4]: i128x4, m128x4 | i128 | test_v512 | x0, x1, x2, x3 | -+impl_i!([i128; 4]: i128x4, m128x4 | i128, u8 | test_v512 | x0, x1, x2, x3 | - From: i8x4, u8x4, i16x4, u16x4, i32x4, u32x4, i64x4, u64x4 | - /// A 512-bit vector with 4 `i128` lanes. - ); --impl_u!([u128; 4]: u128x4, m128x4 | u128 | test_v512 | x0, x1, x2, x3 | -+impl_u!([u128; 4]: u128x4, m128x4 | u128, u8 | test_v512 | x0, x1, x2, x3 | - From: u8x4, u16x4, u32x4, u64x4 | - /// A 512-bit vector with 4 `u128` lanes. - ); --impl_m!([m128; 4]: m128x4 | i128 | test_v512 | x0, x1, x2, x3 | -+impl_m!([m128; 4]: m128x4 | i128, u8 | test_v512 | x0, x1, x2, x3 | - From: m8x4, m16x4, m32x4, m64x4 | - /// A 512-bit vector mask with 4 `m128` lanes. - ); -diff --git a/third_party/rust/packed_simd/src/v64.rs b/third_party/rust/packed_simd/src/v64.rs -index 1ee6219c04..bf6b9de610 100644 ---- a/third_party/rust/packed_simd/src/v64.rs -+++ b/third_party/rust/packed_simd/src/v64.rs -@@ -1,43 +1,43 @@ - //! 64-bit wide vector types --#![rustfmt::skip] -+#[rustfmt::skip] - - use super::*; - --impl_i!([i8; 8]: i8x8, m8x8 | i8 | test_v64 | x0, x1, x2, x3, x4, x5, x6, x7 | -+impl_i!([i8; 8]: i8x8, m8x8 | i8, u8 | test_v64 | x0, x1, x2, x3, x4, x5, x6, x7 | - From: | - /// A 64-bit vector with 8 `i8` lanes. - ); --impl_u!([u8; 8]: u8x8, m8x8 | u8 | test_v64 | x0, x1, x2, x3, x4, x5, x6, x7 | -+impl_u!([u8; 8]: u8x8, m8x8 | u8, u8 | test_v64 | x0, x1, x2, x3, x4, x5, x6, x7 | - From: | - /// A 64-bit vector with 8 `u8` lanes. - ); --impl_m!([m8; 8]: m8x8 | i8 | test_v64 | x0, x1, x2, x3, x4, x5, x6, x7 | -+impl_m!([m8; 8]: m8x8 | i8, u8 | test_v64 | x0, x1, x2, x3, x4, x5, x6, x7 | - From: m16x8, m32x8 | - /// A 64-bit vector mask with 8 `m8` lanes. - ); - --impl_i!([i16; 4]: i16x4, m16x4 | i16 | test_v64 | x0, x1, x2, x3 | -+impl_i!([i16; 4]: i16x4, m16x4 | i16, u8 | test_v64 | x0, x1, x2, x3 | - From: i8x4, u8x4 | - /// A 64-bit vector with 4 `i16` lanes. - ); --impl_u!([u16; 4]: u16x4, m16x4 | u16 | test_v64 | x0, x1, x2, x3 | -+impl_u!([u16; 4]: u16x4, m16x4 | u16, u8 | test_v64 | x0, x1, x2, x3 | - From: u8x4 | - /// A 64-bit vector with 4 `u16` lanes. - ); --impl_m!([m16; 4]: m16x4 | i16 | test_v64 | x0, x1, x2, x3 | -+impl_m!([m16; 4]: m16x4 | i16, u8 | test_v64 | x0, x1, x2, x3 | - From: m8x4, m32x4, m64x4 | - /// A 64-bit vector mask with 4 `m16` lanes. - ); - --impl_i!([i32; 2]: i32x2, m32x2 | i32 | test_v64 | x0, x1 | -+impl_i!([i32; 2]: i32x2, m32x2 | i32, u8 | test_v64 | x0, x1 | - From: i8x2, u8x2, i16x2, u16x2 | - /// A 64-bit vector with 2 `i32` lanes. - ); --impl_u!([u32; 2]: u32x2, m32x2 | u32 | test_v64 | x0, x1 | -+impl_u!([u32; 2]: u32x2, m32x2 | u32, u8 | test_v64 | x0, x1 | - From: u8x2, u16x2 | - /// A 64-bit vector with 2 `u32` lanes. - ); --impl_m!([m32; 2]: m32x2 | i32 | test_v64 | x0, x1 | -+impl_m!([m32; 2]: m32x2 | i32, u8 | test_v64 | x0, x1 | - From: m8x2, m16x2, m64x2, m128x2 | - /// A 64-bit vector mask with 2 `m32` lanes. - ); -@@ -47,15 +47,15 @@ impl_f!([f32; 2]: f32x2, m32x2 | f32 | test_v64 | x0, x1 | - ); - - /* --impl_i!([i64; 1]: i64x1, m64x1 | i64 | test_v64 | x0 | -+impl_i!([i64; 1]: i64x1, m64x1 | i64, u8 | test_v64 | x0 | - From: /*i8x1, u8x1, i16x1, u16x1, i32x1, u32x1*/ | // FIXME: primitive to vector conversion - /// A 64-bit vector with 1 `i64` lanes. - ); --impl_u!([u64; 1]: u64x1, m64x1 | u64 | test_v64 | x0 | -+impl_u!([u64; 1]: u64x1, m64x1 | u64, u8 | test_v64 | x0 | - From: /*u8x1, u16x1, u32x1*/ | // FIXME: primitive to vector conversion - /// A 64-bit vector with 1 `u64` lanes. - ); --impl_m!([m64; 1]: m64x1 | i64 | test_v64 | x0 | -+impl_m!([m64; 1]: m64x1 | i64, u8 | test_v64 | x0 | - From: /*m8x1, m16x1, m32x1, */ m128x1 | // FIXME: unary small vector types - /// A 64-bit vector mask with 1 `m64` lanes. - ); -diff --git a/third_party/rust/packed_simd/src/vPtr.rs b/third_party/rust/packed_simd/src/vPtr.rs -index fe9fb28ffa..e34cb170eb 100644 ---- a/third_party/rust/packed_simd/src/vPtr.rs -+++ b/third_party/rust/packed_simd/src/vPtr.rs -@@ -1,5 +1,5 @@ - //! Vectors of pointers --#![rustfmt::skip] -+#[rustfmt::skip] - - use crate::*; - -diff --git a/third_party/rust/packed_simd/src/vSize.rs b/third_party/rust/packed_simd/src/vSize.rs -index 5594323372..b5d8910061 100644 ---- a/third_party/rust/packed_simd/src/vSize.rs -+++ b/third_party/rust/packed_simd/src/vSize.rs -@@ -3,50 +3,50 @@ - use crate::codegen::pointer_sized_int::{isize_, usize_}; - use crate::*; - --impl_i!([isize; 2]: isizex2, msizex2 | isize_ | test_v128 | -+impl_i!([isize; 2]: isizex2, msizex2 | isize_, u8 | test_v128 | - x0, x1| - From: | - /// A vector with 2 `isize` lanes. - ); - --impl_u!([usize; 2]: usizex2, msizex2 | usize_ | test_v128 | -+impl_u!([usize; 2]: usizex2, msizex2 | usize_, u8 | test_v128 | - x0, x1| - From: | - /// A vector with 2 `usize` lanes. - ); --impl_m!([msize; 2]: msizex2 | isize_ | test_v128 | -+impl_m!([msize; 2]: msizex2 | isize_, u8 | test_v128 | - x0, x1 | - From: | - /// A vector mask with 2 `msize` lanes. - ); - --impl_i!([isize; 4]: isizex4, msizex4 | isize_ | test_v256 | -+impl_i!([isize; 4]: isizex4, msizex4 | isize_, u8 | test_v256 | - x0, x1, x2, x3 | - From: | - /// A vector with 4 `isize` lanes. - ); --impl_u!([usize; 4]: usizex4, msizex4 | usize_ | test_v256 | -+impl_u!([usize; 4]: usizex4, msizex4 | usize_, u8 | test_v256 | - x0, x1, x2, x3| - From: | - /// A vector with 4 `usize` lanes. - ); --impl_m!([msize; 4]: msizex4 | isize_ | test_v256 | -+impl_m!([msize; 4]: msizex4 | isize_, u8 | test_v256 | - x0, x1, x2, x3 | - From: | - /// A vector mask with 4 `msize` lanes. - ); - --impl_i!([isize; 8]: isizex8, msizex8 | isize_ | test_v512 | -+impl_i!([isize; 8]: isizex8, msizex8 | isize_, u8 | test_v512 | - x0, x1, x2, x3, x4, x5, x6, x7 | - From: | -- /// A vector with 4 `isize` lanes. -+ /// A vector with 8 `isize` lanes. - ); --impl_u!([usize; 8]: usizex8, msizex8 | usize_ | test_v512 | -+impl_u!([usize; 8]: usizex8, msizex8 | usize_, u8 | test_v512 | - x0, x1, x2, x3, x4, x5, x6, x7 | - From: | - /// A vector with 8 `usize` lanes. - ); --impl_m!([msize; 8]: msizex8 | isize_ | test_v512 | -+impl_m!([msize; 8]: msizex8 | isize_, u8 | test_v512 | - x0, x1, x2, x3, x4, x5, x6, x7 | - From: | - /// A vector mask with 8 `msize` lanes. -diff --git a/third_party/rust/packed_simd/tests/endianness.rs b/third_party/rust/packed_simd/tests/endianness.rs -index 1e6b4f3543..31fb7073af 100644 ---- a/third_party/rust/packed_simd/tests/endianness.rs -+++ b/third_party/rust/packed_simd/tests/endianness.rs -@@ -17,7 +17,7 @@ fn endian_indexing() { - #[cfg_attr(not(target_arch = "wasm32"), test)] - #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] - fn endian_bitcasts() { -- #[cfg_attr(rustfmt, rustfmt_skip)] -+ #[rustfmt::skip] - let x = i8x16::new( - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, -@@ -34,13 +34,13 @@ fn endian_bitcasts() { - #[cfg_attr(not(target_arch = "wasm32"), test)] - #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] - fn endian_casts() { -- #[cfg_attr(rustfmt, rustfmt_skip)] -+ #[rustfmt::skip] - let x = i8x16::new( - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, - ); - let t: i16x16 = x.into(); // simd_cast -- #[cfg_attr(rustfmt, rustfmt_skip)] -+ #[rustfmt::skip] - let e = i16x16::new( - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, -@@ -51,7 +51,7 @@ fn endian_casts() { - #[cfg_attr(not(target_arch = "wasm32"), test)] - #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] - fn endian_load_and_stores() { -- #[cfg_attr(rustfmt, rustfmt_skip)] -+ #[rustfmt::skip] - let x = i8x16::new( - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, -@@ -82,10 +82,15 @@ fn endian_array_union() { - vec: f32x4, - } - let x: [f32; 4] = unsafe { A { vec: f32x4::new(0., 1., 2., 3.) }.data }; -- assert_eq!(x[0], 0_f32); -- assert_eq!(x[1], 1_f32); -- assert_eq!(x[2], 2_f32); -- assert_eq!(x[3], 3_f32); -+ // As all of these are integer values within the mantissa^1 range, it -+ // would be very unusual for them to actually fail to compare. -+ #[allow(clippy::float_cmp)] -+ { -+ assert_eq!(x[0], 0_f32); -+ assert_eq!(x[1], 1_f32); -+ assert_eq!(x[2], 2_f32); -+ assert_eq!(x[3], 3_f32); -+ } - let y: f32x4 = unsafe { A { data: [3., 2., 1., 0.] }.vec }; - assert_eq!(y, f32x4::new(3., 2., 1., 0.)); - -@@ -93,23 +98,23 @@ fn endian_array_union() { - data: [i8; 16], - vec: i8x16, - } -- #[cfg_attr(rustfmt, rustfmt_skip)] -+ #[rustfmt::skip] - let x = i8x16::new( - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, - ); - let x: [i8; 16] = unsafe { B { vec: x }.data }; - -- for i in 0..16 { -- assert_eq!(x[i], i as i8); -+ for (i, v) in x.iter().enumerate() { -+ assert_eq!(i as i8, *v); - } - -- #[cfg_attr(rustfmt, rustfmt_skip)] -+ #[rustfmt::skip] - let y = [ - 15, 14, 13, 12, 11, 19, 9, 8, - 7, 6, 5, 4, 3, 2, 1, 0 - ]; -- #[cfg_attr(rustfmt, rustfmt_skip)] -+ #[rustfmt::skip] - let e = i8x16::new( - 15, 14, 13, 12, 11, 19, 9, 8, - 7, 6, 5, 4, 3, 2, 1, 0 -@@ -121,7 +126,7 @@ fn endian_array_union() { - data: [i16; 8], - vec: i8x16, - } -- #[cfg_attr(rustfmt, rustfmt_skip)] -+ #[rustfmt::skip] - let x = i8x16::new( - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, -@@ -145,21 +150,26 @@ fn endian_tuple_access() { - vec: f32x4, - } - let x: F32x4T = unsafe { A { vec: f32x4::new(0., 1., 2., 3.) }.data }; -- assert_eq!(x.0, 0_f32); -- assert_eq!(x.1, 1_f32); -- assert_eq!(x.2, 2_f32); -- assert_eq!(x.3, 3_f32); -+ // As all of these are integer values within the mantissa^1 range, it -+ // would be very unusual for them to actually fail to compare. -+ #[allow(clippy::float_cmp)] -+ { -+ assert_eq!(x.0, 0_f32); -+ assert_eq!(x.1, 1_f32); -+ assert_eq!(x.2, 2_f32); -+ assert_eq!(x.3, 3_f32); -+ } - let y: f32x4 = unsafe { A { data: (3., 2., 1., 0.) }.vec }; - assert_eq!(y, f32x4::new(3., 2., 1., 0.)); - -- #[cfg_attr(rustfmt, rustfmt_skip)] -+ #[rustfmt::skip] - type I8x16T = (i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8); - union B { - data: I8x16T, - vec: i8x16, - } - -- #[cfg_attr(rustfmt, rustfmt_skip)] -+ #[rustfmt::skip] - let x = i8x16::new( - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, -@@ -183,27 +193,27 @@ fn endian_tuple_access() { - assert_eq!(x.14, 14); - assert_eq!(x.15, 15); - -- #[cfg_attr(rustfmt, rustfmt_skip)] -+ #[rustfmt::skip] - let y = ( - 15, 14, 13, 12, 11, 10, 9, 8, - 7, 6, 5, 4, 3, 2, 1, 0 - ); - let z: i8x16 = unsafe { B { data: y }.vec }; -- #[cfg_attr(rustfmt, rustfmt_skip)] -+ #[rustfmt::skip] - let e = i8x16::new( - 15, 14, 13, 12, 11, 10, 9, 8, - 7, 6, 5, 4, 3, 2, 1, 0 - ); - assert_eq!(e, z); - -- #[cfg_attr(rustfmt, rustfmt_skip)] -+ #[rustfmt::skip] - type I16x8T = (i16, i16, i16, i16, i16, i16, i16, i16); - union C { - data: I16x8T, - vec: i8x16, - } - -- #[cfg_attr(rustfmt, rustfmt_skip)] -+ #[rustfmt::skip] - let x = i8x16::new( - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, -@@ -224,7 +234,7 @@ fn endian_tuple_access() { - assert_eq!(x.6, e[6]); - assert_eq!(x.7, e[7]); - -- #[cfg_attr(rustfmt, rustfmt_skip)] -+ #[rustfmt::skip] - #[repr(C)] - #[derive(Copy ,Clone)] - pub struct Tup(pub i8, pub i8, pub i16, pub i8, pub i8, pub i16, -@@ -235,7 +245,7 @@ fn endian_tuple_access() { - vec: i8x16, - } - -- #[cfg_attr(rustfmt, rustfmt_skip)] -+ #[rustfmt::skip] - let x = i8x16::new( - 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, --- -2.30.1 - diff --git a/thunderbird/Pkgfile b/thunderbird/Pkgfile index a30aa00cb..95fd8fb3f 100644 --- a/thunderbird/Pkgfile +++ b/thunderbird/Pkgfile @@ -1,25 +1,18 @@ # Description: Email client from the Mozilla project # URL: https://www.thunderbird.net/en-US/ # Maintainer: Danny Rawlins, crux at romster dot me -# Depends on: alsa-lib autoconf-2.13 cbindgen clang dbus-glib gnupg gtk libwebp libevent libidl libnotify libvpx lld nodejs nss startup-notification unzip zip wasi-libc++ +# Depends on: alsa-lib autoconf-2.13 cbindgen clang dbus-glib gnupg gtk libevent libidl libnotify libvpx libwebp lld nodejs nss startup-notification unzip wasi-libc++ zip # Optional: sccache name=thunderbird -version=102.2.2 +version=102.4.1 release=1 source=(https://archive.mozilla.org/pub/thunderbird/releases/$version/source/$name-$... - $name.desktop - cbindgen-0.24.patch - rustc_version-0.4.0.patch - packed_simd_2-0.3.8.patch) - + $name.desktop) + build() { cd $name-$version - patch -p1 -i $SRC/cbindgen-0.24.patch - patch -p1 -i $SRC/rustc_version-0.4.0.patch - patch -p1 -i $SRC/packed_simd_2-0.3.8.patch - if [ -e '/usr/bin/ccache' ]; then export OS_CCACHE_COMPILERCHECK="$(/usr/bin/clang -dumpversion | sed -z 's/\n/ /g'; crux | cut -d' ' -f3)" export CCACHE_COMPILERCHECK="string:$OS_CCACHE_COMPILERCHECK" @@ -30,6 +23,8 @@ build() { mkdir "$PKGMK_SOURCE_DIR/rust" || true export CARGO_HOME="$PKGMK_SOURCE_DIR/rust" + sed -i '/ROOT_CLIP_CHAIN/d' gfx/webrender_bindings/webrender_ffi.h + cat <<- EOF > .mozconfig ac_add_options --prefix=/usr ac_add_options --enable-application=comm/mail @@ -41,7 +36,6 @@ cat <<- EOF > .mozconfig ac_add_options --with-system-libevent ac_add_options --with-system-libvpx ac_add_options --with-system-webp - ac_add_options --with-wasi-sysroot=/usr/share/wasi-sysroot ac_add_options --enable-av1 ac_add_options --enable-system-ffi ac_add_options --enable-system-pixman @@ -58,14 +52,14 @@ cat <<- EOF > .mozconfig ac_add_options --disable-updater ac_add_options --disable-crashreporter ac_add_options --disable-necko-wifi - ac_add_options --disable-pulseaudio ac_add_options --disable-elf-hack + ac_add_options --without-wasm-sandboxed-libraries EOF # audio - prt-get isinst alsa-lib && echo 'ac_add_options --enable-alsa' >> .mozconfig || echo 'ac_add_options --disable-alsa' >> .mozconfig - prt-get isinst jack && echo 'ac_add_options --enable-jack' >> .mozconfig || echo 'ac_add_options --disable-jack' >> .mozconfig - prt-get isinst pulseaudio && echo 'ac_add_options --enable-pulseaudio' >> .mozconfig || echo 'ac_add_options --disable-pulseaudio' >> .mozconfig + prt-get isinst alsa-lib && echo 'ac_add_options --enable-audio-backends=alsa' >> .mozconfig + prt-get isinst pulseaudio && sed -i '/audio-backends/s/alsa/&,pulseaudio/' .mozconfig + #prt-get isinst jack && echo 'ac_add_options --enable-jack' >> .mozconfig || echo 'ac_add_options --disable-jack' >> .mozconfig prt-get isinst wayland-protocols && \ echo 'ac_add_options --enable-default-toolkit=cairo-gtk3-wayland' >> .mozconfig || \ diff --git a/thunderbird/cbindgen-0.24.patch b/thunderbird/cbindgen-0.24.patch deleted file mode 100644 index 3011e8ada..000000000 --- a/thunderbird/cbindgen-0.24.patch +++ /dev/null @@ -1,17 +0,0 @@ -Description: Remove an extra constant definition that is now being generated by newer versions of cbindgen (0.24), and causing build failures because it is defined in several places. -Author: Olivier Tilloy <olivier.tilloy@canonical.com> -Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1773259 -Forwarded: not-needed - ---- a/gfx/webrender_bindings/webrender_ffi.h -+++ b/gfx/webrender_bindings/webrender_ffi.h -@@ -73,8 +73,6 @@ struct WrPipelineInfo; - struct WrPipelineIdAndEpoch; - using WrPipelineIdEpochs = nsTArray<WrPipelineIdAndEpoch>; - --const uint64_t ROOT_CLIP_CHAIN = ~0; -- - } // namespace wr - } // namespace mozilla - - diff --git a/thunderbird/packed_simd_2-0.3.8.patch b/thunderbird/packed_simd_2-0.3.8.patch deleted file mode 100644 index f3c4fca6a..000000000 --- a/thunderbird/packed_simd_2-0.3.8.patch +++ /dev/null @@ -1,925 +0,0 @@ - -# HG changeset patch -# User Mike Hommey <mh+mozilla@glandium.org> -# Date 1660200949 0 -# Node ID fac963c3bc003f12171fbb706fbd0ef676aeaa52 -# Parent d6c758891f5d505f3dcb09cc559b9aa4d3199597 -Bug 1783784 - Update packed_simd_2 to 0.3.8. r=hsivonen,supply-chain-reviewers - -Differential Revision: https://phabricator.services.mozilla.com/D154063 - -diff --git a/.cargo/config.in b/.cargo/config.in ---- a/.cargo/config.in -+++ b/.cargo/config.in -@@ -70,17 +70,17 @@ rev = "499b95580c8b276e52bd9757d73524950 - [source."https://github.com/jfkthame/mapped_hyph.git"] - git = "https://github.com/jfkthame/mapped_hyph.git" - replace-with = "vendored-sources" - rev = "746743227485a83123784df0c53227ab466612ed" - - [source."https://github.com/hsivonen/packed_simd"] - git = "https://github.com/hsivonen/packed_simd" - replace-with = "vendored-sources" --rev = "c149d0a519bf878567c7630096737669ec2ff15f" -+rev = "90eebb82a107cbec1c8e406d9223819417e96de1" - - [source."https://github.com/hsivonen/chardetng_c"] - git = "https://github.com/hsivonen/chardetng_c" - replace-with = "vendored-sources" - rev = "ed8a4c6f900a90d4dbc1d64b856e61490a1c3570" - - [source."https://github.com/hsivonen/chardetng"] - git = "https://github.com/hsivonen/chardetng" -diff --git a/Cargo.lock b/Cargo.lock ---- a/Cargo.lock -+++ b/Cargo.lock -@@ -3904,20 +3904,21 @@ version = "0.4.1" - source = "registry+https://github.com/rust-lang/crates.io-index" - checksum = "6ff55baddef9e4ad00f88b6c743a2a8062d4c6ade126c2a528644b8e444d52ce" - dependencies = [ - "stable_deref_trait", - ] - - [[package]] - name = "packed_simd_2" --version = "0.3.7" --source = "git+https://github.com/hsivonen/packed_simd?rev=c149d0a519bf878567c7630096737669..." -+version = "0.3.8" -+source = "git+https://github.com/hsivonen/packed_simd?rev=90eebb82a107cbec1c8e406d92238194..." - dependencies = [ - "cfg-if 1.0.0", -+ "rustc_version", - ] - - [[package]] - name = "parking_lot" - version = "0.11.1" - source = "registry+https://github.com/rust-lang/crates.io-index" - checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb" - dependencies = [ -diff --git a/Cargo.toml b/Cargo.toml ---- a/Cargo.toml -+++ b/Cargo.toml -@@ -140,16 +140,16 @@ moz_asserts = { path = "mozglue/static/r - - # Other overrides - async-task = { git = "https://github.com/smol-rs/async-task", rev="f6488e35beccb26eb6e85847b02aa78a42cd3d0e" } - chardetng = { git = "https://github.com/hsivonen/chardetng", rev="3484d3e3ebdc8931493aa5df4d7ee9360a90e76b" } - chardetng_c = { git = "https://github.com/hsivonen/chardetng_c", rev="ed8a4c6f900a90d4dbc1d64b856e61490a1c3570" } - coremidi = { git = "https://github.com/chris-zen/coremidi.git", rev="fc68464b5445caf111e41f643a2e69ccce0b4f83" } - fog = { path = "toolkit/components/glean/api" } - libudev-sys = { path = "dom/webauthn/libudev-sys" } --packed_simd = { package = "packed_simd_2", git = "https://github.com/hsivonen/packed_simd", rev="c149d0a519bf878567c7630096737669ec2ff15f" } -+packed_simd = { package = "packed_simd_2", git = "https://github.com/hsivonen/packed_simd", rev="90eebb82a107cbec1c8e406d9223819417e96de1" } - midir = { git = "https://github.com/mozilla/midir.git", rev = "4c11f0ffb5d6a10de4aff40a7b81218b33b94e6f" } - minidump_writer_linux = { git = "https://github.com/rust-minidump/minidump-writer.git", rev = "75ada456c92a429704691a85e1cb42fef8cafc0d" } - - # Patch mio 0.6 to use winapi 0.3 and miow 0.3, getting rid of winapi 0.2. - # There is not going to be new version of mio 0.6, mio now being >= 0.7.11. - [patch.crates-io.mio] - path = "third_party/rust/mio-0.6.23" -diff --git a/third_party/rust/packed_simd_2/.cargo-checksum.json b/third_party/rust/packed_simd_2/.cargo-checksum.json ---- a/third_party/rust/packed_simd_2/.cargo-checksum.json -+++ b/third_party/rust/packed_simd_2/.cargo-checksum.json -@@ -1,1 +1,1 @@ --{"files":{".appveyor.yml":"f1ed01850e0d725f9498f52a1a63ddf40702ad6e0bf5b2d7c4c04d76e96794a3",".travis.yml":"30a61a5ec53355fc1f3585e1690280308c2b7961701abc11e8389b235b647178","Cargo.toml":"f85e54e13a05f6e4f27c230ab81430af27b6ff80a1c036bd70c42ea115f89487","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"882f8894b333becf490d23c9024a86fd1327c8edea33aa8dbb98dc2f2ddb3956","bors.toml":"dee881dc69b9b7834e4eba5d95c3ed5a416d4628815a167d6a22d4cb4fb064b8","build.rs":"019ed29c43989782d8eec3a961654cfc172d7a7898da4eca8f654700af7e1988","ci/all.sh":"2ae6b2445b4db83833e40b37efd0016c6b9879ee988b9b3ef94db5439a3e1606","ci/android-install-ndk.sh":"0f1746108cc30bf9b9ba45bcde7b19fc1a8bdf5b0258035b4eb8dc69b75efac4","ci/android-install-sdk.sh":"3490432022c5c8f5a115c084f7a9aca1626f96c0c87ffb62019228c4346b47e4","ci/android-sysimage.sh":"ebf4e5daa1f0fe1b2092b79f0f3f161c4c4275cb744e52352c4d81ab451e4c5a","ci/benchmark.sh":"b61d19ef6b90deba8fb79dee74c8b062d94844676293da346da87bb78a9a49a4","ci/deploy_and_run_on_ios_simulator.rs":"ec8ecf82d92072676aa47f0d1a3d021b60a7ae3531153ef12d2ff4541fc294dc","ci/docker/aarch64-linux-android/Dockerfile":"ace2e7d33c87bc0f6d3962a4a3408c04557646f7f51ab99cfbf574906796b016","ci/docker/aarch64-unknown-linux-gnu/Dockerfile":"da88c0d50f16dc08448c7fdf1fa5ed2cbe576acf9e7dd85b5b818621b2a8c702","ci/docker/arm-linux-androideabi/Dockerfile":"370e55d3330a413a3ccf677b3afb3e0ef9018a5fab263faa97ae8ac017fc2286","ci/docker/arm-unknown-linux-gnueabi/Dockerfile":"bb5f8ae890707c128652290ffc544447643bf12037ddd73c6ad6989f848cb380","ci/docker/arm-unknown-linux-gnueabihf/Dockerfile":"1afaefcbc05b740859acd4e067bc92439be6bcbe8f2e9678474fb434bcd398d9","ci/docker/armv7-unknown-linux-gnueabihf/Dockerfile":"8282ea707a94109beed47a57574755e2d58401735904a03f85fb64c578c53b4f","ci/docker/i586-unknown-linux-gnu/Dockerfile":"49792922269f371bd29da4727e9085101b27be67a6b97755d0196c63317f7abb","ci/docker/i686-unknown-linux-gnu/Dockerfile":"49792922269f371bd29da4727e9085101b27be67a6b97755d0196c63317f7abb","ci/docker/mips-unknown-linux-gnu/Dockerfile":"b2ebc25797612c4f8395fe9d407725156044955bfbcf442036b7f55b43a5f9da","ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile":"b0c1692ac65bc56dd30494b1993d8e929c48cc9c4b92029b7c7592af6d4f9220","ci/docker/mips64el-unknown-linux-gnuabi64/Dockerfile":"4e9249c179300138141d0b2b7401b11897f64aed69f541f078c1db4594df2827","ci/docker/mipsel-unknown-linux-musl/Dockerfile":"3164c52b0dcbb01afa78292b15b5c43503ccf0491cf6eb801ec2bf22ae274e52","ci/docker/powerpc-unknown-linux-gnu/Dockerfile":"786f799d0b56eb54d7b6c4b00e1aed4ce81776e14e44767e083c89d014b72004","ci/docker/powerpc64-unknown-linux-gnu/Dockerfile":"e8bc363837cd9c2d8b22402acb8c1c329efc11ba5d12170603d2fe2eae9da059","ci/docker/powerpc64le-unknown-linux-gnu/Dockerfile":"47998d45b781d797b9e6085ebe898d90de0c952b54537a8db4e8d7503eb032d9","ci/docker/s390x-unknown-linux-gnu/Dockerfile":"93fb44df3d7fd31ead158570667c97b5076a05c3d968af4a84bc13819a8f2db8","ci/docker/sparc64-unknown-linux-gnu/Dockerfile":"da1c39a3ff1fe22e41395fa7c8934e90b4c1788e551b9aec6e38bfd94effc437","ci/docker/thumbv7neon-linux-androideabi/Dockerfile":"c2decd5591bd7a09378901bef629cd944acf052eb55e4f35b79eb9cb4d62246a","ci/docker/thumbv7neon-unknown-linux-gnueabihf/Dockerfile":"51955a8bf3c4d440f47382af6f5426ebff94ab01a04da36175babda9a057740f","ci/docker/wasm32-unknown-unknown/Dockerfile":"5a022299f56730cf8c432a07391e95e199cfa36dc8da2a96c9d185c8de93e913","ci/docker/x86_64-linux-android/Dockerfile":"685040273cf350d5509e580ac451555efa19790c8723ca2af066adadc6880ad2","ci/docker/x86_64-unknown-linux-gnu-emulated/Dockerfile":"44b6203d9290bfdc53d81219f0937e1110847a23dd982ec8c4de388354f01536","ci/docker/x86_64-unknown-linux-gnu/Dockerfile":"7f4e3ca5fa288ea70edb4d1f75309708cd30b192e2e4444e61c4d5b3b58f89cf","ci/dox.sh":"434e9611c52e389312d2b03564adf09429f10cc76fe66a8644adb104903b87b7","ci/linux-s390x.sh":"d6b732d7795b4ba131326aff893bca6228a7d2eb0e9402f135705413dbbe0dce","ci/linux-sparc64.sh":"c92966838b1ab7ad3b7a344833ee726aba6b647cf5952e56f0ad1ba420b13325","ci/lld-shim.rs":"3d7f71ec23a49e2b67f694a0168786f9a954dda15f5a138815d966643fd3fcc3","ci/max_line_width.sh":"0a1518bba4c9ecaa55694cb2e9930d0e19c265baabf73143f17f9cf285aaa5bb","ci/run-docker.sh":"92e036390ad9b0d16f109579df1b5ced2e72e9afea40c7d011400ebd3a2a90de","ci/run.sh":"41dd6a60efaaeae9661a01370cce98b631f78392859a0cf68c946c0a16edf5f7","ci/run_examples.sh":"d1a23c6c35374a0678ba5114b9b8fefd8be0a79e774872a8bf0898d1baca18d0","ci/runtest-android.rs":"145a8e9799a5223975061fe7e586ade5669ee4877a7d7a4cf6b4ab48e8e36c7c","ci/setup_benchmarks.sh":"fae3960023f6f3d1388cd2ad22fdbab4b075f1f29dd4292d7994a20783beb6cf","ci/test-runner-linux":"c8aa6025cff5306f4f31d0c61dc5f9d4dd5a1d189ab613ef8d4c367c694d9ccd","contributing.md":"2d2629310ad4d464c482bdbb5819f0d6ce223c576aeef2cdce6a1f6857085ea5","perf-guide/.gitignore":"fe82c7da551079d832cf74200b0b359b4df9828cb4a0416fa7384f07a2ae6a13","perf-guide/book.toml":"115a98284126c6b180178b44713314cc494f08a71662ee2ce15cf67f17a51064","perf-guide/src/SUMMARY.md":"3e03bffc991fdc2050f3d51842d72d9d21ea6abab56a3baf3b2d5973a78b89e1","perf-guide/src/ascii.css":"29afb08833b2fe2250f0412e1fa1161a2432a0820a14953c87124407417c741a","perf-guide/src/bound_checks.md":"5e4991ff58a183ef0cd9fdc1feb4cd12d083b44bdf87393bbb0927808ef3ce7d","perf-guide/src/float-math/approx.md":"8c09032fa2d795a0c5db1775826c850d28eb2627846d0965c60ee72de63735ad","perf-guide/src/float-math/fma.md":"311076ba4b741d604a82e74b83a8d7e8c318fcbd7f64c4392d1cf5af95c60243","perf-guide/src/float-math/fp.md":"04153e775ab6e4f0d7837bcc515230d327b04edfa34c84ce9c9e10ebaeef2be8","perf-guide/src/float-math/svml.md":"0798873b8eedaeda5fed62dc91645b57c20775a02d3cd74d8bd06958f1516506","perf-guide/src/introduction.md":"9f5a19e9e6751f25d2daad39891a0cc600974527ec4c8305843f9618910671bd","perf-guide/src/prof/linux.md":"447731eb5de7d69166728fdbc5ecb0c0c9db678ea493b45a592d67dd002184c0","perf-guide/src/prof/mca.md":"f56d54f3d20e7aa4d32052186e8237b03d65971eb5d112802b442570ff11d344","perf-guide/src/prof/profiling.md":"8a650c0fd6ede0964789bb6577557eeef1d8226a896788602ce61528e260e43c","perf-guide/src/target-feature/attribute.md":"615f88dca0a707b6c416fa605435dd6e1fb5361cc639429cbf68cd87624bd78b","perf-guide/src/target-feature/features.md":"17077760ff24c006b606dd21889c53d87228f4311f3ba3a574f9afdeacd86165","perf-guide/src/target-feature/inlining.md":"7ed1d7068d8173a00d84c16cfe5871cd68b9f04f8d0cca2d01ebc84957ebf2f6","perf-guide/src/target-feature/practice.md":"c4b371842e0086df178488fec97f20def8f0c62ee588bcd25fd948b9b1fa227e","perf-guide/src/target-feature/runtime.md":"835425f5ee597fb3e51d36e725a81ebee29f4561231d19563cd4da81dbb1cfcb","perf-guide/src/target-feature/rustflags.md":"01197acf6f0adec8db32b8591811f69cecb6555a2b05dc5d5ec27d0e3f7b065e","perf-guide/src/vert-hor-ops.md":"c6211c0ee91e60552ec592d89d9d957eedc21dee3cbd89e1ad6765ea06a27471","rustfmt.toml":"d99a43f3f8ef9e425cf01c333fba9f0051f888f5d87ab4e8f63c2f7d0fe6620f","src/api.rs":"f6e92f056565e6fd93f98829a408aee9e790251e0cbd8a8bc30c8662b4d6fabb","src/api/bit_manip.rs":"c47a4d0f7451f7e35d07715e4f39a472e07457fd456fdb726864a4f6887252a3","src/api/bitmask.rs":"6d2beefd62ee5d9c8eb060bee6abc641616bf828c99f82abf97b21bf004e894b","src/api/cast.rs":"03b94a3d316ac7b7be7068810044911e965e889a0ace7bae762749ca74a92747","src/api/cast/macros.rs":"b0a14d0c83ad2ebb7a275180f6d9e3f2bc312ba57a7d3d6c39fad4e0f20f9408","src/api/cast/v128.rs":"edd0994efac4379dff26e178423a52dbb3ffeb38b1fc97cae975d744c00b4fb6","src/api/cast/v16.rs":"96bd98c2d21b0663abe6c0ab33005b1fa693f3db7ee6795351391343863484da","src/api/cast/v256.rs":"8c31fe91f5e78ef737dfba6979cc1240210cb094a89d284fe459bf8a991ca24b","src/api/cast/v32.rs":"a99a79dd84d2a5e6adf9db98705675915bd03fd1287d489c7fe38e84d7e4a086","src/api/cast/v512.rs":"c0dd526f41ed7b8a71c3743d91267554ec0a0c75834ccc2e3ecb0ef3004af642","src/api/cast/v64.rs":"6572fdba2a1241a6cd666d3f0cce3306cd2cb7e5e236172e59d5d4351c8a88af","src/api/cmp.rs":"357c3a2a09c6d4611c32dd7fa95be2fae933d513e229026ec9b44451a77b884e","src/api/cmp/eq.rs":"60f70f355bae4cb5b17db53204cacc3890f70670611c17df638d4c04f7cc8075","src/api/cmp/ord.rs":"589f7234761c294fa5df8f525bc4acd5a47cdb602207d524a0d4e19804cd9695","src/api/cmp/partial_eq.rs":"902ccb8aa01fd5738b30ba0b712669c21d4801958907e03bad23432c7dba0198","src/api/cmp/partial_ord.rs":"9db0c37d7434cdfc62d8d66912e972fa3d8c115ab2af051a6f45e414bd3e4f1c","src/api/cmp/vertical.rs":"de3d62f38eba817299aa16f1e1939954c9a447e316509397465c2830852ba053","src/api/default.rs":"67bf21c134127d12a7028c8b88a57f0ceee8ccbd74976da8ca74eb9f16a174d5","src/api/fmt.rs":"67fb804bb86b6cd77cf8cd492b5733ce437071b66fe3297278b8a6552c325dda","src/api/fmt/binary.rs":"02b2b287f7404f8a983813cf70c87108c8da3835578b63ab303116885f609413","src/api/fmt/debug.rs":"56e1c3bdc092747344fffaafff9da7163ee7827857f6fb7cb1c9923eca4f6fa0","src/api/fmt/lower_hex.rs":"558fd592f7f485712fb051509cecc7174a21e6bf62e5ce64766e75afc97bb8e1","src/api/fmt/octal.rs":"3b2e70877a4f368c7704f8e254236c014c365c74d93371c1feb5f030e6c66422","src/api/fmt/upper_hex.rs":"2a442f666bc80e22d41f903f881238fe114dd49344c3ed69849250e853cafc5d","src/api/from.rs":"2e599d8329cb05eaf06224cc441355c4b7b51254fc19256619333be8c149d444","src/api/from/from_array.rs":"dd3fc64fb17d6184bb60343f8da26a05edf0e5f3c14caf55d49fa15e21d948dc","src/api/from/from_vector.rs":"9764371aa9e6005aace74dea14f59e5611a095b7cf42707940924749282c52f0","src/api/hash.rs":"5076ece87969592c876486f5b1ea8affbeaec379d1a14a30859e0aa5592019de","src/api/into_bits.rs":"1ee15923352786b9ab4a31fa506762297116b18cfdb8e72853abc8ad001651d2","src/api/into_bits/arch_specific.rs":"e7445021f3908326bfee758835e5fc5ad56aa1baa77fc1c58abe4350c66c670a","src/api/into_bits/macros.rs":"bb4fe99be2af6a21d805efab44c8e4e61a7b2adb42a65504a0cf26d13efdadcd","src/api/into_bits/v128.rs":"145a44922b09a5ca5b62d88a461d327d399a997a15db4b11d7b17e554a9fa4c0","src/api/into_bits/v16.rs":"f4f4f61ba88aa51b158ec56ca3dce234349aea0daf2b3029a14ab5125d1e41e5","src/api/into_bits/v256.rs":"8cea9c5d9809f11323cb7cdc53b83df593fd17caf926251e412ae9777bed547f","src/api/into_bits/v32.rs":"905ba683d342fa32f4202b80bb46530807bd0a5b588f6c2e8c9f475223c47775","src/api/into_bits/v512.rs":"e25afa1fbf088a5d58e7d75d197b6cd4c56637ea28542ba18e46a451f29d04e7","src/api/into_bits/v64.rs":"d6238022ccff7b92e55b3f6017fc269acb6f36330a6d7e8fb389853a0f1b6478","src/api/math.rs":"8b2a2fc651917a850539f993aa0b9e5bf4da67b11685285b8de8cdca311719ec","src/api/math/float.rs":"61d2794d68262a1090ae473bd30793b5f65cf732f32a6694a3af2ce5d9225616","src/api/math/float/abs.rs":"5b6b2701e2e11135b7ce58a05052ea8120e10e4702c95d046b9d21b827b26bf8","src/api/math/float/consts.rs":"6302c9261da4291d144d5bb53493cdd073498feb40955fb6860ea3c4d06c978a","src/api/math/float/cos.rs":"4c2dd7173728ef189314f1576c9486e03be21b7da98843b2f9011282a7979e31","src/api/math/float/exp.rs":"7c6d5f1e304f498a01cfa23b92380c815d7da0ad94eae3483783bc377d287eef","src/api/math/float/ln.rs":"54c7583f3df793b39ff57534fade27b41bb992439e5dc178252f5ca3190a3e54","src/api/math/float/mul_add.rs":"62cac77660d20159276d4c9ef066eb90c81cbddb808e8e157182c607625ad2eb","src/api/math/float/mul_adde.rs":"bae056ee9f3a70df39ec3c3b2f6437c65303888a7b843ef1a5bcf1f5aca0e602","src/api/math/float/powf.rs":"9ddb938984b36d39d82a82f862f80df8f7fb013f1d222d45698d41d88472f568","src/api/math/float/recpre.rs":"589225794ff1dbf31158dff660e6d4509ecc8befbb57c633900dea5ac0b840d6","src/api/math/float/rsqrte.rs":"a32abdcc318d7ccc8448231f54d75b884b7cbeb03a7d595713ab6243036f4dbf","src/api/math/float/sin.rs":"cbd3622b7df74f19691743001c8cf747a201f8977ad90542fee915f37dcd1e49","src/api/math/float/sqrt.rs":"0c66d5d63fb08e4d99c6b82a8828e41173aff1ac9fa1a2764a11fac217ccf2ac","src/api/math/float/sqrte.rs":"731e1c9f321b662accdd27dacb3aac2e8043b7aecb2f2161dde733bd9f025362","src/api/minimal.rs":"1f22bcc528555444e76de569ec0ae2029b9ae9d04805efeafa93369c8098036b","src/api/minimal/iuf.rs":"819cff26d3e196f807645bcc1d79eb27d9f175edb89910f2274d52a1e913cd11","src/api/minimal/mask.rs":"0cae10ae1fc65f5070e686c0c79bfba27b86b33d6c399367bd4848fb367dcec4","src/api/minimal/ptr.rs":"f65ebf21866a863485344432d9a7a9b7418f7fad5fdf841a4e2fa56ec0766ad0","src/api/ops.rs":"3e273b277a0f3019d42c3c59ca94a5afd4885d5ae6d2182e5089bbeec9de42ee","src/api/ops/scalar_arithmetic.rs":"d2d5ad897a59dd0787544f927e0e7ca4072c3e58b0f4a2324083312b0d5a21d7","src/api/ops/scalar_bitwise.rs":"482204e459ca6be79568e1c9f70adbe2d2151412ddf122fb2161be8ebb51c40c","src/api/ops/scalar_mask_bitwise.rs":"c250f52042e37b22d57256c80d4604104cfd2fbe2a2e127c676267270ca5d350","src/api/ops/scalar_shifts.rs":"c4773d435c3f9da4454327e6fbb2b5b41a1c0ebb1cca7372e69dc7a344a1b6e4","src/api/ops/vector_arithmetic.rs":"ddca15d09ddeef502c2ed66117a62300ca65d87e959e8b622d767bdf1c307910","src/api/ops/vector_bitwise.rs":"b3968f7005b649edcc22a54e2379b14d5ee19045f2e784029805781ae043b5ee","src/api/ops/vector_float_min_max.rs":"76bf8cb607e2c442923c1da1061a6b80d742d607408033c2a3761161114cf2a0","src/api/ops/vector_int_min_max.rs":"a378789c6ff9b32a51fbd0a97ffd36ed102cd1fe6a067d2b02017c1df342def6","src/api/ops/vector_mask_bitwise.rs":"5052d18517d765415d40327e6e8e55a312daaca0a5e2aec959bfa54b1675f9c8","src/api/ops/vector_neg.rs":"5c62f6b0221983cdbd23cd0a3af3672e6ba1255f0dfe8b19aae6fbd6503e231b","src/api/ops/vector_rotates.rs":"ee319eaaa449dc50ea8ef05b89d38519c6faa6753dfdce432ea7bb8520e4e8e7","src/api/ops/vector_shifts.rs":"e510be14127c0ffd58a2573a39701da3557d66bedec09837ac8bbd44d579da00","src/api/ptr.rs":"8a793251bed6130dcfb2f1519ceaa18b751bbb15875928d0fb6deb5a5e07523a","src/api/ptr/gather_scatter.rs":"3d614f9d5b4ca201a9f7e46af4405e1d2c28ecee1620297c23b52e37b92cc0ea","src/api/reductions.rs":"ae5baca81352ecd44526d6c30c0a1feeda475ec73ddd3c3ec6b14e944e5448ee","src/api/reductions/bitwise.rs":"8bf910ae226188bd15fc7e125f058cd2566b6186fcd0cd8fd020f352c39ce139","src/api/reductions/float_arithmetic.rs":"47a5679896db2cbb56c31372fe42143da015b6beae7db5d2f3a0309ddf427ae1","src/api/reductions/integer_arithmetic.rs":"c2df3cf7493cca4174f2c65aea422a3d20d8a23af03f8d57cef72c19fee8f20d","src/api/reductions/mask.rs":"db83327a950e33a317f37fd33ca4e20c347fb415975ec024f3e23da8509425af","src/api/reductions/min_max.rs":"6af8c9aa45c69961b1b6fc205395f4767d4421869fb105fb3d563c5605fc13cd","src/api/select.rs":"6b07e7e8026df561f7307221a896f0fbb272536f41b9109040ac094c24c69331","src/api/shuffle.rs":"26458aec2557bfab41b7765f72aefbff3a7ee08cdc689981a81f133f58ee368b","src/api/shuffle1_dyn.rs":"bfea5a91905b31444e9ef7ca6eddb7a9606b7e22d3f71bb842eb2795a0346620","src/api/slice.rs":"ee87484e8af329547b9a5d4f2a69e8bed6ea10bbd96270d706083843d4eea2ac","src/api/slice/from_slice.rs":"9b6f01ace2d12ef45c84608bb7aad3a122e2cc319b2d99170fc332a568b8de63","src/api/slice/write_to_slice.rs":"244b6bd6ccffa6e5a195f8b1abc66d94251b6d16b2ec3fe4d76d32caec68261e","src/api/swap_bytes.rs":"4a6792a2e49a77475e1b237592b4b2804dbddb79c474331acd0dd71b36934259","src/codegen.rs":"a29d38fa0a85eaf787fb49989e625bf64effd5f39c126fbb2a24be206d2a3917","src/codegen/bit_manip.rs":"9991570a21ca98134b08b5c5935e2c259cea39c82d9d1529f52c561a84fec642","src/codegen/llvm.rs":"5bc6751293f9f184cf23d5df448c7d58b58b799e41c7a91f8ca41a5ba56e64ec","src/codegen/math.rs":"35f96e37a78fcf0cdb02146b7f27a45108fe06a37fc2a54d8851ce131a326178","src/codegen/math/float.rs":"dd86c0449e576c83b719700962ac017c332987fac08d91f2b7a2b1b883598170","src/codegen/math/float/abs.rs":"f56e2b4b8055ea861c1f5cbc6b6e1d8e7e5af163b62c13574ddee4e09513bfbc","src/codegen/math/float/cos.rs":"ef3b511a24d23045b310315e80348a9b7fedb576fc2de52d74290616a0abeb2a","src/codegen/math/float/cos_pi.rs":"4e7631a5d73dac21531e09ef1802d1180f8997509c2c8fa9f67f322194263a97","src/codegen/math/float/exp.rs":"61b691598c41b5622f24e4320c1bdd08701e612a516438bdddcc728fc3405c8c","src/codegen/math/float/ln.rs":"46b718b1ba8c9d99e1ad40f53d20dfde08a3063ca7bd2a9fdd6698e060da687e","src/codegen/math/float/macros.rs":"fc9924869ed85e4795983af228cacf23158f4f35919adce16c920ad4a3f0a009","src/codegen/math/float/mul_add.rs":"a37bf764345d4b1714f97e83897b7cf0855fc2811704bcbc0012db91825339e1","src/codegen/math/float/mul_adde.rs":"9aa6ed39825e61edb2522e002c59c9392d7c655c01af1cf8380ba22c8ddf69cd","src/codegen/math/float/powf.rs":"642346e982bc4c39203de0864d2149c4179cd7b21cf67a2951687932b4675872","src/codegen/math/float/sin.rs":"9d68164c90cdca6a85155040cdac42e27342ebe0b925273ef1593df721af4258","src/codegen/math/float/sin_cos_pi.rs":"e0c661d1d894fd4018723b9f3143ab6771c9405e41907cb1a7b9f9b380a97523","src/codegen/math/float/sin_pi.rs":"9890347905b4d4a3c7341c3eb06406e46e60582bcf6960688bd727e5dadc6c57","src/codegen/math/float/sqrt.rs":"e3c60dcfb0c6d2fc62adabcc931b2d4040b83cab294dea36443fb4b89eb79e34","src/codegen/math/float/sqrte.rs":"f0f4ef9eb475ae41bcc7ec6a95ad744ba6b36925faa8b2c2814004396d196b63","src/codegen/pointer_sized_int.rs":"a70697169c28218b56fd2e8d5353f2e00671d1150d0c8cef77d613bdfacd84cb","src/codegen/reductions.rs":"645e2514746d01387ddd07f0aa4ffd8430cc9ab428d4fb13773ea319fa25dd95","src/codegen/reductions/mask.rs":"dd68fd8bc5335fa2d0405e59dd1e9fff16fdf7651aa8db670ca86145fd5b5dda","src/codegen/reductions/mask/aarch64.rs":"84b101c17cad1ede4eb6d38cada0ac7da239dba8cea3badd3829b967e558431f","src/codegen/reductions/mask/arm.rs":"aaa07129bd078ae7e677cf8b8e67ec9f30536606a0c7ed1baaa18fd1793bb218","src/codegen/reductions/mask/fallback.rs":"3eb9319d2c7cf19216b607b8459612c4e027b643cf11b036937d36896bf76786","src/codegen/reductions/mask/fallback_impl.rs":"76547f396e55ef403327c77c314cf8db8c7a5c9b9819bfb925abeacf130249e5","src/codegen/reductions/mask/x86.rs":"36dcd8af4ab99730a078ed113d3955f74eb1a2876e2e6d9f224e0ff462c216d1","src/codegen/reductions/mask/x86/avx.rs":"3a40868b38c86e35aefb96d7578de6322efe89d8135e0366359b54ddd06f861a","src/codegen/reductions/mask/x86/avx2.rs":"677aed3f056285285daa3adff8bc65e739630b4424defa6d9665e160f027507e","src/codegen/reductions/mask/x86/sse.rs":"8522f6ed03f6c32dd577d4298df477c08aeaaa38563706f29096e1911ed731f2","src/codegen/reductions/mask/x86/sse2.rs":"54ec56e49b0c6841eccb719e4f310d65fe767c04136b2ec20bd8b9d7d9897b9e","src/codegen/shuffle.rs":"1ec2930f4e1acc43ac30b518af298d466a79e9e75734a51c380b7810efd1a27f","src/codegen/shuffle1_dyn.rs":"3f13ca1597378758d05106bf5ff3715eee531f3cb6d88f48b9182bd6c9386b51","src/codegen/swap_bytes.rs":"ac659780deb0c52daa9c73afb4ba8645c9fa35350cd897b23e567860492553b7","src/codegen/v128.rs":"94226b31ec403d18d9d2fe06713f147c9c79e9b5f9105089088266313f843185","src/codegen/v16.rs":"ddec4ffb66b6f7aaffb9a1780c5ddba82557abd74f45073d335047e04cf74924","src/codegen/v256.rs":"6b63917f0444118d6b1595bff2045e59b97c4d24012bd575f69f1f0efc5a0241","src/codegen/v32.rs":"3477b3c5540aed86e61e2f5807dd31db947413cec9181c587d93ed6ec74f0eba","src/codegen/v512.rs":"5854f99d3aabc4cd42b28a20d9ce447756dc2ba024a409a69b6a8ae1f1842fc5","src/codegen/v64.rs":"e9e89caebfe63d10c0cbca61e4dfdba3b7e02ee0989170f80beed23237ddd950","src/codegen/vPtr.rs":"711c753a08d53a2879c4fb87a0762c46ce4e34c22f0ca88d2e4c557a0f679969","src/codegen/vSize.rs":"c89f5fdeb28ac4c8272ed1816fce03d9d95308cc32bb2533bd8b20cd5ac102ac","src/lib.rs":"5efc09cb3d164e4e38b71fd4999afbfd234f5080dc84ce22fda2fc15d381e8c7","src/masks.rs":"70fc0abe4c2907ce2a491c574e1cfb9f3423385da2e1a923a48c9c13f8ba6ed8","src/sealed.rs":"ae7fdeaf5d84cd7710ed730ca72ca7eaba93df6cb0acb183e5c0a7327acf197f","src/testing.rs":"1d3a7862ef625e235a5734ad7204e68d350f902c0695182b1f08a0552432416e","src/testing/macros.rs":"403bbc5ecb7c786fe36156df302d0c07a8122408dbb15f7474d7682224ba1106","src/testing/utils.rs":"41912a92266dfe884647fc035e4242fd746100df8e839808ae0397af3759a3c8","src/v128.rs":"16cf9a8e7156b899ee9b9cd3f2dba9d13ec63289bea8c3ee9ae2e43ad9510288","src/v16.rs":"cb6465cf1e00bf530183af1819b9fe3d7eec978f8765d5e85d9b58a39a4b4045","src/v256.rs":"fe235017da18c7f3c361831c60e3173ad304d8ea1e95d64ebebc79da2d708511","src/v32.rs":"145d347855bac59b2de6508f9e594654e6c330423af9edc0e2ac8f4d1abdf45e","src/v512.rs":"f372f277f3e62eb5c945bb1c460333fdb17b6974fcc876633788ff53bded9599","src/v64.rs":"0b8079881b71575e3414be0b7f8f7eaba65281ba6732f2b2f61f73e95b6f48f7","src/vPtr.rs":"8b3e433d487180bb4304ff71245ecad90f0010f43e139a72027b672abe58facc","src/vSize.rs":"eda5aa020706cbf94d15bada41a0c2a35fc8f3f37cb7c2cd6f34d201399a495e","tests/endianness.rs":"2783d727e8ff8789211e03120634cd3ad9f8972fc484012681b5b63cf89408a7"},"package":null} -\ No newline at end of file -+{"files":{".appveyor.yml":"f1ed01850e0d725f9498f52a1a63ddf40702ad6e0bf5b2d7c4c04d76e96794a3",".travis.yml":"30a61a5ec53355fc1f3585e1690280308c2b7961701abc11e8389b235b647178","Cargo.toml":"2cab084b3d55d0b307788b02a6206a3ec39fee027535dc62d6421bce70e2e2c1","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"fa4dd64f66972217d35b7653338c9e2011ccd8f3008ae7c0103272d4287f9b1d","bors.toml":"dee881dc69b9b7834e4eba5d95c3ed5a416d4628815a167d6a22d4cb4fb064b8","build.rs":"a766fba121243a9b617432c592873801adb74c3a2f4a24d9d45859b8ce9357fc","ci/all.sh":"2ae6b2445b4db83833e40b37efd0016c6b9879ee988b9b3ef94db5439a3e1606","ci/android-install-ndk.sh":"0f1746108cc30bf9b9ba45bcde7b19fc1a8bdf5b0258035b4eb8dc69b75efac4","ci/android-install-sdk.sh":"3490432022c5c8f5a115c084f7a9aca1626f96c0c87ffb62019228c4346b47e4","ci/android-sysimage.sh":"ebf4e5daa1f0fe1b2092b79f0f3f161c4c4275cb744e52352c4d81ab451e4c5a","ci/benchmark.sh":"b61d19ef6b90deba8fb79dee74c8b062d94844676293da346da87bb78a9a49a4","ci/deploy_and_run_on_ios_simulator.rs":"ec8ecf82d92072676aa47f0d1a3d021b60a7ae3531153ef12d2ff4541fc294dc","ci/docker/aarch64-linux-android/Dockerfile":"ace2e7d33c87bc0f6d3962a4a3408c04557646f7f51ab99cfbf574906796b016","ci/docker/aarch64-unknown-linux-gnu/Dockerfile":"da88c0d50f16dc08448c7fdf1fa5ed2cbe576acf9e7dd85b5b818621b2a8c702","ci/docker/arm-linux-androideabi/Dockerfile":"370e55d3330a413a3ccf677b3afb3e0ef9018a5fab263faa97ae8ac017fc2286","ci/docker/arm-unknown-linux-gnueabi/Dockerfile":"bb5f8ae890707c128652290ffc544447643bf12037ddd73c6ad6989f848cb380","ci/docker/arm-unknown-linux-gnueabihf/Dockerfile":"1afaefcbc05b740859acd4e067bc92439be6bcbe8f2e9678474fb434bcd398d9","ci/docker/armv7-unknown-linux-gnueabihf/Dockerfile":"8282ea707a94109beed47a57574755e2d58401735904a03f85fb64c578c53b4f","ci/docker/i586-unknown-linux-gnu/Dockerfile":"49792922269f371bd29da4727e9085101b27be67a6b97755d0196c63317f7abb","ci/docker/i686-unknown-linux-gnu/Dockerfile":"49792922269f371bd29da4727e9085101b27be67a6b97755d0196c63317f7abb","ci/docker/mips-unknown-linux-gnu/Dockerfile":"b2ebc25797612c4f8395fe9d407725156044955bfbcf442036b7f55b43a5f9da","ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile":"b0c1692ac65bc56dd30494b1993d8e929c48cc9c4b92029b7c7592af6d4f9220","ci/docker/mips64el-unknown-linux-gnuabi64/Dockerfile":"4e9249c179300138141d0b2b7401b11897f64aed69f541f078c1db4594df2827","ci/docker/mipsel-unknown-linux-musl/Dockerfile":"3164c52b0dcbb01afa78292b15b5c43503ccf0491cf6eb801ec2bf22ae274e52","ci/docker/powerpc-unknown-linux-gnu/Dockerfile":"786f799d0b56eb54d7b6c4b00e1aed4ce81776e14e44767e083c89d014b72004","ci/docker/powerpc64-unknown-linux-gnu/Dockerfile":"e8bc363837cd9c2d8b22402acb8c1c329efc11ba5d12170603d2fe2eae9da059","ci/docker/powerpc64le-unknown-linux-gnu/Dockerfile":"47998d45b781d797b9e6085ebe898d90de0c952b54537a8db4e8d7503eb032d9","ci/docker/s390x-unknown-linux-gnu/Dockerfile":"93fb44df3d7fd31ead158570667c97b5076a05c3d968af4a84bc13819a8f2db8","ci/docker/sparc64-unknown-linux-gnu/Dockerfile":"da1c39a3ff1fe22e41395fa7c8934e90b4c1788e551b9aec6e38bfd94effc437","ci/docker/thumbv7neon-linux-androideabi/Dockerfile":"c2decd5591bd7a09378901bef629cd944acf052eb55e4f35b79eb9cb4d62246a","ci/docker/thumbv7neon-unknown-linux-gnueabihf/Dockerfile":"51955a8bf3c4d440f47382af6f5426ebff94ab01a04da36175babda9a057740f","ci/docker/wasm32-unknown-unknown/Dockerfile":"5a022299f56730cf8c432a07391e95e199cfa36dc8da2a96c9d185c8de93e913","ci/docker/x86_64-linux-android/Dockerfile":"685040273cf350d5509e580ac451555efa19790c8723ca2af066adadc6880ad2","ci/docker/x86_64-unknown-linux-gnu-emulated/Dockerfile":"44b6203d9290bfdc53d81219f0937e1110847a23dd982ec8c4de388354f01536","ci/docker/x86_64-unknown-linux-gnu/Dockerfile":"7f4e3ca5fa288ea70edb4d1f75309708cd30b192e2e4444e61c4d5b3b58f89cf","ci/dox.sh":"434e9611c52e389312d2b03564adf09429f10cc76fe66a8644adb104903b87b7","ci/linux-s390x.sh":"d6b732d7795b4ba131326aff893bca6228a7d2eb0e9402f135705413dbbe0dce","ci/linux-sparc64.sh":"c92966838b1ab7ad3b7a344833ee726aba6b647cf5952e56f0ad1ba420b13325","ci/lld-shim.rs":"3d7f71ec23a49e2b67f694a0168786f9a954dda15f5a138815d966643fd3fcc3","ci/max_line_width.sh":"0a1518bba4c9ecaa55694cb2e9930d0e19c265baabf73143f17f9cf285aaa5bb","ci/run-docker.sh":"92e036390ad9b0d16f109579df1b5ced2e72e9afea40c7d011400ebd3a2a90de","ci/run.sh":"41dd6a60efaaeae9661a01370cce98b631f78392859a0cf68c946c0a16edf5f7","ci/run_examples.sh":"d1a23c6c35374a0678ba5114b9b8fefd8be0a79e774872a8bf0898d1baca18d0","ci/runtest-android.rs":"145a8e9799a5223975061fe7e586ade5669ee4877a7d7a4cf6b4ab48e8e36c7c","ci/setup_benchmarks.sh":"fae3960023f6f3d1388cd2ad22fdbab4b075f1f29dd4292d7994a20783beb6cf","ci/test-runner-linux":"c8aa6025cff5306f4f31d0c61dc5f9d4dd5a1d189ab613ef8d4c367c694d9ccd","contributing.md":"2d2629310ad4d464c482bdbb5819f0d6ce223c576aeef2cdce6a1f6857085ea5","perf-guide/.gitignore":"fe82c7da551079d832cf74200b0b359b4df9828cb4a0416fa7384f07a2ae6a13","perf-guide/book.toml":"115a98284126c6b180178b44713314cc494f08a71662ee2ce15cf67f17a51064","perf-guide/src/SUMMARY.md":"3e03bffc991fdc2050f3d51842d72d9d21ea6abab56a3baf3b2d5973a78b89e1","perf-guide/src/ascii.css":"29afb08833b2fe2250f0412e1fa1161a2432a0820a14953c87124407417c741a","perf-guide/src/bound_checks.md":"5e4991ff58a183ef0cd9fdc1feb4cd12d083b44bdf87393bbb0927808ef3ce7d","perf-guide/src/float-math/approx.md":"8c09032fa2d795a0c5db1775826c850d28eb2627846d0965c60ee72de63735ad","perf-guide/src/float-math/fma.md":"311076ba4b741d604a82e74b83a8d7e8c318fcbd7f64c4392d1cf5af95c60243","perf-guide/src/float-math/fp.md":"04153e775ab6e4f0d7837bcc515230d327b04edfa34c84ce9c9e10ebaeef2be8","perf-guide/src/float-math/svml.md":"0798873b8eedaeda5fed62dc91645b57c20775a02d3cd74d8bd06958f1516506","perf-guide/src/introduction.md":"9f5a19e9e6751f25d2daad39891a0cc600974527ec4c8305843f9618910671bd","perf-guide/src/prof/linux.md":"447731eb5de7d69166728fdbc5ecb0c0c9db678ea493b45a592d67dd002184c0","perf-guide/src/prof/mca.md":"f56d54f3d20e7aa4d32052186e8237b03d65971eb5d112802b442570ff11d344","perf-guide/src/prof/profiling.md":"8a650c0fd6ede0964789bb6577557eeef1d8226a896788602ce61528e260e43c","perf-guide/src/target-feature/attribute.md":"615f88dca0a707b6c416fa605435dd6e1fb5361cc639429cbf68cd87624bd78b","perf-guide/src/target-feature/features.md":"17077760ff24c006b606dd21889c53d87228f4311f3ba3a574f9afdeacd86165","perf-guide/src/target-feature/inlining.md":"7ed1d7068d8173a00d84c16cfe5871cd68b9f04f8d0cca2d01ebc84957ebf2f6","perf-guide/src/target-feature/practice.md":"c4b371842e0086df178488fec97f20def8f0c62ee588bcd25fd948b9b1fa227e","perf-guide/src/target-feature/runtime.md":"835425f5ee597fb3e51d36e725a81ebee29f4561231d19563cd4da81dbb1cfcb","perf-guide/src/target-feature/rustflags.md":"01197acf6f0adec8db32b8591811f69cecb6555a2b05dc5d5ec27d0e3f7b065e","perf-guide/src/vert-hor-ops.md":"c6211c0ee91e60552ec592d89d9d957eedc21dee3cbd89e1ad6765ea06a27471","rustfmt.toml":"d99a43f3f8ef9e425cf01c333fba9f0051f888f5d87ab4e8f63c2f7d0fe6620f","src/api.rs":"bb1795e9657a8298d37d2349b45443f08e9e455399ad4b727018600728478c10","src/api/bit_manip.rs":"c47a4d0f7451f7e35d07715e4f39a472e07457fd456fdb726864a4f6887252a3","src/api/bitmask.rs":"6d2beefd62ee5d9c8eb060bee6abc641616bf828c99f82abf97b21bf004e894b","src/api/cast.rs":"03b94a3d316ac7b7be7068810044911e965e889a0ace7bae762749ca74a92747","src/api/cast/macros.rs":"b0a14d0c83ad2ebb7a275180f6d9e3f2bc312ba57a7d3d6c39fad4e0f20f9408","src/api/cast/v128.rs":"edd0994efac4379dff26e178423a52dbb3ffeb38b1fc97cae975d744c00b4fb6","src/api/cast/v16.rs":"96bd98c2d21b0663abe6c0ab33005b1fa693f3db7ee6795351391343863484da","src/api/cast/v256.rs":"8c31fe91f5e78ef737dfba6979cc1240210cb094a89d284fe459bf8a991ca24b","src/api/cast/v32.rs":"a99a79dd84d2a5e6adf9db98705675915bd03fd1287d489c7fe38e84d7e4a086","src/api/cast/v512.rs":"c0dd526f41ed7b8a71c3743d91267554ec0a0c75834ccc2e3ecb0ef3004af642","src/api/cast/v64.rs":"6572fdba2a1241a6cd666d3f0cce3306cd2cb7e5e236172e59d5d4351c8a88af","src/api/cmp.rs":"357c3a2a09c6d4611c32dd7fa95be2fae933d513e229026ec9b44451a77b884e","src/api/cmp/eq.rs":"60f70f355bae4cb5b17db53204cacc3890f70670611c17df638d4c04f7cc8075","src/api/cmp/ord.rs":"589f7234761c294fa5df8f525bc4acd5a47cdb602207d524a0d4e19804cd9695","src/api/cmp/partial_eq.rs":"902ccb8aa01fd5738b30ba0b712669c21d4801958907e03bad23432c7dba0198","src/api/cmp/partial_ord.rs":"9db0c37d7434cdfc62d8d66912e972fa3d8c115ab2af051a6f45e414bd3e4f1c","src/api/cmp/vertical.rs":"de3d62f38eba817299aa16f1e1939954c9a447e316509397465c2830852ba053","src/api/default.rs":"67bf21c134127d12a7028c8b88a57f0ceee8ccbd74976da8ca74eb9f16a174d5","src/api/fmt.rs":"67fb804bb86b6cd77cf8cd492b5733ce437071b66fe3297278b8a6552c325dda","src/api/fmt/binary.rs":"02b2b287f7404f8a983813cf70c87108c8da3835578b63ab303116885f609413","src/api/fmt/debug.rs":"56e1c3bdc092747344fffaafff9da7163ee7827857f6fb7cb1c9923eca4f6fa0","src/api/fmt/lower_hex.rs":"558fd592f7f485712fb051509cecc7174a21e6bf62e5ce64766e75afc97bb8e1","src/api/fmt/octal.rs":"3b2e70877a4f368c7704f8e254236c014c365c74d93371c1feb5f030e6c66422","src/api/fmt/upper_hex.rs":"2a442f666bc80e22d41f903f881238fe114dd49344c3ed69849250e853cafc5d","src/api/from.rs":"2e599d8329cb05eaf06224cc441355c4b7b51254fc19256619333be8c149d444","src/api/from/from_array.rs":"dd3fc64fb17d6184bb60343f8da26a05edf0e5f3c14caf55d49fa15e21d948dc","src/api/from/from_vector.rs":"9764371aa9e6005aace74dea14f59e5611a095b7cf42707940924749282c52f0","src/api/hash.rs":"5076ece87969592c876486f5b1ea8affbeaec379d1a14a30859e0aa5592019de","src/api/into_bits.rs":"1ee15923352786b9ab4a31fa506762297116b18cfdb8e72853abc8ad001651d2","src/api/into_bits/arch_specific.rs":"e7445021f3908326bfee758835e5fc5ad56aa1baa77fc1c58abe4350c66c670a","src/api/into_bits/macros.rs":"bb4fe99be2af6a21d805efab44c8e4e61a7b2adb42a65504a0cf26d13efdadcd","src/api/into_bits/v128.rs":"145a44922b09a5ca5b62d88a461d327d399a997a15db4b11d7b17e554a9fa4c0","src/api/into_bits/v16.rs":"f4f4f61ba88aa51b158ec56ca3dce234349aea0daf2b3029a14ab5125d1e41e5","src/api/into_bits/v256.rs":"8cea9c5d9809f11323cb7cdc53b83df593fd17caf926251e412ae9777bed547f","src/api/into_bits/v32.rs":"905ba683d342fa32f4202b80bb46530807bd0a5b588f6c2e8c9f475223c47775","src/api/into_bits/v512.rs":"e25afa1fbf088a5d58e7d75d197b6cd4c56637ea28542ba18e46a451f29d04e7","src/api/into_bits/v64.rs":"d6238022ccff7b92e55b3f6017fc269acb6f36330a6d7e8fb389853a0f1b6478","src/api/math.rs":"8b2a2fc651917a850539f993aa0b9e5bf4da67b11685285b8de8cdca311719ec","src/api/math/float.rs":"61d2794d68262a1090ae473bd30793b5f65cf732f32a6694a3af2ce5d9225616","src/api/math/float/abs.rs":"5b6b2701e2e11135b7ce58a05052ea8120e10e4702c95d046b9d21b827b26bf8","src/api/math/float/consts.rs":"6302c9261da4291d144d5bb53493cdd073498feb40955fb6860ea3c4d06c978a","src/api/math/float/cos.rs":"4c2dd7173728ef189314f1576c9486e03be21b7da98843b2f9011282a7979e31","src/api/math/float/exp.rs":"7c6d5f1e304f498a01cfa23b92380c815d7da0ad94eae3483783bc377d287eef","src/api/math/float/ln.rs":"54c7583f3df793b39ff57534fade27b41bb992439e5dc178252f5ca3190a3e54","src/api/math/float/mul_add.rs":"62cac77660d20159276d4c9ef066eb90c81cbddb808e8e157182c607625ad2eb","src/api/math/float/mul_adde.rs":"bae056ee9f3a70df39ec3c3b2f6437c65303888a7b843ef1a5bcf1f5aca0e602","src/api/math/float/powf.rs":"9ddb938984b36d39d82a82f862f80df8f7fb013f1d222d45698d41d88472f568","src/api/math/float/recpre.rs":"589225794ff1dbf31158dff660e6d4509ecc8befbb57c633900dea5ac0b840d6","src/api/math/float/rsqrte.rs":"a32abdcc318d7ccc8448231f54d75b884b7cbeb03a7d595713ab6243036f4dbf","src/api/math/float/sin.rs":"cbd3622b7df74f19691743001c8cf747a201f8977ad90542fee915f37dcd1e49","src/api/math/float/sqrt.rs":"0c66d5d63fb08e4d99c6b82a8828e41173aff1ac9fa1a2764a11fac217ccf2ac","src/api/math/float/sqrte.rs":"731e1c9f321b662accdd27dacb3aac2e8043b7aecb2f2161dde733bd9f025362","src/api/minimal.rs":"1f22bcc528555444e76de569ec0ae2029b9ae9d04805efeafa93369c8098036b","src/api/minimal/iuf.rs":"819cff26d3e196f807645bcc1d79eb27d9f175edb89910f2274d52a1e913cd11","src/api/minimal/mask.rs":"0cae10ae1fc65f5070e686c0c79bfba27b86b33d6c399367bd4848fb367dcec4","src/api/minimal/ptr.rs":"f65ebf21866a863485344432d9a7a9b7418f7fad5fdf841a4e2fa56ec0766ad0","src/api/ops.rs":"3e273b277a0f3019d42c3c59ca94a5afd4885d5ae6d2182e5089bbeec9de42ee","src/api/ops/scalar_arithmetic.rs":"d2d5ad897a59dd0787544f927e0e7ca4072c3e58b0f4a2324083312b0d5a21d7","src/api/ops/scalar_bitwise.rs":"482204e459ca6be79568e1c9f70adbe2d2151412ddf122fb2161be8ebb51c40c","src/api/ops/scalar_mask_bitwise.rs":"c250f52042e37b22d57256c80d4604104cfd2fbe2a2e127c676267270ca5d350","src/api/ops/scalar_shifts.rs":"c4773d435c3f9da4454327e6fbb2b5b41a1c0ebb1cca7372e69dc7a344a1b6e4","src/api/ops/vector_arithmetic.rs":"ddca15d09ddeef502c2ed66117a62300ca65d87e959e8b622d767bdf1c307910","src/api/ops/vector_bitwise.rs":"b3968f7005b649edcc22a54e2379b14d5ee19045f2e784029805781ae043b5ee","src/api/ops/vector_float_min_max.rs":"76bf8cb607e2c442923c1da1061a6b80d742d607408033c2a3761161114cf2a0","src/api/ops/vector_int_min_max.rs":"a378789c6ff9b32a51fbd0a97ffd36ed102cd1fe6a067d2b02017c1df342def6","src/api/ops/vector_mask_bitwise.rs":"5052d18517d765415d40327e6e8e55a312daaca0a5e2aec959bfa54b1675f9c8","src/api/ops/vector_neg.rs":"5c62f6b0221983cdbd23cd0a3af3672e6ba1255f0dfe8b19aae6fbd6503e231b","src/api/ops/vector_rotates.rs":"ee319eaaa449dc50ea8ef05b89d38519c6faa6753dfdce432ea7bb8520e4e8e7","src/api/ops/vector_shifts.rs":"e510be14127c0ffd58a2573a39701da3557d66bedec09837ac8bbd44d579da00","src/api/ptr.rs":"8a793251bed6130dcfb2f1519ceaa18b751bbb15875928d0fb6deb5a5e07523a","src/api/ptr/gather_scatter.rs":"3d614f9d5b4ca201a9f7e46af4405e1d2c28ecee1620297c23b52e37b92cc0ea","src/api/reductions.rs":"ae5baca81352ecd44526d6c30c0a1feeda475ec73ddd3c3ec6b14e944e5448ee","src/api/reductions/bitwise.rs":"8bf910ae226188bd15fc7e125f058cd2566b6186fcd0cd8fd020f352c39ce139","src/api/reductions/float_arithmetic.rs":"47a5679896db2cbb56c31372fe42143da015b6beae7db5d2f3a0309ddf427ae1","src/api/reductions/integer_arithmetic.rs":"c2df3cf7493cca4174f2c65aea422a3d20d8a23af03f8d57cef72c19fee8f20d","src/api/reductions/mask.rs":"db83327a950e33a317f37fd33ca4e20c347fb415975ec024f3e23da8509425af","src/api/reductions/min_max.rs":"6af8c9aa45c69961b1b6fc205395f4767d4421869fb105fb3d563c5605fc13cd","src/api/select.rs":"6b07e7e8026df561f7307221a896f0fbb272536f41b9109040ac094c24c69331","src/api/shuffle.rs":"26458aec2557bfab41b7765f72aefbff3a7ee08cdc689981a81f133f58ee368b","src/api/shuffle1_dyn.rs":"bfea5a91905b31444e9ef7ca6eddb7a9606b7e22d3f71bb842eb2795a0346620","src/api/slice.rs":"ee87484e8af329547b9a5d4f2a69e8bed6ea10bbd96270d706083843d4eea2ac","src/api/slice/from_slice.rs":"9b6f01ace2d12ef45c84608bb7aad3a122e2cc319b2d99170fc332a568b8de63","src/api/slice/write_to_slice.rs":"244b6bd6ccffa6e5a195f8b1abc66d94251b6d16b2ec3fe4d76d32caec68261e","src/api/swap_bytes.rs":"4a6792a2e49a77475e1b237592b4b2804dbddb79c474331acd0dd71b36934259","src/codegen.rs":"db4f232fb9f5728db310b87dc8c4733be48afacab1053798c06106bef9a42b05","src/codegen/bit_manip.rs":"525ea6ff7ad1e043b6f6136992166f1803ed5563b7f6fc292c1c40257d20e264","src/codegen/llvm.rs":"b4ccbc0bad90038f00fc3c158736462d01d0053df3afa00f9169e67d1a264444","src/codegen/math.rs":"dfcf02ad34e2fdfe22c3f1cc2822001cc895e65031b4d06e585e5047839febb7","src/codegen/math/float.rs":"2c1cbce155bc527ce34d472c0fef6bc3dadb79cd7a357dd7aa5b1ebeb1d77a13","src/codegen/math/float/abs.rs":"d5aaadcf540bdb9b4264dca6471a255fd7bf509e763bef0239c0144a68466fea","src/codegen/math/float/cos.rs":"17f28d2900c852dca221fa9c92a9cd5fe7fd2df8d427bbc60216c749b2be013d","src/codegen/math/float/cos_pi.rs":"dbaf9f443f9846a491d4ec52210a7b5835dd593b03366e3135b05c37d70f9d6c","src/codegen/math/float/exp.rs":"d300058a4bcc7ae7976f216f81902cd73a9e603ad63880dff3bbc866c27a9f37","src/codegen/math/float/ln.rs":"c851e211e43f8256093ba75b03ae0c307c9962ee66d94f09b4dd80068190cbdf","src/codegen/math/float/macros.rs":"fc9924869ed85e4795983af228cacf23158f4f35919adce16c920ad4a3f0a009","src/codegen/math/float/mul_add.rs":"041a5b69d5991d93ef795351b17560c10faf80b78fd26ad7df42a239b32cf9de","src/codegen/math/float/mul_adde.rs":"d71d5f0f3333b62a7439b823cb7adf5340ea1555ce820fb4a3f4cb922f73f5f5","src/codegen/math/float/powf.rs":"9742c3877f1a5509ca5c9492a40884b6579ba6dd11c26b7112e63f70666b395d","src/codegen/math/float/sin.rs":"0e9868d35531566509f3a01d85d5253045eb4afa8525d8407dcc1f5f33c56036","src/codegen/math/float/sin_cos_pi.rs":"8e6b6142d7dd240cdb36669722e82ab9810a2261e86e659f7d97a942ad8b1258","src/codegen/math/float/sin_pi.rs":"bb6d39db8f921e03a301fc5206ac1a61a97def8a2cb83b87ccf189f3fc48d548","src/codegen/math/float/sqrt.rs":"e6ebb0c5f428efad1f672b9a8fe4e58534dbf1ea5a8fe092ce5ce76b52fe89cb","src/codegen/math/float/sqrte.rs":"23acfaea38d0e081a6d9021c1094e813d0cfd12c58c1eca9662aade5e625d51c","src/codegen/pointer_sized_int.rs":"6ca13c214b6cf7e0929dbe18e96a16fc0bb7d8799608df29c4c8115490f99e01","src/codegen/reductions.rs":"8eb18ebac76985d2aa30262a2edd8cb004230b511a765d657525f677a585c12c","src/codegen/reductions/mask.rs":"e67f35a1f4d156a4894a2d6ea5a935b4d898cf70eefb2715f5c1cc165e776c11","src/codegen/reductions/mask/aarch64.rs":"84b101c17cad1ede4eb6d38cada0ac7da239dba8cea3badd3829b967e558431f","src/codegen/reductions/mask/arm.rs":"aaa07129bd078ae7e677cf8b8e67ec9f30536606a0c7ed1baaa18fd1793bb218","src/codegen/reductions/mask/fallback.rs":"3eb9319d2c7cf19216b607b8459612c4e027b643cf11b036937d36896bf76786","src/codegen/reductions/mask/fallback_impl.rs":"76547f396e55ef403327c77c314cf8db8c7a5c9b9819bfb925abeacf130249e5","src/codegen/reductions/mask/x86.rs":"36dcd8af4ab99730a078ed113d3955f74eb1a2876e2e6d9f224e0ff462c216d1","src/codegen/reductions/mask/x86/avx.rs":"3a40868b38c86e35aefb96d7578de6322efe89d8135e0366359b54ddd06f861a","src/codegen/reductions/mask/x86/avx2.rs":"677aed3f056285285daa3adff8bc65e739630b4424defa6d9665e160f027507e","src/codegen/reductions/mask/x86/sse.rs":"8522f6ed03f6c32dd577d4298df477c08aeaaa38563706f29096e1911ed731f2","src/codegen/reductions/mask/x86/sse2.rs":"54ec56e49b0c6841eccb719e4f310d65fe767c04136b2ec20bd8b9d7d9897b9e","src/codegen/shuffle.rs":"1ec2930f4e1acc43ac30b518af298d466a79e9e75734a51c380b7810efd1a27f","src/codegen/shuffle1_dyn.rs":"3f13ca1597378758d05106bf5ff3715eee531f3cb6d88f48b9182bd6c9386b51","src/codegen/swap_bytes.rs":"c67c86e91ca3fc77539e0efcea081a3c62548cccf503963ae408f2e86f4e6a21","src/codegen/v128.rs":"94226b31ec403d18d9d2fe06713f147c9c79e9b5f9105089088266313f843185","src/codegen/v16.rs":"ddec4ffb66b6f7aaffb9a1780c5ddba82557abd74f45073d335047e04cf74924","src/codegen/v256.rs":"6b63917f0444118d6b1595bff2045e59b97c4d24012bd575f69f1f0efc5a0241","src/codegen/v32.rs":"3477b3c5540aed86e61e2f5807dd31db947413cec9181c587d93ed6ec74f0eba","src/codegen/v512.rs":"5854f99d3aabc4cd42b28a20d9ce447756dc2ba024a409a69b6a8ae1f1842fc5","src/codegen/v64.rs":"e9e89caebfe63d10c0cbca61e4dfdba3b7e02ee0989170f80beed23237ddd950","src/codegen/vPtr.rs":"f0753b405cdc865bdf8e82c6505f299ea1f96136239ebbaf7f9ce93d310764b8","src/codegen/vSize.rs":"c89f5fdeb28ac4c8272ed1816fce03d9d95308cc32bb2533bd8b20cd5ac102ac","src/lib.rs":"b6f846d5d30cf6b035a2d18039aba7b2045cf89384733d643572bd68873ae064","src/masks.rs":"70fc0abe4c2907ce2a491c574e1cfb9f3423385da2e1a923a48c9c13f8ba6ed8","src/sealed.rs":"ae7fdeaf5d84cd7710ed730ca72ca7eaba93df6cb0acb183e5c0a7327acf197f","src/testing.rs":"896669c08d8c801448a4d2fadc9d633eda0fbe879d229997e2a182e31278e469","src/testing/macros.rs":"403bbc5ecb7c786fe36156df302d0c07a8122408dbb15f7474d7682224ba1106","src/testing/utils.rs":"41912a92266dfe884647fc035e4242fd746100df8e839808ae0397af3759a3c8","src/v128.rs":"16cf9a8e7156b899ee9b9cd3f2dba9d13ec63289bea8c3ee9ae2e43ad9510288","src/v16.rs":"cb6465cf1e00bf530183af1819b9fe3d7eec978f8765d5e85d9b58a39a4b4045","src/v256.rs":"fe235017da18c7f3c361831c60e3173ad304d8ea1e95d64ebebc79da2d708511","src/v32.rs":"145d347855bac59b2de6508f9e594654e6c330423af9edc0e2ac8f4d1abdf45e","src/v512.rs":"f372f277f3e62eb5c945bb1c460333fdb17b6974fcc876633788ff53bded9599","src/v64.rs":"0b8079881b71575e3414be0b7f8f7eaba65281ba6732f2b2f61f73e95b6f48f7","src/vPtr.rs":"8b3e433d487180bb4304ff71245ecad90f0010f43e139a72027b672abe58facc","src/vSize.rs":"eda5aa020706cbf94d15bada41a0c2a35fc8f3f37cb7c2cd6f34d201399a495e","tests/endianness.rs":"2783d727e8ff8789211e03120634cd3ad9f8972fc484012681b5b63cf89408a7"},"package":null} -\ No newline at end of file -diff --git a/third_party/rust/packed_simd_2/Cargo.toml b/third_party/rust/packed_simd_2/Cargo.toml ---- a/third_party/rust/packed_simd_2/Cargo.toml -+++ b/third_party/rust/packed_simd_2/Cargo.toml -@@ -1,11 +1,11 @@ - [package] - name = "packed_simd_2" --version = "0.3.7" -+version = "0.3.8" - description = "Portable Packed SIMD vectors" - documentation = "https://docs.rs/crate/packed_simd/" - homepage = "https://github.com/rust-lang/packed_simd" - repository = "https://github.com/rust-lang/packed_simd" - keywords = ["simd", "vector", "portability"] - categories = ["hardware-support", "concurrency", "no-std", "data-structures"] - license = "MIT OR Apache-2.0" - build = "build.rs" -@@ -18,16 +18,19 @@ codecov = { repository = "rust-lang/pack - is-it-maintained-issue-resolution = { repository = "rust-lang/packed_simd" } - is-it-maintained-open-issues = { repository = "rust-lang/packed_simd" } - maintenance = { status = "experimental" } - - [dependencies] - cfg-if = "1.0.0" - core_arch = { version = "0.1.5", optional = true } - -+[build-dependencies] -+rustc_version = "0.4" -+ - [features] - default = [] - into_bits = [] - libcore_neon = [] - - [dev-dependencies] - paste = "^0.1.3" - arrayvec = { version = "^0.5", default-features = false } -diff --git a/third_party/rust/packed_simd_2/README.md b/third_party/rust/packed_simd_2/README.md ---- a/third_party/rust/packed_simd_2/README.md -+++ b/third_party/rust/packed_simd_2/README.md -@@ -3,17 +3,17 @@ - The original maintainer is out of contact, and the new maintainers (the Portable SIMD Project Group) do not have the appropriate crates.io permissions to issue updates. - - We are aware that the version available on crates.io is currently broken, and will not build. - - If you need to continue to use the crate, we have published a "next version" under an alternative name. - - Adjust your `[dependencies]` section of `Cargo.toml` to be the following: - ```toml --packed_simd = { version = "0.3.6", package = "packed_simd_2" } -+packed_simd = { version = "0.3.8", package = "packed_simd_2" } - ``` - - # `Simd<[T; N]>` - - ## Implementation of [Rust RFC #2366: `std::simd`][rfc2366] - - [![Travis-CI Status]][travis] <!-- [![Appveyor Status]][appveyor] --> [![Latest Version]][crates.io] [![docs]][master_docs] - -diff --git a/third_party/rust/packed_simd_2/build.rs b/third_party/rust/packed_simd_2/build.rs ---- a/third_party/rust/packed_simd_2/build.rs -+++ b/third_party/rust/packed_simd_2/build.rs -@@ -1,6 +1,11 @@ -+use rustc_version::{version, Version}; -+ - fn main() { - let target = std::env::var("TARGET").expect("TARGET environment variable not defined"); - if target.contains("neon") { - println!("cargo:rustc-cfg=libcore_neon"); - } -+ if version().unwrap() < Version::parse("1.61.0-alpha").unwrap() { -+ println!("cargo:rustc-cfg=aarch64_target_feature"); -+ } - } -diff --git a/third_party/rust/packed_simd_2/src/api.rs b/third_party/rust/packed_simd_2/src/api.rs ---- a/third_party/rust/packed_simd_2/src/api.rs -+++ b/third_party/rust/packed_simd_2/src/api.rs -@@ -1,13 +1,13 @@ - //! Implements the Simd<[T; N]> APIs - - #[macro_use] - mod bitmask; --crate mod cast; -+pub(crate) mod cast; - #[macro_use] - mod cmp; - #[macro_use] - mod default; - #[macro_use] - mod fmt; - #[macro_use] - mod from; -@@ -32,17 +32,17 @@ mod shuffle1_dyn; - #[macro_use] - mod slice; - #[macro_use] - mod swap_bytes; - #[macro_use] - mod bit_manip; - - #[cfg(feature = "into_bits")] --crate mod into_bits; -+pub(crate) mod into_bits; - - macro_rules! impl_i { - ([$elem_ty:ident; $elem_n:expr]: $tuple_id:ident, $mask_ty:ident - | $ielem_ty:ident, $ibitmask_ty:ident | $test_tt:tt | $($elem_ids:ident),* - | From: $($from_vec_ty:ident),* | $(#[$doc:meta])*) => { - impl_minimal_iuf!([$elem_ty; $elem_n]: $tuple_id | $ielem_ty | $test_tt - | $($elem_ids),* | $(#[$doc])*); - impl_ops_vector_arithmetic!([$elem_ty; $elem_n]: $tuple_id | $test_tt); -diff --git a/third_party/rust/packed_simd_2/src/codegen.rs b/third_party/rust/packed_simd_2/src/codegen.rs ---- a/third_party/rust/packed_simd_2/src/codegen.rs -+++ b/third_party/rust/packed_simd_2/src/codegen.rs -@@ -1,24 +1,24 @@ - //! Code-generation utilities - --crate mod bit_manip; --crate mod llvm; --crate mod math; --crate mod reductions; --crate mod shuffle; --crate mod shuffle1_dyn; --crate mod swap_bytes; -+pub(crate) mod bit_manip; -+pub(crate) mod llvm; -+pub(crate) mod math; -+pub(crate) mod reductions; -+pub(crate) mod shuffle; -+pub(crate) mod shuffle1_dyn; -+pub(crate) mod swap_bytes; - - macro_rules! impl_simd_array { - ([$elem_ty:ident; $elem_count:expr]: - $tuple_id:ident | $($elem_tys:ident),*) => { - #[derive(Copy, Clone)] - #[repr(simd)] -- pub struct $tuple_id($(crate $elem_tys),*); -+ pub struct $tuple_id($(pub(crate) $elem_tys),*); - //^^^^^^^ leaked through SimdArray - - impl crate::sealed::Seal for [$elem_ty; $elem_count] {} - - impl crate::sealed::SimdArray for [$elem_ty; $elem_count] { - type Tuple = $tuple_id; - type T = $elem_ty; - const N: usize = $elem_count; -@@ -30,33 +30,33 @@ macro_rules! impl_simd_array { - type Element = $elem_ty; - const LANES: usize = $elem_count; - type LanesType = [u32; $elem_count]; - } - - } - } - --crate mod pointer_sized_int; -+pub(crate) mod pointer_sized_int; - --crate mod v16; --crate use self::v16::*; -+pub(crate) mod v16; -+pub(crate) use self::v16::*; - --crate mod v32; --crate use self::v32::*; -+pub(crate) mod v32; -+pub(crate) use self::v32::*; - --crate mod v64; --crate use self::v64::*; -+pub(crate) mod v64; -+pub(crate) use self::v64::*; - --crate mod v128; --crate use self::v128::*; -+pub(crate) mod v128; -+pub(crate) use self::v128::*; - --crate mod v256; --crate use self::v256::*; -+pub(crate) mod v256; -+pub(crate) use self::v256::*; - --crate mod v512; --crate use self::v512::*; -+pub(crate) mod v512; -+pub(crate) use self::v512::*; - --crate mod vSize; --crate use self::vSize::*; -+pub(crate) mod vSize; -+pub(crate) use self::vSize::*; - --crate mod vPtr; --crate use self::vPtr::*; -+pub(crate) mod vPtr; -+pub(crate) use self::vPtr::*; -diff --git a/third_party/rust/packed_simd_2/src/codegen/bit_manip.rs b/third_party/rust/packed_simd_2/src/codegen/bit_manip.rs ---- a/third_party/rust/packed_simd_2/src/codegen/bit_manip.rs -+++ b/third_party/rust/packed_simd_2/src/codegen/bit_manip.rs -@@ -1,12 +1,12 @@ - //! LLVM bit manipulation intrinsics. - #[rustfmt::skip] - --use crate::*; -+pub(crate) use crate::*; - - #[allow(improper_ctypes, dead_code)] - extern "C" { - #[link_name = "llvm.ctlz.v2i8"] - fn ctlz_u8x2(x: u8x2, is_zero_undef: bool) -> u8x2; - #[link_name = "llvm.ctlz.v4i8"] - fn ctlz_u8x4(x: u8x4, is_zero_undef: bool) -> u8x4; - #[link_name = "llvm.ctlz.v8i8"] -@@ -142,17 +142,17 @@ extern "C" { - #[link_name = "llvm.ctpop.v1i128"] - fn ctpop_u128x1(x: u128x1) -> u128x1; - #[link_name = "llvm.ctpop.v2i128"] - fn ctpop_u128x2(x: u128x2) -> u128x2; - #[link_name = "llvm.ctpop.v4i128"] - fn ctpop_u128x4(x: u128x4) -> u128x4; - } - --crate trait BitManip { -+pub(crate) trait BitManip { - fn ctpop(self) -> Self; - fn ctlz(self) -> Self; - fn cttz(self) -> Self; - } - - macro_rules! impl_bit_manip { - (inner: $ty:ident, $scalar:ty, $uty:ident, - $ctpop:ident, $ctlz:ident, $cttz:ident) => { -diff --git a/third_party/rust/packed_simd_2/src/codegen/llvm.rs b/third_party/rust/packed_simd_2/src/codegen/llvm.rs ---- a/third_party/rust/packed_simd_2/src/codegen/llvm.rs -+++ b/third_party/rust/packed_simd_2/src/codegen/llvm.rs -@@ -71,58 +71,58 @@ pub unsafe fn __shuffle_vector64<const I - where - T: Simd, - <T as Simd>::Element: Shuffle<[u32; 64], Output = U>, - { - simd_shuffle64(x, y, IDX) - } - - extern "platform-intrinsic" { -- crate fn simd_eq<T, U>(x: T, y: T) -> U; -- crate fn simd_ne<T, U>(x: T, y: T) -> U; -- crate fn simd_lt<T, U>(x: T, y: T) -> U; -- crate fn simd_le<T, U>(x: T, y: T) -> U; -- crate fn simd_gt<T, U>(x: T, y: T) -> U; -- crate fn simd_ge<T, U>(x: T, y: T) -> U; -+ pub(crate) fn simd_eq<T, U>(x: T, y: T) -> U; -+ pub(crate) fn simd_ne<T, U>(x: T, y: T) -> U; -+ pub(crate) fn simd_lt<T, U>(x: T, y: T) -> U; -+ pub(crate) fn simd_le<T, U>(x: T, y: T) -> U; -+ pub(crate) fn simd_gt<T, U>(x: T, y: T) -> U; -+ pub(crate) fn simd_ge<T, U>(x: T, y: T) -> U; - -- crate fn simd_insert<T, U>(x: T, idx: u32, val: U) -> T; -- crate fn simd_extract<T, U>(x: T, idx: u32) -> U; -+ pub(crate) fn simd_insert<T, U>(x: T, idx: u32, val: U) -> T; -+ pub(crate) fn simd_extract<T, U>(x: T, idx: u32) -> U; - -- crate fn simd_cast<T, U>(x: T) -> U; -+ pub(crate) fn simd_cast<T, U>(x: T) -> U; - -- crate fn simd_add<T>(x: T, y: T) -> T; -- crate fn simd_sub<T>(x: T, y: T) -> T; -- crate fn simd_mul<T>(x: T, y: T) -> T; -- crate fn simd_div<T>(x: T, y: T) -> T; -- crate fn simd_rem<T>(x: T, y: T) -> T; -- crate fn simd_shl<T>(x: T, y: T) -> T; -- crate fn simd_shr<T>(x: T, y: T) -> T; -- crate fn simd_and<T>(x: T, y: T) -> T; -- crate fn simd_or<T>(x: T, y: T) -> T; -- crate fn simd_xor<T>(x: T, y: T) -> T; -+ pub(crate) fn simd_add<T>(x: T, y: T) -> T; -+ pub(crate) fn simd_sub<T>(x: T, y: T) -> T; -+ pub(crate) fn simd_mul<T>(x: T, y: T) -> T; -+ pub(crate) fn simd_div<T>(x: T, y: T) -> T; -+ pub(crate) fn simd_rem<T>(x: T, y: T) -> T; -+ pub(crate) fn simd_shl<T>(x: T, y: T) -> T; -+ pub(crate) fn simd_shr<T>(x: T, y: T) -> T; -+ pub(crate) fn simd_and<T>(x: T, y: T) -> T; -+ pub(crate) fn simd_or<T>(x: T, y: T) -> T; -+ pub(crate) fn simd_xor<T>(x: T, y: T) -> T; - -- crate fn simd_reduce_add_unordered<T, U>(x: T) -> U; -- crate fn simd_reduce_mul_unordered<T, U>(x: T) -> U; -- crate fn simd_reduce_add_ordered<T, U>(x: T, acc: U) -> U; -- crate fn simd_reduce_mul_ordered<T, U>(x: T, acc: U) -> U; -- crate fn simd_reduce_min<T, U>(x: T) -> U; -- crate fn simd_reduce_max<T, U>(x: T) -> U; -- crate fn simd_reduce_min_nanless<T, U>(x: T) -> U; -- crate fn simd_reduce_max_nanless<T, U>(x: T) -> U; -- crate fn simd_reduce_and<T, U>(x: T) -> U; -- crate fn simd_reduce_or<T, U>(x: T) -> U; -- crate fn simd_reduce_xor<T, U>(x: T) -> U; -- crate fn simd_reduce_all<T>(x: T) -> bool; -- crate fn simd_reduce_any<T>(x: T) -> bool; -+ pub(crate) fn simd_reduce_add_unordered<T, U>(x: T) -> U; -+ pub(crate) fn simd_reduce_mul_unordered<T, U>(x: T) -> U; -+ pub(crate) fn simd_reduce_add_ordered<T, U>(x: T, acc: U) -> U; -+ pub(crate) fn simd_reduce_mul_ordered<T, U>(x: T, acc: U) -> U; -+ pub(crate) fn simd_reduce_min<T, U>(x: T) -> U; -+ pub(crate) fn simd_reduce_max<T, U>(x: T) -> U; -+ pub(crate) fn simd_reduce_min_nanless<T, U>(x: T) -> U; -+ pub(crate) fn simd_reduce_max_nanless<T, U>(x: T) -> U; -+ pub(crate) fn simd_reduce_and<T, U>(x: T) -> U; -+ pub(crate) fn simd_reduce_or<T, U>(x: T) -> U; -+ pub(crate) fn simd_reduce_xor<T, U>(x: T) -> U; -+ pub(crate) fn simd_reduce_all<T>(x: T) -> bool; -+ pub(crate) fn simd_reduce_any<T>(x: T) -> bool; - -- crate fn simd_select<M, T>(m: M, a: T, b: T) -> T; -+ pub(crate) fn simd_select<M, T>(m: M, a: T, b: T) -> T; - -- crate fn simd_fmin<T>(a: T, b: T) -> T; -- crate fn simd_fmax<T>(a: T, b: T) -> T; -+ pub(crate) fn simd_fmin<T>(a: T, b: T) -> T; -+ pub(crate) fn simd_fmax<T>(a: T, b: T) -> T; - -- crate fn simd_fsqrt<T>(a: T) -> T; -- crate fn simd_fma<T>(a: T, b: T, c: T) -> T; -+ pub(crate) fn simd_fsqrt<T>(a: T) -> T; -+ pub(crate) fn simd_fma<T>(a: T, b: T, c: T) -> T; - -- crate fn simd_gather<T, P, M>(value: T, pointers: P, mask: M) -> T; -- crate fn simd_scatter<T, P, M>(value: T, pointers: P, mask: M); -+ pub(crate) fn simd_gather<T, P, M>(value: T, pointers: P, mask: M) -> T; -+ pub(crate) fn simd_scatter<T, P, M>(value: T, pointers: P, mask: M); - -- crate fn simd_bitmask<T, U>(value: T) -> U; -+ pub(crate) fn simd_bitmask<T, U>(value: T) -> U; - } -diff --git a/third_party/rust/packed_simd_2/src/codegen/math.rs b/third_party/rust/packed_simd_2/src/codegen/math.rs ---- a/third_party/rust/packed_simd_2/src/codegen/math.rs -+++ b/third_party/rust/packed_simd_2/src/codegen/math.rs -@@ -1,3 +1,3 @@ - //! Vertical math operations - --crate mod float; -+pub(crate) mod float; -diff --git a/third_party/rust/packed_simd_2/src/codegen/math/float.rs b/third_party/rust/packed_simd_2/src/codegen/math/float.rs ---- a/third_party/rust/packed_simd_2/src/codegen/math/float.rs -+++ b/third_party/rust/packed_simd_2/src/codegen/math/float.rs -@@ -1,18 +1,18 @@ - //! Vertical floating-point math operations. - #![allow(clippy::useless_transmute)] - - #[macro_use] --crate mod macros; --crate mod abs; --crate mod cos; --crate mod cos_pi; --crate mod exp; --crate mod ln; --crate mod mul_add; --crate mod mul_adde; --crate mod powf; --crate mod sin; --crate mod sin_cos_pi; --crate mod sin_pi; --crate mod sqrt; --crate mod sqrte; -+pub(crate) mod macros; -+pub(crate) mod abs; -+pub(crate) mod cos; -+pub(crate) mod cos_pi; -+pub(crate) mod exp; -+pub(crate) mod ln; -+pub(crate) mod mul_add; -+pub(crate) mod mul_adde; -+pub(crate) mod powf; -+pub(crate) mod sin; -+pub(crate) mod sin_cos_pi; -+pub(crate) mod sin_pi; -+pub(crate) mod sqrt; -+pub(crate) mod sqrte; -diff --git a/third_party/rust/packed_simd_2/src/codegen/math/float/abs.rs b/third_party/rust/packed_simd_2/src/codegen/math/float/abs.rs ---- a/third_party/rust/packed_simd_2/src/codegen/math/float/abs.rs -+++ b/third_party/rust/packed_simd_2/src/codegen/math/float/abs.rs -@@ -1,16 +1,16 @@ - //! Vertical floating-point `fabs` - #![allow(unused)] - - // FIXME 64-bit 1 elem vectors fabs - - use crate::*; - --crate trait Abs { -+pub(crate) trait Abs { - fn abs(self) -> Self; - } - - #[allow(improper_ctypes)] - extern "C" { - #[link_name = "llvm.fabs.v2f32"] - fn fabs_v2f32(x: f32x2) -> f32x2; - #[link_name = "llvm.fabs.v4f32"] -diff --git a/third_party/rust/packed_simd_2/src/codegen/math/float/cos.rs b/third_party/rust/packed_simd_2/src/codegen/math/float/cos.rs ---- a/third_party/rust/packed_simd_2/src/codegen/math/float/cos.rs -+++ b/third_party/rust/packed_simd_2/src/codegen/math/float/cos.rs -@@ -1,16 +1,16 @@ - //! Vertical floating-point `cos` - #![allow(unused)] - - // FIXME 64-bit 1 elem vector cos - - use crate::*; - --crate trait Cos { -+pub(crate) trait Cos { - fn cos(self) -> Self; - } - - #[allow(improper_ctypes)] - extern "C" { - #[link_name = "llvm.cos.v2f32"] - fn cos_v2f32(x: f32x2) -> f32x2; - #[link_name = "llvm.cos.v4f32"] -diff --git a/third_party/rust/packed_simd_2/src/codegen/math/float/cos_pi.rs b/third_party/rust/packed_simd_2/src/codegen/math/float/cos_pi.rs ---- a/third_party/rust/packed_simd_2/src/codegen/math/float/cos_pi.rs -+++ b/third_party/rust/packed_simd_2/src/codegen/math/float/cos_pi.rs -@@ -1,16 +1,16 @@ - //! Vertical floating-point `cos` - #![allow(unused)] - - // FIXME 64-bit 1 elem vectors cos_pi - - use crate::*; - --crate trait CosPi { -+pub(crate) trait CosPi { - fn cos_pi(self) -> Self; - } - - gen_unary_impl_table!(CosPi, cos_pi); - - macro_rules! impl_def { - ($vid:ident, $PI:path) => { - impl CosPi for $vid { -diff --git a/third_party/rust/packed_simd_2/src/codegen/math/float/exp.rs b/third_party/rust/packed_simd_2/src/codegen/math/float/exp.rs ---- a/third_party/rust/packed_simd_2/src/codegen/math/float/exp.rs -+++ b/third_party/rust/packed_simd_2/src/codegen/math/float/exp.rs -@@ -1,16 +1,16 @@ - //! Vertical floating-point `exp` - #![allow(unused)] - - // FIXME 64-bit expgle elem vectors misexpg - - use crate::*; - --crate trait Exp { -+pub(crate) trait Exp { - fn exp(self) -> Self; - } - - #[allow(improper_ctypes)] - extern "C" { - #[link_name = "llvm.exp.v2f32"] - fn exp_v2f32(x: f32x2) -> f32x2; - #[link_name = "llvm.exp.v4f32"] -diff --git a/third_party/rust/packed_simd_2/src/codegen/math/float/ln.rs b/third_party/rust/packed_simd_2/src/codegen/math/float/ln.rs ---- a/third_party/rust/packed_simd_2/src/codegen/math/float/ln.rs -+++ b/third_party/rust/packed_simd_2/src/codegen/math/float/ln.rs -@@ -1,16 +1,16 @@ - //! Vertical floating-point `ln` - #![allow(unused)] - - // FIXME 64-bit lngle elem vectors mislng - - use crate::*; - --crate trait Ln { -+pub(crate) trait Ln { - fn ln(self) -> Self; - } - - #[allow(improper_ctypes)] - extern "C" { - #[link_name = "llvm.log.v2f32"] - fn ln_v2f32(x: f32x2) -> f32x2; - #[link_name = "llvm.log.v4f32"] -diff --git a/third_party/rust/packed_simd_2/src/codegen/math/float/mul_add.rs b/third_party/rust/packed_simd_2/src/codegen/math/float/mul_add.rs ---- a/third_party/rust/packed_simd_2/src/codegen/math/float/mul_add.rs -+++ b/third_party/rust/packed_simd_2/src/codegen/math/float/mul_add.rs -@@ -1,15 +1,15 @@ - //! Vertical floating-point `mul_add` - #![allow(unused)] - use crate::*; - - // FIXME: 64-bit 1 element mul_add - --crate trait MulAdd { -+pub(crate) trait MulAdd { - fn mul_add(self, y: Self, z: Self) -> Self; - } - - #[cfg(not(target_arch = "s390x"))] - #[allow(improper_ctypes)] - extern "C" { - #[link_name = "llvm.fma.v2f32"] - fn fma_v2f32(x: f32x2, y: f32x2, z: f32x2) -> f32x2; -diff --git a/third_party/rust/packed_simd_2/src/codegen/math/float/mul_adde.rs b/third_party/rust/packed_simd_2/src/codegen/math/float/mul_adde.rs ---- a/third_party/rust/packed_simd_2/src/codegen/math/float/mul_adde.rs -+++ b/third_party/rust/packed_simd_2/src/codegen/math/float/mul_adde.rs -@@ -1,14 +1,14 @@ - //! Approximation for floating-point `mul_add` - use crate::*; - - // FIXME: 64-bit 1 element mul_adde - --crate trait MulAddE { -+pub(crate) trait MulAddE { - fn mul_adde(self, y: Self, z: Self) -> Self; - } - - #[cfg(not(target_arch = "s390x"))] - #[allow(improper_ctypes)] - extern "C" { - #[link_name = "llvm.fmuladd.v2f32"] - fn fmuladd_v2f32(x: f32x2, y: f32x2, z: f32x2) -> f32x2; -diff --git a/third_party/rust/packed_simd_2/src/codegen/math/float/powf.rs b/third_party/rust/packed_simd_2/src/codegen/math/float/powf.rs ---- a/third_party/rust/packed_simd_2/src/codegen/math/float/powf.rs -+++ b/third_party/rust/packed_simd_2/src/codegen/math/float/powf.rs -@@ -1,16 +1,16 @@ - //! Vertical floating-point `powf` - #![allow(unused)] - - // FIXME 64-bit powfgle elem vectors mispowfg - - use crate::*; - --crate trait Powf { -+pub(crate) trait Powf { - fn powf(self, x: Self) -> Self; - } - - #[allow(improper_ctypes)] - extern "C" { - #[link_name = "llvm.pow.v2f32"] - fn powf_v2f32(x: f32x2, y: f32x2) -> f32x2; - #[link_name = "llvm.pow.v4f32"] -diff --git a/third_party/rust/packed_simd_2/src/codegen/math/float/sin.rs b/third_party/rust/packed_simd_2/src/codegen/math/float/sin.rs ---- a/third_party/rust/packed_simd_2/src/codegen/math/float/sin.rs -+++ b/third_party/rust/packed_simd_2/src/codegen/math/float/sin.rs -@@ -1,16 +1,16 @@ - //! Vertical floating-point `sin` - #![allow(unused)] - - // FIXME 64-bit 1 elem vectors sin - - use crate::*; - --crate trait Sin { -+pub(crate) trait Sin { - fn sin(self) -> Self; - } - - #[allow(improper_ctypes)] - extern "C" { - #[link_name = "llvm.sin.v2f32"] - fn sin_v2f32(x: f32x2) -> f32x2; - #[link_name = "llvm.sin.v4f32"] -diff --git a/third_party/rust/packed_simd_2/src/codegen/math/float/sin_cos_pi.rs b/third_party/rust/packed_simd_2/src/codegen/math/float/sin_cos_pi.rs ---- a/third_party/rust/packed_simd_2/src/codegen/math/float/sin_cos_pi.rs -+++ b/third_party/rust/packed_simd_2/src/codegen/math/float/sin_cos_pi.rs -@@ -1,16 +1,16 @@ - //! Vertical floating-point `sin_cos` - #![allow(unused)] - - // FIXME 64-bit 1 elem vectors sin_cos - - use crate::*; - --crate trait SinCosPi: Sized { -+pub(crate) trait SinCosPi: Sized { - type Output; - fn sin_cos_pi(self) -> Self::Output; - } - - macro_rules! impl_def { - ($vid:ident, $PI:path) => { - impl SinCosPi for $vid { - type Output = (Self, Self); -diff --git a/third_party/rust/packed_simd_2/src/codegen/math/float/sin_pi.rs b/third_party/rust/packed_simd_2/src/codegen/math/float/sin_pi.rs ---- a/third_party/rust/packed_simd_2/src/codegen/math/float/sin_pi.rs -+++ b/third_party/rust/packed_simd_2/src/codegen/math/float/sin_pi.rs -@@ -1,16 +1,16 @@ - //! Vertical floating-point `sin_pi` - #![allow(unused)] - - // FIXME 64-bit 1 elem vectors sin_pi - - use crate::*; - --crate trait SinPi { -+pub(crate) trait SinPi { - fn sin_pi(self) -> Self; - } - - gen_unary_impl_table!(SinPi, sin_pi); - - macro_rules! impl_def { - ($vid:ident, $PI:path) => { - impl SinPi for $vid { -diff --git a/third_party/rust/packed_simd_2/src/codegen/math/float/sqrt.rs b/third_party/rust/packed_simd_2/src/codegen/math/float/sqrt.rs ---- a/third_party/rust/packed_simd_2/src/codegen/math/float/sqrt.rs -+++ b/third_party/rust/packed_simd_2/src/codegen/math/float/sqrt.rs -@@ -1,16 +1,16 @@ - //! Vertical floating-point `sqrt` - #![allow(unused)] - - // FIXME 64-bit 1 elem vectors sqrt - - use crate::*; - --crate trait Sqrt { -+pub(crate) trait Sqrt { - fn sqrt(self) -> Self; - } - - #[allow(improper_ctypes)] - extern "C" { - #[link_name = "llvm.sqrt.v2f32"] - fn sqrt_v2f32(x: f32x2) -> f32x2; - #[link_name = "llvm.sqrt.v4f32"] -diff --git a/third_party/rust/packed_simd_2/src/codegen/math/float/sqrte.rs b/third_party/rust/packed_simd_2/src/codegen/math/float/sqrte.rs ---- a/third_party/rust/packed_simd_2/src/codegen/math/float/sqrte.rs -+++ b/third_party/rust/packed_simd_2/src/codegen/math/float/sqrte.rs -@@ -1,17 +1,17 @@ - //! Vertical floating-point `sqrt` - #![allow(unused)] - - // FIXME 64-bit 1 elem vectors sqrte - - use crate::llvm::simd_fsqrt; - use crate::*; - --crate trait Sqrte { -+pub(crate) trait Sqrte { - fn sqrte(self) -> Self; - } - - gen_unary_impl_table!(Sqrte, sqrte); - - cfg_if! { - if #[cfg(all(target_arch = "x86_64", feature = "sleef-sys"))] { - use sleef_sys::*; -diff --git a/third_party/rust/packed_simd_2/src/codegen/pointer_sized_int.rs b/third_party/rust/packed_simd_2/src/codegen/pointer_sized_int.rs ---- a/third_party/rust/packed_simd_2/src/codegen/pointer_sized_int.rs -+++ b/third_party/rust/packed_simd_2/src/codegen/pointer_sized_int.rs -@@ -1,28 +1,28 @@ - //! Provides `isize` and `usize` - - use cfg_if::cfg_if; - - cfg_if! { - if #[cfg(target_pointer_width = "8")] { -- crate type isize_ = i8; -- crate type usize_ = u8; -+ pub(crate) type isize_ = i8; -+ pub(crate) type usize_ = u8; - } else if #[cfg(target_pointer_width = "16")] { -- crate type isize_ = i16; -- crate type usize_ = u16; -+ pub(crate) type isize_ = i16; -+ pub(crate) type usize_ = u16; - } else if #[cfg(target_pointer_width = "32")] { -- crate type isize_ = i32; -- crate type usize_ = u32; -+ pub(crate) type isize_ = i32; -+ pub(crate) type usize_ = u32; - - } else if #[cfg(target_pointer_width = "64")] { -- crate type isize_ = i64; -- crate type usize_ = u64; -+ pub(crate) type isize_ = i64; -+ pub(crate) type usize_ = u64; - } else if #[cfg(target_pointer_width = "64")] { -- crate type isize_ = i64; -- crate type usize_ = u64; -+ pub(crate) type isize_ = i64; -+ pub(crate) type usize_ = u64; - } else if #[cfg(target_pointer_width = "128")] { -- crate type isize_ = i128; -- crate type usize_ = u128; -+ pub(crate) type isize_ = i128; -+ pub(crate) type usize_ = u128; - } else { - compile_error!("unsupported target_pointer_width"); - } - } -diff --git a/third_party/rust/packed_simd_2/src/codegen/reductions.rs b/third_party/rust/packed_simd_2/src/codegen/reductions.rs ---- a/third_party/rust/packed_simd_2/src/codegen/reductions.rs -+++ b/third_party/rust/packed_simd_2/src/codegen/reductions.rs -@@ -1,1 +1,1 @@ --crate mod mask; -+pub(crate) mod mask; -diff --git a/third_party/rust/packed_simd_2/src/codegen/reductions/mask.rs b/third_party/rust/packed_simd_2/src/codegen/reductions/mask.rs ---- a/third_party/rust/packed_simd_2/src/codegen/reductions/mask.rs -+++ b/third_party/rust/packed_simd_2/src/codegen/reductions/mask.rs -@@ -2,21 +2,21 @@ - //! - //! Works around [LLVM bug 36702]. - //! - //! [LLVM bug 36702]: https://bugs.llvm.org/show_bug.cgi?id=36702 - #![allow(unused_macros)] - - use crate::*; - --crate trait All: crate::marker::Sized { -+pub(crate) trait All: crate::marker::Sized { - unsafe fn all(self) -> bool; - } - --crate trait Any: crate::marker::Sized { -+pub(crate) trait Any: crate::marker::Sized { - unsafe fn any(self) -> bool; - } - - #[macro_use] - mod fallback_impl; - - cfg_if! { - if #[cfg(any(target_arch = "x86", target_arch = "x86_64"))] { -diff --git a/third_party/rust/packed_simd_2/src/codegen/swap_bytes.rs b/third_party/rust/packed_simd_2/src/codegen/swap_bytes.rs ---- a/third_party/rust/packed_simd_2/src/codegen/swap_bytes.rs -+++ b/third_party/rust/packed_simd_2/src/codegen/swap_bytes.rs -@@ -1,26 +1,26 @@ - //! Horizontal swap bytes reductions. - - // FIXME: investigate using `llvm.bswap` - // https://github.com/rust-lang-nursery/packed_simd/issues/19 - - use crate::*; - --crate trait SwapBytes { -+pub(crate) trait SwapBytes { - fn swap_bytes(self) -> Self; - } - - macro_rules! impl_swap_bytes { - (v16: $($id:ident,)+) => { - $( - impl SwapBytes for $id { - #[inline] - fn swap_bytes(self) -> Self { -- unsafe { shuffle!(self, [1, 0]) } -+ shuffle!(self, [1, 0]) - } - } - )+ - }; - (v32: $($id:ident,)+) => { - $( - impl SwapBytes for $id { - #[inline] -diff --git a/third_party/rust/packed_simd_2/src/codegen/vPtr.rs b/third_party/rust/packed_simd_2/src/codegen/vPtr.rs ---- a/third_party/rust/packed_simd_2/src/codegen/vPtr.rs -+++ b/third_party/rust/packed_simd_2/src/codegen/vPtr.rs -@@ -1,16 +1,16 @@ - //! Pointer vector types - - macro_rules! impl_simd_ptr { - ([$ptr_ty:ty; $elem_count:expr]: $tuple_id:ident | $ty:ident - | $($tys:ty),*) => { - #[derive(Copy, Clone)] - #[repr(simd)] -- pub struct $tuple_id<$ty>($(crate $tys),*); -+ pub struct $tuple_id<$ty>($(pub(crate) $tys),*); - //^^^^^^^ leaked through SimdArray - - impl<$ty> crate::sealed::Seal for [$ptr_ty; $elem_count] {} - impl<$ty> crate::sealed::SimdArray for [$ptr_ty; $elem_count] { - type Tuple = $tuple_id<$ptr_ty>; - type T = $ptr_ty; - const N: usize = $elem_count; - type NT = [u32; $elem_count]; -diff --git a/third_party/rust/packed_simd_2/src/lib.rs b/third_party/rust/packed_simd_2/src/lib.rs ---- a/third_party/rust/packed_simd_2/src/lib.rs -+++ b/third_party/rust/packed_simd_2/src/lib.rs -@@ -212,24 +212,23 @@ - //! guide](https://rust-lang-nursery.github.io/packed_simd/perf-guide/) - - #![feature( - adt_const_params, - repr_simd, - rustc_attrs, - platform_intrinsics, - stdsimd, -- aarch64_target_feature, - arm_target_feature, - link_llvm_intrinsics, - core_intrinsics, - stmt_expr_attributes, -- crate_visibility_modifier, - custom_inner_attributes, - )] -+#![cfg_attr(aarch64_target_feature, feature(aarch64_target_feature))] - #![allow(non_camel_case_types, non_snake_case, - // FIXME: these types are unsound in C FFI already - // See https://github.com/rust-lang/rust/issues/53346 - improper_ctypes_definitions, - incomplete_features, - clippy::cast_possible_truncation, - clippy::cast_lossless, - clippy::cast_possible_wrap, -@@ -339,11 +338,11 @@ pub use self::api::into_bits::*; - - // Re-export the shuffle intrinsics required by the `shuffle!` macro. - #[doc(hidden)] - pub use self::codegen::llvm::{ - __shuffle_vector16, __shuffle_vector2, __shuffle_vector32, __shuffle_vector4, __shuffle_vector64, - __shuffle_vector8, - }; - --crate mod llvm { -- crate use crate::codegen::llvm::*; -+pub(crate) mod llvm { -+ pub(crate) use crate::codegen::llvm::*; - } -diff --git a/third_party/rust/packed_simd_2/src/testing.rs b/third_party/rust/packed_simd_2/src/testing.rs ---- a/third_party/rust/packed_simd_2/src/testing.rs -+++ b/third_party/rust/packed_simd_2/src/testing.rs -@@ -1,8 +1,8 @@ - //! Testing macros and other utilities. - - #[macro_use] - mod macros; - - #[cfg(test)] - #[macro_use] --crate mod utils; -+pub(crate) mod utils; - diff --git a/thunderbird/rustc_version-0.4.0.patch b/thunderbird/rustc_version-0.4.0.patch deleted file mode 100644 index b0e95daaf..000000000 --- a/thunderbird/rustc_version-0.4.0.patch +++ /dev/null @@ -1,8593 +0,0 @@ - -# HG changeset patch -# User Mike Hommey <mh+mozilla@glandium.org> -# Date 1654596092 0 -# Node ID f52e2ad948e88e2c4ce83599d379aa4a1e57334e -# Parent 969171da8cc09d4eb7c070b0ecf33bc5cc504537 -Bug 1772048 - Update rustc_version and semver crates. r=emilio,webdriver-reviewers,kinetik,whimboo - -semver 1.0 doesn't and won't support Clone on semver::Error[1], so we -convert the mozversion error type to store the string version of the -error, which is an incompatible change requiring a version bump on the -crate. - -1. https://github.com/dtolnay/semver/pull/280 - -Differential Revision: https://phabricator.services.mozilla.com/D147825 - -diff --git a/.cargo/config.in b/.cargo/config.in ---- a/.cargo/config.in -+++ b/.cargo/config.in -@@ -25,17 +25,17 @@ rev = "3bfc47d9a571d0842676043ba60716318 - [source."https://github.com/mozilla/midir.git"] - git = "https://github.com/mozilla/midir.git" - replace-with = "vendored-sources" - rev = "4c11f0ffb5d6a10de4aff40a7b81218b33b94e6f" - - [source."https://github.com/mozilla/cubeb-pulse-rs"] - git = "https://github.com/mozilla/cubeb-pulse-rs" - replace-with = "vendored-sources" --rev = "df4dc0288b07b865440f4c7e41ca49ca9ccffc63" -+rev = "1f1fe1e08e01a9a534ec7f079702a583a0899ce7" - - [source."https://github.com/mozilla/cubeb-coreaudio-rs"] - git = "https://github.com/mozilla/cubeb-coreaudio-rs" - replace-with = "vendored-sources" - rev = "44eca95823bb57e964cf7b6d9791ed2ccb4b2108" - - [source."https://github.com/mozilla/audioipc"] - git = "https://github.com/mozilla/audioipc" -diff --git a/Cargo.lock b/Cargo.lock ---- a/Cargo.lock -+++ b/Cargo.lock -@@ -1157,17 +1157,17 @@ dependencies = [ - "mach", - "ringbuf", - "triple_buffer", - ] - - [[package]] - name = "cubeb-pulse" - version = "0.4.0" --source = "git+https://github.com/mozilla/cubeb-pulse-rs?rev=df4dc0288b07b865440f4c7e41ca49..." -+source = "git+https://github.com/mozilla/cubeb-pulse-rs?rev=1f1fe1e08e01a9a534ec7f079702a5..." - dependencies = [ - "cubeb-backend", - "pulse", - "pulse-ffi", - "ringbuf", - "semver", - ] - -@@ -3399,17 +3399,17 @@ dependencies = [ - "nsstring", - "url", - "uuid", - "xpcom", - ] - - [[package]] - name = "mozversion" --version = "0.4.3" -+version = "0.5.0-alpha" - dependencies = [ - "regex", - "rust-ini", - "semver", - ] - - [[package]] - name = "mozwer_s" -@@ -4122,26 +4122,26 @@ dependencies = [ - "proc-macro2", - "quote", - "syn", - ] - - [[package]] - name = "pulse" - version = "0.3.0" --source = "git+https://github.com/mozilla/cubeb-pulse-rs?rev=df4dc0288b07b865440f4c7e41ca49..." -+source = "git+https://github.com/mozilla/cubeb-pulse-rs?rev=1f1fe1e08e01a9a534ec7f079702a5..." - dependencies = [ - "bitflags", - "pulse-ffi", - ] - - [[package]] - name = "pulse-ffi" - version = "0.1.0" --source = "git+https://github.com/mozilla/cubeb-pulse-rs?rev=df4dc0288b07b865440f4c7e41ca49..." -+source = "git+https://github.com/mozilla/cubeb-pulse-rs?rev=1f1fe1e08e01a9a534ec7f079702a5..." - dependencies = [ - "libc", - ] - - [[package]] - name = "qcms" - version = "0.2.0" - dependencies = [ -@@ -4456,19 +4456,19 @@ checksum = "7ef03e0a2b150c7a90d01faf6254 - [[package]] - name = "rustc-hash" - version = "1.1.0" - source = "registry+https://github.com/rust-lang/crates.io-index" - checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - - [[package]] - name = "rustc_version" --version = "0.2.3" --source = "registry+https://github.com/rust-lang/crates.io-index" --checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -+version = "0.4.0" -+source = "registry+https://github.com/rust-lang/crates.io-index" -+checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" - dependencies = [ - "semver", - ] - - [[package]] - name = "ryu" - version = "1.0.10" - source = "registry+https://github.com/rust-lang/crates.io-index" -@@ -4544,28 +4544,19 @@ dependencies = [ - [[package]] - name = "self_cell" - version = "0.10.2" - source = "registry+https://github.com/rust-lang/crates.io-index" - checksum = "1ef965a420fe14fdac7dd018862966a4c14094f900e1650bbc71ddd7d580c8af" - - [[package]] - name = "semver" --version = "0.9.0" --source = "registry+https://github.com/rust-lang/crates.io-index" --checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" --dependencies = [ -- "semver-parser", --] -- --[[package]] --name = "semver-parser" --version = "0.7.0" --source = "registry+https://github.com/rust-lang/crates.io-index" --checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" -+version = "1.0.9" -+source = "registry+https://github.com/rust-lang/crates.io-index" -+checksum = "8cb243bdfdb5936c8dc3c45762a19d12ab4550cdc753bc247637d4ec35a040fd" - - [[package]] - name = "serde" - version = "1.0.136" - source = "registry+https://github.com/rust-lang/crates.io-index" - checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" - dependencies = [ - "serde_derive", -diff --git a/gfx/qcms/Cargo.toml b/gfx/qcms/Cargo.toml ---- a/gfx/qcms/Cargo.toml -+++ b/gfx/qcms/Cargo.toml -@@ -17,9 +17,9 @@ c_bindings = ["libc"] - neon = [] - iccv4-enabled = [] - cmyk = [] - - [dependencies] - libc = {version = "0.2", optional = true } - - [build-dependencies] --rustc_version = "0.2" -+rustc_version = "0.4" -diff --git a/mozglue/static/rust/Cargo.toml b/mozglue/static/rust/Cargo.toml ---- a/mozglue/static/rust/Cargo.toml -+++ b/mozglue/static/rust/Cargo.toml -@@ -8,12 +8,12 @@ license = "MPL" - path = "lib.rs" - - [dependencies] - arrayvec = "0.5" - - [build-dependencies] - mozbuild = "0.1" - cc = "1" --rustc_version = "0.2" -+rustc_version = "0.4" - - [features] - moz_memory = [] -diff --git a/testing/geckodriver/Cargo.toml b/testing/geckodriver/Cargo.toml ---- a/testing/geckodriver/Cargo.toml -+++ b/testing/geckodriver/Cargo.toml -@@ -15,17 +15,17 @@ chrono = "0.4.6" - clap = { version = "3.1", default-features = false, features = ["cargo", "std", "suggestions", "wrap_help"] } - hyper = "0.14" - lazy_static = "1.0" - log = { version = "0.4", features = ["std"] } - marionette = { path = "./marionette", version="0.2.0" } - mozdevice = { path = "../mozbase/rust/mozdevice", version="0.5.0" } - mozprofile = { path = "../mozbase/rust/mozprofile", version="0.8.0" } - mozrunner = { path = "../mozbase/rust/mozrunner", version="0.14.0" } --mozversion = { path = "../mozbase/rust/mozversion", version="0.4.3" } -+mozversion = { path = "../mozbase/rust/mozversion", version="0.5.0-alpha" } - regex = { version="1.0", default-features = false, features = ["perf", "std"] } - serde = "1.0" - serde_derive = "1.0" - serde_json = "1.0" - serde_yaml = "0.8" - tempfile = "3" - url = "2.0" - uuid = { version = "0.8", features = ["v4"] } -diff --git a/testing/mozbase/rust/mozversion/Cargo.toml b/testing/mozbase/rust/mozversion/Cargo.toml ---- a/testing/mozbase/rust/mozversion/Cargo.toml -+++ b/testing/mozbase/rust/mozversion/Cargo.toml -@@ -1,14 +1,14 @@ - [package] - name = "mozversion" --version = "0.4.3" -+version = "0.5.0-alpha" - authors = ["Mozilla"] - description = "Utility for accessing Firefox version metadata" - keywords = ["mozilla", "firefox"] - repository = "https://hg.mozilla.org/mozilla-central/file/tip/testing/mozbase/rust/mozvers..." - license = "MPL-2.0" - edition = "2018" - - [dependencies] - regex = { version = "1", default-features = false, features = ["perf", "std"] } - rust-ini = "0.10" --semver = "0.9" -+semver = "1.0" -diff --git a/testing/mozbase/rust/mozversion/src/lib.rs b/testing/mozbase/rust/mozversion/src/lib.rs ---- a/testing/mozbase/rust/mozversion/src/lib.rs -+++ b/testing/mozbase/rust/mozversion/src/lib.rs -@@ -101,18 +101,18 @@ impl Version { - // The way the semver crate handles prereleases isn't what we want here - // This should be fixed in the long term by implementing our own comparison - // operators, but for now just act as if prerelease metadata was missing, - // otherwise it is almost impossible to use this with nightly - semver::Version { - major: self.major, - minor: self.minor, - patch: self.patch, -- pre: vec![], -- build: vec![], -+ pre: semver::Prerelease::EMPTY, -+ build: semver::BuildMetadata::EMPTY, - } - } - - pub fn matches(&self, version_req: &str) -> VersionResult<bool> { - let req = semver::VersionReq::parse(version_req)?; - Ok(req.matches(&self.to_semver())) - } - } -@@ -269,17 +269,17 @@ fn parse_binary_version(version_str: &st - - #[derive(Clone, Debug)] - pub enum Error { - /// Error parsing a version string - VersionError(String), - /// Error reading application metadata - MetadataError(String), - /// Error processing a string as a semver comparator -- SemVerError(semver::ReqParseError), -+ SemVerError(String), - } - - impl Display for Error { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - Error::VersionError(ref x) => { - "VersionError: ".fmt(f)?; - x.fmt(f) -@@ -291,28 +291,25 @@ impl Display for Error { - Error::SemVerError(ref e) => { - "SemVerError: ".fmt(f)?; - e.fmt(f) - } - } - } - } - --impl From<semver::ReqParseError> for Error { -- fn from(err: semver::ReqParseError) -> Error { -- Error::SemVerError(err) -+impl From<semver::Error> for Error { -+ fn from(err: semver::Error) -> Error { -+ Error::SemVerError(err.to_string()) - } - } - - impl error::Error for Error { - fn cause(&self) -> Option<&dyn error::Error> { -- match *self { -- Error::SemVerError(ref e) => Some(e), -- Error::VersionError(_) | Error::MetadataError(_) => None, -- } -+ None - } - } - - pub type VersionResult<T> = Result<T, Error>; - - #[cfg(target_os = "macos")] - mod platform { - use std::path::{Path, PathBuf}; -diff --git a/third_party/rust/cubeb-pulse/.cargo-checksum.json b/third_party/rust/cubeb-pulse/.cargo-checksum.json ---- a/third_party/rust/cubeb-pulse/.cargo-checksum.json -+++ b/third_party/rust/cubeb-pulse/.cargo-checksum.json -@@ -1,1 +1,1 @@ --{"files":{".editorconfig":"bf047bd1da10cabb99eea666d1e57c321eba4716dccb3e4ed0e2c5fe3ca53858",".github/workflows/build.yml":"95d0d2542c04f0c932f58591b92c3051db5c95657bf5f24b6a6110f7b667568d","AUTHORS":"0e0ac930a68ce2f6b876126b195add177f0d3886facb9260f4d9b69f1988f0cc","Cargo.toml":"d8f84d114794b79a02c8d93724951a0b924f4815e446d666e66877c7a90d0446","LICENSE":"44c6b5ae5ec3fe2fbc608b00e6f4896f4d2d5c7e525fcbaa3eaa3cf2f3d5a983","README.md":"0079450bb4b013bac065ed1750851e461a3710ebad1f323817da1cb82db0bc4f","src/backend/context.rs":"839fbbd90e501c9e455e6b46729f8c3cc03b368b6b45d02c82399660b7cf8289","src/backend/cork_state.rs":"4a0f1afc7d9f333dac89218cc56d7d32fbffb487cd48c1c9a4e03d79cb3b5e28","src/backend/intern.rs":"11ca424e4eb77f8eb9fd5a6717d1e791facf9743156a8534f0016fcf64d57b0f","src/backend/mod.rs":"d5da05348bf1a7f65c85b14372964a49dc4849f0aee96c75e2c18b51fb03fcaf","src/backend/stream.rs":"525e1f6be1990deef3c42d34fc4e25947be642ce242514f8e3428737146cc755","src/capi.rs":"fa0fa020f0d0efe55aa0fc3596405e8407bbe2cbe6c7a558345304e6da87994e","src/lib.rs":"b41bbdc562cbfb130ed7c1e53fe69944774f515705341d8ce48a2f82c8c0c2c5"},"package":null} -\ No newline at end of file -+{"files":{".editorconfig":"bf047bd1da10cabb99eea666d1e57c321eba4716dccb3e4ed0e2c5fe3ca53858",".github/workflows/build.yml":"95d0d2542c04f0c932f58591b92c3051db5c95657bf5f24b6a6110f7b667568d","AUTHORS":"0e0ac930a68ce2f6b876126b195add177f0d3886facb9260f4d9b69f1988f0cc","Cargo.toml":"13fe95ad27f37b8423958d78093ecff3ade9fffb28c5980604b624c2b617e5a7","LICENSE":"44c6b5ae5ec3fe2fbc608b00e6f4896f4d2d5c7e525fcbaa3eaa3cf2f3d5a983","README.md":"0079450bb4b013bac065ed1750851e461a3710ebad1f323817da1cb82db0bc4f","src/backend/context.rs":"839fbbd90e501c9e455e6b46729f8c3cc03b368b6b45d02c82399660b7cf8289","src/backend/cork_state.rs":"4a0f1afc7d9f333dac89218cc56d7d32fbffb487cd48c1c9a4e03d79cb3b5e28","src/backend/intern.rs":"11ca424e4eb77f8eb9fd5a6717d1e791facf9743156a8534f0016fcf64d57b0f","src/backend/mod.rs":"d5da05348bf1a7f65c85b14372964a49dc4849f0aee96c75e2c18b51fb03fcaf","src/backend/stream.rs":"e88a04ab7094b9df1bcdd07628369ec70ecb2062b91b0bd86f2642962814405c","src/capi.rs":"fa0fa020f0d0efe55aa0fc3596405e8407bbe2cbe6c7a558345304e6da87994e","src/lib.rs":"b41bbdc562cbfb130ed7c1e53fe69944774f515705341d8ce48a2f82c8c0c2c5"},"package":null} -\ No newline at end of file -diff --git a/third_party/rust/cubeb-pulse/Cargo.toml b/third_party/rust/cubeb-pulse/Cargo.toml ---- a/third_party/rust/cubeb-pulse/Cargo.toml -+++ b/third_party/rust/cubeb-pulse/Cargo.toml -@@ -10,10 +10,10 @@ pulse-dlopen = ["pulse-ffi/dlopen"] - - [lib] - crate-type = ["staticlib", "rlib"] - - [dependencies] - cubeb-backend = "0.10" - pulse-ffi = { path = "pulse-ffi" } - pulse = { path = "pulse-rs" } --semver = "^0.9" -+semver = "1.0" - ringbuf = "0.2" -diff --git a/third_party/rust/cubeb-pulse/src/backend/stream.rs b/third_party/rust/cubeb-pulse/src/backend/stream.rs ---- a/third_party/rust/cubeb-pulse/src/backend/stream.rs -+++ b/third_party/rust/cubeb-pulse/src/backend/stream.rs -@@ -350,16 +350,25 @@ impl<'ctx> PulseStream<'ctx> { - ptr::null_mut(), - read_frames as c_long, - ) - }; - - if got < 0 || got as usize != read_frames { - let _ = s.cancel_write(); - stm.shutdown = true; -+ if got < 0 { -+ unsafe { -+ stm.state_callback.unwrap()( -+ stm as *mut _ as *mut _, -+ stm.user_ptr, -+ ffi::CUBEB_STATE_ERROR, -+ ); -+ } -+ } - break; - } - } - } - - if read_size > 0 { - let _ = s.drop(); - } -@@ -1064,16 +1073,23 @@ impl<'ctx> PulseStream<'ctx> { - read_ptr as *const _ as *mut _, - buffer, - (size / frame_size) as c_long, - ) as i64 - }; - if got < 0 { - let _ = stm.cancel_write(); - self.shutdown = true; -+ unsafe { -+ self.state_callback.unwrap()( -+ self as *const _ as *mut _, -+ self.user_ptr, -+ ffi::CUBEB_STATE_ERROR, -+ ); -+ } - return; - } - - // If more iterations move offset of read buffer - if !input_data.is_null() { - let in_frame_size = self.input_sample_spec.frame_size(); - read_offset += (size / frame_size) * in_frame_size; - } -diff --git a/third_party/rust/rustc_version/.cargo-checksum.json b/third_party/rust/rustc_version/.cargo-checksum.json ---- a/third_party/rust/rustc_version/.cargo-checksum.json -+++ b/third_party/rust/rustc_version/.cargo-checksum.json -@@ -1,1 +1,1 @@ --{"files":{"Cargo.toml":"80b9fb136c8c2945b4875b05b0f5a4b11e4722997e751f17d8d3f241d7c684db","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5","README.md":"58bd14a1dfa1d828e6e99f35c3b7c2149d08e2d990d6ca93f92ab8ffb43275b7","src/errors.rs":"b28c2eeb1278fc3e8d68a64b177034faed67f6762335729d3a6d1e61be8fb034","src/lib.rs":"92a32673f77961724bc52b872781f06d22d166f06838c9582c5adae3c5214f51"},"package":"138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"} -\ No newline at end of file -+{"files":{"Cargo.toml":"6a2e927f37b4897e75470e62face13eff0fe846c57f8fcfb98bcd5e0fe8ed0a2","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5","README.md":"40f1138d4ddcfcfd0534429cea8dcbdcaf4a175aca1c26662f011f6e83d2fd7a","deny.toml":"22979f2da49546b27a5c892d5216bf74215987810a2d011b58870471883b9437","src/lib.rs":"bc18589948e3c04c3ffb491ffc3d4eccd8037c8e377d0bbae8aca2b21978b1de","tests/all.rs":"7b2969022feab85a948fafd331d9bb30d80357d01afaf7e0f723908e75f39e89"},"package":"bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"} -\ No newline at end of file -diff --git a/third_party/rust/rustc_version/Cargo.toml b/third_party/rust/rustc_version/Cargo.toml ---- a/third_party/rust/rustc_version/Cargo.toml -+++ b/third_party/rust/rustc_version/Cargo.toml -@@ -1,26 +1,27 @@ - # 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 -+# 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] -+edition = "2018" - name = "rustc_version" --version = "0.2.3" --authors = ["Marvin Löbel <loebel.marvin@gmail.com>"] -+version = "0.4.0" -+authors = ["Dirkjan Ochtman <dirkjan@ochtman.nl>", "Marvin Löbel <loebel.marvin@gmail.com>"] - description = "A library for querying the version of a installed rustc compiler" - documentation = "https://docs.rs/rustc_version/" - readme = "README.md" - keywords = ["version", "rustc"] - license = "MIT/Apache-2.0" - repository = "https://github.com/Kimundi/rustc-version-rs" - [dependencies.semver] --version = "0.9" --[badges.travis-ci] --repository = "Kimundi/rustc-version-rs" -+version = "1.0" -+[dev-dependencies.doc-comment] -+version = "0.3" -diff --git a/third_party/rust/rustc_version/README.md b/third_party/rust/rustc_version/README.md ---- a/third_party/rust/rustc_version/README.md -+++ b/third_party/rust/rustc_version/README.md -@@ -1,40 +1,46 @@ - rustc-version-rs --============== -+================ -+ -+[![Documentation](https://docs.rs/rustc_version/badge.svg)](https://docs.rs/rustc_version/) -+[![Crates.io](https://img.shields.io/crates/v/rustc_version.svg)](https://crates.io/crates/rustc_version) -+[![Build status](https://github.com/Kimundi/rustc-version-rs/workflows/CI/badge.svg)](https://github.com/Kimundi/rustc-version-rs/actions?query=workflow%3ACI) - - A library for querying the version of a `rustc` compiler. - - This can be used by build scripts or other tools dealing with Rust sources --to make decisions based on the version of the compiler. -+to make decisions based on the version of the compiler. Current MSRV is 1.32.0. - --[![Travis-CI Status](https://travis-ci.org/Kimundi/rustc-version-rs.png?branch=master)](https://travis-ci.org/Kimundi/rustc-version-rs) -+If this is of interest, also consider looking at these other crates: -+ -+* [autocfg](https://crates.io/crates/autocfg/), which helps with feature detection instead of depending on compiler versions -+* [rustversion](https://github.com/dtolnay/rustversion) provides a procedural macro with no other dependencies - - # Getting Started - - [rustc-version-rs is available on crates.io](https://crates.io/crates/rustc_version). - It is recommended to look there for the newest released version, as well as links to the newest builds of the docs. - - At the point of the last update of this README, the latest published version could be used like this: - - Add the following dependency to your Cargo manifest... - - ```toml - [build-dependencies] - rustc_version = "0.2" - ``` - --...and see the [docs](http://kimundi.github.io/rustc-version-rs/rustc_version/index.html) for how to use it. -+... and see the [docs](https://docs.rs/rustc_version) for how to use it. - - # Example - - ```rust - // This could be a cargo build script - --extern crate rustc_version; - use rustc_version::{version, version_meta, Channel, Version}; - - fn main() { - // Assert we haven't travelled back in time - assert!(version().unwrap().major >= 1); - - // Set cfg flags depending on release channel - match version_meta().unwrap().channel { -diff --git a/third_party/rust/rustc_version/deny.toml b/third_party/rust/rustc_version/deny.toml -new file mode 100644 ---- /dev/null -+++ b/third_party/rust/rustc_version/deny.toml -@@ -0,0 +1,3 @@ -+[licenses] -+allow-osi-fsf-free = "either" -+copyleft = "deny" -diff --git a/third_party/rust/rustc_version/src/errors.rs b/third_party/rust/rustc_version/src/errors.rs -deleted file mode 100644 ---- a/third_party/rust/rustc_version/src/errors.rs -+++ /dev/null -@@ -1,79 +0,0 @@ --use std::{self, error, fmt, io, str}; --use semver::{self, Identifier}; -- --/// The error type for this crate. --#[derive(Debug)] --pub enum Error { -- /// An error ocurrend when executing the `rustc` command. -- CouldNotExecuteCommand(io::Error), -- /// The output of `rustc -vV` was not valid utf-8. -- Utf8Error(str::Utf8Error), -- /// The output of `rustc -vV` was not in the expected format. -- UnexpectedVersionFormat, -- /// An error ocurred in parsing a `VersionReq`. -- ReqParseError(semver::ReqParseError), -- /// An error ocurred in parsing the semver. -- SemVerError(semver::SemVerError), -- /// The pre-release tag is unknown. -- UnknownPreReleaseTag(Identifier), --} --use Error::*; -- --impl fmt::Display for Error { -- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { -- use std::error::Error; -- match *self { -- CouldNotExecuteCommand(ref e) => write!(f, "{}: {}", self.description(), e), -- Utf8Error(_) => write!(f, "{}", self.description()), -- UnexpectedVersionFormat => write!(f, "{}", self.description()), -- ReqParseError(ref e) => write!(f, "{}: {}", self.description(), e), -- SemVerError(ref e) => write!(f, "{}: {}", self.description(), e), -- UnknownPreReleaseTag(ref i) => write!(f, "{}: {}", self.description(), i), -- } -- } --} -- --impl error::Error for Error { -- fn cause(&self) -> Option<&error::Error> { -- match *self { -- CouldNotExecuteCommand(ref e) => Some(e), -- Utf8Error(ref e) => Some(e), -- UnexpectedVersionFormat => None, -- ReqParseError(ref e) => Some(e), -- SemVerError(ref e) => Some(e), -- UnknownPreReleaseTag(_) => None, -- } -- } -- -- fn description(&self) -> &str { -- match *self { -- CouldNotExecuteCommand(_) => "could not execute command", -- Utf8Error(_) => "invalid UTF-8 output from `rustc -vV`", -- UnexpectedVersionFormat => "unexpected `rustc -vV` format", -- ReqParseError(_) => "error parsing version requirement", -- SemVerError(_) => "error parsing version", -- UnknownPreReleaseTag(_) => "unknown pre-release tag", -- } -- } --} -- --macro_rules! impl_from { -- ($($err_ty:ty => $variant:ident),* $(,)*) => { -- $( -- impl From<$err_ty> for Error { -- fn from(e: $err_ty) -> Error { -- Error::$variant(e) -- } -- } -- )* -- } --} -- --impl_from! { -- str::Utf8Error => Utf8Error, -- semver::SemVerError => SemVerError, -- semver::ReqParseError => ReqParseError, --} -- --/// The result type for this crate. --pub type Result<T> = std::result::Result<T, Error>; -diff --git a/third_party/rust/rustc_version/src/lib.rs b/third_party/rust/rustc_version/src/lib.rs ---- a/third_party/rust/rustc_version/src/lib.rs -+++ b/third_party/rust/rustc_version/src/lib.rs -@@ -17,73 +17,138 @@ - //! It calls `$RUSTC --version -v` and parses the output, falling - //! back to `rustc` if `$RUSTC` is not set. - //! - //! # Example - //! - //! ```rust - //! // This could be a cargo build script - //! --//! extern crate rustc_version; - //! use rustc_version::{version, version_meta, Channel, Version}; - //! --//! fn main() { --//! // Assert we haven't travelled back in time --//! assert!(version().unwrap().major >= 1); -+//! // Assert we haven't travelled back in time -+//! assert!(version().unwrap().major >= 1); - //! --//! // Set cfg flags depending on release channel --//! match version_meta().unwrap().channel { --//! Channel::Stable => { --//! println!("cargo:rustc-cfg=RUSTC_IS_STABLE"); --//! } --//! Channel::Beta => { --//! println!("cargo:rustc-cfg=RUSTC_IS_BETA"); --//! } --//! Channel::Nightly => { --//! println!("cargo:rustc-cfg=RUSTC_IS_NIGHTLY"); --//! } --//! Channel::Dev => { --//! println!("cargo:rustc-cfg=RUSTC_IS_DEV"); --//! } -+//! // Set cfg flags depending on release channel -+//! match version_meta().unwrap().channel { -+//! Channel::Stable => { -+//! println!("cargo:rustc-cfg=RUSTC_IS_STABLE"); -+//! } -+//! Channel::Beta => { -+//! println!("cargo:rustc-cfg=RUSTC_IS_BETA"); - //! } -+//! Channel::Nightly => { -+//! println!("cargo:rustc-cfg=RUSTC_IS_NIGHTLY"); -+//! } -+//! Channel::Dev => { -+//! println!("cargo:rustc-cfg=RUSTC_IS_DEV"); -+//! } -+//! } - //! --//! // Check for a minimum version --//! if version().unwrap() >= Version::parse("1.4.0").unwrap() { --//! println!("cargo:rustc-cfg=compiler_has_important_bugfix"); --//! } -+//! // Check for a minimum version -+//! if version().unwrap() >= Version::parse("1.4.0").unwrap() { -+//! println!("cargo:rustc-cfg=compiler_has_important_bugfix"); - //! } - //! ``` - --extern crate semver; --use semver::Identifier; -+#[cfg(test)] -+#[macro_use] -+extern crate doc_comment; -+ -+#[cfg(test)] -+doctest!("../README.md"); -+ -+use std::collections::HashMap; - use std::process::Command; --use std::{env, str}; --use std::ffi::OsString; -+use std::{env, error, fmt, io, num, str}; -+use std::{ffi::OsString, str::FromStr}; - - // Convenience re-export to allow version comparison without needing to add - // semver crate. - pub use semver::Version; - --mod errors; --pub use errors::{Error, Result}; -+use Error::*; - - /// Release channel of the compiler. - #[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)] - pub enum Channel { - /// Development release channel - Dev, - /// Nightly release channel - Nightly, - /// Beta release channel - Beta, - /// Stable release channel - Stable, - } - --/// Rustc version plus metada like git short hash and build date. -+/// LLVM version -+/// -+/// LLVM's version numbering scheme is not semver compatible until version 4.0 -+/// -+/// rustc [just prints the major and minor versions], so other parts of the version are not included. -+/// -+/// [just prints the major and minor versions]: https://github.com/rust-lang/rust/blob/b5c9e2448c9ace53ad5c11585803894651b18... -+#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)] -+pub struct LlvmVersion { -+ // fields must be ordered major, minor for comparison to be correct -+ /// Major version -+ pub major: u64, -+ /// Minor version -+ pub minor: u64, -+ // TODO: expose micro version here -+} -+ -+impl fmt::Display for LlvmVersion { -+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { -+ write!(f, "{}.{}", self.major, self.minor) -+ } -+} -+ -+impl FromStr for LlvmVersion { -+ type Err = LlvmVersionParseError; -+ -+ fn from_str(s: &str) -> Result<Self, Self::Err> { -+ let mut parts = s -+ .split('.') -+ .map(|part| -> Result<u64, LlvmVersionParseError> { -+ if part == "0" { -+ Ok(0) -+ } else if part.starts_with('0') { -+ Err(LlvmVersionParseError::ComponentMustNotHaveLeadingZeros) -+ } else if part.starts_with('-') || part.starts_with('+') { -+ Err(LlvmVersionParseError::ComponentMustNotHaveSign) -+ } else { -+ Ok(part.parse()?) -+ } -+ }); -+ -+ let major = parts.next().unwrap()?; -+ let mut minor = 0; -+ -+ if let Some(part) = parts.next() { -+ minor = part?; -+ } else if major < 4 { -+ // LLVM versions earlier than 4.0 have significant minor versions, so require the minor version in this case. -+ return Err(LlvmVersionParseError::MinorVersionRequiredBefore4); -+ } -+ -+ if let Some(Err(e)) = parts.next() { -+ return Err(e); -+ } -+ -+ if parts.next().is_some() { -+ return Err(LlvmVersionParseError::TooManyComponents); -+ } -+ -+ Ok(Self { major, minor }) -+ } -+} -+ -+/// Rustc version plus metadata like git short hash and build date. - #[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)] - pub struct VersionMeta { - /// Version of the compiler - pub semver: Version, - - /// Git short hash of the build of the compiler - pub commit_hash: Option<String>, - -@@ -96,27 +161,37 @@ pub struct VersionMeta { - /// Release channel of the compiler - pub channel: Channel, - - /// Host target triple of the compiler - pub host: String, - - /// Short version string of the compiler - pub short_version_string: String, -+ -+ /// Version of LLVM used by the compiler -+ pub llvm_version: Option<LlvmVersion>, - } - - impl VersionMeta { - /// Returns the version metadata for `cmd`, which should be a `rustc` command. -- pub fn for_command(cmd: Command) -> Result<VersionMeta> { -- let mut cmd = cmd; -+ pub fn for_command(mut cmd: Command) -> Result<VersionMeta> { -+ let out = cmd -+ .arg("-vV") -+ .output() -+ .map_err(Error::CouldNotExecuteCommand)?; - -- let out = cmd.arg("-vV").output().map_err(Error::CouldNotExecuteCommand)?; -- let out = str::from_utf8(&out.stdout)?; -+ if !out.status.success() { -+ return Err(Error::CommandError { -+ stdout: String::from_utf8_lossy(&out.stdout).into(), -+ stderr: String::from_utf8_lossy(&out.stderr).into(), -+ }); -+ } - -- version_meta_for(out) -+ version_meta_for(str::from_utf8(&out.stdout)?) - } - } - - /// Returns the `rustc` SemVer version. - pub fn version() -> Result<Version> { - Ok(version_meta()?.semver) - } - -@@ -127,221 +202,216 @@ pub fn version_meta() -> Result<VersionM - - VersionMeta::for_command(Command::new(cmd)) - } - - /// Parses a "rustc -vV" output string and returns - /// the SemVer version and additional metadata - /// like the git short hash and build date. - pub fn version_meta_for(verbose_version_string: &str) -> Result<VersionMeta> { -- let out: Vec<_> = verbose_version_string.lines().collect(); -- -- if !(out.len() >= 6 && out.len() <= 8) { -- return Err(Error::UnexpectedVersionFormat); -- } -+ let mut map = HashMap::new(); -+ for (i, line) in verbose_version_string.lines().enumerate() { -+ if i == 0 { -+ map.insert("short", line); -+ continue; -+ } - -- let short_version_string = out[0]; -+ let mut parts = line.splitn(2, ": "); -+ let key = match parts.next() { -+ Some(key) => key, -+ None => continue, -+ }; - -- fn expect_prefix<'a>(line: &'a str, prefix: &str) -> Result<&'a str> { -- if line.starts_with(prefix) { -- Ok(&line[prefix.len()..]) -- } else { -- Err(Error::UnexpectedVersionFormat) -+ if let Some(value) = parts.next() { -+ map.insert(key, value); - } - } - -- let commit_hash = match expect_prefix(out[2], "commit-hash: ")? { -- "unknown" => None, -- hash => Some(hash.to_owned()), -- }; -+ let short_version_string = expect_key("short", &map)?; -+ let host = expect_key("host", &map)?; -+ let release = expect_key("release", &map)?; -+ let semver: Version = release.parse()?; - -- let commit_date = match expect_prefix(out[3], "commit-date: ")? { -- "unknown" => None, -- hash => Some(hash.to_owned()), -+ let channel = match semver.pre.split('.').next().unwrap() { -+ "" => Channel::Stable, -+ "dev" => Channel::Dev, -+ "beta" => Channel::Beta, -+ "nightly" => Channel::Nightly, -+ x => return Err(Error::UnknownPreReleaseTag(x.to_owned())), - }; - -- // Handle that the build date may or may not be present. -- let mut idx = 4; -- let mut build_date = None; -- if out[idx].starts_with("build-date") { -- build_date = match expect_prefix(out[idx], "build-date: ")? { -- "unknown" => None, -- s => Some(s.to_owned()), -- }; -- idx += 1; -- } -- -- let host = expect_prefix(out[idx], "host: ")?; -- idx += 1; -- let release = expect_prefix(out[idx], "release: ")?; -- -- let semver: Version = release.parse()?; -- -- let channel = if semver.pre.is_empty() { -- Channel::Stable -- } else { -- match semver.pre[0] { -- Identifier::AlphaNumeric(ref s) if s == "dev" => Channel::Dev, -- Identifier::AlphaNumeric(ref s) if s == "beta" => Channel::Beta, -- Identifier::AlphaNumeric(ref s) if s == "nightly" => Channel::Nightly, -- ref x => return Err(Error::UnknownPreReleaseTag(x.clone())), -- } -+ let commit_hash = expect_key_or_unknown("commit-hash", &map)?; -+ let commit_date = expect_key_or_unknown("commit-date", &map)?; -+ let build_date = map -+ .get("build-date") -+ .filter(|&v| *v != "unknown") -+ .map(|&v| String::from(v)); -+ let llvm_version = match map.get("LLVM version") { -+ Some(&v) => Some(v.parse()?), -+ None => None, - }; - - Ok(VersionMeta { -- semver: semver, -- commit_hash: commit_hash, -- commit_date: commit_date, -- build_date: build_date, -- channel: channel, -- host: host.into(), -- short_version_string: short_version_string.into(), -+ semver, -+ commit_hash, -+ commit_date, -+ build_date, -+ channel, -+ host, -+ short_version_string, -+ llvm_version, - }) - } - --#[test] --fn smoketest() { -- let v = version().unwrap(); -- assert!(v.major >= 1); -+fn expect_key_or_unknown(key: &str, map: &HashMap<&str, &str>) -> Result<Option<String>, Error> { -+ match map.get(key) { -+ Some(&v) if v == "unknown" => Ok(None), -+ Some(&v) => Ok(Some(String::from(v))), -+ None => Err(Error::UnexpectedVersionFormat), -+ } -+} - -- let v = version_meta().unwrap(); -- assert!(v.semver.major >= 1); -- -- assert!(version().unwrap() >= Version::parse("1.0.0").unwrap()); -+fn expect_key(key: &str, map: &HashMap<&str, &str>) -> Result<String, Error> { -+ map.get(key) -+ .map(|&v| String::from(v)) -+ .ok_or(Error::UnexpectedVersionFormat) - } - --#[test] --fn parse_unexpected() { -- let res = version_meta_for( --"rustc 1.0.0 (a59de37e9 2015-05-13) (built 2015-05-14) --binary: rustc --commit-hash: a59de37e99060162a2674e3ff45409ac73595c0e --commit-date: 2015-05-13 --rust-birthday: 2015-05-14 --host: x86_64-unknown-linux-gnu --release: 1.0.0"); -+/// LLVM Version Parse Error -+#[derive(Debug)] -+pub enum LlvmVersionParseError { -+ /// An error occurred in parsing a version component as an integer -+ ParseIntError(num::ParseIntError), -+ /// A version component must not have leading zeros -+ ComponentMustNotHaveLeadingZeros, -+ /// A version component has a sign -+ ComponentMustNotHaveSign, -+ /// Minor version component must be zero on LLVM versions later than 4.0 -+ MinorVersionMustBeZeroAfter4, -+ /// Minor version component is required on LLVM versions earlier than 4.0 -+ MinorVersionRequiredBefore4, -+ /// Too many components -+ TooManyComponents, -+} - -- assert!(match res { -- Err(Error::UnexpectedVersionFormat) => true, -- _ => false, -- }); -- -+impl From<num::ParseIntError> for LlvmVersionParseError { -+ fn from(e: num::ParseIntError) -> Self { -+ LlvmVersionParseError::ParseIntError(e) -+ } - } - --#[test] --fn parse_1_0_0() { -- let version = version_meta_for( --"rustc 1.0.0 (a59de37e9 2015-05-13) (built 2015-05-14) --binary: rustc --commit-hash: a59de37e99060162a2674e3ff45409ac73595c0e --commit-date: 2015-05-13 --build-date: 2015-05-14 --host: x86_64-unknown-linux-gnu --release: 1.0.0").unwrap(); -- -- assert_eq!(version.semver, Version::parse("1.0.0").unwrap()); -- assert_eq!(version.commit_hash, Some("a59de37e99060162a2674e3ff45409ac73595c0e".into())); -- assert_eq!(version.commit_date, Some("2015-05-13".into())); -- assert_eq!(version.build_date, Some("2015-05-14".into())); -- assert_eq!(version.channel, Channel::Stable); -- assert_eq!(version.host, "x86_64-unknown-linux-gnu"); -- assert_eq!(version.short_version_string, "rustc 1.0.0 (a59de37e9 2015-05-13) (built 2015-05-14)"); -+impl fmt::Display for LlvmVersionParseError { -+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { -+ match self { -+ LlvmVersionParseError::ParseIntError(e) => { -+ write!(f, "error parsing LLVM version component: {}", e) -+ } -+ LlvmVersionParseError::ComponentMustNotHaveLeadingZeros => { -+ write!(f, "a version component must not have leading zeros") -+ } -+ LlvmVersionParseError::ComponentMustNotHaveSign => { -+ write!(f, "a version component must not have a sign") -+ } -+ LlvmVersionParseError::MinorVersionMustBeZeroAfter4 => write!( -+ f, -+ "LLVM's minor version component must be 0 for versions greater than 4.0" -+ ), -+ LlvmVersionParseError::MinorVersionRequiredBefore4 => write!( -+ f, -+ "LLVM's minor version component is required for versions less than 4.0" -+ ), -+ LlvmVersionParseError::TooManyComponents => write!(f, "too many version components"), -+ } -+ } - } - -- --#[test] --fn parse_unknown() { -- let version = version_meta_for( --"rustc 1.3.0 --binary: rustc --commit-hash: unknown --commit-date: unknown --host: x86_64-unknown-linux-gnu --release: 1.3.0").unwrap(); -- -- assert_eq!(version.semver, Version::parse("1.3.0").unwrap()); -- assert_eq!(version.commit_hash, None); -- assert_eq!(version.commit_date, None); -- assert_eq!(version.channel, Channel::Stable); -- assert_eq!(version.host, "x86_64-unknown-linux-gnu"); -- assert_eq!(version.short_version_string, "rustc 1.3.0"); -+impl error::Error for LlvmVersionParseError { -+ fn source(&self) -> Option<&(dyn error::Error + 'static)> { -+ match self { -+ LlvmVersionParseError::ParseIntError(e) => Some(e), -+ LlvmVersionParseError::ComponentMustNotHaveLeadingZeros -+ | LlvmVersionParseError::ComponentMustNotHaveSign -+ | LlvmVersionParseError::MinorVersionMustBeZeroAfter4 -+ | LlvmVersionParseError::MinorVersionRequiredBefore4 -+ | LlvmVersionParseError::TooManyComponents => None, -+ } -+ } - } - --#[test] --fn parse_nightly() { -- let version = version_meta_for( --"rustc 1.5.0-nightly (65d5c0833 2015-09-29) --binary: rustc --commit-hash: 65d5c083377645a115c4ac23a620d3581b9562b6 --commit-date: 2015-09-29 --host: x86_64-unknown-linux-gnu --release: 1.5.0-nightly").unwrap(); -- -- assert_eq!(version.semver, Version::parse("1.5.0-nightly").unwrap()); -- assert_eq!(version.commit_hash, Some("65d5c083377645a115c4ac23a620d3581b9562b6".into())); -- assert_eq!(version.commit_date, Some("2015-09-29".into())); -- assert_eq!(version.channel, Channel::Nightly); -- assert_eq!(version.host, "x86_64-unknown-linux-gnu"); -- assert_eq!(version.short_version_string, "rustc 1.5.0-nightly (65d5c0833 2015-09-29)"); --} -- --#[test] --fn parse_stable() { -- let version = version_meta_for( --"rustc 1.3.0 (9a92aaf19 2015-09-15) --binary: rustc --commit-hash: 9a92aaf19a64603b02b4130fe52958cc12488900 --commit-date: 2015-09-15 --host: x86_64-unknown-linux-gnu --release: 1.3.0").unwrap(); -- -- assert_eq!(version.semver, Version::parse("1.3.0").unwrap()); -- assert_eq!(version.commit_hash, Some("9a92aaf19a64603b02b4130fe52958cc12488900".into())); -- assert_eq!(version.commit_date, Some("2015-09-15".into())); -- assert_eq!(version.channel, Channel::Stable); -- assert_eq!(version.host, "x86_64-unknown-linux-gnu"); -- assert_eq!(version.short_version_string, "rustc 1.3.0 (9a92aaf19 2015-09-15)"); -+/// The error type for this crate. -+#[derive(Debug)] -+pub enum Error { -+ /// An error occurred while trying to find the `rustc` to run. -+ CouldNotExecuteCommand(io::Error), -+ /// Error output from the command that was run. -+ CommandError { -+ /// stdout output from the command -+ stdout: String, -+ /// stderr output from the command -+ stderr: String, -+ }, -+ /// The output of `rustc -vV` was not valid utf-8. -+ Utf8Error(str::Utf8Error), -+ /// The output of `rustc -vV` was not in the expected format. -+ UnexpectedVersionFormat, -+ /// An error occurred in parsing the semver. -+ SemVerError(semver::Error), -+ /// The pre-release tag is unknown. -+ UnknownPreReleaseTag(String), -+ /// An error occurred in parsing a `LlvmVersion`. -+ LlvmVersionError(LlvmVersionParseError), - } - --#[test] --fn parse_1_16_0_nightly() { -- let version = version_meta_for( --"rustc 1.16.0-nightly (5d994d8b7 2017-01-05) --binary: rustc --commit-hash: 5d994d8b7e482e87467d4a521911477bd8284ce3 --commit-date: 2017-01-05 --host: x86_64-unknown-linux-gnu --release: 1.16.0-nightly --LLVM version: 3.9").unwrap(); -- -- assert_eq!(version.semver, Version::parse("1.16.0-nightly").unwrap()); -- assert_eq!(version.commit_hash, Some("5d994d8b7e482e87467d4a521911477bd8284ce3".into())); -- assert_eq!(version.commit_date, Some("2017-01-05".into())); -- assert_eq!(version.channel, Channel::Nightly); -- assert_eq!(version.host, "x86_64-unknown-linux-gnu"); -- assert_eq!(version.short_version_string, "rustc 1.16.0-nightly (5d994d8b7 2017-01-05)"); -+impl fmt::Display for Error { -+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { -+ match *self { -+ CouldNotExecuteCommand(ref e) => write!(f, "could not execute command: {}", e), -+ CommandError { -+ ref stdout, -+ ref stderr, -+ } => write!( -+ f, -+ "error from command -- stderr:\n\n{}\n\nstderr:\n\n{}", -+ stderr, stdout, -+ ), -+ Utf8Error(_) => write!(f, "invalid UTF-8 output from `rustc -vV`"), -+ UnexpectedVersionFormat => write!(f, "unexpected `rustc -vV` format"), -+ SemVerError(ref e) => write!(f, "error parsing version: {}", e), -+ UnknownPreReleaseTag(ref i) => write!(f, "unknown pre-release tag: {}", i), -+ LlvmVersionError(ref e) => write!(f, "error parsing LLVM's version: {}", e), -+ } -+ } - } - --/* --#[test] --fn version_matches_replacement() { -- let f = |s1: &str, s2: &str| { -- let a = Version::parse(s1).unwrap(); -- let b = Version::parse(s2).unwrap(); -- println!("{} <= {} : {}", s1, s2, a <= b); -- }; -- -- println!(); -+impl error::Error for Error { -+ fn source(&self) -> Option<&(dyn error::Error + 'static)> { -+ match *self { -+ CouldNotExecuteCommand(ref e) => Some(e), -+ CommandError { .. } => None, -+ Utf8Error(ref e) => Some(e), -+ UnexpectedVersionFormat => None, -+ SemVerError(ref e) => Some(e), -+ UnknownPreReleaseTag(_) => None, -+ LlvmVersionError(ref e) => Some(e), -+ } -+ } -+} - -- f("1.5.0", "1.5.0"); -- f("1.5.0-nightly", "1.5.0"); -- f("1.5.0", "1.5.0-nightly"); -- f("1.5.0-nightly", "1.5.0-nightly"); -+macro_rules! impl_from { -+ ($($err_ty:ty => $variant:ident),* $(,)*) => { -+ $( -+ impl From<$err_ty> for Error { -+ fn from(e: $err_ty) -> Error { -+ Error::$variant(e) -+ } -+ } -+ )* -+ } -+} - -- f("1.5.0", "1.6.0"); -- f("1.5.0-nightly", "1.6.0"); -- f("1.5.0", "1.6.0-nightly"); -- f("1.5.0-nightly", "1.6.0-nightly"); -+impl_from! { -+ str::Utf8Error => Utf8Error, -+ semver::Error => SemVerError, -+ LlvmVersionParseError => LlvmVersionError, -+} - -- panic!(); -- --} --*/ -+/// The result type for this crate. -+pub type Result<T, E = Error> = std::result::Result<T, E>; -diff --git a/third_party/rust/rustc_version/tests/all.rs b/third_party/rust/rustc_version/tests/all.rs -new file mode 100644 ---- /dev/null -+++ b/third_party/rust/rustc_version/tests/all.rs -@@ -0,0 +1,456 @@ -+#![allow(clippy::match_like_matches_macro)] -+ -+use std::process::Command; -+ -+use rustc_version::{ -+ version, version_meta, version_meta_for, Channel, Error, LlvmVersion, LlvmVersionParseError, -+ Version, VersionMeta, -+}; -+ -+#[test] -+fn rustc_error() { -+ let mut cmd = Command::new("rustc"); -+ cmd.arg("--FOO"); -+ let stderr = match VersionMeta::for_command(cmd) { -+ Err(Error::CommandError { stdout: _, stderr }) => stderr, -+ _ => panic!("command error expected"), -+ }; -+ assert_eq!(stderr, "error: Unrecognized option: \'FOO\'\n\n"); -+} -+ -+#[test] -+fn smoketest() { -+ let v = version().unwrap(); -+ assert!(v.major >= 1); -+ -+ let v = version_meta().unwrap(); -+ assert!(v.semver.major >= 1); -+ -+ assert!(version().unwrap() >= Version::parse("1.0.0").unwrap()); -+} -+ -+#[test] -+fn parse_1_0_0() { -+ let version = version_meta_for( -+ "rustc 1.0.0 (a59de37e9 2015-05-13) (built 2015-05-14) -+binary: rustc -+commit-hash: a59de37e99060162a2674e3ff45409ac73595c0e -+commit-date: 2015-05-13 -+build-date: 2015-05-14 -+host: x86_64-unknown-linux-gnu -+release: 1.0.0", -+ ) -+ .unwrap(); -+ -+ assert_eq!(version.semver, Version::parse("1.0.0").unwrap()); -+ assert_eq!( -+ version.commit_hash, -+ Some("a59de37e99060162a2674e3ff45409ac73595c0e".into()) -+ ); -+ assert_eq!(version.commit_date, Some("2015-05-13".into())); -+ assert_eq!(version.build_date, Some("2015-05-14".into())); -+ assert_eq!(version.channel, Channel::Stable); -+ assert_eq!(version.host, "x86_64-unknown-linux-gnu"); -+ assert_eq!( -+ version.short_version_string, -+ "rustc 1.0.0 (a59de37e9 2015-05-13) (built 2015-05-14)" -+ ); -+ assert_eq!(version.llvm_version, None); -+} -+ -+#[test] -+fn parse_unknown() { -+ let version = version_meta_for( -+ "rustc 1.3.0 -+binary: rustc -+commit-hash: unknown -+commit-date: unknown -+host: x86_64-unknown-linux-gnu -+release: 1.3.0", -+ ) -+ .unwrap(); -+ -+ assert_eq!(version.semver, Version::parse("1.3.0").unwrap()); -+ assert_eq!(version.commit_hash, None); -+ assert_eq!(version.commit_date, None); -+ assert_eq!(version.channel, Channel::Stable); -+ assert_eq!(version.host, "x86_64-unknown-linux-gnu"); -+ assert_eq!(version.short_version_string, "rustc 1.3.0"); -+ assert_eq!(version.llvm_version, None); -+} -+ -+#[test] -+fn parse_nightly() { -+ let version = version_meta_for( -+ "rustc 1.5.0-nightly (65d5c0833 2015-09-29) -+binary: rustc -+commit-hash: 65d5c083377645a115c4ac23a620d3581b9562b6 -+commit-date: 2015-09-29 -+host: x86_64-unknown-linux-gnu -+release: 1.5.0-nightly", -+ ) -+ .unwrap(); -+ -+ assert_eq!(version.semver, Version::parse("1.5.0-nightly").unwrap()); -+ assert_eq!( -+ version.commit_hash, -+ Some("65d5c083377645a115c4ac23a620d3581b9562b6".into()) -+ ); -+ assert_eq!(version.commit_date, Some("2015-09-29".into())); -+ assert_eq!(version.channel, Channel::Nightly); -+ assert_eq!(version.host, "x86_64-unknown-linux-gnu"); -+ assert_eq!( -+ version.short_version_string, -+ "rustc 1.5.0-nightly (65d5c0833 2015-09-29)" -+ ); -+ assert_eq!(version.llvm_version, None); -+} -+ -+#[test] -+fn parse_stable() { -+ let version = version_meta_for( -+ "rustc 1.3.0 (9a92aaf19 2015-09-15) -+binary: rustc -+commit-hash: 9a92aaf19a64603b02b4130fe52958cc12488900 -+commit-date: 2015-09-15 -+host: x86_64-unknown-linux-gnu -+release: 1.3.0", -+ ) -+ .unwrap(); -+ -+ assert_eq!(version.semver, Version::parse("1.3.0").unwrap()); -+ assert_eq!( -+ version.commit_hash, -+ Some("9a92aaf19a64603b02b4130fe52958cc12488900".into()) -+ ); -+ assert_eq!(version.commit_date, Some("2015-09-15".into())); -+ assert_eq!(version.channel, Channel::Stable); -+ assert_eq!(version.host, "x86_64-unknown-linux-gnu"); -+ assert_eq!( -+ version.short_version_string, -+ "rustc 1.3.0 (9a92aaf19 2015-09-15)" -+ ); -+ assert_eq!(version.llvm_version, None); -+} -+ -+#[test] -+fn parse_1_16_0_nightly() { -+ let version = version_meta_for( -+ "rustc 1.16.0-nightly (5d994d8b7 2017-01-05) -+binary: rustc -+commit-hash: 5d994d8b7e482e87467d4a521911477bd8284ce3 -+commit-date: 2017-01-05 -+host: x86_64-unknown-linux-gnu -+release: 1.16.0-nightly -+LLVM version: 3.9", -+ ) -+ .unwrap(); -+ -+ assert_eq!(version.semver, Version::parse("1.16.0-nightly").unwrap()); -+ assert_eq!( -+ version.commit_hash, -+ Some("5d994d8b7e482e87467d4a521911477bd8284ce3".into()) -+ ); -+ assert_eq!(version.commit_date, Some("2017-01-05".into())); -+ assert_eq!(version.channel, Channel::Nightly); -+ assert_eq!(version.host, "x86_64-unknown-linux-gnu"); -+ assert_eq!( -+ version.short_version_string, -+ "rustc 1.16.0-nightly (5d994d8b7 2017-01-05)" -+ ); -+ assert_eq!( -+ version.llvm_version, -+ Some(LlvmVersion { major: 3, minor: 9 }) -+ ); -+} -+ -+#[test] -+fn parse_1_47_0_stable() { -+ let version = version_meta_for( -+ "rustc 1.47.0 (18bf6b4f0 2020-10-07) -+binary: rustc -+commit-hash: 18bf6b4f01a6feaf7259ba7cdae58031af1b7b39 -+commit-date: 2020-10-07 -+host: powerpc64le-unknown-linux-gnu -+release: 1.47.0 -+LLVM version: 11.0", -+ ) -+ .unwrap(); -+ -+ assert_eq!(version.semver, Version::parse("1.47.0").unwrap()); -+ assert_eq!( -+ version.commit_hash, -+ Some("18bf6b4f01a6feaf7259ba7cdae58031af1b7b39".into()) -+ ); -+ assert_eq!(version.commit_date, Some("2020-10-07".into())); -+ assert_eq!(version.channel, Channel::Stable); -+ assert_eq!(version.host, "powerpc64le-unknown-linux-gnu"); -+ assert_eq!( -+ version.short_version_string, -+ "rustc 1.47.0 (18bf6b4f0 2020-10-07)" -+ ); -+ assert_eq!( -+ version.llvm_version, -+ Some(LlvmVersion { -+ major: 11, -+ minor: 0, -+ }) -+ ); -+} -+ -+#[test] -+fn parse_llvm_micro() { -+ let version = version_meta_for( -+ "rustc 1.51.0-nightly (4253153db 2021-01-17) -+binary: rustc -+commit-hash: 4253153db205251f72ea4493687a31e04a2a8ca0 -+commit-date: 2021-01-17 -+host: x86_64-pc-windows-msvc -+release: 1.51.0-nightly -+LLVM version: 11.0.1", -+ ) -+ .unwrap(); -+ -+ assert_eq!(version.semver, Version::parse("1.51.0-nightly").unwrap()); -+ assert_eq!( -+ version.commit_hash.unwrap(), -+ "4253153db205251f72ea4493687a31e04a2a8ca0" -+ ); -+ assert_eq!(version.commit_date.unwrap(), "2021-01-17"); -+ assert_eq!(version.host, "x86_64-pc-windows-msvc"); -+ assert_eq!( -+ version.short_version_string, -+ "rustc 1.51.0-nightly (4253153db 2021-01-17)" -+ ); -+ assert_eq!( -+ version.llvm_version, -+ Some(LlvmVersion { -+ major: 11, -+ minor: 0 -+ }) -+ ); -+} -+ -+#[test] -+fn parse_debian_buster() { -+ let version = version_meta_for( -+ "rustc 1.41.1 -+binary: rustc -+commit-hash: unknown -+commit-date: unknown -+host: powerpc64le-unknown-linux-gnu -+release: 1.41.1 -+LLVM version: 7.0", -+ ) -+ .unwrap(); -+ -+ assert_eq!(version.semver, Version::parse("1.41.1").unwrap()); -+ assert_eq!(version.commit_hash, None); -+ assert_eq!(version.commit_date, None); -+ assert_eq!(version.channel, Channel::Stable); -+ assert_eq!(version.host, "powerpc64le-unknown-linux-gnu"); -+ assert_eq!(version.short_version_string, "rustc 1.41.1"); -+ assert_eq!( -+ version.llvm_version, -+ Some(LlvmVersion { major: 7, minor: 0 }) -+ ); -+} -+ -+#[test] -+fn parse_termux() { -+ let version = version_meta_for( -+ "rustc 1.46.0 -+binary: rustc -+commit-hash: unknown -+commit-date: unknown -+host: aarch64-linux-android -+release: 1.46.0 -+LLVM version: 10.0", -+ ) -+ .unwrap(); -+ -+ assert_eq!(version.semver, Version::parse("1.46.0").unwrap()); -+ assert_eq!(version.commit_hash, None); -+ assert_eq!(version.commit_date, None); -+ assert_eq!(version.channel, Channel::Stable); -+ assert_eq!(version.host, "aarch64-linux-android"); -+ assert_eq!(version.short_version_string, "rustc 1.46.0"); -+ assert_eq!( -+ version.llvm_version, -+ Some(LlvmVersion { -+ major: 10, -+ minor: 0, -+ }) -+ ); -+} -+ -+#[test] -+fn parse_llvm_version_empty() { -+ let res: Result<LlvmVersion, _> = "".parse(); -+ assert!(match res { -+ Err(LlvmVersionParseError::ParseIntError(_)) => true, -+ _ => false, -+ }); -+} -+ -+#[test] -+fn parse_llvm_version_invalid_char() { -+ let res: Result<LlvmVersion, _> = "A".parse(); -+ assert!(match res { -+ Err(LlvmVersionParseError::ParseIntError(_)) => true, -+ _ => false, -+ }); -+} -+ -+#[test] -+fn parse_llvm_version_overflow() { -+ let res: Result<LlvmVersion, _> = "9999999999999999999999999999999".parse(); -+ assert!(match res { -+ Err(LlvmVersionParseError::ParseIntError(_)) => true, -+ _ => false, -+ }); -+} -+ -+#[test] -+fn parse_llvm_version_leading_zero_on_zero() { -+ let res: Result<LlvmVersion, _> = "00".parse(); -+ assert!(match res { -+ Err(LlvmVersionParseError::ComponentMustNotHaveLeadingZeros) => true, -+ _ => false, -+ }); -+} -+ -+#[test] -+fn parse_llvm_version_leading_zero_on_nonzero() { -+ let res: Result<LlvmVersion, _> = "01".parse(); -+ assert!(match res { -+ Err(LlvmVersionParseError::ComponentMustNotHaveLeadingZeros) => true, -+ _ => false, -+ }); -+} -+ -+#[test] -+fn parse_llvm_version_4_components() { -+ let res: Result<LlvmVersion, _> = "4.0.0.0".parse(); -+ -+ assert!(match res { -+ Err(LlvmVersionParseError::TooManyComponents) => true, -+ _ => false, -+ }); -+} -+ -+#[test] -+fn parse_llvm_version_component_sign_plus() { -+ let res: Result<LlvmVersion, _> = "1.+3".parse(); -+ -+ assert!(match res { -+ Err(LlvmVersionParseError::ComponentMustNotHaveSign) => true, -+ _ => false, -+ }); -+} -+ -+#[test] -+fn parse_llvm_version_component_sign_minus() { -+ let res: Result<LlvmVersion, _> = "1.-3".parse(); -+ -+ assert!(match res { -+ Err(LlvmVersionParseError::ComponentMustNotHaveSign) => true, -+ _ => false, -+ }); -+} -+ -+#[test] -+fn parse_llvm_version_3() { -+ let res: Result<LlvmVersion, _> = "3".parse(); -+ -+ assert!(match res { -+ Err(LlvmVersionParseError::MinorVersionRequiredBefore4) => true, -+ _ => false, -+ }); -+} -+ -+#[test] -+fn parse_llvm_version_5() { -+ let v: LlvmVersion = "5".parse().unwrap(); -+ assert_eq!(v, LlvmVersion { major: 5, minor: 0 }); -+} -+ -+#[test] -+fn parse_llvm_version_5_0() { -+ let v: LlvmVersion = "5.0".parse().unwrap(); -+ assert_eq!(v, LlvmVersion { major: 5, minor: 0 }); -+} -+ -+#[test] -+fn parse_llvm_version_4_0() { -+ let v: LlvmVersion = "4.0".parse().unwrap(); -+ assert_eq!(v, LlvmVersion { major: 4, minor: 0 }); -+} -+ -+#[test] -+fn parse_llvm_version_3_0() { -+ let v: LlvmVersion = "3.0".parse().unwrap(); -+ assert_eq!(v, LlvmVersion { major: 3, minor: 0 }); -+} -+ -+#[test] -+fn parse_llvm_version_3_9() { -+ let v: LlvmVersion = "3.9".parse().unwrap(); -+ assert_eq!(v, LlvmVersion { major: 3, minor: 9 }); -+} -+ -+#[test] -+fn parse_llvm_version_11_0() { -+ let v: LlvmVersion = "11.0".parse().unwrap(); -+ assert_eq!( -+ v, -+ LlvmVersion { -+ major: 11, -+ minor: 0 -+ } -+ ); -+} -+ -+#[test] -+fn parse_llvm_version_11() { -+ let v: LlvmVersion = "11".parse().unwrap(); -+ assert_eq!( -+ v, -+ LlvmVersion { -+ major: 11, -+ minor: 0 -+ } -+ ); -+} -+ -+#[test] -+fn test_llvm_version_comparison() { -+ // check that field order is correct -+ assert!(LlvmVersion { major: 3, minor: 9 } < LlvmVersion { major: 4, minor: 0 }); -+} -+ -+/* -+#[test] -+fn version_matches_replacement() { -+ let f = |s1: &str, s2: &str| { -+ let a = Version::parse(s1).unwrap(); -+ let b = Version::parse(s2).unwrap(); -+ println!("{} <= {} : {}", s1, s2, a <= b); -+ }; -+ -+ println!(); -+ -+ f("1.5.0", "1.5.0"); -+ f("1.5.0-nightly", "1.5.0"); -+ f("1.5.0", "1.5.0-nightly"); -+ f("1.5.0-nightly", "1.5.0-nightly"); -+ -+ f("1.5.0", "1.6.0"); -+ f("1.5.0-nightly", "1.6.0"); -+ f("1.5.0", "1.6.0-nightly"); -+ f("1.5.0-nightly", "1.6.0-nightly"); -+ -+ panic!(); -+ -+} -+*/ -diff --git a/third_party/rust/semver-parser/.cargo-checksum.json b/third_party/rust/semver-parser/.cargo-checksum.json -deleted file mode 100644 ---- a/third_party/rust/semver-parser/.cargo-checksum.json -+++ /dev/null -@@ -1,1 +0,0 @@ --{"files":{"Cargo.toml":"67597114802114d2a7fdb457c1cf5f7e0c951b21e287c6a47b9a86b9028cf64d","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"d38feaa4f9468cd1e0ece22e0ad2eadfe6195a9a0a3843b7c722d5c7d81804fb","src/common.rs":"dc42336abd34e19ca9f732f33657e106f98dcc8c10d4c2564bc4f160cb31926e","src/lib.rs":"3ac8ef5a280344a25cb18ac386034c0fee8d64060fa14af5e25ed49f0cb2fd9e","src/range.rs":"3596f048d466d43887aff1e8c8c834476672a4627631ed35379c35466b5f02ec","src/recognize.rs":"9f16eda9fcd7d8af7eee4c3b89c611bd648040273fde6b35778f8a50b004c8b1","src/version.rs":"dbd91a4e4fd92a0aa9eb4f858ecbc1ecd680aa60572cc2ad2085e5c5c30e5b77"},"package":"388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"} -\ No newline at end of file -diff --git a/third_party/rust/semver-parser/Cargo.toml b/third_party/rust/semver-parser/Cargo.toml -deleted file mode 100644 ---- a/third_party/rust/semver-parser/Cargo.toml -+++ /dev/null -@@ -1,11 +0,0 @@ --[package] --name = "semver-parser" --version = "0.7.0" --authors = ["Steve Klabnik <steve@steveklabnik.com>"] --license = "MIT/Apache-2.0" --repository = "https://github.com/steveklabnik/semver-parser" --homepage = "https://github.com/steveklabnik/semver-parser" --documentation = "https://docs.rs/semver-parser" --description = """ --Parsing of the semver spec. --""" -diff --git a/third_party/rust/semver-parser/LICENSE-APACHE b/third_party/rust/semver-parser/LICENSE-APACHE -deleted file mode 100644 ---- a/third_party/rust/semver-parser/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. -diff --git a/third_party/rust/semver-parser/LICENSE-MIT b/third_party/rust/semver-parser/LICENSE-MIT -deleted file mode 100644 ---- a/third_party/rust/semver-parser/LICENSE-MIT -+++ /dev/null -@@ -1,25 +0,0 @@ --Copyright (c) 2016 Steve Klabnik -- --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. -diff --git a/third_party/rust/semver-parser/src/common.rs b/third_party/rust/semver-parser/src/common.rs -deleted file mode 100644 ---- a/third_party/rust/semver-parser/src/common.rs -+++ /dev/null -@@ -1,66 +0,0 @@ --use version::Identifier; --use recognize::{Recognize, Alt, OneOrMore, Inclusive, OneByte}; --use std::str::from_utf8; -- --// by the time we get here, we know that it's all valid characters, so this doesn't need to return --// a result or anything --fn parse_meta(s: &str) -> Vec<Identifier> { -- // Originally, I wanted to implement this method via calling parse, but parse is tolerant of -- // leading zeroes, and we want anything with leading zeroes to be considered alphanumeric, not -- // numeric. So the strategy is to check with a recognizer first, and then call parse once -- // we've determined that it's a number without a leading zero. -- s.split(".") -- .map(|part| { -- // another wrinkle: we made sure that any number starts with a -- // non-zero. But there's a problem: an actual zero is a number, yet -- // gets left out by this heuristic. So let's also check for the -- // single, lone zero. -- if is_alpha_numeric(part) { -- Identifier::AlphaNumeric(part.to_string()) -- } else { -- // we can unwrap here because we know it is only digits due to the regex -- Identifier::Numeric(part.parse().unwrap()) -- } -- }).collect() --} -- --// parse optional metadata (preceded by the prefix character) --pub fn parse_optional_meta(s: &[u8], prefix_char: u8)-> Result<(Vec<Identifier>, usize), String> { -- if let Some(len) = prefix_char.p(s) { -- let start = len; -- if let Some(len) = letters_numbers_dash_dot(&s[start..]) { -- let end = start + len; -- Ok((parse_meta(from_utf8(&s[start..end]).unwrap()), end)) -- } else { -- Err("Error parsing prerelease".to_string()) -- } -- } else { -- Ok((Vec::new(), 0)) -- } --} -- --pub fn is_alpha_numeric(s: &str) -> bool { -- if let Some((_val, len)) = numeric_identifier(s.as_bytes()) { -- // Return true for number with leading zero -- // Note: doing it this way also handily makes overflow fail over. -- len != s.len() -- } else { -- true -- } --} -- --// Note: could plumb overflow error up to return value as Result --pub fn numeric_identifier(s: &[u8]) -> Option<(u64, usize)> { -- if let Some(len) = Alt(b'0', OneOrMore(Inclusive(b'0'..b'9'))).p(s) { -- from_utf8(&s[0..len]).unwrap().parse().ok().map(|val| (val, len)) -- } else { -- None -- } --} -- --pub fn letters_numbers_dash_dot(s: &[u8]) -> Option<usize> { -- OneOrMore(OneByte(|c| c == b'-' || c == b'.' || -- (b'0' <= c && c <= b'9') || -- (b'a' <= c && c <= b'z') || -- (b'A' <= c && c <= b'Z'))).p(s) --} -diff --git a/third_party/rust/semver-parser/src/lib.rs b/third_party/rust/semver-parser/src/lib.rs -deleted file mode 100644 ---- a/third_party/rust/semver-parser/src/lib.rs -+++ /dev/null -@@ -1,8 +0,0 @@ --pub mod version; --pub mod range; -- --// for private stuff the two share --mod common; -- --// for recognizer combinators --mod recognize; -diff --git a/third_party/rust/semver-parser/src/range.rs b/third_party/rust/semver-parser/src/range.rs -deleted file mode 100644 ---- a/third_party/rust/semver-parser/src/range.rs -+++ /dev/null -@@ -1,696 +0,0 @@ --use common::{self, numeric_identifier, letters_numbers_dash_dot}; --use version::Identifier; --use std::str::{FromStr, from_utf8}; --use recognize::*; -- --#[derive(Debug)] --pub struct VersionReq { -- pub predicates: Vec<Predicate>, --} -- --#[derive(PartialEq,Debug)] --pub enum WildcardVersion { -- Major, -- Minor, -- Patch, --} -- --#[derive(PartialEq,Debug)] --pub enum Op { -- Ex, // Exact -- Gt, // Greater than -- GtEq, // Greater than or equal to -- Lt, // Less than -- LtEq, // Less than or equal to -- Tilde, // e.g. ~1.0.0 -- Compatible, // compatible by definition of semver, indicated by ^ -- Wildcard(WildcardVersion), // x.y.*, x.*, * --} -- --impl FromStr for Op { -- type Err = String; -- -- fn from_str(s: &str) -> Result<Op, String> { -- match s { -- "=" => Ok(Op::Ex), -- ">" => Ok(Op::Gt), -- ">=" => Ok(Op::GtEq), -- "<" => Ok(Op::Lt), -- "<=" => Ok(Op::LtEq), -- "~" => Ok(Op::Tilde), -- "^" => Ok(Op::Compatible), -- _ => Err(String::from("Could not parse Op")), -- } -- } --} -- --#[derive(PartialEq,Debug)] --pub struct Predicate { -- pub op: Op, -- pub major: u64, -- pub minor: Option<u64>, -- pub patch: Option<u64>, -- pub pre: Vec<Identifier>, --} -- --fn numeric_or_wild(s: &[u8]) -> Option<(Option<u64>, usize)> { -- if let Some((val, len)) = numeric_identifier(s) { -- Some((Some(val), len)) -- } else if let Some(len) = OneOf(b"*xX").p(s) { -- Some((None, len)) -- } else { -- None -- } --} -- --fn dot_numeric_or_wild(s: &[u8]) -> Option<(Option<u64>, usize)> { -- b'.'.p(s).and_then(|len| -- numeric_or_wild(&s[len..]).map(|(val, len2)| (val, len + len2)) -- ) --} -- --fn operation(s: &[u8]) -> Option<(Op, usize)> { -- if let Some(len) = "=".p(s) { -- Some((Op::Ex, len)) -- } else if let Some(len) = ">=".p(s) { -- Some((Op::GtEq, len)) -- } else if let Some(len) = ">".p(s) { -- Some((Op::Gt, len)) -- } else if let Some(len) = "<=".p(s) { -- Some((Op::LtEq, len)) -- } else if let Some(len) = "<".p(s) { -- Some((Op::Lt, len)) -- } else if let Some(len) = "~".p(s) { -- Some((Op::Tilde, len)) -- } else if let Some(len) = "^".p(s) { -- Some((Op::Compatible, len)) -- } else { -- None -- } --} -- --fn whitespace(s: &[u8]) -> Option<usize> { -- ZeroOrMore(OneOf(b"\t\r\n ")).p(s) --} -- --pub fn parse_predicate(range: &str) -> Result<Predicate, String> { -- let s = range.trim().as_bytes(); -- let mut i = 0; -- let mut operation = if let Some((op, len)) = operation(&s[i..]) { -- i += len; -- op -- } else { -- // operations default to Compatible -- Op::Compatible -- }; -- if let Some(len) = whitespace.p(&s[i..]) { -- i += len; -- } -- let major = if let Some((major, len)) = numeric_identifier(&s[i..]) { -- i += len; -- major -- } else { -- return Err("Error parsing major version number: ".to_string()); -- }; -- let minor = if let Some((minor, len)) = dot_numeric_or_wild(&s[i..]) { -- i += len; -- if minor.is_none() { -- operation = Op::Wildcard(WildcardVersion::Minor); -- } -- minor -- } else { -- None -- }; -- let patch = if let Some((patch, len)) = dot_numeric_or_wild(&s[i..]) { -- i += len; -- if patch.is_none() { -- operation = Op::Wildcard(WildcardVersion::Patch); -- } -- patch -- } else { -- None -- }; -- let (pre, pre_len) = common::parse_optional_meta(&s[i..], b'-')?; -- i += pre_len; -- if let Some(len) = (b'+', letters_numbers_dash_dot).p(&s[i..]) { -- i += len; -- } -- if i != s.len() { -- return Err("Extra junk after valid predicate: ".to_string() + -- from_utf8(&s[i..]).unwrap()); -- } -- Ok(Predicate { -- op: operation, -- major: major, -- minor: minor, -- patch: patch, -- pre: pre, -- }) --} -- --pub fn parse(ranges: &str) -> Result<VersionReq, String> { -- // null is an error -- if ranges == "\0" { -- return Err(String::from("Null is not a valid VersionReq")); -- } -- -- // an empty range is a major version wildcard -- // so is a lone * or x of either capitalization -- if (ranges == "") -- || (ranges == "*") -- || (ranges == "x") -- || (ranges == "X") { -- return Ok(VersionReq { -- predicates: vec![Predicate { -- op: Op::Wildcard(WildcardVersion::Major), -- major: 0, -- minor: None, -- patch: None, -- pre: Vec::new(), -- }], -- }); -- } -- -- -- let ranges = ranges.trim(); -- -- let predicates: Result<Vec<_>, String> = ranges -- .split(",") -- .map(|range| { -- parse_predicate(range) -- }) -- .collect(); -- -- let predicates = try!(predicates); -- -- if predicates.len() == 0 { -- return Err(String::from("VersionReq did not parse properly")); -- } -- -- Ok(VersionReq { -- predicates: predicates, -- }) --} -- --#[cfg(test)] --mod tests { -- use super::*; -- use range; -- use version::Identifier; -- -- #[test] -- fn test_parsing_default() { -- let r = range::parse("1.0.0").unwrap(); -- -- assert_eq!(Predicate { -- op: Op::Compatible, -- major: 1, -- minor: Some(0), -- patch: Some(0), -- pre: Vec::new(), -- }, -- r.predicates[0] -- ); -- } -- -- #[test] -- fn test_parsing_exact_01() { -- let r = range::parse("=1.0.0").unwrap(); -- -- assert_eq!(Predicate { -- op: Op::Ex, -- major: 1, -- minor: Some(0), -- patch: Some(0), -- pre: Vec::new(), -- }, -- r.predicates[0] -- ); -- } -- -- #[test] -- fn test_parsing_exact_02() { -- let r = range::parse("=0.9.0").unwrap(); -- -- assert_eq!(Predicate { -- op: Op::Ex, -- major: 0, -- minor: Some(9), -- patch: Some(0), -- pre: Vec::new(), -- }, -- r.predicates[0] -- ); -- } -- -- #[test] -- fn test_parsing_exact_03() { -- let r = range::parse("=0.1.0-beta2.a").unwrap(); -- -- assert_eq!(Predicate { -- op: Op::Ex, -- major: 0, -- minor: Some(1), -- patch: Some(0), -- pre: vec![Identifier::AlphaNumeric(String::from("beta2")), -- Identifier::AlphaNumeric(String::from("a"))], -- }, -- r.predicates[0] -- ); -- } -- -- #[test] -- pub fn test_parsing_greater_than() { -- let r = range::parse("> 1.0.0").unwrap(); -- -- assert_eq!(Predicate { -- op: Op::Gt, -- major: 1, -- minor: Some(0), -- patch: Some(0), -- pre: Vec::new(), -- }, -- r.predicates[0] -- ); -- } -- -- #[test] -- pub fn test_parsing_greater_than_01() { -- let r = range::parse(">= 1.0.0").unwrap(); -- -- assert_eq!(Predicate { -- op: Op::GtEq, -- major: 1, -- minor: Some(0), -- patch: Some(0), -- pre: Vec::new(), -- }, -- r.predicates[0] -- ); -- } -- -- #[test] -- pub fn test_parsing_greater_than_02() { -- let r = range::parse(">= 2.1.0-alpha2").unwrap(); -- -- assert_eq!(Predicate { -- op: Op::GtEq, -- major: 2, -- minor: Some(1), -- patch: Some(0), -- pre: vec![Identifier::AlphaNumeric(String::from("alpha2"))], -- }, -- r.predicates[0] -- ); -- } -- -- #[test] -- pub fn test_parsing_less_than() { -- let r = range::parse("< 1.0.0").unwrap(); -- -- assert_eq!(Predicate { -- op: Op::Lt, -- major: 1, -- minor: Some(0), -- patch: Some(0), -- pre: Vec::new(), -- }, -- r.predicates[0] -- ); -- } -- -- #[test] -- pub fn test_parsing_less_than_eq() { -- let r = range::parse("<= 2.1.0-alpha2").unwrap(); -- -- assert_eq!(Predicate { -- op: Op::LtEq, -- major: 2, -- minor: Some(1), -- patch: Some(0), -- pre: vec![Identifier::AlphaNumeric(String::from("alpha2"))], -- }, -- r.predicates[0] -- ); -- } -- -- #[test] -- pub fn test_parsing_tilde() { -- let r = range::parse("~1").unwrap(); -- -- assert_eq!(Predicate { -- op: Op::Tilde, -- major: 1, -- minor: None, -- patch: None, -- pre: Vec::new(), -- }, -- r.predicates[0] -- ); -- } -- -- #[test] -- pub fn test_parsing_compatible() { -- let r = range::parse("^0").unwrap(); -- -- assert_eq!(Predicate { -- op: Op::Compatible, -- major: 0, -- minor: None, -- patch: None, -- pre: Vec::new(), -- }, -- r.predicates[0] -- ); -- } -- -- #[test] -- fn test_parsing_blank() { -- let r = range::parse("").unwrap(); -- -- assert_eq!(Predicate { -- op: Op::Wildcard(WildcardVersion::Major), -- major: 0, -- minor: None, -- patch: None, -- pre: Vec::new(), -- }, -- r.predicates[0] -- ); -- } -- -- #[test] -- fn test_parsing_wildcard() { -- let r = range::parse("*").unwrap(); -- -- assert_eq!(Predicate { -- op: Op::Wildcard(WildcardVersion::Major), -- major: 0, -- minor: None, -- patch: None, -- pre: Vec::new(), -- }, -- r.predicates[0] -- ); -- } -- -- #[test] -- fn test_parsing_x() { -- let r = range::parse("x").unwrap(); -- -- assert_eq!(Predicate { -- op: Op::Wildcard(WildcardVersion::Major), -- major: 0, -- minor: None, -- patch: None, -- pre: Vec::new(), -- }, -- r.predicates[0] -- ); -- } -- -- #[test] -- fn test_parsing_capital_x() { -- let r = range::parse("X").unwrap(); -- -- assert_eq!(Predicate { -- op: Op::Wildcard(WildcardVersion::Major), -- major: 0, -- minor: None, -- patch: None, -- pre: Vec::new(), -- }, -- r.predicates[0] -- ); -- } -- -- #[test] -- fn test_parsing_minor_wildcard_star() { -- let r = range::parse("1.*").unwrap(); -- -- assert_eq!(Predicate { -- op: Op::Wildcard(WildcardVersion::Minor), -- major: 1, -- minor: None, -- patch: None, -- pre: Vec::new(), -- }, -- r.predicates[0] -- ); -- } -- -- #[test] -- fn test_parsing_minor_wildcard_x() { -- let r = range::parse("1.x").unwrap(); -- -- assert_eq!(Predicate { -- op: Op::Wildcard(WildcardVersion::Minor), -- major: 1, -- minor: None, -- patch: None, -- pre: Vec::new(), -- }, -- r.predicates[0] -- ); -- } -- -- #[test] -- fn test_parsing_minor_wildcard_capital_x() { -- let r = range::parse("1.X").unwrap(); -- -- assert_eq!(Predicate { -- op: Op::Wildcard(WildcardVersion::Minor), -- major: 1, -- minor: None, -- patch: None, -- pre: Vec::new(), -- }, -- r.predicates[0] -- ); -- } -- -- #[test] -- fn test_parsing_patch_wildcard_star() { -- let r = range::parse("1.2.*").unwrap(); -- -- assert_eq!(Predicate { -- op: Op::Wildcard(WildcardVersion::Patch), -- major: 1, -- minor: Some(2), -- patch: None, -- pre: Vec::new(), -- }, -- r.predicates[0] -- ); -- } -- -- #[test] -- fn test_parsing_patch_wildcard_x() { -- let r = range::parse("1.2.x").unwrap(); -- -- assert_eq!(Predicate { -- op: Op::Wildcard(WildcardVersion::Patch), -- major: 1, -- minor: Some(2), -- patch: None, -- pre: Vec::new(), -- }, -- r.predicates[0] -- ); -- } -- -- #[test] -- fn test_parsing_patch_wildcard_capital_x() { -- let r = range::parse("1.2.X").unwrap(); -- -- assert_eq!(Predicate { -- op: Op::Wildcard(WildcardVersion::Patch), -- major: 1, -- minor: Some(2), -- patch: None, -- pre: Vec::new(), -- }, -- r.predicates[0] -- ); -- } -- -- #[test] -- pub fn test_multiple_01() { -- let r = range::parse("> 0.0.9, <= 2.5.3").unwrap(); -- -- assert_eq!(Predicate { -- op: Op::Gt, -- major: 0, -- minor: Some(0), -- patch: Some(9), -- pre: Vec::new(), -- }, -- r.predicates[0] -- ); -- -- assert_eq!(Predicate { -- op: Op::LtEq, -- major: 2, -- minor: Some(5), -- patch: Some(3), -- pre: Vec::new(), -- }, -- r.predicates[1] -- ); -- } -- -- #[test] -- pub fn test_multiple_02() { -- let r = range::parse("0.3.0, 0.4.0").unwrap(); -- -- assert_eq!(Predicate { -- op: Op::Compatible, -- major: 0, -- minor: Some(3), -- patch: Some(0), -- pre: Vec::new(), -- }, -- r.predicates[0] -- ); -- -- assert_eq!(Predicate { -- op: Op::Compatible, -- major: 0, -- minor: Some(4), -- patch: Some(0), -- pre: Vec::new(), -- }, -- r.predicates[1] -- ); -- } -- -- #[test] -- pub fn test_multiple_03() { -- let r = range::parse("<= 0.2.0, >= 0.5.0").unwrap(); -- -- assert_eq!(Predicate { -- op: Op::LtEq, -- major: 0, -- minor: Some(2), -- patch: Some(0), -- pre: Vec::new(), -- }, -- r.predicates[0] -- ); -- -- assert_eq!(Predicate { -- op: Op::GtEq, -- major: 0, -- minor: Some(5), -- patch: Some(0), -- pre: Vec::new(), -- }, -- r.predicates[1] -- ); -- } -- -- #[test] -- pub fn test_multiple_04() { -- let r = range::parse("0.1.0, 0.1.4, 0.1.6").unwrap(); -- -- assert_eq!(Predicate { -- op: Op::Compatible, -- major: 0, -- minor: Some(1), -- patch: Some(0), -- pre: Vec::new(), -- }, -- r.predicates[0] -- ); -- -- assert_eq!(Predicate { -- op: Op::Compatible, -- major: 0, -- minor: Some(1), -- patch: Some(4), -- pre: Vec::new(), -- }, -- r.predicates[1] -- ); -- -- assert_eq!(Predicate { -- op: Op::Compatible, -- major: 0, -- minor: Some(1), -- patch: Some(6), -- pre: Vec::new(), -- }, -- r.predicates[2] -- ); -- } -- -- #[test] -- pub fn test_multiple_05() { -- let r = range::parse(">=0.5.1-alpha3, <0.6").unwrap(); -- -- assert_eq!(Predicate { -- op: Op::GtEq, -- major: 0, -- minor: Some(5), -- patch: Some(1), -- pre: vec![Identifier::AlphaNumeric(String::from("alpha3"))], -- }, -- r.predicates[0] -- ); -- -- assert_eq!(Predicate { -- op: Op::Lt, -- major: 0, -- minor: Some(6), -- patch: None, -- pre: Vec::new(), -- }, -- r.predicates[1] -- ); -- } -- -- #[test] -- fn test_parse_build_metadata_with_predicate() { -- assert_eq!(range::parse("^1.2.3+meta").unwrap().predicates[0].op, -- Op::Compatible); -- assert_eq!(range::parse("~1.2.3+meta").unwrap().predicates[0].op, -- Op::Tilde); -- assert_eq!(range::parse("=1.2.3+meta").unwrap().predicates[0].op, -- Op::Ex); -- assert_eq!(range::parse("<=1.2.3+meta").unwrap().predicates[0].op, -- Op::LtEq); -- assert_eq!(range::parse(">=1.2.3+meta").unwrap().predicates[0].op, -- Op::GtEq); -- assert_eq!(range::parse("<1.2.3+meta").unwrap().predicates[0].op, -- Op::Lt); -- assert_eq!(range::parse(">1.2.3+meta").unwrap().predicates[0].op, -- Op::Gt); -- } -- -- #[test] -- pub fn test_parse_errors() { -- assert!(range::parse("\0").is_err()); -- assert!(range::parse(">= >= 0.0.2").is_err()); -- assert!(range::parse(">== 0.0.2").is_err()); -- assert!(range::parse("a.0.0").is_err()); -- assert!(range::parse("1.0.0-").is_err()); -- assert!(range::parse(">=").is_err()); -- assert!(range::parse("> 0.1.0,").is_err()); -- assert!(range::parse("> 0.3.0, ,").is_err()); -- } -- -- #[test] -- pub fn test_large_major_version() { -- assert!(range::parse("18446744073709551617.0.0").is_err()); -- } -- -- #[test] -- pub fn test_large_minor_version() { -- assert!(range::parse("0.18446744073709551617.0").is_err()); -- } -- -- #[test] -- pub fn test_large_patch_version() { -- assert!(range::parse("0.0.18446744073709551617").is_err()); -- } --} -diff --git a/third_party/rust/semver-parser/src/recognize.rs b/third_party/rust/semver-parser/src/recognize.rs -deleted file mode 100644 ---- a/third_party/rust/semver-parser/src/recognize.rs -+++ /dev/null -@@ -1,154 +0,0 @@ --// Copyright 2017 Google Inc. All rights reserved. --// --// Licensed under either of MIT or Apache License, Version 2.0, --// at your option. --// --// Use of this source code is governed by a MIT-style --// license that can be found in the LICENSE file or at --// https://opensource.org/licenses/MIT. --// --// 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. -- --//! Simple recognizer combinators. -- --// This version is similar to a similar one in the "lang" module of --// xi-editor, but is stripped down to only the needed combinators. -- --use std::ops; -- --pub trait Recognize { -- fn p(&self, s: &[u8]) -> Option<usize>; --} -- --impl<F: Fn(&[u8]) -> Option<usize>> Recognize for F { -- #[inline(always)] -- fn p(&self, s: &[u8]) -> Option<usize> { -- self(s) -- } --} -- --pub struct OneByte<F>(pub F); -- --impl<F: Fn(u8) -> bool> Recognize for OneByte<F> { -- #[inline(always)] -- fn p(&self, s: &[u8]) -> Option<usize> { -- if s.is_empty() || !self.0(s[0]) { -- None -- } else { -- Some(1) -- } -- } --} -- --impl Recognize for u8 { -- #[inline(always)] -- fn p(&self, s: &[u8]) -> Option<usize> { -- OneByte(|b| b == *self).p(s) -- } --} -- --/// Use Inclusive(a..b) to indicate an inclusive range. When a...b syntax becomes --/// stable, we can get rid of this and switch to that. --pub struct Inclusive<T>(pub T); -- --impl Recognize for Inclusive<ops::Range<u8>> { -- #[inline(always)] -- fn p(&self, s: &[u8]) -> Option<usize> { -- OneByte(|x| x >= self.0.start && x <= self.0.end).p(s) -- } --} -- --impl<'a> Recognize for &'a [u8] { -- #[inline(always)] -- fn p(&self, s: &[u8]) -> Option<usize> { -- let len = self.len(); -- if s.len() >= len && &s[..len] == *self { -- Some(len) -- } else { -- None -- } -- } --} -- --impl<'a> Recognize for &'a str { -- #[inline(always)] -- fn p(&self, s: &[u8]) -> Option<usize> { -- self.as_bytes().p(s) -- } --} -- --impl<P1: Recognize, P2: Recognize> Recognize for (P1, P2) { -- #[inline(always)] -- fn p(&self, s: &[u8]) -> Option<usize> { -- self.0.p(s).and_then(|len1| -- self.1.p(&s[len1..]).map(|len2| -- len1 + len2)) -- } --} -- --/// Choice from two heterogeneous alternatives. --pub struct Alt<P1, P2>(pub P1, pub P2); -- --impl<P1: Recognize, P2: Recognize> Recognize for Alt<P1, P2> { -- #[inline(always)] -- fn p(&self, s: &[u8]) -> Option<usize> { -- self.0.p(s).or_else(|| self.1.p(s)) -- } --} -- --/// Choice from a homogenous slice of parsers. --pub struct OneOf<'a, P: 'a>(pub &'a [P]); -- --impl<'a, P: Recognize> Recognize for OneOf<'a, P> { -- #[inline] -- fn p(&self, s: &[u8]) -> Option<usize> { -- for ref p in self.0 { -- if let Some(len) = p.p(s) { -- return Some(len); -- } -- } -- None -- } --} -- --pub struct OneOrMore<P>(pub P); -- --impl<P: Recognize> Recognize for OneOrMore<P> { -- #[inline] -- fn p(&self, s: &[u8]) -> Option<usize> { -- let mut i = 0; -- let mut count = 0; -- while let Some(len) = self.0.p(&s[i..]) { -- i += len; -- count += 1; -- } -- if count >= 1 { -- Some(i) -- } else { -- None -- } -- } --} -- --pub struct ZeroOrMore<P>(pub P); -- --impl<P: Recognize> Recognize for ZeroOrMore<P> { -- #[inline] -- fn p(&self, s: &[u8]) -> Option<usize> { -- let mut i = 0; -- while let Some(len) = self.0.p(&s[i..]) { -- i += len; -- } -- Some(i) -- } --} -diff --git a/third_party/rust/semver-parser/src/version.rs b/third_party/rust/semver-parser/src/version.rs -deleted file mode 100644 ---- a/third_party/rust/semver-parser/src/version.rs -+++ /dev/null -@@ -1,365 +0,0 @@ --use std::fmt; --use std::str::from_utf8; -- --use recognize::*; -- --use common::{self, numeric_identifier}; -- --#[derive(Clone, Debug, PartialEq, Eq)] --pub struct Version { -- pub major: u64, -- pub minor: u64, -- pub patch: u64, -- pub pre: Vec<Identifier>, -- pub build: Vec<Identifier>, --} -- --#[derive(Clone, Debug, PartialEq, Eq)] --pub enum Identifier { -- /// An identifier that's solely numbers. -- Numeric(u64), -- /// An identifier with letters and numbers. -- AlphaNumeric(String), --} -- --pub fn parse(version: &str) -> Result<Version, String> { -- let s = version.trim().as_bytes(); -- let mut i = 0; -- let major = if let Some((major, len)) = numeric_identifier(&s[i..]) { -- i += len; -- major -- } else { -- return Err("Error parsing major identifier".to_string()); -- }; -- if let Some(len) = b'.'.p(&s[i..]) { -- i += len; -- } else { -- return Err("Expected dot".to_string()); -- } -- let minor = if let Some((minor, len)) = numeric_identifier(&s[i..]) { -- i += len; -- minor -- } else { -- return Err("Error parsing minor identifier".to_string()); -- }; -- if let Some(len) = b'.'.p(&s[i..]) { -- i += len; -- } else { -- return Err("Expected dot".to_string()); -- } -- let patch = if let Some((patch, len)) = numeric_identifier(&s[i..]) { -- i += len; -- patch -- } else { -- return Err("Error parsing patch identifier".to_string()); -- }; -- let (pre, pre_len) = common::parse_optional_meta(&s[i..], b'-')?; -- i += pre_len; -- let (build, build_len) = common::parse_optional_meta(&s[i..], b'+')?; -- i += build_len; -- if i != s.len() { -- return Err("Extra junk after valid version: ".to_string() + -- from_utf8(&s[i..]).unwrap()); -- } -- Ok(Version { -- major: major, -- minor: minor, -- patch: patch, -- pre: pre, -- build: build, -- }) --} -- --impl fmt::Display for Version { -- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { -- try!(write!(f, "{}.{}.{}", self.major, self.minor, self.patch)); -- if !self.pre.is_empty() { -- let strs: Vec<_> = -- self.pre.iter().map(ToString::to_string).collect(); -- try!(write!(f, "-{}", strs.join("."))); -- } -- if !self.build.is_empty() { -- let strs: Vec<_> = -- self.build.iter().map(ToString::to_string).collect(); -- try!(write!(f, "+{}", strs.join("."))); -- } -- Ok(()) -- } --} -- --impl fmt::Display for Identifier { -- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { -- match *self { -- Identifier::Numeric(ref id) => id.fmt(f), -- Identifier::AlphaNumeric(ref id) => id.fmt(f), -- } -- } --} -- --#[cfg(test)] --mod tests { -- use version; -- use super::*; -- -- #[test] -- fn parse_empty() { -- let version = ""; -- -- let parsed = version::parse(version); -- -- assert!(parsed.is_err(), "empty string incorrectly considered a valid parse"); -- } -- -- #[test] -- fn parse_blank() { -- let version = " "; -- -- let parsed = version::parse(version); -- -- assert!(parsed.is_err(), "blank string incorrectly considered a valid parse"); -- } -- -- #[test] -- fn parse_no_minor_patch() { -- let version = "1"; -- -- let parsed = version::parse(version); -- -- assert!(parsed.is_err(), format!("'{}' incorrectly considered a valid parse", version)); -- } -- -- #[test] -- fn parse_no_patch() { -- let version = "1.2"; -- -- let parsed = version::parse(version); -- -- assert!(parsed.is_err(), format!("'{}' incorrectly considered a valid parse", version)); -- } -- -- #[test] -- fn parse_empty_pre() { -- let version = "1.2.3-"; -- -- let parsed = version::parse(version); -- -- assert!(parsed.is_err(), format!("'{}' incorrectly considered a valid parse", version)); -- } -- -- #[test] -- fn parse_letters() { -- let version = "a.b.c"; -- -- let parsed = version::parse(version); -- -- assert!(parsed.is_err(), format!("'{}' incorrectly considered a valid parse", version)); -- } -- -- #[test] -- fn parse_with_letters() { -- let version = "1.2.3 a.b.c"; -- -- let parsed = version::parse(version); -- -- assert!(parsed.is_err(), format!("'{}' incorrectly considered a valid parse", version)); -- } -- -- #[test] -- fn parse_basic_version() { -- let version = "1.2.3"; -- -- let parsed = version::parse(version).unwrap(); -- -- assert_eq!(1, parsed.major); -- assert_eq!(2, parsed.minor); -- assert_eq!(3, parsed.patch); -- } -- -- #[test] -- fn parse_trims_input() { -- let version = " 1.2.3 "; -- -- let parsed = version::parse(version).unwrap(); -- -- assert_eq!(1, parsed.major); -- assert_eq!(2, parsed.minor); -- assert_eq!(3, parsed.patch); -- } -- -- #[test] -- fn parse_no_major_leading_zeroes() { -- let version = "01.0.0"; -- -- let parsed = version::parse(version); -- -- assert!(parsed.is_err(), "01 incorrectly considered a valid major version"); -- } -- -- #[test] -- fn parse_no_minor_leading_zeroes() { -- let version = "0.01.0"; -- -- let parsed = version::parse(version); -- -- assert!(parsed.is_err(), "01 incorrectly considered a valid minor version"); -- } -- -- #[test] -- fn parse_no_patch_leading_zeroes() { -- let version = "0.0.01"; -- -- let parsed = version::parse(version); -- -- assert!(parsed.is_err(), "01 incorrectly considered a valid patch version"); -- } -- -- #[test] -- fn parse_no_major_overflow() { -- let version = "98765432109876543210.0.0"; -- -- let parsed = version::parse(version); -- -- assert!(parsed.is_err(), "98765432109876543210 incorrectly considered a valid major version"); -- } -- -- #[test] -- fn parse_no_minor_overflow() { -- let version = "0.98765432109876543210.0"; -- -- let parsed = version::parse(version); -- -- assert!(parsed.is_err(), "98765432109876543210 incorrectly considered a valid minor version"); -- } -- -- #[test] -- fn parse_no_patch_overflow() { -- let version = "0.0.98765432109876543210"; -- -- let parsed = version::parse(version); -- -- assert!(parsed.is_err(), "98765432109876543210 incorrectly considered a valid patch version"); -- } -- -- #[test] -- fn parse_basic_prerelease() { -- let version = "1.2.3-pre"; -- -- let parsed = version::parse(version).unwrap(); -- -- let expected_pre = vec![Identifier::AlphaNumeric(String::from("pre"))]; -- assert_eq!(expected_pre, parsed.pre); -- } -- -- #[test] -- fn parse_prerelease_alphanumeric() { -- let version = "1.2.3-alpha1"; -- -- let parsed = version::parse(version).unwrap(); -- -- let expected_pre = vec![Identifier::AlphaNumeric(String::from("alpha1"))]; -- assert_eq!(expected_pre, parsed.pre); -- } -- -- #[test] -- fn parse_prerelease_zero() { -- let version = "1.2.3-pre.0"; -- -- let parsed = version::parse(version).unwrap(); -- -- let expected_pre = vec![Identifier::AlphaNumeric(String::from("pre")), -- Identifier::Numeric(0)]; -- assert_eq!(expected_pre, parsed.pre); -- } -- -- #[test] -- fn parse_basic_build() { -- let version = "1.2.3+build"; -- -- let parsed = version::parse(version).unwrap(); -- -- let expected_build = vec![Identifier::AlphaNumeric(String::from("build"))]; -- assert_eq!(expected_build, parsed.build); -- } -- -- #[test] -- fn parse_build_alphanumeric() { -- let version = "1.2.3+build5"; -- -- let parsed = version::parse(version).unwrap(); -- -- let expected_build = vec![Identifier::AlphaNumeric(String::from("build5"))]; -- assert_eq!(expected_build, parsed.build); -- } -- -- #[test] -- fn parse_pre_and_build() { -- let version = "1.2.3-alpha1+build5"; -- -- let parsed = version::parse(version).unwrap(); -- -- let expected_pre = vec![Identifier::AlphaNumeric(String::from("alpha1"))]; -- assert_eq!(expected_pre, parsed.pre); -- -- let expected_build = vec![Identifier::AlphaNumeric(String::from("build5"))]; -- assert_eq!(expected_build, parsed.build); -- } -- -- #[test] -- fn parse_complex_metadata_01() { -- let version = "1.2.3-1.alpha1.9+build5.7.3aedf "; -- -- let parsed = version::parse(version).unwrap(); -- -- let expected_pre = vec![Identifier::Numeric(1), -- Identifier::AlphaNumeric(String::from("alpha1")), -- Identifier::Numeric(9)]; -- assert_eq!(expected_pre, parsed.pre); -- -- let expected_build = vec![Identifier::AlphaNumeric(String::from("build5")), -- Identifier::Numeric(7), -- Identifier::AlphaNumeric(String::from("3aedf"))]; -- assert_eq!(expected_build, parsed.build); -- } -- -- #[test] -- fn parse_complex_metadata_02() { -- let version = "0.4.0-beta.1+0851523"; -- -- let parsed = version::parse(version).unwrap(); -- -- let expected_pre = vec![Identifier::AlphaNumeric(String::from("beta")), -- Identifier::Numeric(1)]; -- assert_eq!(expected_pre, parsed.pre); -- -- let expected_build = vec![Identifier::AlphaNumeric(String::from("0851523"))]; -- assert_eq!(expected_build, parsed.build); -- } -- -- #[test] -- fn parse_metadata_overflow() { -- let version = "0.4.0-beta.1+98765432109876543210"; -- -- let parsed = version::parse(version).unwrap(); -- -- let expected_pre = vec![Identifier::AlphaNumeric(String::from("beta")), -- Identifier::Numeric(1)]; -- assert_eq!(expected_pre, parsed.pre); -- -- let expected_build = vec![Identifier::AlphaNumeric(String::from("98765432109876543210"))]; -- assert_eq!(expected_build, parsed.build); -- } -- -- #[test] -- fn parse_regression_01() { -- let version = "0.0.0-WIP"; -- -- let parsed = version::parse(version).unwrap(); -- -- assert_eq!(0, parsed.major); -- assert_eq!(0, parsed.minor); -- assert_eq!(0, parsed.patch); -- -- let expected_pre = vec![Identifier::AlphaNumeric(String::from("WIP"))]; -- assert_eq!(expected_pre, parsed.pre); -- } --} -diff --git a/third_party/rust/semver/.cargo-checksum.json b/third_party/rust/semver/.cargo-checksum.json ---- a/third_party/rust/semver/.cargo-checksum.json -+++ b/third_party/rust/semver/.cargo-checksum.json -@@ -1,1 +1,1 @@ --{"files":{"Cargo.toml":"a5b995796b5559de8975a6fee7166c9fda6c21b449ec90bef5f9baaeddd479a5","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"c780d8c3c802c5fe2c316127900385010c3e57f71c851eea9e8ed8495e2030dd","src/lib.rs":"cb1725a8bb90c1043f187c6ba504d0a9d07793e2f39f5205f926c58849311770","src/version.rs":"ffdf9c628597b889f149f3b2b1245b97c774eae1ce7030bd19235eabecaaede0","src/version_req.rs":"40d20720f5fdc0b3d9e398e64eb448a65987229bd322cab0fedf0cf1843f3bd8","tests/deprecation.rs":"b5ec79e19d61968d05b96b876c449e54d43cbd1762c6e63c23c3470f9db56292","tests/regression.rs":"180b699ad029b81e6135d42f0a8e6d782177bc29a41132f875ee6f8607a46b56","tests/serde.rs":"cdbbefc576ffcc814c30dad9598ab87a7fd9d14c5f42f1349e1db6afc72f8fed"},"package":"1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"} -\ No newline at end of file -+{"files":{"Cargo.toml":"2a2126f8fe5d20540ae6cfbf6649ed3af365ffb9a0a788a7552a6e7649a7a75f","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"57659341319915482c0b83779fb7f3f0f3accb7a8b881965799116afb5e9f7e9","benches/parse.rs":"6531f66f80ce2fc83878f9bf84f94c42e96f1e709466f2b88be8d95a3cec1511","build.rs":"47b42941210d44567c8561107420d7825aa1d01332c2d2f8892d9e20646a1c77","src/backport.rs":"f8866548840434c8974f135528693f25aacc4ad03639c4e3aea3be351e13fdf8","src/display.rs":"9ba42f7a6579aa9c7dd72f2380036f5c9664592f3eacd09ea25cef291a3e64e5","src/error.rs":"3bb489f4a29f38d93370e64ae8d6e4e9b451a055cd7d392b6aeacab7eb3e1953","src/eval.rs":"b7e7ec976051b9f87ddf5cfdbaad64654d98d86ae0763f7d88b14eeaeac6013c","src/identifier.rs":"601231351ac58602b7d193cb0951b5146bd868b62aba938d5cbe52cf2b93414b","src/impls.rs":"79b5a2ac6ca3d4cb46adfb1494756079f53bef780dd81c3a8d3adf86f91395c8","src/lib.rs":"8e116a19e521909f3fa50206c078f1e23bf033dc8057ba6101f80d5bc5900fed","src/parse.rs":"93593f62cdae489feb4f2e8ae1fa93d90dca63db50669b6265346ffaaf687be5","src/serde.rs":"970d343a6bac21ddd965168d3cc2af9998796bf29bf545e8b37c6bcdd97d9710","tests/node/mod.rs":"2710d9b8daace2038b66db0f8f4cc522dee938e7cbc42d7739c31995343c32f4","tests/test_autotrait.rs":"070500c32ceee14a8a0110c04a01f98278b24614a0aec8c382dcea3da0343f58","tests/test_identifier.rs":"6c3da46c73df210527b60f1069131b15e2c65eb7b5d11793940d00cf66812f4d","tests/test_version.rs":"09e37c3df162205acf3683d1c760a6001e34e1c709fd4a1a265d82450e340003","tests/test_version_req.rs":"b6eea0258cc3b6d567a9f6c42693a97316345083495236c47e85374fd45f7cf0","tests/util/mod.rs":"db61c2cd86af864d8be4f2a3d5f25c86d7712201cc6ab47b715facf5f7f275b7"},"package":"8cb243bdfdb5936c8dc3c45762a19d12ab4550cdc753bc247637d4ec35a040fd"} -\ No newline at end of file -diff --git a/third_party/rust/semver/Cargo.toml b/third_party/rust/semver/Cargo.toml ---- a/third_party/rust/semver/Cargo.toml -+++ b/third_party/rust/semver/Cargo.toml -@@ -1,45 +1,38 @@ - # 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 -+# 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) -+# If you are reading this file be aware that the original Cargo.toml -+# will likely look very different (and much more reasonable). -+# See Cargo.toml.orig for the original contents. - - [package] -+edition = "2018" -+rust-version = "1.31" - name = "semver" --version = "0.9.0" --authors = ["Steve Klabnik <steve@steveklabnik.com>", "The Rust Project Developers"] --description = "Semantic version parsing and comparison.\n" --homepage = "https://docs.rs/crate/semver/" --documentation = "https://docs.rs/crate/semver/" -+version = "1.0.9" -+authors = ["David Tolnay <dtolnay@gmail.com>"] -+description = "Parser and evaluator for Cargo's flavor of Semantic Versioning" -+documentation = "https://docs.rs/semver" - readme = "README.md" --license = "MIT/Apache-2.0" --repository = "https://github.com/steveklabnik/semver" --[dependencies.semver-parser] --version = "0.7.0" -+license = "MIT OR Apache-2.0" -+repository = "https://github.com/dtolnay/semver" -+ -+[package.metadata.docs.rs] -+targets = ["x86_64-unknown-linux-gnu"] -+rustdoc-args = [ -+ "--cfg", -+ "doc_cfg", -+] - - [dependencies.serde] - version = "1.0" - optional = true --[dev-dependencies.crates-index] --version = "0.5.0" -- --[dev-dependencies.serde_json] --version = "1.0" -- --[dev-dependencies.serde_derive] --version = "1.0" -- --[dev-dependencies.tempdir] --version = "0.3.4" -+default-features = false - - [features] --default = [] --ci = ["serde"] --[badges.travis-ci] --repository = "steveklabnik/semver" -+default = ["std"] -+std = [] -diff --git a/third_party/rust/semver/LICENSE-MIT b/third_party/rust/semver/LICENSE-MIT ---- a/third_party/rust/semver/LICENSE-MIT -+++ b/third_party/rust/semver/LICENSE-MIT -@@ -1,10 +1,8 @@ --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 -diff --git a/third_party/rust/semver/README.md b/third_party/rust/semver/README.md ---- a/third_party/rust/semver/README.md -+++ b/third_party/rust/semver/README.md -@@ -1,103 +1,84 @@ - semver - ====== - --Semantic version parsing and comparison. -- --[![Build Status](https://api.travis-ci.org/steveklabnik/semver.svg?branch=master)](https://travis-ci.org/steveklabnik/semver) -- --[Documentation](https://steveklabnik.github.io/semver) -- --Semantic versioning (see http://semver.org/) is a set of rules for --assigning version numbers. -+[<img alt="github" src="https://img.shields.io/badge/github-dtolnay/semver-8da0cb?style=for-the-badge&labelColor=555555&logo=github" height="20">](https://github.com/dtolnay/semver) -+[<img alt="crates.io" src="https://img.shields.io/crates/v/semver.svg?style=for-the-badge&color=fc8d62&logo=rust" height="20">](https://crates.io/crates/semver) -+[<img alt="docs.rs" src="https://img.shields.io/badge/docs.rs-semver-66c2a5?style=for-the-badge&labelColor=555555&logoColor=white&logo=data:image/svg+xml;base64,PHN2ZyByb2xlPSJpbWciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDUxMiA1MTIiPjxwYXRoIGZpbGw9IiNmNWY1ZjUiIGQ9Ik00ODguNiAyNTAuMkwzOTIgMjE0VjEwNS41YzAtMTUtOS4zLTI4LjQtMjMuNC0zMy43bC0xMDAtMzcuNWMtOC4xLTMuMS0xNy4xLTMuMS0yNS4zIDBsLTEwMCAzNy41Yy0xNC4xIDUuMy0yMy40IDE4LjctMjMuNCAzMy43VjIxNGwtOTYuNiAzNi4yQzkuMyAyNTUuNSAwIDI2OC45IDAgMjgzLjlWMzk0YzAgMTMuNiA3LjcgMjYuMSAxOS45IDMyLjJsMTAwIDUwYzEwLjEgNS4xIDIyLjEgNS4xIDMyLjIgMGwxMDMuOS01MiAxMDMuOSA1MmMxMC4xIDUuMSAyMi4xIDUuMSAzMi4yIDBsMTAwLTUwYzEyLjItNi4xIDE5LjktMTguNiAxOS45LTMyLjJWMjgzLjljMC0xNS05LjMtMjguNC0yMy40LTMzLjd6TTM1OCAyMTQuOGwtODUgMzEuOXYtNjguMmw4NS0zN3Y3My4zek0xNTQgMTA0LjFsMTAyLTM4LjIgMTAyIDM4LjJ2LjZsLTEwMiA0MS40LTEwMi00MS40di0uNnptODQgMjkxLjFsLTg1IDQyLjV2LTc5LjFsODUtMzguOHY3NS40em0wLTExMmwtMTAyIDQxLjQtMTAyLTQxLjR2LS42bDEwMi0zOC4yIDEwMiAzOC4ydi42em0yNDAgMTEybC04NSA0Mi41di03OS4xbDg1LTM4Ljh2NzUuNHptMC0xMTJsLTEwMiA0MS40LTEwMi00MS40di0uNmwxMDItMzguMiAxMDIgMzguMnYuNnoiPjwvcGF0aD48L3N2Zz4K" height="20">](https://docs.rs/semver) -+[<img alt="build status" src="https://img.shields.io/github/workflow/status/dtolnay/semver/CI/master?style..." height="20">](https://github.com/dtolnay/semver/actions?query=branch%3Amaster) - --## SemVer and the Rust ecosystem -- --Rust itself follows the SemVer specification, as does its standard libraries. The two are --not tied together. -+A parser and evaluator for Cargo's flavor of Semantic Versioning. - --[Cargo](https://crates.io), Rust's package manager, uses SemVer to determine which versions of --packages you need installed. -- --## Installation -- --To use `semver`, add this to your `[dependencies]` section: -+Semantic Versioning (see <https://semver.org>) is a guideline for how version -+numbers are assigned and incremented. It is widely followed within the -+Cargo/crates.io ecosystem for Rust. - - ```toml --semver = "0.7.0" --``` -- --And this to your crate root: -- --```rust --extern crate semver; --``` -- --## Versions -- --At its simplest, the `semver` crate allows you to construct `Version` objects using the `parse` --method: -- --```rust --use semver::Version; -- --assert!(Version::parse("1.2.3") == Ok(Version { -- major: 1, -- minor: 2, -- patch: 3, -- pre: vec!(), -- build: vec!(), --})); -+[dependencies] -+semver = "1.0" - ``` - --If you have multiple `Version`s, you can use the usual comparison operators to compare them: -- --```rust --use semver::Version; -+*Compiler support: requires rustc 1.31+* - --assert!(Version::parse("1.2.3-alpha") != Version::parse("1.2.3-beta")); --assert!(Version::parse("1.2.3-alpha2") > Version::parse("1.2.0")); --``` -- --## Requirements -+<br> - --The `semver` crate also provides the ability to compare requirements, which are more complex --comparisons. -- --For example, creating a requirement that only matches versions greater than or --equal to 1.0.0: -+## Example - - ```rust --use semver::Version; --use semver::VersionReq; -+use semver::{BuildMetadata, Prerelease, Version, VersionReq}; -+ -+fn main() { -+ let req = VersionReq::parse(">=1.2.3, <1.8.0").unwrap(); - --let r = VersionReq::parse(">= 1.0.0").unwrap(); --let v = Version::parse("1.0.0").unwrap(); -+ // Check whether this requirement matches version 1.2.3-alpha.1 (no) -+ let version = Version { -+ major: 1, -+ minor: 2, -+ patch: 3, -+ pre: Prerelease::new("alpha.1").unwrap(), -+ build: BuildMetadata::EMPTY, -+ }; -+ assert!(!req.matches(&version)); - --assert!(r.to_string() == ">= 1.0.0".to_string()); --assert!(r.matches(&v)) -+ // Check whether it matches 1.3.0 (yes it does) -+ let version = Version::parse("1.3.0").unwrap(); -+ assert!(req.matches(&version)); -+} - ``` - --It also allows parsing of `~x.y.z` and `^x.y.z` requirements as defined at --https://www.npmjs.org/doc/misc/semver.html -+<br> -+ -+## Scope of this crate - --**Tilde requirements** specify a minimal version with some updates: -+Besides Cargo, several other package ecosystems and package managers for other -+languages also use SemVer: RubyGems/Bundler for Ruby, npm for JavaScript, -+Composer for PHP, CocoaPods for Objective-C... - --```notrust --~1.2.3 := >=1.2.3 <1.3.0 --~1.2 := >=1.2.0 <1.3.0 --~1 := >=1.0.0 <2.0.0 --``` -+The `semver` crate is specifically intended to implement Cargo's interpretation -+of Semantic Versioning. -+ -+Where the various tools differ in their interpretation or implementation of the -+spec, this crate follows the implementation choices made by Cargo. If you are -+operating on version numbers from some other package ecosystem, you will want to -+use a different semver library which is appropriate to that ecosystem. -+ -+The extent of Cargo's SemVer support is documented in the *[Specifying -+Dependencies]* chapter of the Cargo reference. - --**Caret requirements** allow SemVer compatible updates to a specified version, --`0.x` and `0.x+1` are not considered compatible, but `1.x` and `1.x+1` are. -+[Specifying Dependencies]: https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html - --`0.0.x` is not considered compatible with any other version. --Missing minor and patch versions are desugared to `0` but allow flexibility for that value. -+<br> -+ -+#### License - --```notrust --^1.2.3 := >=1.2.3 <2.0.0 --^0.2.3 := >=0.2.3 <0.3.0 --^0.0.3 := >=0.0.3 <0.0.4 --^0.0 := >=0.0.0 <0.1.0 --^0 := >=0.0.0 <1.0.0 --``` -+<sup> -+Licensed under either of <a href="LICENSE-APACHE">Apache License, Version -+2.0</a> or <a href="LICENSE-MIT">MIT license</a> at your option. -+</sup> -+ -+<br> -+ -+<sub> -+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. -+</sub> -diff --git a/third_party/rust/semver/benches/parse.rs b/third_party/rust/semver/benches/parse.rs -new file mode 100644 ---- /dev/null -+++ b/third_party/rust/semver/benches/parse.rs -@@ -0,0 +1,24 @@ -+#![feature(test)] -+ -+extern crate test; -+ -+use semver::{Prerelease, Version, VersionReq}; -+use test::{black_box, Bencher}; -+ -+#[bench] -+fn parse_prerelease(b: &mut Bencher) { -+ let text = "x.7.z.92"; -+ b.iter(|| black_box(text).parse::<Prerelease>().unwrap()); -+} -+ -+#[bench] -+fn parse_version(b: &mut Bencher) { -+ let text = "1.0.2021-beta+exp.sha.5114f85"; -+ b.iter(|| black_box(text).parse::<Version>().unwrap()); -+} -+ -+#[bench] -+fn parse_version_req(b: &mut Bencher) { -+ let text = ">=1.2.3, <2.0.0"; -+ b.iter(|| black_box(text).parse::<VersionReq>().unwrap()); -+} -diff --git a/third_party/rust/semver/build.rs b/third_party/rust/semver/build.rs -new file mode 100644 ---- /dev/null -+++ b/third_party/rust/semver/build.rs -@@ -0,0 +1,73 @@ -+use std::env; -+use std::process::Command; -+use std::str; -+ -+fn main() { -+ let compiler = match rustc_minor_version() { -+ Some(compiler) => compiler, -+ None => return, -+ }; -+ -+ if compiler < 33 { -+ // Exhaustive integer patterns. On older compilers, a final `_` arm is -+ // required even if every possible integer value is otherwise covered. -+ // https://github.com/rust-lang/rust/issues/50907 -+ println!("cargo:rustc-cfg=no_exhaustive_int_match"); -+ } -+ -+ if compiler < 36 { -+ // extern crate alloc. -+ // https://blog.rust-lang.org/2019/07/04/Rust-1.36.0.html#the-alloc-crate-is-st... -+ println!("cargo:rustc-cfg=no_alloc_crate"); -+ } -+ -+ if compiler < 39 { -+ // const Vec::new. -+ // https://doc.rust-lang.org/std/vec/struct.Vec.html#method.new -+ println!("cargo:rustc-cfg=no_const_vec_new"); -+ } -+ -+ if compiler < 40 { -+ // #[non_exhaustive]. -+ // https://blog.rust-lang.org/2019/12/19/Rust-1.40.0.html#non_exhaustive-struct... -+ println!("cargo:rustc-cfg=no_non_exhaustive"); -+ } -+ -+ if compiler < 45 { -+ // String::strip_prefix. -+ // https://doc.rust-lang.org/std/primitive.str.html#method.repeat -+ println!("cargo:rustc-cfg=no_str_strip_prefix"); -+ } -+ -+ if compiler < 46 { -+ // #[track_caller]. -+ // https://blog.rust-lang.org/2020/08/27/Rust-1.46.0.html#track_caller -+ println!("cargo:rustc-cfg=no_track_caller"); -+ } -+ -+ if compiler < 52 { -+ // #![deny(unsafe_op_in_unsafe_fn)]. -+ // https://github.com/rust-lang/rust/issues/71668 -+ println!("cargo:rustc-cfg=no_unsafe_op_in_unsafe_fn_lint"); -+ } -+ -+ if compiler < 53 { -+ // Efficient intrinsics for count-leading-zeros and count-trailing-zeros -+ // on NonZero integers stabilized in 1.53.0. On many architectures these -+ // are more efficient than counting zeros on ordinary zeroable integers. -+ // https://doc.rust-lang.org/std/num/struct.NonZeroU64.html#method.leading_zero... -+ // https://doc.rust-lang.org/std/num/struct.NonZeroU64.html#method.trailing_zer... -+ println!("cargo:rustc-cfg=no_nonzero_bitscan"); -+ } -+} -+ -+fn rustc_minor_version() -> Option<u32> { -+ let rustc = env::var_os("RUSTC")?; -+ let output = Command::new(rustc).arg("--version").output().ok()?; -+ let version = str::from_utf8(&output.stdout).ok()?; -+ let mut pieces = version.split('.'); -+ if pieces.next() != Some("rustc 1") { -+ return None; -+ } -+ pieces.next()?.parse().ok() -+} -diff --git a/third_party/rust/semver/src/backport.rs b/third_party/rust/semver/src/backport.rs -new file mode 100644 ---- /dev/null -+++ b/third_party/rust/semver/src/backport.rs -@@ -0,0 +1,51 @@ -+#[cfg(no_str_strip_prefix)] // rustc <1.45 -+pub(crate) trait StripPrefixExt { -+ fn strip_prefix(&self, ch: char) -> Option<&str>; -+} -+ -+#[cfg(no_str_strip_prefix)] -+impl StripPrefixExt for str { -+ fn strip_prefix(&self, ch: char) -> Option<&str> { -+ if self.starts_with(ch) { -+ Some(&self[ch.len_utf8()..]) -+ } else { -+ None -+ } -+ } -+} -+ -+pub(crate) use crate::alloc::vec::Vec; -+ -+#[cfg(no_alloc_crate)] // rustc <1.36 -+pub(crate) mod alloc { -+ pub use std::vec; -+ -+ pub mod alloc { -+ use std::mem; -+ -+ pub struct Layout { -+ size: usize, -+ } -+ -+ impl Layout { -+ pub unsafe fn from_size_align_unchecked(size: usize, align: usize) -> Self { -+ assert_eq!(align, 2); -+ Layout { size } -+ } -+ } -+ -+ pub unsafe fn alloc(layout: Layout) -> *mut u8 { -+ let len_u16 = (layout.size + 1) / 2; -+ let mut vec = Vec::new(); -+ vec.reserve_exact(len_u16); -+ let ptr: *mut u16 = vec.as_mut_ptr(); -+ mem::forget(vec); -+ ptr as *mut u8 -+ } -+ -+ pub unsafe fn dealloc(ptr: *mut u8, layout: Layout) { -+ let len_u16 = (layout.size + 1) / 2; -+ unsafe { Vec::from_raw_parts(ptr as *mut u16, 0, len_u16) }; -+ } -+ } -+} -diff --git a/third_party/rust/semver/src/display.rs b/third_party/rust/semver/src/display.rs -new file mode 100644 ---- /dev/null -+++ b/third_party/rust/semver/src/display.rs -@@ -0,0 +1,165 @@ -+use crate::{BuildMetadata, Comparator, Op, Prerelease, Version, VersionReq}; -+use core::fmt::{self, Alignment, Debug, Display, Write}; -+ -+impl Display for Version { -+ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { -+ let do_display = |formatter: &mut fmt::Formatter| -> fmt::Result { -+ write!(formatter, "{}.{}.{}", self.major, self.minor, self.patch)?; -+ if !self.pre.is_empty() { -+ write!(formatter, "-{}", self.pre)?; -+ } -+ if !self.build.is_empty() { -+ write!(formatter, "+{}", self.build)?; -+ } -+ Ok(()) -+ }; -+ -+ let do_len = || -> usize { -+ digits(self.major) -+ + 1 -+ + digits(self.minor) -+ + 1 -+ + digits(self.patch) -+ + !self.pre.is_empty() as usize -+ + self.pre.len() -+ + !self.build.is_empty() as usize -+ + self.build.len() -+ }; -+ -+ pad(formatter, do_display, do_len) -+ } -+} -+ -+impl Display for VersionReq { -+ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { -+ if self.comparators.is_empty() { -+ return formatter.write_str("*"); -+ } -+ for (i, comparator) in self.comparators.iter().enumerate() { -+ if i > 0 { -+ formatter.write_str(", ")?; -+ } -+ write!(formatter, "{}", comparator)?; -+ } -+ Ok(()) -+ } -+} -+ -+impl Display for Comparator { -+ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { -+ let op = match self.op { -+ Op::Exact => "=", -+ Op::Greater => ">", -+ Op::GreaterEq => ">=", -+ Op::Less => "<", -+ Op::LessEq => "<=", -+ Op::Tilde => "~", -+ Op::Caret => "^", -+ Op::Wildcard => "", -+ #[cfg(no_non_exhaustive)] -+ Op::__NonExhaustive => unreachable!(), -+ }; -+ formatter.write_str(op)?; -+ write!(formatter, "{}", self.major)?; -+ if let Some(minor) = &self.minor { -+ write!(formatter, ".{}", minor)?; -+ if let Some(patch) = &self.patch { -+ write!(formatter, ".{}", patch)?; -+ if !self.pre.is_empty() { -+ write!(formatter, "-{}", self.pre)?; -+ } -+ } else if self.op == Op::Wildcard { -+ formatter.write_str(".*")?; -+ } -+ } else if self.op == Op::Wildcard { -+ formatter.write_str(".*")?; -+ } -+ Ok(()) -+ } -+} -+ -+impl Display for Prerelease { -+ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { -+ formatter.write_str(self.as_str()) -+ } -+} -+ -+impl Display for BuildMetadata { -+ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { -+ formatter.write_str(self.as_str()) -+ } -+} -+ -+impl Debug for Version { -+ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { -+ let mut debug = formatter.debug_struct("Version"); -+ debug -+ .field("major", &self.major) -+ .field("minor", &self.minor) -+ .field("patch", &self.patch); -+ if !self.pre.is_empty() { -+ debug.field("pre", &self.pre); -+ } -+ if !self.build.is_empty() { -+ debug.field("build", &self.build); -+ } -+ debug.finish() -+ } -+} -+ -+impl Debug for Prerelease { -+ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { -+ write!(formatter, "Prerelease(\"{}\")", self) -+ } -+} -+ -+impl Debug for BuildMetadata { -+ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { -+ write!(formatter, "BuildMetadata(\"{}\")", self) -+ } -+} -+ -+fn pad( -+ formatter: &mut fmt::Formatter, -+ do_display: impl FnOnce(&mut fmt::Formatter) -> fmt::Result, -+ do_len: impl FnOnce() -> usize, -+) -> fmt::Result { -+ let min_width = match formatter.width() { -+ Some(min_width) => min_width, -+ None => return do_display(formatter), -+ }; -+ -+ let len = do_len(); -+ if len >= min_width { -+ return do_display(formatter); -+ } -+ -+ let default_align = Alignment::Left; -+ let align = formatter.align().unwrap_or(default_align); -+ let padding = min_width - len; -+ let (pre_pad, post_pad) = match align { -+ Alignment::Left => (0, padding), -+ Alignment::Right => (padding, 0), -+ Alignment::Center => (padding / 2, (padding + 1) / 2), -+ }; -+ -+ let fill = formatter.fill(); -+ for _ in 0..pre_pad { -+ formatter.write_char(fill)?; -+ } -+ -+ do_display(formatter)?; -+ -+ for _ in 0..post_pad { -+ formatter.write_char(fill)?; -+ } -+ Ok(()) -+} -+ -+fn digits(val: u64) -> usize { -+ if val < 10 { -+ 1 -+ } else { -+ 1 + digits(val / 10) -+ } -+} -diff --git a/third_party/rust/semver/src/error.rs b/third_party/rust/semver/src/error.rs -new file mode 100644 ---- /dev/null -+++ b/third_party/rust/semver/src/error.rs -@@ -0,0 +1,124 @@ -+use crate::parse::Error; -+use core::fmt::{self, Debug, Display}; -+ -+pub(crate) enum ErrorKind { -+ UnexpectedEnd(Position), -+ UnexpectedChar(Position, char), -+ UnexpectedCharAfter(Position, char), -+ ExpectedCommaFound(Position, char), -+ LeadingZero(Position), -+ Overflow(Position), -+ EmptySegment(Position), -+ IllegalCharacter(Position), -+ WildcardNotTheOnlyComparator(char), -+ UnexpectedAfterWildcard, -+ ExcessiveComparators, -+} -+ -+#[derive(Copy, Clone, Eq, PartialEq)] -+pub(crate) enum Position { -+ Major, -+ Minor, -+ Patch, -+ Pre, -+ Build, -+} -+ -+#[cfg(feature = "std")] -+#[cfg_attr(doc_cfg, doc(cfg(feature = "std")))] -+impl std::error::Error for Error {} -+ -+impl Display for Error { -+ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { -+ match &self.kind { -+ ErrorKind::UnexpectedEnd(pos) => { -+ write!(formatter, "unexpected end of input while parsing {}", pos) -+ } -+ ErrorKind::UnexpectedChar(pos, ch) => { -+ write!( -+ formatter, -+ "unexpected character {} while parsing {}", -+ QuotedChar(*ch), -+ pos, -+ ) -+ } -+ ErrorKind::UnexpectedCharAfter(pos, ch) => { -+ write!( -+ formatter, -+ "unexpected character {} after {}", -+ QuotedChar(*ch), -+ pos, -+ ) -+ } -+ ErrorKind::ExpectedCommaFound(pos, ch) => { -+ write!( -+ formatter, -+ "expected comma after {}, found {}", -+ pos, -+ QuotedChar(*ch), -+ ) -+ } -+ ErrorKind::LeadingZero(pos) => { -+ write!(formatter, "invalid leading zero in {}", pos) -+ } -+ ErrorKind::Overflow(pos) => { -+ write!(formatter, "value of {} exceeds u64::MAX", pos) -+ } -+ ErrorKind::EmptySegment(pos) => { -+ write!(formatter, "empty identifier segment in {}", pos) -+ } -+ ErrorKind::IllegalCharacter(pos) => { -+ write!(formatter, "unexpected character in {}", pos) -+ } -+ ErrorKind::WildcardNotTheOnlyComparator(ch) => { -+ write!( -+ formatter, -+ "wildcard req ({}) must be the only comparator in the version req", -+ ch, -+ ) -+ } -+ ErrorKind::UnexpectedAfterWildcard => { -+ formatter.write_str("unexpected character after wildcard in version req") -+ } -+ ErrorKind::ExcessiveComparators => { -+ formatter.write_str("excessive number of version comparators") -+ } -+ } -+ } -+} -+ -+impl Display for Position { -+ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { -+ formatter.write_str(match self { -+ Position::Major => "major version number", -+ Position::Minor => "minor version number", -+ Position::Patch => "patch version number", -+ Position::Pre => "pre-release identifier", -+ Position::Build => "build metadata", -+ }) -+ } -+} -+ -+impl Debug for Error { -+ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { -+ formatter.write_str("Error(\"")?; -+ Display::fmt(self, formatter)?; -+ formatter.write_str("\")")?; -+ Ok(()) -+ } -+} -+ -+struct QuotedChar(char); -+ -+impl Display for QuotedChar { -+ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { -+ // Standard library versions prior to https://github.com/rust-lang/rust/pull/95345 -+ // print character 0 as '\u{0}'. We prefer '\0' to keep error messages -+ // the same across all supported Rust versions. -+ if self.0 == '\0' { -+ formatter.write_str("'\\0'") -+ } else { -+ write!(formatter, "{:?}", self.0) -+ } -+ } -+} -diff --git a/third_party/rust/semver/src/eval.rs b/third_party/rust/semver/src/eval.rs -new file mode 100644 ---- /dev/null -+++ b/third_party/rust/semver/src/eval.rs -@@ -0,0 +1,181 @@ -+use crate::{Comparator, Op, Version, VersionReq}; -+ -+pub(crate) fn matches_req(req: &VersionReq, ver: &Version) -> bool { -+ for cmp in &req.comparators { -+ if !matches_impl(cmp, ver) { -+ return false; -+ } -+ } -+ -+ if ver.pre.is_empty() { -+ return true; -+ } -+ -+ // If a version has a prerelease tag (for example, 1.2.3-alpha.3) then it -+ // will only be allowed to satisfy req if at least one comparator with the -+ // same major.minor.patch also has a prerelease tag. -+ for cmp in &req.comparators { -+ if pre_is_compatible(cmp, ver) { -+ return true; -+ } -+ } -+ -+ false -+} -+ -+pub(crate) fn matches_comparator(cmp: &Comparator, ver: &Version) -> bool { -+ matches_impl(cmp, ver) && (ver.pre.is_empty() || pre_is_compatible(cmp, ver)) -+} -+ -+fn matches_impl(cmp: &Comparator, ver: &Version) -> bool { -+ match cmp.op { -+ Op::Exact | Op::Wildcard => matches_exact(cmp, ver), -+ Op::Greater => matches_greater(cmp, ver), -+ Op::GreaterEq => matches_exact(cmp, ver) || matches_greater(cmp, ver), -+ Op::Less => matches_less(cmp, ver), -+ Op::LessEq => matches_exact(cmp, ver) || matches_less(cmp, ver), -+ Op::Tilde => matches_tilde(cmp, ver), -+ Op::Caret => matches_caret(cmp, ver), -+ #[cfg(no_non_exhaustive)] -+ Op::__NonExhaustive => unreachable!(), -+ } -+} -+ -+fn matches_exact(cmp: &Comparator, ver: &Version) -> bool { -+ if ver.major != cmp.major { -+ return false; -+ } -+ -+ if let Some(minor) = cmp.minor { -+ if ver.minor != minor { -+ return false; -+ } -+ } -+ -+ if let Some(patch) = cmp.patch { -+ if ver.patch != patch { -+ return false; -+ } -+ } -+ -+ ver.pre == cmp.pre -+} -+ -+fn matches_greater(cmp: &Comparator, ver: &Version) -> bool { -+ if ver.major != cmp.major { -+ return ver.major > cmp.major; -+ } -+ -+ match cmp.minor { -+ None => return false, -+ Some(minor) => { -+ if ver.minor != minor { -+ return ver.minor > minor; -+ } -+ } -+ } -+ -+ match cmp.patch { -+ None => return false, -+ Some(patch) => { -+ if ver.patch != patch { -+ return ver.patch > patch; -+ } -+ } -+ } -+ -+ ver.pre > cmp.pre -+} -+ -+fn matches_less(cmp: &Comparator, ver: &Version) -> bool { -+ if ver.major != cmp.major { -+ return ver.major < cmp.major; -+ } -+ -+ match cmp.minor { -+ None => return false, -+ Some(minor) => { -+ if ver.minor != minor { -+ return ver.minor < minor; -+ } -+ } -+ } -+ -+ match cmp.patch { -+ None => return false, -+ Some(patch) => { -+ if ver.patch != patch { -+ return ver.patch < patch; -+ } -+ } -+ } -+ -+ ver.pre < cmp.pre -+} -+ -+fn matches_tilde(cmp: &Comparator, ver: &Version) -> bool { -+ if ver.major != cmp.major { -+ return false; -+ } -+ -+ if let Some(minor) = cmp.minor { -+ if ver.minor != minor { -+ return false; -+ } -+ } -+ -+ if let Some(patch) = cmp.patch { -+ if ver.patch != patch { -+ return ver.patch > patch; -+ } -+ } -+ -+ ver.pre >= cmp.pre -+} -+ -+fn matches_caret(cmp: &Comparator, ver: &Version) -> bool { -+ if ver.major != cmp.major { -+ return false; -+ } -+ -+ let minor = match cmp.minor { -+ None => return true, -+ Some(minor) => minor, -+ }; -+ -+ let patch = match cmp.patch { -+ None => { -+ if cmp.major > 0 { -+ return ver.minor >= minor; -+ } else { -+ return ver.minor == minor; -+ } -+ } -+ Some(patch) => patch, -+ }; -+ -+ if cmp.major > 0 { -+ if ver.minor != minor { -+ return ver.minor > minor; -+ } else if ver.patch != patch { -+ return ver.patch > patch; -+ } -+ } else if minor > 0 { -+ if ver.minor != minor { -+ return false; -+ } else if ver.patch != patch { -+ return ver.patch > patch; -+ } -+ } else if ver.minor != minor || ver.patch != patch { -+ return false; -+ } -+ -+ ver.pre >= cmp.pre -+} -+ -+fn pre_is_compatible(cmp: &Comparator, ver: &Version) -> bool { -+ cmp.major == ver.major -+ && cmp.minor == Some(ver.minor) -+ && cmp.patch == Some(ver.patch) -+ && !cmp.pre.is_empty() -+} -diff --git a/third_party/rust/semver/src/identifier.rs b/third_party/rust/semver/src/identifier.rs -new file mode 100644 ---- /dev/null -+++ b/third_party/rust/semver/src/identifier.rs -@@ -0,0 +1,400 @@ -+// This module implements Identifier, a short-optimized string allowed to -+// contain only the ASCII characters hyphen, dot, 0-9, A-Z, a-z. -+// -+// As of mid-2021, the distribution of pre-release lengths on crates.io is: -+// -+// length count length count length count -+// 0 355929 11 81 24 2 -+// 1 208 12 48 25 6 -+// 2 236 13 55 26 10 -+// 3 1909 14 25 27 4 -+// 4 1284 15 15 28 1 -+// 5 1742 16 35 30 1 -+// 6 3440 17 9 31 5 -+// 7 5624 18 6 32 1 -+// 8 1321 19 12 36 2 -+// 9 179 20 2 37 379 -+// 10 65 23 11 -+// -+// and the distribution of build metadata lengths is: -+// -+// length count length count length count -+// 0 364445 8 7725 18 1 -+// 1 72 9 16 19 1 -+// 2 7 10 85 20 1 -+// 3 28 11 17 22 4 -+// 4 9 12 10 26 1 -+// 5 68 13 9 27 1 -+// 6 73 14 10 40 5 -+// 7 53 15 6 -+// -+// Therefore it really behooves us to be able to use the entire 8 bytes of a -+// pointer for inline storage. For both pre-release and build metadata there are -+// vastly more strings with length exactly 8 bytes than the sum over all lengths -+// longer than 8 bytes. -+// -+// To differentiate the inline representation from the heap allocated long -+// representation, we'll allocate heap pointers with 2-byte alignment so that -+// they are guaranteed to have an unset least significant bit. Then in the repr -+// we store for pointers, we rotate a 1 into the most significant bit of the -+// most significant byte, which is never set for an ASCII byte. -+// -+// Inline repr: -+// -+// 0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx -+// -+// Heap allocated repr: -+// -+// 1ppppppp pppppppp pppppppp pppppppp pppppppp pppppppp pppppppp pppppppp 0 -+// ^ most significant bit least significant bit of orig ptr, rotated out ^ -+// -+// Since the most significant bit doubles as a sign bit for the similarly sized -+// signed integer type, the CPU has an efficient instruction for inspecting it, -+// meaning we can differentiate between an inline repr and a heap allocated repr -+// in one instruction. Effectively an inline repr always looks like a positive -+// i64 while a heap allocated repr always looks like a negative i64. -+// -+// For the inline repr, we store \0 padding on the end of the stored characters, -+// and thus the string length is readily determined efficiently by a cttz (count -+// trailing zeros) or bsf (bit scan forward) instruction. -+// -+// For the heap allocated repr, the length is encoded as a base-128 varint at -+// the head of the allocation. -+// -+// Empty strings are stored as an all-1 bit pattern, corresponding to -1i64. -+// Consequently the all-0 bit pattern is never a legal representation in any -+// repr, leaving it available as a niche for downstream code. For example this -+// allows size_of::<Version>() == size_of::<Option<Version>>(). -+ -+use crate::alloc::alloc::{alloc, dealloc, Layout}; -+use core::mem; -+use core::num::{NonZeroU64, NonZeroUsize}; -+use core::ptr::{self, NonNull}; -+use core::slice; -+use core::str; -+ -+const PTR_BYTES: usize = mem::size_of::<NonNull<u8>>(); -+ -+// If pointers are already 8 bytes or bigger, then 0. If pointers are smaller -+// than 8 bytes, then Identifier will contain a byte array to raise its size up -+// to 8 bytes total. -+const TAIL_BYTES: usize = 8 * (PTR_BYTES < 8) as usize - PTR_BYTES * (PTR_BYTES < 8) as usize; -+ -+#[repr(C, align(8))] -+pub(crate) struct Identifier { -+ head: NonNull<u8>, -+ tail: [u8; TAIL_BYTES], -+} -+ -+impl Identifier { -+ pub(crate) const fn empty() -> Self { -+ // This is a separate constant because unsafe function calls are not -+ // allowed in a const fn body, only in a const, until later rustc than -+ // what we support. -+ const HEAD: NonNull<u8> = unsafe { NonNull::new_unchecked(!0 as *mut u8) }; -+ -+ // `mov rax, -1` -+ Identifier { -+ head: HEAD, -+ tail: [!0; TAIL_BYTES], -+ } -+ } -+ -+ // SAFETY: string must be ASCII and not contain \0 bytes. -+ pub(crate) unsafe fn new_unchecked(string: &str) -> Self { -+ let len = string.len(); -+ match len as u64 { -+ 0 => Self::empty(), -+ 1..=8 => { -+ let mut bytes = [0u8; mem::size_of::<Identifier>()]; -+ // SAFETY: string is big enough to read len bytes, bytes is big -+ // enough to write len bytes, and they do not overlap. -+ unsafe { ptr::copy_nonoverlapping(string.as_ptr(), bytes.as_mut_ptr(), len) }; -+ // SAFETY: the head field is nonzero because the input string -+ // was at least 1 byte of ASCII and did not contain \0. -+ unsafe { mem::transmute::<[u8; mem::size_of::<Identifier>()], Identifier>(bytes) } -+ } -+ 9..=0xff_ffff_ffff_ffff => { -+ // SAFETY: len is in a range that does not contain 0. -+ let size = bytes_for_varint(unsafe { NonZeroUsize::new_unchecked(len) }) + len; -+ let align = 2; -+ // SAFETY: align is not zero, align is a power of two, and -+ // rounding size up to align does not overflow usize::MAX. -+ let layout = unsafe { Layout::from_size_align_unchecked(size, align) }; -+ // SAFETY: layout's size is nonzero. -+ let ptr = unsafe { alloc(layout) }; -+ let mut write = ptr; -+ let mut varint_remaining = len; -+ while varint_remaining > 0 { -+ // SAFETY: size is bytes_for_varint(len) bytes + len bytes. -+ // This is writing the first bytes_for_varint(len) bytes. -+ unsafe { ptr::write(write, varint_remaining as u8 | 0x80) }; -+ varint_remaining >>= 7; -+ // SAFETY: still in bounds of the same allocation. -+ write = unsafe { write.add(1) }; -+ } -+ // SAFETY: size is bytes_for_varint(len) bytes + len bytes. This -+ // is writing to the last len bytes. -+ unsafe { ptr::copy_nonoverlapping(string.as_ptr(), write, len) }; -+ Identifier { -+ head: ptr_to_repr(ptr), -+ tail: [0; TAIL_BYTES], -+ } -+ } -+ 0x100_0000_0000_0000..=0xffff_ffff_ffff_ffff => { -+ unreachable!("please refrain from storing >64 petabytes of text in semver version"); -+ } -+ #[cfg(no_exhaustive_int_match)] // rustc <1.33 -+ _ => unreachable!(), -+ } -+ } -+ -+ pub(crate) fn is_empty(&self) -> bool { -+ // `cmp rdi, -1` -- basically: `repr as i64 == -1` -+ let empty = Self::empty(); -+ let is_empty = self.head == empty.head && self.tail == empty.tail; -+ // The empty representation does nothing on Drop. We can't let this one -+ // drop normally because `impl Drop for Identifier` calls is_empty; that -+ // would be an infinite recursion. -+ mem::forget(empty); -+ is_empty -+ } -+ -+ fn is_inline(&self) -> bool { -+ // `test rdi, rdi` -- basically: `repr as i64 >= 0` -+ self.head.as_ptr() as usize >> (PTR_BYTES * 8 - 1) == 0 -+ } -+ -+ fn is_empty_or_inline(&self) -> bool { -+ // `cmp rdi, -2` -- basically: `repr as i64 > -2` -+ self.is_empty() || self.is_inline() -+ } -+ -+ pub(crate) fn as_str(&self) -> &str { -+ if self.is_empty() { -+ "" -+ } else if self.is_inline() { -+ // SAFETY: repr is in the inline representation. -+ unsafe { inline_as_str(self) } -+ } else { -+ // SAFETY: repr is in the heap allocated representation. -+ unsafe { ptr_as_str(&self.head) } -+ } -+ } -+} -+ -+impl Clone for Identifier { -+ fn clone(&self) -> Self { -+ if self.is_empty_or_inline() { -+ Identifier { -+ head: self.head, -+ tail: self.tail, -+ } -+ } else { -+ let ptr = repr_to_ptr(self.head); -+ // SAFETY: ptr is one of our own heap allocations. -+ let len = unsafe { decode_len(ptr) }; -+ let size = bytes_for_varint(len) + len.get(); -+ let align = 2; -+ // SAFETY: align is not zero, align is a power of two, and rounding -+ // size up to align does not overflow usize::MAX. This is just -+ // duplicating a previous allocation where all of these guarantees -+ // were already made. -+ let layout = unsafe { Layout::from_size_align_unchecked(size, align) }; -+ // SAFETY: layout's size is nonzero. -+ let clone = unsafe { alloc(layout) }; -+ // SAFETY: new allocation cannot overlap the previous one (this was -+ // not a realloc). The argument ptrs are readable/writeable -+ // respectively for size bytes. -+ unsafe { ptr::copy_nonoverlapping(ptr, clone, size) } -+ Identifier { -+ head: ptr_to_repr(clone), -+ tail: [0; TAIL_BYTES], -+ } -+ } -+ } -+} -+ -+impl Drop for Identifier { -+ fn drop(&mut self) { -+ if self.is_empty_or_inline() { -+ return; -+ } -+ let ptr = repr_to_ptr_mut(self.head); -+ // SAFETY: ptr is one of our own heap allocations. -+ let len = unsafe { decode_len(ptr) }; -+ let size = bytes_for_varint(len) + len.get(); -+ let align = 2; -+ // SAFETY: align is not zero, align is a power of two, and rounding -+ // size up to align does not overflow usize::MAX. These guarantees were -+ // made when originally allocating this memory. -+ let layout = unsafe { Layout::from_size_align_unchecked(size, align) }; -+ // SAFETY: ptr was previously allocated by the same allocator with the -+ // same layout. -+ unsafe { dealloc(ptr, layout) } -+ } -+} -+ -+impl PartialEq for Identifier { -+ fn eq(&self, rhs: &Self) -> bool { -+ if self.is_empty_or_inline() { -+ // Fast path (most common) -+ self.head == rhs.head && self.tail == rhs.tail -+ } else if rhs.is_empty_or_inline() { -+ false -+ } else { -+ // SAFETY: both reprs are in the heap allocated representation. -+ unsafe { ptr_as_str(&self.head) == ptr_as_str(&rhs.head) } -+ } -+ } -+} -+ -+unsafe impl Send for Identifier {} -+unsafe impl Sync for Identifier {} -+ -+// We use heap pointers that are 2-byte aligned, meaning they have an -+// insignificant 0 in the least significant bit. We take advantage of that -+// unneeded bit to rotate a 1 into the most significant bit to make the repr -+// distinguishable from ASCII bytes. -+fn ptr_to_repr(original: *mut u8) -> NonNull<u8> { -+ // `mov eax, 1` -+ // `shld rax, rdi, 63` -+ let modified = (original as usize | 1).rotate_right(1); -+ -+ // `original + (modified - original)`, but being mindful of provenance. -+ let diff = modified.wrapping_sub(original as usize); -+ let modified = original.wrapping_add(diff); -+ -+ // SAFETY: the most significant bit of repr is known to be set, so the value -+ // is not zero. -+ unsafe { NonNull::new_unchecked(modified) } -+} -+ -+// Shift out the 1 previously placed into the most significant bit of the least -+// significant byte. Shift in a low 0 bit to reconstruct the original 2-byte -+// aligned pointer. -+fn repr_to_ptr(modified: NonNull<u8>) -> *const u8 { -+ // `lea rax, [rdi + rdi]` -+ let modified = modified.as_ptr(); -+ let original = (modified as usize) << 1; -+ -+ // `modified + (original - modified)`, but being mindful of provenance. -+ let diff = original.wrapping_sub(modified as usize); -+ modified.wrapping_add(diff) -+} -+ -+fn repr_to_ptr_mut(repr: NonNull<u8>) -> *mut u8 { -+ repr_to_ptr(repr) as *mut u8 -+} -+ -+// Compute the length of the inline string, assuming the argument is in short -+// string representation. Short strings are stored as 1 to 8 nonzero ASCII -+// bytes, followed by \0 padding for the remaining bytes. -+// -+// SAFETY: the identifier must indeed be in the inline representation. -+unsafe fn inline_len(repr: &Identifier) -> NonZeroUsize { -+ // SAFETY: Identifier's layout is align(8) and at least size 8. We're doing -+ // an aligned read of the first 8 bytes from it. The bytes are not all zero -+ // because inline strings are at least 1 byte long and cannot contain \0. -+ let repr = unsafe { ptr::read(repr as *const Identifier as *const NonZeroU64) }; -+ -+ // Rustc >=1.53 has intrinsics for counting zeros on a non-zeroable integer. -+ // On many architectures these are more efficient than counting on ordinary -+ // zeroable integers (bsf vs cttz). On rustc <1.53 without those intrinsics, -+ // we count zeros in the u64 rather than the NonZeroU64. -+ #[cfg(no_nonzero_bitscan)] -+ let repr = repr.get(); -+ -+ #[cfg(target_endian = "little")] -+ let zero_bits_on_string_end = repr.leading_zeros(); -+ #[cfg(target_endian = "big")] -+ let zero_bits_on_string_end = repr.trailing_zeros(); -+ -+ let nonzero_bytes = 8 - zero_bits_on_string_end as usize / 8; -+ -+ // SAFETY: repr is nonzero, so it has at most 63 zero bits on either end, -+ // thus at least one nonzero byte. -+ unsafe { NonZeroUsize::new_unchecked(nonzero_bytes) } -+} -+ -+// SAFETY: repr must be in the inline representation, i.e. at least 1 and at -+// most 8 nonzero ASCII bytes padded on the end with \0 bytes. -+unsafe fn inline_as_str(repr: &Identifier) -> &str { -+ let ptr = repr as *const Identifier as *const u8; -+ let len = unsafe { inline_len(repr) }.get(); -+ // SAFETY: we are viewing the nonzero ASCII prefix of the inline repr's -+ // contents as a slice of bytes. Input/output lifetimes are correctly -+ // associated. -+ let slice = unsafe { slice::from_raw_parts(ptr, len) }; -+ // SAFETY: the string contents are known to be only ASCII bytes, which are -+ // always valid UTF-8. -+ unsafe { str::from_utf8_unchecked(slice) } -+} -+ -+// Decode varint. Varints consist of between one and eight base-128 digits, each -+// of which is stored in a byte with most significant bit set. Adjacent to the -+// varint in memory there is guaranteed to be at least 9 ASCII bytes, each of -+// which has an unset most significant bit. -+// -+// SAFETY: ptr must be one of our own heap allocations, with the varint header -+// already written. -+unsafe fn decode_len(ptr: *const u8) -> NonZeroUsize { -+ // SAFETY: There is at least one byte of varint followed by at least 9 bytes -+ // of string content, which is at least 10 bytes total for the allocation, -+ // so reading the first two is no problem. -+ let [first, second] = unsafe { ptr::read(ptr as *const [u8; 2]) }; -+ if second < 0x80 { -+ // SAFETY: the length of this heap allocated string has been encoded as -+ // one base-128 digit, so the length is at least 9 and at most 127. It -+ // cannot be zero. -+ unsafe { NonZeroUsize::new_unchecked((first & 0x7f) as usize) } -+ } else { -+ return unsafe { decode_len_cold(ptr) }; -+ -+ // Identifiers 128 bytes or longer. This is not exercised by any crate -+ // version currently published to crates.io. -+ #[cold] -+ #[inline(never)] -+ unsafe fn decode_len_cold(mut ptr: *const u8) -> NonZeroUsize { -+ let mut len = 0; -+ let mut shift = 0; -+ loop { -+ // SAFETY: varint continues while there are bytes having the -+ // most significant bit set, i.e. until we start hitting the -+ // ASCII string content with msb unset. -+ let byte = unsafe { *ptr }; -+ if byte < 0x80 { -+ // SAFETY: the string length is known to be 128 bytes or -+ // longer. -+ return unsafe { NonZeroUsize::new_unchecked(len) }; -+ } -+ // SAFETY: still in bounds of the same allocation. -+ ptr = unsafe { ptr.add(1) }; -+ len += ((byte & 0x7f) as usize) << shift; -+ shift += 7; -+ } -+ } -+ } -+} -+ -+// SAFETY: repr must be in the heap allocated representation, with varint header -+// and string contents already written. -+unsafe fn ptr_as_str(repr: &NonNull<u8>) -> &str { -+ let ptr = repr_to_ptr(*repr); -+ let len = unsafe { decode_len(ptr) }; -+ let header = bytes_for_varint(len); -+ let slice = unsafe { slice::from_raw_parts(ptr.add(header), len.get()) }; -+ // SAFETY: all identifier contents are ASCII bytes, which are always valid -+ // UTF-8. -+ unsafe { str::from_utf8_unchecked(slice) } -+} -+ -+// Number of base-128 digits required for the varint representation of a length. -+fn bytes_for_varint(len: NonZeroUsize) -> usize { -+ #[cfg(no_nonzero_bitscan)] // rustc <1.53 -+ let len = len.get(); -+ -+ let usize_bits = mem::size_of::<usize>() * 8; -+ let len_bits = usize_bits - len.leading_zeros() as usize; -+ (len_bits + 6) / 7 -+} -diff --git a/third_party/rust/semver/src/impls.rs b/third_party/rust/semver/src/impls.rs -new file mode 100644 ---- /dev/null -+++ b/third_party/rust/semver/src/impls.rs -@@ -0,0 +1,156 @@ -+use crate::backport::*; -+use crate::identifier::Identifier; -+use crate::{BuildMetadata, Comparator, Prerelease, VersionReq}; -+use core::cmp::Ordering; -+use core::hash::{Hash, Hasher}; -+use core::iter::FromIterator; -+use core::ops::Deref; -+ -+impl Default for Identifier { -+ fn default() -> Self { -+ Identifier::empty() -+ } -+} -+ -+impl Eq for Identifier {} -+ -+impl Hash for Identifier { -+ fn hash<H: Hasher>(&self, hasher: &mut H) { -+ self.as_str().hash(hasher); -+ } -+} -+ -+impl Deref for Prerelease { -+ type Target = str; -+ -+ fn deref(&self) -> &Self::Target { -+ self.identifier.as_str() -+ } -+} -+ -+impl Deref for BuildMetadata { -+ type Target = str; -+ -+ fn deref(&self) -> &Self::Target { -+ self.identifier.as_str() -+ } -+} -+ -+impl PartialOrd for Prerelease { -+ fn partial_cmp(&self, rhs: &Self) -> Option<Ordering> { -+ Some(Ord::cmp(self, rhs)) -+ } -+} -+ -+impl PartialOrd for BuildMetadata { -+ fn partial_cmp(&self, rhs: &Self) -> Option<Ordering> { -+ Some(Ord::cmp(self, rhs)) -+ } -+} -+ -+impl Ord for Prerelease { -+ fn cmp(&self, rhs: &Self) -> Ordering { -+ match self.is_empty() { -+ true if rhs.is_empty() => return Ordering::Equal, -+ // A real release compares greater than prerelease. -+ true => return Ordering::Greater, -+ // Prerelease compares less than the real release. -+ false if rhs.is_empty() => return Ordering::Less, -+ false => {} -+ } -+ -+ let lhs = self.as_str().split('.'); -+ let mut rhs = rhs.as_str().split('.'); -+ -+ for lhs in lhs { -+ let rhs = match rhs.next() { -+ // Spec: "A larger set of pre-release fields has a higher -+ // precedence than a smaller set, if all of the preceding -+ // identifiers are equal." -+ None => return Ordering::Greater, -+ Some(rhs) => rhs, -+ }; -+ -+ let string_cmp = || Ord::cmp(lhs, rhs); -+ let is_ascii_digit = |b: u8| b.is_ascii_digit(); -+ let ordering = match ( -+ lhs.bytes().all(is_ascii_digit), -+ rhs.bytes().all(is_ascii_digit), -+ ) { -+ // Respect numeric ordering, for example 99 < 100. Spec says: -+ // "Identifiers consisting of only digits are compared -+ // numerically." -+ (true, true) => Ord::cmp(&lhs.len(), &rhs.len()).then_with(string_cmp), -+ // Spec: "Numeric identifiers always have lower precedence than -+ // non-numeric identifiers." -+ (true, false) => return Ordering::Less, -+ (false, true) => return Ordering::Greater, -+ // Spec: "Identifiers with letters or hyphens are compared -+ // lexically in ASCII sort order." -+ (false, false) => string_cmp(), -+ }; -+ -+ if ordering != Ordering::Equal { -+ return ordering; -+ } -+ } -+ -+ if rhs.next().is_none() { -+ Ordering::Equal -+ } else { -+ Ordering::Less -+ } -+ } -+} -+ -+impl Ord for BuildMetadata { -+ fn cmp(&self, rhs: &Self) -> Ordering { -+ let lhs = self.as_str().split('.'); -+ let mut rhs = rhs.as_str().split('.'); -+ -+ for lhs in lhs { -+ let rhs = match rhs.next() { -+ None => return Ordering::Greater, -+ Some(rhs) => rhs, -+ }; -+ -+ let is_ascii_digit = |b: u8| b.is_ascii_digit(); -+ let ordering = match ( -+ lhs.bytes().all(is_ascii_digit), -+ rhs.bytes().all(is_ascii_digit), -+ ) { -+ (true, true) => { -+ // 0 < 00 < 1 < 01 < 001 < 2 < 02 < 002 < 10 -+ let lhval = lhs.trim_start_matches('0'); -+ let rhval = rhs.trim_start_matches('0'); -+ Ord::cmp(&lhval.len(), &rhval.len()) -+ .then_with(|| Ord::cmp(lhval, rhval)) -+ .then_with(|| Ord::cmp(&lhs.len(), &rhs.len())) -+ } -+ (true, false) => return Ordering::Less, -+ (false, true) => return Ordering::Greater, -+ (false, false) => Ord::cmp(lhs, rhs), -+ }; -+ -+ if ordering != Ordering::Equal { -+ return ordering; -+ } -+ } -+ -+ if rhs.next().is_none() { -+ Ordering::Equal -+ } else { -+ Ordering::Less -+ } -+ } -+} -+ -+impl FromIterator<Comparator> for VersionReq { -+ fn from_iter<I>(iter: I) -> Self -+ where -+ I: IntoIterator<Item = Comparator>, -+ { -+ let comparators = Vec::from_iter(iter); -+ VersionReq { comparators } -+ } -+} -diff --git a/third_party/rust/semver/src/lib.rs b/third_party/rust/semver/src/lib.rs ---- a/third_party/rust/semver/src/lib.rs -+++ b/third_party/rust/semver/src/lib.rs -@@ -1,182 +1,533 @@ --// Copyright 2012-2013 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. -- --//! Semantic version parsing and comparison. -+//! [![github]](https://github.com/dtolnay/semver) [![crates-io]](https://crates.io/crates/semver) [![docs-rs]](https://docs.rs/semver) - //! --//! Semantic versioning (see http://semver.org/) is a set of rules for --//! assigning version numbers. -+//! [github]: https://img.shields.io/badge/github-8da0cb?style=for-the-badge&labelColor=555555&logo=github -+//! [crates-io]: https://img.shields.io/badge/crates.io-fc8d62?style=for-the-badge&labelColor=555555&logo=rust -+//! [docs-rs]: https://img.shields.io/badge/docs.rs-66c2a5?style=for-the-badge&labelColor=555555&logoColor=white&logo=data:image/svg+xml;base64,PHN2ZyByb2xlPSJpbWciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDUxMiA1MTIiPjxwYXRoIGZpbGw9IiNmNWY1ZjUiIGQ9Ik00ODguNiAyNTAuMkwzOTIgMjE0VjEwNS41YzAtMTUtOS4zLTI4LjQtMjMuNC0zMy43bC0xMDAtMzcuNWMtOC4xLTMuMS0xNy4xLTMuMS0yNS4zIDBsLTEwMCAzNy41Yy0xNC4xIDUuMy0yMy40IDE4LjctMjMuNCAzMy43VjIxNGwtOTYuNiAzNi4yQzkuMyAyNTUuNSAwIDI2OC45IDAgMjgzLjlWMzk0YzAgMTMuNiA3LjcgMjYuMSAxOS45IDMyLjJsMTAwIDUwYzEwLjEgNS4xIDIyLjEgNS4xIDMyLjIgMGwxMDMuOS01MiAxMDMuOSA1MmMxMC4xIDUuMSAyMi4xIDUuMSAzMi4yIDBsMTAwLTUwYzEyLjItNi4xIDE5LjktMTguNiAxOS45LTMyLjJWMjgzLjljMC0xNS05LjMtMjguNC0yMy40LTMzLjd6TTM1OCAyMTQuOGwtODUgMzEuOXYtNjguMmw4NS0zN3Y3My4zek0xNTQgMTA0LjFsMTAyLTM4LjIgMTAyIDM4LjJ2LjZsLTEwMiA0MS40LTEwMi00MS40di0uNnptODQgMjkxLjFsLTg1IDQyLjV2LTc5LjFsODUtMzguOHY3NS40em0wLTExMmwtMTAyIDQxLjQtMTAyLTQxLjR2LS42bDEwMi0zOC4yIDEwMiAzOC4ydi42em0yNDAgMTEybC04NSA0Mi41di03OS4xbDg1LTM4Ljh2NzUuNHptMC0xMTJsLTEwMiA0MS40LTEwMi00MS40di0uNmwxMDItMzguMiAxMDIgMzguMnYuNnoiPjwvcGF0aD48L3N2Zz4K - //! --//! ## SemVer overview --//! --//! Given a version number MAJOR.MINOR.PATCH, increment the: -+//! <br> - //! --//! 1. MAJOR version when you make incompatible API changes, --//! 2. MINOR version when you add functionality in a backwards-compatible --//! manner, and --//! 3. PATCH version when you make backwards-compatible bug fixes. --//! --//! Additional labels for pre-release and build metadata are available as --//! extensions to the MAJOR.MINOR.PATCH format. --//! --//! Any references to 'the spec' in this documentation refer to [version 2.0 of --//! the SemVer spec](http://semver.org/spec/v2.0.0.html). -+//! A parser and evaluator for Cargo's flavor of Semantic Versioning. - //! --//! ## SemVer and the Rust ecosystem --//! --//! Rust itself follows the SemVer specification, as does its standard --//! libraries. The two are not tied together. -+//! Semantic Versioning (see <https://semver.org>) is a guideline for how -+//! version numbers are assigned and incremented. It is widely followed within -+//! the Cargo/crates.io ecosystem for Rust. - //! --//! [Cargo](http://crates.io), Rust's package manager, uses SemVer to determine --//! which versions of packages you need installed. -+//! <br> - //! --//! ## Versions --//! --//! At its simplest, the `semver` crate allows you to construct `Version` --//! objects using the `parse` method: -+//! # Example - //! --//! ```{rust} --//! use semver::Version; -+//! ``` -+//! use semver::{BuildMetadata, Prerelease, Version, VersionReq}; - //! --//! assert!(Version::parse("1.2.3") == Ok(Version { --//! major: 1, --//! minor: 2, --//! patch: 3, --//! pre: vec!(), --//! build: vec!(), --//! })); --//! ``` --//! --//! If you have multiple `Version`s, you can use the usual comparison operators --//! to compare them: --//! --//! ```{rust} --//! use semver::Version; --//! --//! assert!(Version::parse("1.2.3-alpha") != Version::parse("1.2.3-beta")); --//! assert!(Version::parse("1.2.3-alpha2") > Version::parse("1.2.0")); --//! ``` -+//! fn main() { -+//! let req = VersionReq::parse(">=1.2.3, <1.8.0").unwrap(); - //! --//! If you explicitly need to modify a Version, SemVer also allows you to --//! increment the major, minor, and patch numbers in accordance with the spec. --//! --//! Please note that in order to do this, you must use a mutable Version: --//! --//! ```{rust} --//! use semver::Version; --//! --//! let mut bugfix_release = Version::parse("1.0.0").unwrap(); --//! bugfix_release.increment_patch(); -+//! // Check whether this requirement matches version 1.2.3-alpha.1 (no) -+//! let version = Version { -+//! major: 1, -+//! minor: 2, -+//! patch: 3, -+//! pre: Prerelease::new("alpha.1").unwrap(), -+//! build: BuildMetadata::EMPTY, -+//! }; -+//! assert!(!req.matches(&version)); - //! --//! assert_eq!(Ok(bugfix_release), Version::parse("1.0.1")); --//! ``` --//! --//! When incrementing the minor version number, the patch number resets to zero --//! (in accordance with section 7 of the spec) --//! --//! ```{rust} --//! use semver::Version; --//! --//! let mut feature_release = Version::parse("1.4.6").unwrap(); --//! feature_release.increment_minor(); --//! --//! assert_eq!(Ok(feature_release), Version::parse("1.5.0")); -+//! // Check whether it matches 1.3.0 (yes it does) -+//! let version = Version::parse("1.3.0").unwrap(); -+//! assert!(req.matches(&version)); -+//! } - //! ``` - //! --//! Similarly, when incrementing the major version number, the patch and minor --//! numbers reset to zero (in accordance with section 8 of the spec) -+//! <br><br> - //! --//! ```{rust} --//! use semver::Version; --//! --//! let mut chrome_release = Version::parse("41.5.5377").unwrap(); --//! chrome_release.increment_major(); -+//! # Scope of this crate - //! --//! assert_eq!(Ok(chrome_release), Version::parse("42.0.0")); --//! ``` --//! --//! ## Requirements --//! --//! The `semver` crate also provides the ability to compare requirements, which --//! are more complex comparisons. --//! --//! For example, creating a requirement that only matches versions greater than --//! or equal to 1.0.0: -+//! Besides Cargo, several other package ecosystems and package managers for -+//! other languages also use SemVer: RubyGems/Bundler for Ruby, npm for -+//! JavaScript, Composer for PHP, CocoaPods for Objective-C... - //! --//! ```{rust} --//! # #![allow(unstable)] --//! use semver::Version; --//! use semver::VersionReq; --//! --//! let r = VersionReq::parse(">= 1.0.0").unwrap(); --//! let v = Version::parse("1.0.0").unwrap(); -+//! The `semver` crate is specifically intended to implement Cargo's -+//! interpretation of Semantic Versioning. - //! --//! assert!(r.to_string() == ">= 1.0.0".to_string()); --//! assert!(r.matches(&v)) --//! ``` --//! --//! It also allows parsing of `~x.y.z` and `^x.y.z` requirements as defined at --//! https://www.npmjs.org/doc/misc/semver.html -+//! Where the various tools differ in their interpretation or implementation of -+//! the spec, this crate follows the implementation choices made by Cargo. If -+//! you are operating on version numbers from some other package ecosystem, you -+//! will want to use a different semver library which is appropriate to that -+//! ecosystem. - //! --//! **Tilde requirements** specify a minimal version with some updates: --//! --//! ```notrust --//! ~1.2.3 := >=1.2.3 <1.3.0 --//! ~1.2 := >=1.2.0 <1.3.0 --//! ~1 := >=1.0.0 <2.0.0 --//! ``` -+//! The extent of Cargo's SemVer support is documented in the *[Specifying -+//! Dependencies]* chapter of the Cargo reference. - //! --//! **Caret requirements** allow SemVer compatible updates to a specified --//! verion, `0.x` and `0.x+1` are not considered compatible, but `1.x` and --//! `1.x+1` are. --//! --//! `0.0.x` is not considered compatible with any other version. --//! Missing minor and patch versions are desugared to `0` but allow flexibility --//! for that value. --//! --//! ```notrust --//! ^1.2.3 := >=1.2.3 <2.0.0 --//! ^0.2.3 := >=0.2.3 <0.3.0 --//! ^0.0.3 := >=0.0.3 <0.0.4 --//! ^0.0 := >=0.0.0 <0.1.0 --//! ^0 := >=0.0.0 <1.0.0 --//! ``` --//! --//! **Wildcard requirements** allows parsing of version requirements of the --//! formats `*`, `x.*` and `x.y.*`. --//! --//! ```notrust --//! * := >=0.0.0 --//! 1.* := >=1.0.0 <2.0.0 --//! 1.2.* := >=1.2.0 <1.3.0 --//! ``` -+//! [Specifying Dependencies]: https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html -+ -+#![doc(html_root_url = "https://docs.rs/semver/1.0.9")] -+#![cfg_attr(doc_cfg, feature(doc_cfg))] -+#![cfg_attr(all(not(feature = "std"), not(no_alloc_crate)), no_std)] -+#![cfg_attr(not(no_unsafe_op_in_unsafe_fn_lint), deny(unsafe_op_in_unsafe_fn))] -+#![cfg_attr(no_unsafe_op_in_unsafe_fn_lint, allow(unused_unsafe))] -+#![cfg_attr(no_str_strip_prefix, allow(unstable_name_collisions))] -+#![allow( -+ clippy::cast_lossless, -+ clippy::cast_possible_truncation, -+ clippy::doc_markdown, -+ clippy::items_after_statements, -+ clippy::manual_map, -+ clippy::match_bool, -+ clippy::missing_errors_doc, -+ clippy::must_use_candidate, -+ clippy::needless_doctest_main, -+ clippy::option_if_let_else, -+ clippy::ptr_as_ptr, -+ clippy::redundant_else, -+ clippy::semicolon_if_nothing_returned, // https://github.com/rust-lang/rust-clippy/issues/7324 -+ clippy::similar_names, -+ clippy::unnested_or_patterns, -+ clippy::unseparated_literal_suffix, -+ clippy::wildcard_imports -+)] -+ -+#[cfg(not(no_alloc_crate))] -+extern crate alloc; -+ -+mod backport; -+mod display; -+mod error; -+mod eval; -+mod identifier; -+mod impls; -+mod parse; -+ -+#[cfg(feature = "serde")] -+mod serde; -+ -+use crate::alloc::vec::Vec; -+use crate::identifier::Identifier; -+use core::str::FromStr; -+ -+#[allow(unused_imports)] -+use crate::backport::*; -+ -+pub use crate::parse::Error; -+ -+/// **SemVer version** as defined by <https://semver.org>. -+/// -+/// # Syntax -+/// -+/// - The major, minor, and patch numbers may be any integer 0 through u64::MAX. -+/// When representing a SemVer version as a string, each number is written as -+/// a base 10 integer. For example, `1.0.119`. -+/// -+/// - Leading zeros are forbidden in those positions. For example `1.01.00` is -+/// invalid as a SemVer version. -+/// -+/// - The pre-release identifier, if present, must conform to the syntax -+/// documented for [`Prerelease`]. -+/// -+/// - The build metadata, if present, must conform to the syntax documented for -+/// [`BuildMetadata`]. -+/// -+/// - Whitespace is not allowed anywhere in the version. -+/// -+/// # Total ordering -+/// -+/// Given any two SemVer versions, one is less than, greater than, or equal to -+/// the other. Versions may be compared against one another using Rust's usual -+/// comparison operators. -+/// -+/// - The major, minor, and patch number are compared numerically from left to -+/// right, lexicographically ordered as a 3-tuple of integers. So for example -+/// version `1.5.0` is less than version `1.19.0`, despite the fact that -+/// "1.19.0" < "1.5.0" as ASCIIbetically compared strings and 1.19 < 1.5 -+/// as real numbers. -+/// -+/// - When major, minor, and patch are equal, a pre-release version is -+/// considered less than the ordinary release: version `1.0.0-alpha.1` is -+/// less than version `1.0.0`. -+/// -+/// - Two pre-releases of the same major, minor, patch are compared by -+/// lexicographic ordering of dot-separated components of the pre-release -+/// string. -+/// -+/// - Identifiers consisting of only digits are compared -+/// numerically: `1.0.0-pre.8` is less than `1.0.0-pre.12`. -+/// -+/// - Identifiers that contain a letter or hyphen are compared in ASCII sort -+/// order: `1.0.0-pre12` is less than `1.0.0-pre8`. -+/// -+/// - Any numeric identifier is always less than any non-numeric -+/// identifier: `1.0.0-pre.1` is less than `1.0.0-pre.x`. -+/// -+/// Example: `1.0.0-alpha` < `1.0.0-alpha.1` < `1.0.0-alpha.beta` < `1.0.0-beta` < `1.0.0-beta.2` < `1.0.0-beta.11` < `1.0.0-rc.1` < `1.0.0` -+#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash)] -+pub struct Version { -+ pub major: u64, -+ pub minor: u64, -+ pub patch: u64, -+ pub pre: Prerelease, -+ pub build: BuildMetadata, -+} -+ -+/// **SemVer version requirement** describing the intersection of some version -+/// comparators, such as `>=1.2.3, <1.8`. -+/// -+/// # Syntax -+/// -+/// - Either `*` (meaning "any"), or one or more comma-separated comparators. -+/// -+/// - A [`Comparator`] is an operator ([`Op`]) and a partial version, separated -+/// by optional whitespace. For example `>=1.0.0` or `>=1.0`. -+/// -+/// - Build metadata is syntactically permitted on the partial versions, but is -+/// completely ignored, as it's never relevant to whether any comparator -+/// matches a particular version. -+/// -+/// - Whitespace is permitted around commas and around operators. Whitespace is -+/// not permitted within a partial version, i.e. anywhere between the major -+/// version number and its minor, patch, pre-release, or build metadata. -+#[derive(Clone, Eq, PartialEq, Hash, Debug)] -+#[cfg_attr(no_const_vec_new, derive(Default))] -+pub struct VersionReq { -+ pub comparators: Vec<Comparator>, -+} -+ -+/// A pair of comparison operator and partial version, such as `>=1.2`. Forms -+/// one piece of a VersionReq. -+#[derive(Clone, Eq, PartialEq, Hash, Debug)] -+pub struct Comparator { -+ pub op: Op, -+ pub major: u64, -+ pub minor: Option<u64>, -+ /// Patch is only allowed if minor is Some. -+ pub patch: Option<u64>, -+ /// Non-empty pre-release is only allowed if patch is Some. -+ pub pre: Prerelease, -+} -+ -+/// SemVer comparison operator: `=`, `>`, `>=`, `<`, `<=`, `~`, `^`, `*`. -+/// -+/// # Op::Exact -+/// - **`=I.J.K`** — exactly the version I.J.K -+/// - **`=I.J`** — equivalent to `>=I.J.0, <I.(J+1).0` -+/// - **`=I`** — equivalent to `>=I.0.0, <(I+1).0.0` -+/// -+/// # Op::Greater -+/// - **`>I.J.K`** -+/// - **`>I.J`** — equivalent to `>=I.(J+1).0` -+/// - **`>I`** — equivalent to `>=(I+1).0.0` -+/// -+/// # Op::GreaterEq -+/// - **`>=I.J.K`** -+/// - **`>=I.J`** — equivalent to `>=I.J.0` -+/// - **`>=I`** — equivalent to `>=I.0.0` -+/// -+/// # Op::Less -+/// - **`<I.J.K`** -+/// - **`<I.J`** — equivalent to `<I.J.0` -+/// - **`<I`** — equivalent to `<I.0.0` -+/// -+/// # Op::LessEq -+/// - **`<=I.J.K`** -+/// - **`<=I.J`** — equivalent to `<I.(J+1).0` -+/// - **`<=I`** — equivalent to `<(I+1).0.0` -+/// -+/// # Op::Tilde ("patch" updates) -+/// *Tilde requirements allow the **patch** part of the semver version (the third number) to increase.* -+/// - **`~I.J.K`** — equivalent to `>=I.J.K, <I.(J+1).0` -+/// - **`~I.J`** — equivalent to `=I.J` -+/// - **`~I`** — equivalent to `=I` -+/// -+/// # Op::Caret ("compatible" updates) -+/// *Caret requirements allow parts that are **right of the first nonzero** part of the semver version to increase.* -+/// - **`^I.J.K`** (for I\>0) — equivalent to `>=I.J.K, <(I+1).0.0` -+/// - **`^0.J.K`** (for J\>0) — equivalent to `>=0.J.K, <0.(J+1).0` -+/// - **`^0.0.K`** — equivalent to `=0.0.K` -+/// - **`^I.J`** (for I\>0 or J\>0) — equivalent to `^I.J.0` -+/// - **`^0.0`** — equivalent to `=0.0` -+/// - **`^I`** — equivalent to `=I` -+/// -+/// # Op::Wildcard -+/// - **`I.J.*`** — equivalent to `=I.J` -+/// - **`I.*`** or **`I.*.*`** — equivalent to `=I` -+#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] -+#[cfg_attr(not(no_non_exhaustive), non_exhaustive)] -+pub enum Op { -+ Exact, -+ Greater, -+ GreaterEq, -+ Less, -+ LessEq, -+ Tilde, -+ Caret, -+ Wildcard, -+ -+ #[cfg(no_non_exhaustive)] // rustc <1.40 -+ #[doc(hidden)] -+ __NonExhaustive, -+} - --#![doc(html_logo_url = "https://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png", -- html_favicon_url = "https://www.rust-lang.org/favicon.ico")] --#![deny(missing_docs)] --#![cfg_attr(test, deny(warnings))] -+/// Optional pre-release identifier on a version string. This comes after `-` in -+/// a SemVer version, like `1.0.0-alpha.1` -+/// -+/// # Examples -+/// -+/// Some real world pre-release idioms drawn from crates.io: -+/// -+/// - **[mio]** <code>0.7.0-<b>alpha.1</b></code> — the most common style -+/// for numbering pre-releases. -+/// -+/// - **[pest]** <code>1.0.0-<b>beta.8</b></code>, <code>1.0.0-<b>rc.0</b></code> -+/// — this crate makes a distinction between betas and release -+/// candidates. -+/// -+/// - **[sassers]** <code>0.11.0-<b>shitshow</b></code> — ???. -+/// -+/// - **[atomic-utils]** <code>0.0.0-<b>reserved</b></code> — a squatted -+/// crate name. -+/// -+/// [mio]: https://crates.io/crates/mio -+/// [pest]: https://crates.io/crates/pest -+/// [atomic-utils]: https://crates.io/crates/atomic-utils -+/// [sassers]: https://crates.io/crates/sassers -+/// -+/// *Tip:* Be aware that if you are planning to number your own pre-releases, -+/// you should prefer to separate the numeric part from any non-numeric -+/// identifiers by using a dot in between. That is, prefer pre-releases -+/// `alpha.1`, `alpha.2`, etc rather than `alpha1`, `alpha2` etc. The SemVer -+/// spec's rule for pre-release precedence has special treatment of numeric -+/// components in the pre-release string, but only if there are no non-digit -+/// characters in the same dot-separated component. So you'd have `alpha.2` < -+/// `alpha.11` as intended, but `alpha11` < `alpha2`. -+/// -+/// # Syntax -+/// -+/// Pre-release strings are a series of dot separated identifiers immediately -+/// following the patch version. Identifiers must comprise only ASCII -+/// alphanumerics and hyphens: `0-9`, `A-Z`, `a-z`, `-`. Identifiers must not be -+/// empty. Numeric identifiers must not include leading zeros. -+/// -+/// # Total ordering -+/// -+/// Pre-releases have a total order defined by the SemVer spec. It uses -+/// lexicographic ordering of dot-separated components. Identifiers consisting -+/// of only digits are compared numerically. Otherwise, identifiers are compared -+/// in ASCII sort order. Any numeric identifier is always less than any -+/// non-numeric identifier. -+/// -+/// Example: `alpha` < `alpha.85` < `alpha.90` < `alpha.200` < `alpha.0a` < `alpha.1a0` < `alpha.a` < `beta` -+#[derive(Default, Clone, Eq, PartialEq, Hash)] -+pub struct Prerelease { -+ identifier: Identifier, -+} - --extern crate semver_parser; -- --// Serialization and deserialization support for version numbers --#[cfg(feature = "serde")] --extern crate serde; -+/// Optional build metadata identifier. This comes after `+` in a SemVer -+/// version, as in `0.8.1+zstd.1.5.0`. -+/// -+/// # Examples -+/// -+/// Some real world build metadata idioms drawn from crates.io: -+/// -+/// - **[libgit2-sys]** <code>0.12.20+<b>1.1.0</b></code> — for this -+/// crate, the build metadata indicates the version of the C libgit2 library -+/// that the Rust crate is built against. -+/// -+/// - **[mashup]** <code>0.1.13+<b>deprecated</b></code> — just the word -+/// "deprecated" for a crate that has been superseded by another. Eventually -+/// people will take notice of this in Cargo's build output where it lists the -+/// crates being compiled. -+/// -+/// - **[google-bigquery2]** <code>2.0.4+<b>20210327</b></code> — this -+/// library is automatically generated from an official API schema, and the -+/// build metadata indicates the date on which that schema was last captured. -+/// -+/// - **[fbthrift-git]** <code>0.0.6+<b>c7fcc0e</b></code> — this crate is -+/// published from snapshots of a big company monorepo. In monorepo -+/// development, there is no concept of versions, and all downstream code is -+/// just updated atomically in the same commit that breaking changes to a -+/// library are landed. Therefore for crates.io purposes, every published -+/// version must be assumed to be incompatible with the previous. The build -+/// metadata provides the source control hash of the snapshotted code. -+/// -+/// [libgit2-sys]: https://crates.io/crates/libgit2-sys -+/// [mashup]: https://crates.io/crates/mashup -+/// [google-bigquery2]: https://crates.io/crates/google-bigquery2 -+/// [fbthrift-git]: https://crates.io/crates/fbthrift-git -+/// -+/// # Syntax -+/// -+/// Build metadata is a series of dot separated identifiers immediately -+/// following the patch or pre-release version. Identifiers must comprise only -+/// ASCII alphanumerics and hyphens: `0-9`, `A-Z`, `a-z`, `-`. Identifiers must -+/// not be empty. Leading zeros *are* allowed, unlike any other place in the -+/// SemVer grammar. -+/// -+/// # Total ordering -+/// -+/// Build metadata is ignored in evaluating `VersionReq`; it plays no role in -+/// whether a `Version` matches any one of the comparison operators. -+/// -+/// However for comparing build metadatas among one another, they do have a -+/// total order which is determined by lexicographic ordering of dot-separated -+/// components. Identifiers consisting of only digits are compared numerically. -+/// Otherwise, identifiers are compared in ASCII sort order. Any numeric -+/// identifier is always less than any non-numeric identifier. -+/// -+/// Example: `demo` < `demo.85` < `demo.90` < `demo.090` < `demo.200` < `demo.1a0` < `demo.a` < `memo` -+#[derive(Default, Clone, Eq, PartialEq, Hash)] -+pub struct BuildMetadata { -+ identifier: Identifier, -+} - --// We take the common approach of keeping our own module system private, and --// just re-exporting the interface that we want. -+impl Version { -+ /// Create `Version` with an empty pre-release and build metadata. -+ /// -+ /// Equivalent to: -+ /// -+ /// ``` -+ /// # use semver::{BuildMetadata, Prerelease, Version}; -+ /// # -+ /// # const fn new(major: u64, minor: u64, patch: u64) -> Version { -+ /// Version { -+ /// major, -+ /// minor, -+ /// patch, -+ /// pre: Prerelease::EMPTY, -+ /// build: BuildMetadata::EMPTY, -+ /// } -+ /// # } -+ /// ``` -+ pub const fn new(major: u64, minor: u64, patch: u64) -> Self { -+ Version { -+ major, -+ minor, -+ patch, -+ pre: Prerelease::EMPTY, -+ build: BuildMetadata::EMPTY, -+ } -+ } -+ -+ /// Create `Version` by parsing from string representation. -+ /// -+ /// # Errors -+ /// -+ /// Possible reasons for the parse to fail include: -+ /// -+ /// - `1.0` — too few numeric components. A SemVer version must have -+ /// exactly three. If you are looking at something that has fewer than -+ /// three numbers in it, it's possible it is a `VersionReq` instead (with -+ /// an implicit default `^` comparison operator). -+ /// -+ /// - `1.0.01` — a numeric component has a leading zero. -+ /// -+ /// - `1.0.unknown` — unexpected character in one of the components. -+ /// -+ /// - `1.0.0-` or `1.0.0+` — the pre-release or build metadata are -+ /// indicated present but empty. -+ /// -+ /// - `1.0.0-alpha_123` — pre-release or build metadata have something -+ /// outside the allowed characters, which are `0-9`, `A-Z`, `a-z`, `-`, -+ /// and `.` (dot). -+ /// -+ /// - `23456789999999999999.0.0` — overflow of a u64. -+ pub fn parse(text: &str) -> Result<Self, Error> { -+ Version::from_str(text) -+ } -+} -+ -+impl VersionReq { -+ /// A `VersionReq` with no constraint on the version numbers it matches. -+ /// Equivalent to `VersionReq::parse("*").unwrap()`. -+ /// -+ /// In terms of comparators this is equivalent to `>=0.0.0`. -+ /// -+ /// Counterintuitively a `*` VersionReq does not match every possible -+ /// version number. In particular, in order for *any* `VersionReq` to match -+ /// a pre-release version, the `VersionReq` must contain at least one -+ /// `Comparator` that has an explicit major, minor, and patch version -+ /// identical to the pre-release being matched, and that has a nonempty -+ /// pre-release component. Since `*` is not written with an explicit major, -+ /// minor, and patch version, and does not contain a nonempty pre-release -+ /// component, it does not match any pre-release versions. -+ #[cfg(not(no_const_vec_new))] // rustc <1.39 -+ pub const STAR: Self = VersionReq { -+ comparators: Vec::new(), -+ }; - --pub use version::{Version, Identifier, SemVerError}; --pub use version::Identifier::{Numeric, AlphaNumeric}; --pub use version_req::{VersionReq, ReqParseError}; -+ /// Create `VersionReq` by parsing from string representation. -+ /// -+ /// # Errors -+ /// -+ /// Possible reasons for the parse to fail include: -+ /// -+ /// - `>a.b` — unexpected characters in the partial version. -+ /// -+ /// - `@1.0.0` — unrecognized comparison operator. -+ /// -+ /// - `^1.0.0, ` — unexpected end of input. -+ /// -+ /// - `>=1.0 <2.0` — missing comma between comparators. -+ /// -+ /// - `*.*` — unsupported wildcard syntax. -+ pub fn parse(text: &str) -> Result<Self, Error> { -+ VersionReq::from_str(text) -+ } -+ -+ /// Evaluate whether the given `Version` satisfies the version requirement -+ /// described by `self`. -+ pub fn matches(&self, version: &Version) -> bool { -+ eval::matches_req(self, version) -+ } -+} -+ -+/// The default VersionReq is the same as [`VersionReq::STAR`]. -+#[cfg(not(no_const_vec_new))] -+impl Default for VersionReq { -+ fn default() -> Self { -+ VersionReq::STAR -+ } -+} -+ -+impl Comparator { -+ pub fn parse(text: &str) -> Result<Self, Error> { -+ Comparator::from_str(text) -+ } - --// SemVer-compliant versions. --mod version; -+ pub fn matches(&self, version: &Version) -> bool { -+ eval::matches_comparator(self, version) -+ } -+} -+ -+impl Prerelease { -+ pub const EMPTY: Self = Prerelease { -+ identifier: Identifier::empty(), -+ }; -+ -+ pub fn new(text: &str) -> Result<Self, Error> { -+ Prerelease::from_str(text) -+ } -+ -+ pub fn as_str(&self) -> &str { -+ self.identifier.as_str() -+ } - --// advanced version comparisons --mod version_req; -+ pub fn is_empty(&self) -> bool { -+ self.identifier.is_empty() -+ } -+} -+ -+impl BuildMetadata { -+ pub const EMPTY: Self = BuildMetadata { -+ identifier: Identifier::empty(), -+ }; -+ -+ pub fn new(text: &str) -> Result<Self, Error> { -+ BuildMetadata::from_str(text) -+ } -+ -+ pub fn as_str(&self) -> &str { -+ self.identifier.as_str() -+ } -+ -+ pub fn is_empty(&self) -> bool { -+ self.identifier.is_empty() -+ } -+} -diff --git a/third_party/rust/semver/src/parse.rs b/third_party/rust/semver/src/parse.rs -new file mode 100644 ---- /dev/null -+++ b/third_party/rust/semver/src/parse.rs -@@ -0,0 +1,405 @@ -+use crate::backport::*; -+use crate::error::{ErrorKind, Position}; -+use crate::identifier::Identifier; -+use crate::{BuildMetadata, Comparator, Op, Prerelease, Version, VersionReq}; -+use core::str::FromStr; -+ -+/// Error parsing a SemVer version or version requirement. -+/// -+/// # Example -+/// -+/// ``` -+/// use semver::Version; -+/// -+/// fn main() { -+/// let err = Version::parse("1.q.r").unwrap_err(); -+/// -+/// // "unexpected character 'q' while parsing minor version number" -+/// eprintln!("{}", err); -+/// } -+/// ``` -+pub struct Error { -+ pub(crate) kind: ErrorKind, -+} -+ -+impl FromStr for Version { -+ type Err = Error; -+ -+ fn from_str(text: &str) -> Result<Self, Self::Err> { -+ let mut pos = Position::Major; -+ let (major, text) = numeric_identifier(text, pos)?; -+ let text = dot(text, pos)?; -+ -+ pos = Position::Minor; -+ let (minor, text) = numeric_identifier(text, pos)?; -+ let text = dot(text, pos)?; -+ -+ pos = Position::Patch; -+ let (patch, text) = numeric_identifier(text, pos)?; -+ -+ if text.is_empty() { -+ return Ok(Version::new(major, minor, patch)); -+ } -+ -+ let (pre, text) = if let Some(text) = text.strip_prefix('-') { -+ pos = Position::Pre; -+ let (pre, text) = prerelease_identifier(text)?; -+ if pre.is_empty() { -+ return Err(Error::new(ErrorKind::EmptySegment(pos))); -+ } -+ (pre, text) -+ } else { -+ (Prerelease::EMPTY, text) -+ }; -+ -+ let (build, text) = if let Some(text) = text.strip_prefix('+') { -+ pos = Position::Build; -+ let (build, text) = build_identifier(text)?; -+ if build.is_empty() { -+ return Err(Error::new(ErrorKind::EmptySegment(pos))); -+ } -+ (build, text) -+ } else { -+ (BuildMetadata::EMPTY, text) -+ }; -+ -+ if let Some(unexpected) = text.chars().next() { -+ return Err(Error::new(ErrorKind::UnexpectedCharAfter(pos, unexpected))); -+ } -+ -+ Ok(Version { -+ major, -+ minor, -+ patch, -+ pre, -+ build, -+ }) -+ } -+} -+ -+impl FromStr for VersionReq { -+ type Err = Error; -+ -+ fn from_str(text: &str) -> Result<Self, Self::Err> { -+ let text = text.trim_start_matches(' '); -+ if let Some((ch, text)) = wildcard(text) { -+ let rest = text.trim_start_matches(' '); -+ if rest.is_empty() { -+ #[cfg(not(no_const_vec_new))] -+ return Ok(VersionReq::STAR); -+ #[cfg(no_const_vec_new)] // rustc <1.39 -+ return Ok(VersionReq { -+ comparators: Vec::new(), -+ }); -+ } else if rest.starts_with(',') { -+ return Err(Error::new(ErrorKind::WildcardNotTheOnlyComparator(ch))); -+ } else { -+ return Err(Error::new(ErrorKind::UnexpectedAfterWildcard)); -+ } -+ } -+ -+ let depth = 0; -+ let mut comparators = Vec::new(); -+ let len = version_req(text, &mut comparators, depth)?; -+ unsafe { comparators.set_len(len) } -+ Ok(VersionReq { comparators }) -+ } -+} -+ -+impl FromStr for Comparator { -+ type Err = Error; -+ -+ fn from_str(text: &str) -> Result<Self, Self::Err> { -+ let text = text.trim_start_matches(' '); -+ let (comparator, pos, rest) = comparator(text)?; -+ if !rest.is_empty() { -+ let unexpected = rest.chars().next().unwrap(); -+ return Err(Error::new(ErrorKind::UnexpectedCharAfter(pos, unexpected))); -+ } -+ Ok(comparator) -+ } -+} -+ -+impl FromStr for Prerelease { -+ type Err = Error; -+ -+ fn from_str(text: &str) -> Result<Self, Self::Err> { -+ let (pre, rest) = prerelease_identifier(text)?; -+ if !rest.is_empty() { -+ return Err(Error::new(ErrorKind::IllegalCharacter(Position::Pre))); -+ } -+ Ok(pre) -+ } -+} -+ -+impl FromStr for BuildMetadata { -+ type Err = Error; -+ -+ fn from_str(text: &str) -> Result<Self, Self::Err> { -+ let (build, rest) = build_identifier(text)?; -+ if !rest.is_empty() { -+ return Err(Error::new(ErrorKind::IllegalCharacter(Position::Build))); -+ } -+ Ok(build) -+ } -+} -+ -+impl Error { -+ fn new(kind: ErrorKind) -> Self { -+ Error { kind } -+ } -+} -+ -+impl Op { -+ const DEFAULT: Self = Op::Caret; -+} -+ -+fn numeric_identifier(input: &str, pos: Position) -> Result<(u64, &str), Error> { -+ let mut len = 0; -+ let mut value = 0u64; -+ -+ while let Some(&digit) = input.as_bytes().get(len) { -+ if digit < b'0' || digit > b'9' { -+ break; -+ } -+ if value == 0 && len > 0 { -+ return Err(Error::new(ErrorKind::LeadingZero(pos))); -+ } -+ match value -+ .checked_mul(10) -+ .and_then(|value| value.checked_add((digit - b'0') as u64)) -+ { -+ Some(sum) => value = sum, -+ None => return Err(Error::new(ErrorKind::Overflow(pos))), -+ } -+ len += 1; -+ } -+ -+ if len > 0 { -+ Ok((value, &input[len..])) -+ } else if let Some(unexpected) = input[len..].chars().next() { -+ Err(Error::new(ErrorKind::UnexpectedChar(pos, unexpected))) -+ } else { -+ Err(Error::new(ErrorKind::UnexpectedEnd(pos))) -+ } -+} -+ -+fn wildcard(input: &str) -> Option<(char, &str)> { -+ if let Some(rest) = input.strip_prefix('*') { -+ Some(('*', rest)) -+ } else if let Some(rest) = input.strip_prefix('x') { -+ Some(('x', rest)) -+ } else if let Some(rest) = input.strip_prefix('X') { -+ Some(('X', rest)) -+ } else { -+ None -+ } -+} -+ -+fn dot(input: &str, pos: Position) -> Result<&str, Error> { -+ if let Some(rest) = input.strip_prefix('.') { -+ Ok(rest) -+ } else if let Some(unexpected) = input.chars().next() { -+ Err(Error::new(ErrorKind::UnexpectedCharAfter(pos, unexpected))) -+ } else { -+ Err(Error::new(ErrorKind::UnexpectedEnd(pos))) -+ } -+} -+ -+fn prerelease_identifier(input: &str) -> Result<(Prerelease, &str), Error> { -+ let (string, rest) = identifier(input, Position::Pre)?; -+ let identifier = unsafe { Identifier::new_unchecked(string) }; -+ Ok((Prerelease { identifier }, rest)) -+} -+ -+fn build_identifier(input: &str) -> Result<(BuildMetadata, &str), Error> { -+ let (string, rest) = identifier(input, Position::Build)?; -+ let identifier = unsafe { Identifier::new_unchecked(string) }; -+ Ok((BuildMetadata { identifier }, rest)) -+} -+ -+fn identifier(input: &str, pos: Position) -> Result<(&str, &str), Error> { -+ let mut accumulated_len = 0; -+ let mut segment_len = 0; -+ let mut segment_has_nondigit = false; -+ -+ loop { -+ match input.as_bytes().get(accumulated_len + segment_len) { -+ Some(b'A'..=b'Z') | Some(b'a'..=b'z') | Some(b'-') => { -+ segment_len += 1; -+ segment_has_nondigit = true; -+ } -+ Some(b'0'..=b'9') => { -+ segment_len += 1; -+ } -+ boundary => { -+ if segment_len == 0 { -+ if accumulated_len == 0 && boundary != Some(&b'.') { -+ return Ok(("", input)); -+ } else { -+ return Err(Error::new(ErrorKind::EmptySegment(pos))); -+ } -+ } -+ if pos == Position::Pre -+ && segment_len > 1 -+ && !segment_has_nondigit -+ && input[accumulated_len..].starts_with('0') -+ { -+ return Err(Error::new(ErrorKind::LeadingZero(pos))); -+ } -+ accumulated_len += segment_len; -+ if boundary == Some(&b'.') { -+ accumulated_len += 1; -+ segment_len = 0; -+ segment_has_nondigit = false; -+ } else { -+ return Ok(input.split_at(accumulated_len)); -+ } -+ } -+ } -+ } -+} -+ -+fn op(input: &str) -> (Op, &str) { -+ let bytes = input.as_bytes(); -+ if bytes.get(0) == Some(&b'=') { -+ (Op::Exact, &input[1..]) -+ } else if bytes.get(0) == Some(&b'>') { -+ if bytes.get(1) == Some(&b'=') { -+ (Op::GreaterEq, &input[2..]) -+ } else { -+ (Op::Greater, &input[1..]) -+ } -+ } else if bytes.get(0) == Some(&b'<') { -+ if bytes.get(1) == Some(&b'=') { -+ (Op::LessEq, &input[2..]) -+ } else { -+ (Op::Less, &input[1..]) -+ } -+ } else if bytes.get(0) == Some(&b'~') { -+ (Op::Tilde, &input[1..]) -+ } else if bytes.get(0) == Some(&b'^') { -+ (Op::Caret, &input[1..]) -+ } else { -+ (Op::DEFAULT, input) -+ } -+} -+ -+fn comparator(input: &str) -> Result<(Comparator, Position, &str), Error> { -+ let (mut op, text) = op(input); -+ let default_op = input.len() == text.len(); -+ let text = text.trim_start_matches(' '); -+ -+ let mut pos = Position::Major; -+ let (major, text) = numeric_identifier(text, pos)?; -+ let mut has_wildcard = false; -+ -+ let (minor, text) = if let Some(text) = text.strip_prefix('.') { -+ pos = Position::Minor; -+ if let Some((_, text)) = wildcard(text) { -+ has_wildcard = true; -+ if default_op { -+ op = Op::Wildcard; -+ } -+ (None, text) -+ } else { -+ let (minor, text) = numeric_identifier(text, pos)?; -+ (Some(minor), text) -+ } -+ } else { -+ (None, text) -+ }; -+ -+ let (patch, text) = if let Some(text) = text.strip_prefix('.') { -+ pos = Position::Patch; -+ if let Some((_, text)) = wildcard(text) { -+ if default_op { -+ op = Op::Wildcard; -+ } -+ (None, text) -+ } else if has_wildcard { -+ return Err(Error::new(ErrorKind::UnexpectedAfterWildcard)); -+ } else { -+ let (patch, text) = numeric_identifier(text, pos)?; -+ (Some(patch), text) -+ } -+ } else { -+ (None, text) -+ }; -+ -+ let (pre, text) = if patch.is_some() && text.starts_with('-') { -+ pos = Position::Pre; -+ let text = &text[1..]; -+ let (pre, text) = prerelease_identifier(text)?; -+ if pre.is_empty() { -+ return Err(Error::new(ErrorKind::EmptySegment(pos))); -+ } -+ (pre, text) -+ } else { -+ (Prerelease::EMPTY, text) -+ }; -+ -+ let text = if patch.is_some() && text.starts_with('+') { -+ pos = Position::Build; -+ let text = &text[1..]; -+ let (build, text) = build_identifier(text)?; -+ if build.is_empty() { -+ return Err(Error::new(ErrorKind::EmptySegment(pos))); -+ } -+ text -+ } else { -+ text -+ }; -+ -+ let text = text.trim_start_matches(' '); -+ -+ let comparator = Comparator { -+ op, -+ major, -+ minor, -+ patch, -+ pre, -+ }; -+ -+ Ok((comparator, pos, text)) -+} -+ -+fn version_req(input: &str, out: &mut Vec<Comparator>, depth: usize) -> Result<usize, Error> { -+ let (comparator, pos, text) = match comparator(input) { -+ Ok(success) => success, -+ Err(mut error) => { -+ if let Some((ch, mut rest)) = wildcard(input) { -+ rest = rest.trim_start_matches(' '); -+ if rest.is_empty() || rest.starts_with(',') { -+ error.kind = ErrorKind::WildcardNotTheOnlyComparator(ch); -+ } -+ } -+ return Err(error); -+ } -+ }; -+ -+ if text.is_empty() { -+ out.reserve_exact(depth + 1); -+ unsafe { out.as_mut_ptr().add(depth).write(comparator) } -+ return Ok(depth + 1); -+ } -+ -+ let text = if let Some(text) = text.strip_prefix(',') { -+ text.trim_start_matches(' ') -+ } else { -+ let unexpected = text.chars().next().unwrap(); -+ return Err(Error::new(ErrorKind::ExpectedCommaFound(pos, unexpected))); -+ }; -+ -+ const MAX_COMPARATORS: usize = 32; -+ if depth + 1 == MAX_COMPARATORS { -+ return Err(Error::new(ErrorKind::ExcessiveComparators)); -+ } -+ -+ // Recurse to collect parsed Comparator objects on the stack. We perform a -+ // single allocation to allocate exactly the right sized Vec only once the -+ // total number of comparators is known. -+ let len = version_req(text, out, depth + 1)?; -+ unsafe { out.as_mut_ptr().add(depth).write(comparator) } -+ Ok(len) -+} -diff --git a/third_party/rust/semver/src/serde.rs b/third_party/rust/semver/src/serde.rs -new file mode 100644 ---- /dev/null -+++ b/third_party/rust/semver/src/serde.rs -@@ -0,0 +1,74 @@ -+use crate::{Version, VersionReq}; -+use core::fmt; -+use serde::de::{Deserialize, Deserializer, Error, Visitor}; -+use serde::ser::{Serialize, Serializer}; -+ -+impl Serialize for Version { -+ fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> -+ where -+ S: Serializer, -+ { -+ serializer.collect_str(self) -+ } -+} -+ -+impl Serialize for VersionReq { -+ fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> -+ where -+ S: Serializer, -+ { -+ serializer.collect_str(self) -+ } -+} -+ -+impl<'de> Deserialize<'de> for Version { -+ fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> -+ where -+ D: Deserializer<'de>, -+ { -+ struct VersionVisitor; -+ -+ impl<'de> Visitor<'de> for VersionVisitor { -+ type Value = Version; -+ -+ fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { -+ formatter.write_str("semver version") -+ } -+ -+ fn visit_str<E>(self, string: &str) -> Result<Self::Value, E> -+ where -+ E: Error, -+ { -+ string.parse().map_err(Error::custom) -+ } -+ } -+ -+ deserializer.deserialize_str(VersionVisitor) -+ } -+} -+ -+impl<'de> Deserialize<'de> for VersionReq { -+ fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> -+ where -+ D: Deserializer<'de>, -+ { -+ struct VersionReqVisitor; -+ -+ impl<'de> Visitor<'de> for VersionReqVisitor { -+ type Value = VersionReq; -+ -+ fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { -+ formatter.write_str("semver version") -+ } -+ -+ fn visit_str<E>(self, string: &str) -> Result<Self::Value, E> -+ where -+ E: Error, -+ { -+ string.parse().map_err(Error::custom) -+ } -+ } -+ -+ deserializer.deserialize_str(VersionReqVisitor) -+ } -+} -diff --git a/third_party/rust/semver/src/version.rs b/third_party/rust/semver/src/version.rs -deleted file mode 100644 ---- a/third_party/rust/semver/src/version.rs -+++ /dev/null -@@ -1,759 +0,0 @@ --// Copyright 2012-2013 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. -- --//! The `version` module gives you tools to create and compare SemVer-compliant --//! versions. -- --use std::cmp::{self, Ordering}; --use std::fmt; --use std::hash; --use std::error::Error; -- --use std::result; --use std::str; -- --use semver_parser; -- --#[cfg(feature = "serde")] --use serde::ser::{Serialize, Serializer}; --#[cfg(feature = "serde")] --use serde::de::{self, Deserialize, Deserializer, Visitor}; -- --/// An identifier in the pre-release or build metadata. --/// --/// See sections 9 and 10 of the spec for more about pre-release identifers and --/// build metadata. --#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)] --pub enum Identifier { -- /// An identifier that's solely numbers. -- Numeric(u64), -- /// An identifier with letters and numbers. -- AlphaNumeric(String), --} -- --impl From<semver_parser::version::Identifier> for Identifier { -- fn from(other: semver_parser::version::Identifier) -> Identifier { -- match other { -- semver_parser::version::Identifier::Numeric(n) => Identifier::Numeric(n), -- semver_parser::version::Identifier::AlphaNumeric(s) => Identifier::AlphaNumeric(s), -- } -- } --} -- --impl fmt::Display for Identifier { -- #[inline] -- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { -- match *self { -- Identifier::Numeric(ref n) => fmt::Display::fmt(n, f), -- Identifier::AlphaNumeric(ref s) => fmt::Display::fmt(s, f), -- } -- } --} -- --#[cfg(feature = "serde")] --impl Serialize for Identifier { -- fn serialize<S>(&self, serializer: S) -> result::Result<S::Ok, S::Error> -- where S: Serializer -- { -- // Serialize Identifier as a number or string. -- match *self { -- Identifier::Numeric(n) => serializer.serialize_u64(n), -- Identifier::AlphaNumeric(ref s) => serializer.serialize_str(s), -- } -- } --} -- --#[cfg(feature = "serde")] --impl<'de> Deserialize<'de> for Identifier { -- fn deserialize<D>(deserializer: D) -> result::Result<Self, D::Error> -- where D: Deserializer<'de> -- { -- struct IdentifierVisitor; -- -- // Deserialize Identifier from a number or string. -- impl<'de> Visitor<'de> for IdentifierVisitor { -- type Value = Identifier; -- -- fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { -- formatter.write_str("a SemVer pre-release or build identifier") -- } -- -- fn visit_u64<E>(self, numeric: u64) -> result::Result<Self::Value, E> -- where E: de::Error -- { -- Ok(Identifier::Numeric(numeric)) -- } -- -- fn visit_str<E>(self, alphanumeric: &str) -> result::Result<Self::Value, E> -- where E: de::Error -- { -- Ok(Identifier::AlphaNumeric(alphanumeric.to_owned())) -- } -- } -- -- deserializer.deserialize_any(IdentifierVisitor) -- } --} -- --/// Represents a version number conforming to the semantic versioning scheme. --#[derive(Clone, Eq, Debug)] --pub struct Version { -- /// The major version, to be incremented on incompatible changes. -- pub major: u64, -- /// The minor version, to be incremented when functionality is added in a -- /// backwards-compatible manner. -- pub minor: u64, -- /// The patch version, to be incremented when backwards-compatible bug -- /// fixes are made. -- pub patch: u64, -- /// The pre-release version identifier, if one exists. -- pub pre: Vec<Identifier>, -- /// The build metadata, ignored when determining version precedence. -- pub build: Vec<Identifier>, --} -- --impl From<semver_parser::version::Version> for Version { -- fn from(other: semver_parser::version::Version) -> Version { -- Version { -- major: other.major, -- minor: other.minor, -- patch: other.patch, -- pre: other.pre.into_iter().map(From::from).collect(), -- build: other.build.into_iter().map(From::from).collect(), -- } -- } --} -- --#[cfg(feature = "serde")] --impl Serialize for Version { -- fn serialize<S>(&self, serializer: S) -> result::Result<S::Ok, S::Error> -- where S: Serializer -- { -- // Serialize Version as a string. -- serializer.collect_str(self) -- } --} -- --#[cfg(feature = "serde")] --impl<'de> Deserialize<'de> for Version { -- fn deserialize<D>(deserializer: D) -> result::Result<Self, D::Error> -- where D: Deserializer<'de> -- { -- struct VersionVisitor; -- -- // Deserialize Version from a string. -- impl<'de> Visitor<'de> for VersionVisitor { -- type Value = Version; -- -- fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { -- formatter.write_str("a SemVer version as a string") -- } -- -- fn visit_str<E>(self, v: &str) -> result::Result<Self::Value, E> -- where E: de::Error -- { -- Version::parse(v).map_err(de::Error::custom) -- } -- } -- -- deserializer.deserialize_str(VersionVisitor) -- } --} -- --/// An error type for this crate --/// --/// Currently, just a generic error. Will make this nicer later. --#[derive(Clone,PartialEq,Debug,PartialOrd)] --pub enum SemVerError { -- /// An error ocurred while parsing. -- ParseError(String), --} -- --impl fmt::Display for SemVerError { -- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { -- match self { -- &SemVerError::ParseError(ref m) => write!(f, "{}", m), -- } -- } --} -- --impl Error for SemVerError { -- fn description(&self) -> &str { -- match self { -- &SemVerError::ParseError(ref m) => m, -- } -- } --} -- --/// A Result type for errors --pub type Result<T> = result::Result<T, SemVerError>; -- --impl Version { -- -- /// Contructs the simple case without pre or build. -- pub fn new(major: u64, minor: u64, patch: u64) -> Version { -- Version { -- major: major, -- minor: minor, -- patch: patch, -- pre: Vec::new(), -- build: Vec::new() -- } -- } -- -- /// Parse a string into a semver object. -- pub fn parse(version: &str) -> Result<Version> { -- let res = semver_parser::version::parse(version); -- -- match res { -- // Convert plain String error into proper ParseError -- Err(e) => Err(SemVerError::ParseError(e)), -- Ok(v) => Ok(From::from(v)), -- } -- } -- -- /// Clears the build metadata -- fn clear_metadata(&mut self) { -- self.build = Vec::new(); -- self.pre = Vec::new(); -- } -- -- /// Increments the patch number for this Version (Must be mutable) -- pub fn increment_patch(&mut self) { -- self.patch += 1; -- self.clear_metadata(); -- } -- -- /// Increments the minor version number for this Version (Must be mutable) -- /// -- /// As instructed by section 7 of the spec, the patch number is reset to 0. -- pub fn increment_minor(&mut self) { -- self.minor += 1; -- self.patch = 0; -- self.clear_metadata(); -- } -- -- /// Increments the major version number for this Version (Must be mutable) -- /// -- /// As instructed by section 8 of the spec, the minor and patch numbers are -- /// reset to 0 -- pub fn increment_major(&mut self) { -- self.major += 1; -- self.minor = 0; -- self.patch = 0; -- self.clear_metadata(); -- } -- -- /// Checks to see if the current Version is in pre-release status -- pub fn is_prerelease(&self) -> bool { -- !self.pre.is_empty() -- } --} -- --impl str::FromStr for Version { -- type Err = SemVerError; -- -- fn from_str(s: &str) -> Result<Version> { -- Version::parse(s) -- } --} -- --impl fmt::Display for Version { -- #[inline] -- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { -- try!(write!(f, "{}.{}.{}", self.major, self.minor, self.patch)); -- if !self.pre.is_empty() { -- try!(write!(f, "-")); -- for (i, x) in self.pre.iter().enumerate() { -- if i != 0 { -- try!(write!(f, ".")) -- } -- try!(write!(f, "{}", x)); -- } -- } -- if !self.build.is_empty() { -- try!(write!(f, "+")); -- for (i, x) in self.build.iter().enumerate() { -- if i != 0 { -- try!(write!(f, ".")) -- } -- try!(write!(f, "{}", x)); -- } -- } -- Ok(()) -- } --} -- --impl cmp::PartialEq for Version { -- #[inline] -- fn eq(&self, other: &Version) -> bool { -- // We should ignore build metadata here, otherwise versions v1 and v2 -- // can exist such that !(v1 < v2) && !(v1 > v2) && v1 != v2, which -- // violate strict total ordering rules. -- self.major == other.major && self.minor == other.minor && self.patch == other.patch && -- self.pre == other.pre -- } --} -- --impl cmp::PartialOrd for Version { -- fn partial_cmp(&self, other: &Version) -> Option<Ordering> { -- Some(self.cmp(other)) -- } --} -- --impl cmp::Ord for Version { -- fn cmp(&self, other: &Version) -> Ordering { -- match self.major.cmp(&other.major) { -- Ordering::Equal => {} -- r => return r, -- } -- -- match self.minor.cmp(&other.minor) { -- Ordering::Equal => {} -- r => return r, -- } -- -- match self.patch.cmp(&other.patch) { -- Ordering::Equal => {} -- r => return r, -- } -- -- // NB: semver spec says 0.0.0-pre < 0.0.0 -- // but the version of ord defined for vec -- // says that [] < [pre] so we alter it here -- match (self.pre.len(), other.pre.len()) { -- (0, 0) => Ordering::Equal, -- (0, _) => Ordering::Greater, -- (_, 0) => Ordering::Less, -- (_, _) => self.pre.cmp(&other.pre), -- } -- } --} -- --impl hash::Hash for Version { -- fn hash<H: hash::Hasher>(&self, into: &mut H) { -- self.major.hash(into); -- self.minor.hash(into); -- self.patch.hash(into); -- self.pre.hash(into); -- } --} -- --impl From<(u64,u64,u64)> for Version { -- fn from(tuple: (u64,u64,u64)) -> Version { -- let (major, minor, patch) = tuple; -- Version::new(major, minor, patch) -- } --} -- --#[cfg(test)] --mod tests { -- use std::result; -- use super::Version; -- use super::Identifier; -- use super::SemVerError; -- -- #[test] -- fn test_parse() { -- fn parse_error(e: &str) -> result::Result<Version, SemVerError> { -- return Err(SemVerError::ParseError(e.to_string())); -- } -- -- assert_eq!(Version::parse(""), -- parse_error("Error parsing major identifier")); -- assert_eq!(Version::parse(" "), -- parse_error("Error parsing major identifier")); -- assert_eq!(Version::parse("1"), -- parse_error("Expected dot")); -- assert_eq!(Version::parse("1.2"), -- parse_error("Expected dot")); -- assert_eq!(Version::parse("1.2.3-"), -- parse_error("Error parsing prerelease")); -- assert_eq!(Version::parse("a.b.c"), -- parse_error("Error parsing major identifier")); -- assert_eq!(Version::parse("1.2.3 abc"), -- parse_error("Extra junk after valid version: abc")); -- -- assert_eq!(Version::parse("1.2.3"), -- Ok(Version { -- major: 1, -- minor: 2, -- patch: 3, -- pre: Vec::new(), -- build: Vec::new(), -- })); -- -- assert_eq!(Version::parse("1.2.3"), -- Ok(Version::new(1,2,3))); -- -- assert_eq!(Version::parse(" 1.2.3 "), -- Ok(Version { -- major: 1, -- minor: 2, -- patch: 3, -- pre: Vec::new(), -- build: Vec::new(), -- })); -- assert_eq!(Version::parse("1.2.3-alpha1"), -- Ok(Version { -- major: 1, -- minor: 2, -- patch: 3, -- pre: vec![Identifier::AlphaNumeric(String::from("alpha1"))], -- build: Vec::new(), -- })); -- assert_eq!(Version::parse(" 1.2.3-alpha1 "), -- Ok(Version { -- major: 1, -- minor: 2, -- patch: 3, -- pre: vec![Identifier::AlphaNumeric(String::from("alpha1"))], -- build: Vec::new(), -- })); -- assert_eq!(Version::parse("1.2.3+build5"), -- Ok(Version { -- major: 1, -- minor: 2, -- patch: 3, -- pre: Vec::new(), -- build: vec![Identifier::AlphaNumeric(String::from("build5"))], -- })); -- assert_eq!(Version::parse(" 1.2.3+build5 "), -- Ok(Version { -- major: 1, -- minor: 2, -- patch: 3, -- pre: Vec::new(), -- build: vec![Identifier::AlphaNumeric(String::from("build5"))], -- })); -- assert_eq!(Version::parse("1.2.3-alpha1+build5"), -- Ok(Version { -- major: 1, -- minor: 2, -- patch: 3, -- pre: vec![Identifier::AlphaNumeric(String::from("alpha1"))], -- build: vec![Identifier::AlphaNumeric(String::from("build5"))], -- })); -- assert_eq!(Version::parse(" 1.2.3-alpha1+build5 "), -- Ok(Version { -- major: 1, -- minor: 2, -- patch: 3, -- pre: vec![Identifier::AlphaNumeric(String::from("alpha1"))], -- build: vec![Identifier::AlphaNumeric(String::from("build5"))], -- })); -- assert_eq!(Version::parse("1.2.3-1.alpha1.9+build5.7.3aedf "), -- Ok(Version { -- major: 1, -- minor: 2, -- patch: 3, -- pre: vec![Identifier::Numeric(1), -- Identifier::AlphaNumeric(String::from("alpha1")), -- Identifier::Numeric(9), -- ], -- build: vec![Identifier::AlphaNumeric(String::from("build5")), -- Identifier::Numeric(7), -- Identifier::AlphaNumeric(String::from("3aedf")), -- ], -- })); -- assert_eq!(Version::parse("0.4.0-beta.1+0851523"), -- Ok(Version { -- major: 0, -- minor: 4, -- patch: 0, -- pre: vec![Identifier::AlphaNumeric(String::from("beta")), -- Identifier::Numeric(1), -- ], -- build: vec![Identifier::AlphaNumeric(String::from("0851523"))], -- })); -- -- } -- -- #[test] -- fn test_increment_patch() { -- let mut buggy_release = Version::parse("0.1.0").unwrap(); -- buggy_release.increment_patch(); -- assert_eq!(buggy_release, Version::parse("0.1.1").unwrap()); -- } -- -- #[test] -- fn test_increment_minor() { -- let mut feature_release = Version::parse("1.4.6").unwrap(); -- feature_release.increment_minor(); -- assert_eq!(feature_release, Version::parse("1.5.0").unwrap()); -- } -- -- #[test] -- fn test_increment_major() { -- let mut chrome_release = Version::parse("46.1.246773").unwrap(); -- chrome_release.increment_major(); -- assert_eq!(chrome_release, Version::parse("47.0.0").unwrap()); -- } -- -- #[test] -- fn test_increment_keep_prerelease() { -- let mut release = Version::parse("1.0.0-alpha").unwrap(); -- release.increment_patch(); -- -- assert_eq!(release, Version::parse("1.0.1").unwrap()); -- -- release.increment_minor(); -- -- assert_eq!(release, Version::parse("1.1.0").unwrap()); -- -- release.increment_major(); -- -- assert_eq!(release, Version::parse("2.0.0").unwrap()); -- } -- -- -- #[test] -- fn test_increment_clear_metadata() { -- let mut release = Version::parse("1.0.0+4442").unwrap(); -- release.increment_patch(); -- -- assert_eq!(release, Version::parse("1.0.1").unwrap()); -- release = Version::parse("1.0.1+hello").unwrap(); -- -- release.increment_minor(); -- -- assert_eq!(release, Version::parse("1.1.0").unwrap()); -- release = Version::parse("1.1.3747+hello").unwrap(); -- -- release.increment_major(); -- -- assert_eq!(release, Version::parse("2.0.0").unwrap()); -- } -- -- #[test] -- fn test_eq() { -- assert_eq!(Version::parse("1.2.3"), Version::parse("1.2.3")); -- assert_eq!(Version::parse("1.2.3-alpha1"), -- Version::parse("1.2.3-alpha1")); -- assert_eq!(Version::parse("1.2.3+build.42"), -- Version::parse("1.2.3+build.42")); -- assert_eq!(Version::parse("1.2.3-alpha1+42"), -- Version::parse("1.2.3-alpha1+42")); -- assert_eq!(Version::parse("1.2.3+23"), Version::parse("1.2.3+42")); -- } -- -- #[test] -- fn test_ne() { -- assert!(Version::parse("0.0.0") != Version::parse("0.0.1")); -- assert!(Version::parse("0.0.0") != Version::parse("0.1.0")); -- assert!(Version::parse("0.0.0") != Version::parse("1.0.0")); -- assert!(Version::parse("1.2.3-alpha") != Version::parse("1.2.3-beta")); -- } -- -- #[test] -- fn test_show() { -- assert_eq!(format!("{}", Version::parse("1.2.3").unwrap()), -- "1.2.3".to_string()); -- assert_eq!(format!("{}", Version::parse("1.2.3-alpha1").unwrap()), -- "1.2.3-alpha1".to_string()); -- assert_eq!(format!("{}", Version::parse("1.2.3+build.42").unwrap()), -- "1.2.3+build.42".to_string()); -- assert_eq!(format!("{}", Version::parse("1.2.3-alpha1+42").unwrap()), -- "1.2.3-alpha1+42".to_string()); -- } -- -- #[test] -- fn test_to_string() { -- assert_eq!(Version::parse("1.2.3").unwrap().to_string(), -- "1.2.3".to_string()); -- assert_eq!(Version::parse("1.2.3-alpha1").unwrap().to_string(), -- "1.2.3-alpha1".to_string()); -- assert_eq!(Version::parse("1.2.3+build.42").unwrap().to_string(), -- "1.2.3+build.42".to_string()); -- assert_eq!(Version::parse("1.2.3-alpha1+42").unwrap().to_string(), -- "1.2.3-alpha1+42".to_string()); -- } -- -- #[test] -- fn test_lt() { -- assert!(Version::parse("0.0.0") < Version::parse("1.2.3-alpha2")); -- assert!(Version::parse("1.0.0") < Version::parse("1.2.3-alpha2")); -- assert!(Version::parse("1.2.0") < Version::parse("1.2.3-alpha2")); -- assert!(Version::parse("1.2.3-alpha1") < Version::parse("1.2.3")); -- assert!(Version::parse("1.2.3-alpha1") < Version::parse("1.2.3-alpha2")); -- assert!(!(Version::parse("1.2.3-alpha2") < Version::parse("1.2.3-alpha2"))); -- assert!(!(Version::parse("1.2.3+23") < Version::parse("1.2.3+42"))); -- } -- -- #[test] -- fn test_le() { -- assert!(Version::parse("0.0.0") <= Version::parse("1.2.3-alpha2")); -- assert!(Version::parse("1.0.0") <= Version::parse("1.2.3-alpha2")); -- assert!(Version::parse("1.2.0") <= Version::parse("1.2.3-alpha2")); -- assert!(Version::parse("1.2.3-alpha1") <= Version::parse("1.2.3-alpha2")); -- assert!(Version::parse("1.2.3-alpha2") <= Version::parse("1.2.3-alpha2")); -- assert!(Version::parse("1.2.3+23") <= Version::parse("1.2.3+42")); -- } -- -- #[test] -- fn test_gt() { -- assert!(Version::parse("1.2.3-alpha2") > Version::parse("0.0.0")); -- assert!(Version::parse("1.2.3-alpha2") > Version::parse("1.0.0")); -- assert!(Version::parse("1.2.3-alpha2") > Version::parse("1.2.0")); -- assert!(Version::parse("1.2.3-alpha2") > Version::parse("1.2.3-alpha1")); -- assert!(Version::parse("1.2.3") > Version::parse("1.2.3-alpha2")); -- assert!(!(Version::parse("1.2.3-alpha2") > Version::parse("1.2.3-alpha2"))); -- assert!(!(Version::parse("1.2.3+23") > Version::parse("1.2.3+42"))); -- } -- -- #[test] -- fn test_ge() { -- assert!(Version::parse("1.2.3-alpha2") >= Version::parse("0.0.0")); -- assert!(Version::parse("1.2.3-alpha2") >= Version::parse("1.0.0")); -- assert!(Version::parse("1.2.3-alpha2") >= Version::parse("1.2.0")); -- assert!(Version::parse("1.2.3-alpha2") >= Version::parse("1.2.3-alpha1")); -- assert!(Version::parse("1.2.3-alpha2") >= Version::parse("1.2.3-alpha2")); -- assert!(Version::parse("1.2.3+23") >= Version::parse("1.2.3+42")); -- } -- -- #[test] -- fn test_prerelease_check() { -- assert!(Version::parse("1.0.0").unwrap().is_prerelease() == false); -- assert!(Version::parse("0.0.1").unwrap().is_prerelease() == false); -- assert!(Version::parse("4.1.4-alpha").unwrap().is_prerelease()); -- assert!(Version::parse("1.0.0-beta294296").unwrap().is_prerelease()); -- } -- -- #[test] -- fn test_spec_order() { -- let vs = ["1.0.0-alpha", -- "1.0.0-alpha.1", -- "1.0.0-alpha.beta", -- "1.0.0-beta", -- "1.0.0-beta.2", -- "1.0.0-beta.11", -- "1.0.0-rc.1", -- "1.0.0"]; -- let mut i = 1; -- while i < vs.len() { -- let a = Version::parse(vs[i - 1]); -- let b = Version::parse(vs[i]); -- assert!(a < b, "nope {:?} < {:?}", a, b); -- i += 1; -- } -- } -- -- #[test] -- fn test_from_str() { -- assert_eq!("1.2.3".parse(), -- Ok(Version { -- major: 1, -- minor: 2, -- patch: 3, -- pre: Vec::new(), -- build: Vec::new(), -- })); -- assert_eq!(" 1.2.3 ".parse(), -- Ok(Version { -- major: 1, -- minor: 2, -- patch: 3, -- pre: Vec::new(), -- build: Vec::new(), -- })); -- assert_eq!("1.2.3-alpha1".parse(), -- Ok(Version { -- major: 1, -- minor: 2, -- patch: 3, -- pre: vec![Identifier::AlphaNumeric(String::from("alpha1"))], -- build: Vec::new(), -- })); -- assert_eq!(" 1.2.3-alpha1 ".parse(), -- Ok(Version { -- major: 1, -- minor: 2, -- patch: 3, -- pre: vec![Identifier::AlphaNumeric(String::from("alpha1"))], -- build: Vec::new(), -- })); -- assert_eq!("1.2.3+build5".parse(), -- Ok(Version { -- major: 1, -- minor: 2, -- patch: 3, -- pre: Vec::new(), -- build: vec![Identifier::AlphaNumeric(String::from("build5"))], -- })); -- assert_eq!(" 1.2.3+build5 ".parse(), -- Ok(Version { -- major: 1, -- minor: 2, -- patch: 3, -- pre: Vec::new(), -- build: vec![Identifier::AlphaNumeric(String::from("build5"))], -- })); -- assert_eq!("1.2.3-alpha1+build5".parse(), -- Ok(Version { -- major: 1, -- minor: 2, -- patch: 3, -- pre: vec![Identifier::AlphaNumeric(String::from("alpha1"))], -- build: vec![Identifier::AlphaNumeric(String::from("build5"))], -- })); -- assert_eq!(" 1.2.3-alpha1+build5 ".parse(), -- Ok(Version { -- major: 1, -- minor: 2, -- patch: 3, -- pre: vec![Identifier::AlphaNumeric(String::from("alpha1"))], -- build: vec![Identifier::AlphaNumeric(String::from("build5"))], -- })); -- assert_eq!("1.2.3-1.alpha1.9+build5.7.3aedf ".parse(), -- Ok(Version { -- major: 1, -- minor: 2, -- patch: 3, -- pre: vec![Identifier::Numeric(1), -- Identifier::AlphaNumeric(String::from("alpha1")), -- Identifier::Numeric(9), -- ], -- build: vec![Identifier::AlphaNumeric(String::from("build5")), -- Identifier::Numeric(7), -- Identifier::AlphaNumeric(String::from("3aedf")), -- ], -- })); -- assert_eq!("0.4.0-beta.1+0851523".parse(), -- Ok(Version { -- major: 0, -- minor: 4, -- patch: 0, -- pre: vec![Identifier::AlphaNumeric(String::from("beta")), -- Identifier::Numeric(1), -- ], -- build: vec![Identifier::AlphaNumeric(String::from("0851523"))], -- })); -- -- } -- -- #[test] -- fn test_from_str_errors() { -- fn parse_error(e: &str) -> result::Result<Version, SemVerError> { -- return Err(SemVerError::ParseError(e.to_string())); -- } -- -- assert_eq!("".parse(), parse_error("Error parsing major identifier")); -- assert_eq!(" ".parse(), parse_error("Error parsing major identifier")); -- assert_eq!("1".parse(), parse_error("Expected dot")); -- assert_eq!("1.2".parse(), -- parse_error("Expected dot")); -- assert_eq!("1.2.3-".parse(), -- parse_error("Error parsing prerelease")); -- assert_eq!("a.b.c".parse(), -- parse_error("Error parsing major identifier")); -- assert_eq!("1.2.3 abc".parse(), -- parse_error("Extra junk after valid version: abc")); -- } --} -diff --git a/third_party/rust/semver/src/version_req.rs b/third_party/rust/semver/src/version_req.rs -deleted file mode 100644 ---- a/third_party/rust/semver/src/version_req.rs -+++ /dev/null -@@ -1,895 +0,0 @@ --// Copyright 2012-2013 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. -- --use std::error::Error; --use std::fmt; --use std::result; --use std::str; -- --use Version; --use version::Identifier; --use semver_parser; -- --#[cfg(feature = "serde")] --use serde::ser::{Serialize, Serializer}; --#[cfg(feature = "serde")] --use serde::de::{self, Deserialize, Deserializer, Visitor}; -- --use self::Op::{Ex, Gt, GtEq, Lt, LtEq, Tilde, Compatible, Wildcard}; --use self::WildcardVersion::{Major, Minor, Patch}; --use self::ReqParseError::*; -- --/// A `VersionReq` is a struct containing a list of predicates that can apply to ranges of version --/// numbers. Matching operations can then be done with the `VersionReq` against a particular --/// version to see if it satisfies some or all of the constraints. --#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)] --pub struct VersionReq { -- predicates: Vec<Predicate>, --} -- --impl From<semver_parser::range::VersionReq> for VersionReq { -- fn from(other: semver_parser::range::VersionReq) -> VersionReq { -- VersionReq { predicates: other.predicates.into_iter().map(From::from).collect() } -- } --} -- --#[cfg(feature = "serde")] --impl Serialize for VersionReq { -- fn serialize<S>(&self, serializer: S) -> result::Result<S::Ok, S::Error> -- where S: Serializer -- { -- // Serialize VersionReq as a string. -- serializer.collect_str(self) -- } --} -- --#[cfg(feature = "serde")] --impl<'de> Deserialize<'de> for VersionReq { -- fn deserialize<D>(deserializer: D) -> result::Result<Self, D::Error> -- where D: Deserializer<'de> -- { -- struct VersionReqVisitor; -- -- /// Deserialize `VersionReq` from a string. -- impl<'de> Visitor<'de> for VersionReqVisitor { -- type Value = VersionReq; -- -- fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { -- formatter.write_str("a SemVer version requirement as a string") -- } -- -- fn visit_str<E>(self, v: &str) -> result::Result<Self::Value, E> -- where E: de::Error -- { -- VersionReq::parse(v).map_err(de::Error::custom) -- } -- } -- -- deserializer.deserialize_str(VersionReqVisitor) -- } --} -- --#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)] --enum WildcardVersion { -- Major, -- Minor, -- Patch, --} -- --#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)] --enum Op { -- Ex, // Exact -- Gt, // Greater than -- GtEq, // Greater than or equal to -- Lt, // Less than -- LtEq, // Less than or equal to -- Tilde, // e.g. ~1.0.0 -- Compatible, // compatible by definition of semver, indicated by ^ -- Wildcard(WildcardVersion), // x.y.*, x.*, * --} -- --impl From<semver_parser::range::Op> for Op { -- fn from(other: semver_parser::range::Op) -> Op { -- use semver_parser::range; -- match other { -- range::Op::Ex => Op::Ex, -- range::Op::Gt => Op::Gt, -- range::Op::GtEq => Op::GtEq, -- range::Op::Lt => Op::Lt, -- range::Op::LtEq => Op::LtEq, -- range::Op::Tilde => Op::Tilde, -- range::Op::Compatible => Op::Compatible, -- range::Op::Wildcard(version) => { -- match version { -- range::WildcardVersion::Major => Op::Wildcard(WildcardVersion::Major), -- range::WildcardVersion::Minor => Op::Wildcard(WildcardVersion::Minor), -- range::WildcardVersion::Patch => Op::Wildcard(WildcardVersion::Patch), -- } -- } -- } -- } --} -- --#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)] --struct Predicate { -- op: Op, -- major: u64, -- minor: Option<u64>, -- patch: Option<u64>, -- pre: Vec<Identifier>, --} -- --impl From<semver_parser::range::Predicate> for Predicate { -- fn from(other: semver_parser::range::Predicate) -> Predicate { -- Predicate { -- op: From::from(other.op), -- major: other.major, -- minor: other.minor, -- patch: other.patch, -- pre: other.pre.into_iter().map(From::from).collect(), -- } -- } --} -- --/// A `ReqParseError` is returned from methods which parse a string into a `VersionReq`. Each --/// enumeration is one of the possible errors that can occur. --#[derive(Clone, Debug, PartialEq)] --pub enum ReqParseError { -- /// The given version requirement is invalid. -- InvalidVersionRequirement, -- /// You have already provided an operation, such as `=`, `~`, or `^`. Only use one. -- OpAlreadySet, -- /// The sigil you have written is not correct. -- InvalidSigil, -- /// All components of a version must be numeric. -- VersionComponentsMustBeNumeric, -- /// There was an error parsing an identifier. -- InvalidIdentifier, -- /// At least a major version is required. -- MajorVersionRequired, -- /// An unimplemented version requirement. -- UnimplementedVersionRequirement, -- /// This form of requirement is deprecated. -- DeprecatedVersionRequirement(VersionReq), --} -- --impl fmt::Display for ReqParseError { -- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { -- self.description().fmt(f) -- } --} -- --impl Error for ReqParseError { -- fn description(&self) -> &str { -- match self { -- &InvalidVersionRequirement => "the given version requirement is invalid", -- &OpAlreadySet => { -- "you have already provided an operation, such as =, ~, or ^; only use one" -- }, -- &InvalidSigil => "the sigil you have written is not correct", -- &VersionComponentsMustBeNumeric => "version components must be numeric", -- &InvalidIdentifier => "invalid identifier", -- &MajorVersionRequired => "at least a major version number is required", -- &UnimplementedVersionRequirement => { -- "the given version requirement is not implemented, yet" -- }, -- &DeprecatedVersionRequirement(_) => "This requirement is deprecated", -- } -- } --} -- --impl From<String> for ReqParseError { -- fn from(other: String) -> ReqParseError { -- match &*other { -- "Null is not a valid VersionReq" => ReqParseError::InvalidVersionRequirement, -- "VersionReq did not parse properly." => ReqParseError::OpAlreadySet, -- _ => ReqParseError::InvalidVersionRequirement, -- } -- } --} -- --impl VersionReq { -- /// `any()` is a factory method which creates a `VersionReq` with no constraints. In other -- /// words, any version will match against it. -- /// -- /// # Examples -- /// -- /// ``` -- /// use semver::VersionReq; -- /// -- /// let anything = VersionReq::any(); -- /// ``` -- pub fn any() -> VersionReq { -- VersionReq { predicates: vec![] } -- } -- -- /// `parse()` is the main constructor of a `VersionReq`. It takes a string like `"^1.2.3"` -- /// and turns it into a `VersionReq` that matches that particular constraint. -- /// -- /// A `Result` is returned which contains a `ReqParseError` if there was a problem parsing the -- /// `VersionReq`. -- /// -- /// # Examples -- /// -- /// ``` -- /// use semver::VersionReq; -- /// -- /// let version = VersionReq::parse("=1.2.3"); -- /// let version = VersionReq::parse(">1.2.3"); -- /// let version = VersionReq::parse("<1.2.3"); -- /// let version = VersionReq::parse("~1.2.3"); -- /// let version = VersionReq::parse("^1.2.3"); -- /// let version = VersionReq::parse("1.2.3"); // synonym for ^1.2.3 -- /// let version = VersionReq::parse("<=1.2.3"); -- /// let version = VersionReq::parse(">=1.2.3"); -- /// ``` -- /// -- /// This example demonstrates error handling, and will panic. -- /// -- /// ```should-panic -- /// use semver::VersionReq; -- /// -- /// let version = match VersionReq::parse("not a version") { -- /// Ok(version) => version, -- /// Err(e) => panic!("There was a problem parsing: {}", e), -- /// } -- /// ``` -- pub fn parse(input: &str) -> Result<VersionReq, ReqParseError> { -- let res = semver_parser::range::parse(input); -- -- if let Ok(v) = res { -- return Ok(From::from(v)); -- } -- -- return match VersionReq::parse_deprecated(input) { -- Some(v) => { -- Err(ReqParseError::DeprecatedVersionRequirement(v)) -- } -- None => Err(From::from(res.err().unwrap())), -- } -- } -- -- fn parse_deprecated(version: &str) -> Option<VersionReq> { -- return match version { -- ".*" => Some(VersionReq::any()), -- "0.1.0." => Some(VersionReq::parse("0.1.0").unwrap()), -- "0.3.1.3" => Some(VersionReq::parse("0.3.13").unwrap()), -- "0.2*" => Some(VersionReq::parse("0.2.*").unwrap()), -- "*.0" => Some(VersionReq::any()), -- _ => None, -- } -- } -- -- /// `exact()` is a factory method which creates a `VersionReq` with one exact constraint. -- /// -- /// # Examples -- /// -- /// ``` -- /// use semver::VersionReq; -- /// use semver::Version; -- /// -- /// let version = Version { major: 1, minor: 1, patch: 1, pre: vec![], build: vec![] }; -- /// let exact = VersionReq::exact(&version); -- /// ``` -- pub fn exact(version: &Version) -> VersionReq { -- VersionReq { predicates: vec![Predicate::exact(version)] } -- } -- -- /// `matches()` matches a given `Version` against this `VersionReq`. -- /// -- /// # Examples -- /// -- /// ``` -- /// use semver::VersionReq; -- /// use semver::Version; -- /// -- /// let version = Version { major: 1, minor: 1, patch: 1, pre: vec![], build: vec![] }; -- /// let exact = VersionReq::exact(&version); -- /// -- /// assert!(exact.matches(&version)); -- /// ``` -- pub fn matches(&self, version: &Version) -> bool { -- // no predicates means anything matches -- if self.predicates.is_empty() { -- return true; -- } -- -- self.predicates.iter().all(|p| p.matches(version)) && -- self.predicates.iter().any(|p| p.pre_tag_is_compatible(version)) -- } --} -- --impl str::FromStr for VersionReq { -- type Err = ReqParseError; -- -- fn from_str(s: &str) -> Result<VersionReq, ReqParseError> { -- VersionReq::parse(s) -- } --} -- --impl Predicate { -- fn exact(version: &Version) -> Predicate { -- Predicate { -- op: Ex, -- major: version.major, -- minor: Some(version.minor), -- patch: Some(version.patch), -- pre: version.pre.clone(), -- } -- } -- -- /// `matches()` takes a `Version` and determines if it matches this particular `Predicate`. -- pub fn matches(&self, ver: &Version) -> bool { -- match self.op { -- Ex => self.is_exact(ver), -- Gt => self.is_greater(ver), -- GtEq => self.is_exact(ver) || self.is_greater(ver), -- Lt => !self.is_exact(ver) && !self.is_greater(ver), -- LtEq => !self.is_greater(ver), -- Tilde => self.matches_tilde(ver), -- Compatible => self.is_compatible(ver), -- Wildcard(_) => self.matches_wildcard(ver), -- } -- } -- -- fn is_exact(&self, ver: &Version) -> bool { -- if self.major != ver.major { -- return false; -- } -- -- match self.minor { -- Some(minor) => { -- if minor != ver.minor { -- return false; -- } -- } -- None => return true, -- } -- -- match self.patch { -- Some(patch) => { -- if patch != ver.patch { -- return false; -- } -- } -- None => return true, -- } -- -- if self.pre != ver.pre { -- return false; -- } -- -- true -- } -- -- // https://docs.npmjs.com/misc/semver#prerelease-tags -- fn pre_tag_is_compatible(&self, ver: &Version) -> bool { -- // If a version has a prerelease tag (for example, 1.2.3-alpha.3) then it will -- // only be -- // allowed to satisfy comparator sets if at least one comparator with the same -- // [major, -- // minor, patch] tuple also has a prerelease tag. -- !ver.is_prerelease() || -- (self.major == ver.major && self.minor == Some(ver.minor) && -- self.patch == Some(ver.patch) && !self.pre.is_empty()) -- } -- -- fn is_greater(&self, ver: &Version) -> bool { -- if self.major != ver.major { -- return ver.major > self.major; -- } -- -- match self.minor { -- Some(minor) => { -- if minor != ver.minor { -- return ver.minor > minor; -- } -- } -- None => return false, -- } -- -- match self.patch { -- Some(patch) => { -- if patch != ver.patch { -- return ver.patch > patch; -- } -- } -- None => return false, -- } -- -- if !self.pre.is_empty() { -- return ver.pre.is_empty() || ver.pre > self.pre; -- } -- -- false -- } -- -- // see https://www.npmjs.org/doc/misc/semver.html for behavior -- fn matches_tilde(&self, ver: &Version) -> bool { -- let minor = match self.minor { -- Some(n) => n, -- None => return self.major == ver.major, -- }; -- -- match self.patch { -- Some(patch) => { -- self.major == ver.major && minor == ver.minor && -- (ver.patch > patch || (ver.patch == patch && self.pre_is_compatible(ver))) -- } -- None => self.major == ver.major && minor == ver.minor, -- } -- } -- -- // see https://www.npmjs.org/doc/misc/semver.html for behavior -- fn is_compatible(&self, ver: &Version) -> bool { -- if self.major != ver.major { -- return false; -- } -- -- let minor = match self.minor { -- Some(n) => n, -- None => return self.major == ver.major, -- }; -- -- match self.patch { -- Some(patch) => { -- if self.major == 0 { -- if minor == 0 { -- ver.minor == minor && ver.patch == patch && self.pre_is_compatible(ver) -- } else { -- ver.minor == minor && -- (ver.patch > patch || (ver.patch == patch && self.pre_is_compatible(ver))) -- } -- } else { -- ver.minor > minor || -- (ver.minor == minor && -- (ver.patch > patch || (ver.patch == patch && self.pre_is_compatible(ver)))) -- } -- } -- None => { -- if self.major == 0 { -- ver.minor == minor -- } else { -- ver.minor >= minor -- } -- } -- } -- } -- -- fn pre_is_compatible(&self, ver: &Version) -> bool { -- ver.pre.is_empty() || ver.pre >= self.pre -- } -- -- // see https://www.npmjs.org/doc/misc/semver.html for behavior -- fn matches_wildcard(&self, ver: &Version) -> bool { -- match self.op { -- Wildcard(Major) => true, -- Wildcard(Minor) => self.major == ver.major, -- Wildcard(Patch) => { -- match self.minor { -- Some(minor) => self.major == ver.major && minor == ver.minor, -- None => { -- // minor and patch version astericks mean match on major -- self.major == ver.major -- } -- } -- } -- _ => false, // unreachable -- } -- } --} -- --impl fmt::Display for VersionReq { -- fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { -- if self.predicates.is_empty() { -- try!(write!(fmt, "*")); -- } else { -- for (i, ref pred) in self.predicates.iter().enumerate() { -- if i == 0 { -- try!(write!(fmt, "{}", pred)); -- } else { -- try!(write!(fmt, ", {}", pred)); -- } -- } -- } -- -- Ok(()) -- } --} -- --impl fmt::Display for Predicate { -- fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { -- match self.op { -- Wildcard(Major) => try!(write!(fmt, "*")), -- Wildcard(Minor) => try!(write!(fmt, "{}.*", self.major)), -- Wildcard(Patch) => { -- if let Some(minor) = self.minor { -- try!(write!(fmt, "{}.{}.*", self.major, minor)) -- } else { -- try!(write!(fmt, "{}.*.*", self.major)) -- } -- } -- _ => { -- try!(write!(fmt, "{}{}", self.op, self.major)); -- -- match self.minor { -- Some(v) => try!(write!(fmt, ".{}", v)), -- None => (), -- } -- -- match self.patch { -- Some(v) => try!(write!(fmt, ".{}", v)), -- None => (), -- } -- -- if !self.pre.is_empty() { -- try!(write!(fmt, "-")); -- for (i, x) in self.pre.iter().enumerate() { -- if i != 0 { -- try!(write!(fmt, ".")) -- } -- try!(write!(fmt, "{}", x)); -- } -- } -- } -- } -- -- Ok(()) -- } --} -- --impl fmt::Display for Op { -- fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { -- match *self { -- Ex => try!(write!(fmt, "= ")), -- Gt => try!(write!(fmt, "> ")), -- GtEq => try!(write!(fmt, ">= ")), -- Lt => try!(write!(fmt, "< ")), -- LtEq => try!(write!(fmt, "<= ")), -- Tilde => try!(write!(fmt, "~")), -- Compatible => try!(write!(fmt, "^")), -- // gets handled specially in Predicate::fmt -- Wildcard(_) => try!(write!(fmt, "")), -- } -- Ok(()) -- } --} -- --#[cfg(test)] --mod test { -- use super::{VersionReq, Op}; -- use super::super::version::Version; -- use std::hash::{Hash, Hasher}; -- -- fn req(s: &str) -> VersionReq { -- VersionReq::parse(s).unwrap() -- } -- -- fn version(s: &str) -> Version { -- match Version::parse(s) { -- Ok(v) => v, -- Err(e) => panic!("`{}` is not a valid version. Reason: {:?}", s, e), -- } -- } -- -- fn assert_match(req: &VersionReq, vers: &[&str]) { -- for ver in vers.iter() { -- assert!(req.matches(&version(*ver)), "did not match {}", ver); -- } -- } -- -- fn assert_not_match(req: &VersionReq, vers: &[&str]) { -- for ver in vers.iter() { -- assert!(!req.matches(&version(*ver)), "matched {}", ver); -- } -- } -- -- fn calculate_hash<T: Hash>(t: T) -> u64 { -- use std::collections::hash_map::DefaultHasher; -- -- let mut s = DefaultHasher::new(); -- t.hash(&mut s); -- s.finish() -- } -- -- #[test] -- fn test_parsing_default() { -- let r = req("1.0.0"); -- -- assert_eq!(r.to_string(), "^1.0.0".to_string()); -- -- assert_match(&r, &["1.0.0", "1.0.1"]); -- assert_not_match(&r, &["0.9.9", "0.10.0", "0.1.0"]); -- } -- -- #[test] -- fn test_parsing_exact() { -- let r = req("=1.0.0"); -- -- assert!(r.to_string() == "= 1.0.0".to_string()); -- assert_eq!(r.to_string(), "= 1.0.0".to_string()); -- -- assert_match(&r, &["1.0.0"]); -- assert_not_match(&r, &["1.0.1", "0.9.9", "0.10.0", "0.1.0", "1.0.0-pre"]); -- -- let r = req("=0.9.0"); -- -- assert_eq!(r.to_string(), "= 0.9.0".to_string()); -- -- assert_match(&r, &["0.9.0"]); -- assert_not_match(&r, &["0.9.1", "1.9.0", "0.0.9"]); -- -- let r = req("=0.1.0-beta2.a"); -- -- assert_eq!(r.to_string(), "= 0.1.0-beta2.a".to_string()); -- -- assert_match(&r, &["0.1.0-beta2.a"]); -- assert_not_match(&r, &["0.9.1", "0.1.0", "0.1.1-beta2.a", "0.1.0-beta2"]); -- } -- -- #[test] -- fn test_parse_metadata_see_issue_88_see_issue_88() { -- for op in &[Op::Compatible, Op::Ex, Op::Gt, Op::GtEq, Op::Lt, Op::LtEq, Op::Tilde] { -- req(&format!("{} 1.2.3+meta", op)); -- } -- } -- -- #[test] -- pub fn test_parsing_greater_than() { -- let r = req(">= 1.0.0"); -- -- assert_eq!(r.to_string(), ">= 1.0.0".to_string()); -- -- assert_match(&r, &["1.0.0", "2.0.0"]); -- assert_not_match(&r, &["0.1.0", "0.0.1", "1.0.0-pre", "2.0.0-pre"]); -- -- let r = req(">= 2.1.0-alpha2"); -- -- assert_match(&r, &["2.1.0-alpha2", "2.1.0-alpha3", "2.1.0", "3.0.0"]); -- assert_not_match(&r, -- &["2.0.0", "2.1.0-alpha1", "2.0.0-alpha2", "3.0.0-alpha2"]); -- } -- -- #[test] -- pub fn test_parsing_less_than() { -- let r = req("< 1.0.0"); -- -- assert_eq!(r.to_string(), "< 1.0.0".to_string()); -- -- assert_match(&r, &["0.1.0", "0.0.1"]); -- assert_not_match(&r, &["1.0.0", "1.0.0-beta", "1.0.1", "0.9.9-alpha"]); -- -- let r = req("<= 2.1.0-alpha2"); -- -- assert_match(&r, &["2.1.0-alpha2", "2.1.0-alpha1", "2.0.0", "1.0.0"]); -- assert_not_match(&r, -- &["2.1.0", "2.2.0-alpha1", "2.0.0-alpha2", "1.0.0-alpha2"]); -- } -- -- #[test] -- pub fn test_multiple() { -- let r = req("> 0.0.9, <= 2.5.3"); -- assert_eq!(r.to_string(), "> 0.0.9, <= 2.5.3".to_string()); -- assert_match(&r, &["0.0.10", "1.0.0", "2.5.3"]); -- assert_not_match(&r, &["0.0.8", "2.5.4"]); -- -- let r = req("0.3.0, 0.4.0"); -- assert_eq!(r.to_string(), "^0.3.0, ^0.4.0".to_string()); -- assert_not_match(&r, &["0.0.8", "0.3.0", "0.4.0"]); -- -- let r = req("<= 0.2.0, >= 0.5.0"); -- assert_eq!(r.to_string(), "<= 0.2.0, >= 0.5.0".to_string()); -- assert_not_match(&r, &["0.0.8", "0.3.0", "0.5.1"]); -- -- let r = req("0.1.0, 0.1.4, 0.1.6"); -- assert_eq!(r.to_string(), "^0.1.0, ^0.1.4, ^0.1.6".to_string()); -- assert_match(&r, &["0.1.6", "0.1.9"]); -- assert_not_match(&r, &["0.1.0", "0.1.4", "0.2.0"]); -- -- assert!(VersionReq::parse("> 0.1.0,").is_err()); -- assert!(VersionReq::parse("> 0.3.0, ,").is_err()); -- -- let r = req(">=0.5.1-alpha3, <0.6"); -- assert_eq!(r.to_string(), ">= 0.5.1-alpha3, < 0.6".to_string()); -- assert_match(&r, -- &["0.5.1-alpha3", "0.5.1-alpha4", "0.5.1-beta", "0.5.1", "0.5.5"]); -- assert_not_match(&r, -- &["0.5.1-alpha1", "0.5.2-alpha3", "0.5.5-pre", "0.5.0-pre"]); -- assert_not_match(&r, &["0.6.0", "0.6.0-pre"]); -- } -- -- #[test] -- pub fn test_parsing_tilde() { -- let r = req("~1"); -- assert_match(&r, &["1.0.0", "1.0.1", "1.1.1"]); -- assert_not_match(&r, &["0.9.1", "2.9.0", "0.0.9"]); -- -- let r = req("~1.2"); -- assert_match(&r, &["1.2.0", "1.2.1"]); -- assert_not_match(&r, &["1.1.1", "1.3.0", "0.0.9"]); -- -- let r = req("~1.2.2"); -- assert_match(&r, &["1.2.2", "1.2.4"]); -- assert_not_match(&r, &["1.2.1", "1.9.0", "1.0.9", "2.0.1", "0.1.3"]); -- -- let r = req("~1.2.3-beta.2"); -- assert_match(&r, &["1.2.3", "1.2.4", "1.2.3-beta.2", "1.2.3-beta.4"]); -- assert_not_match(&r, &["1.3.3", "1.1.4", "1.2.3-beta.1", "1.2.4-beta.2"]); -- } -- -- #[test] -- pub fn test_parsing_compatible() { -- let r = req("^1"); -- assert_match(&r, &["1.1.2", "1.1.0", "1.2.1", "1.0.1"]); -- assert_not_match(&r, &["0.9.1", "2.9.0", "0.1.4"]); -- assert_not_match(&r, &["1.0.0-beta1", "0.1.0-alpha", "1.0.1-pre"]); -- -- let r = req("^1.1"); -- assert_match(&r, &["1.1.2", "1.1.0", "1.2.1"]); -- assert_not_match(&r, &["0.9.1", "2.9.0", "1.0.1", "0.1.4"]); -- -- let r = req("^1.1.2"); -- assert_match(&r, &["1.1.2", "1.1.4", "1.2.1"]); -- assert_not_match(&r, &["0.9.1", "2.9.0", "1.1.1", "0.0.1"]); -- assert_not_match(&r, &["1.1.2-alpha1", "1.1.3-alpha1", "2.9.0-alpha1"]); -- -- let r = req("^0.1.2"); -- assert_match(&r, &["0.1.2", "0.1.4"]); -- assert_not_match(&r, &["0.9.1", "2.9.0", "1.1.1", "0.0.1"]); -- assert_not_match(&r, &["0.1.2-beta", "0.1.3-alpha", "0.2.0-pre"]); -- -- let r = req("^0.5.1-alpha3"); -- assert_match(&r, -- &["0.5.1-alpha3", "0.5.1-alpha4", "0.5.1-beta", "0.5.1", "0.5.5"]); -- assert_not_match(&r, -- &["0.5.1-alpha1", "0.5.2-alpha3", "0.5.5-pre", "0.5.0-pre", "0.6.0"]); -- -- let r = req("^0.0.2"); -- assert_match(&r, &["0.0.2"]); -- assert_not_match(&r, &["0.9.1", "2.9.0", "1.1.1", "0.0.1", "0.1.4"]); -- -- let r = req("^0.0"); -- assert_match(&r, &["0.0.2", "0.0.0"]); -- assert_not_match(&r, &["0.9.1", "2.9.0", "1.1.1", "0.1.4"]); -- -- let r = req("^0"); -- assert_match(&r, &["0.9.1", "0.0.2", "0.0.0"]); -- assert_not_match(&r, &["2.9.0", "1.1.1"]); -- -- let r = req("^1.4.2-beta.5"); -- assert_match(&r, -- &["1.4.2", "1.4.3", "1.4.2-beta.5", "1.4.2-beta.6", "1.4.2-c"]); -- assert_not_match(&r, -- &["0.9.9", "2.0.0", "1.4.2-alpha", "1.4.2-beta.4", "1.4.3-beta.5"]); -- } -- -- #[test] -- pub fn test_parsing_wildcard() { -- let r = req(""); -- assert_match(&r, &["0.9.1", "2.9.0", "0.0.9", "1.0.1", "1.1.1"]); -- assert_not_match(&r, &[]); -- let r = req("*"); -- assert_match(&r, &["0.9.1", "2.9.0", "0.0.9", "1.0.1", "1.1.1"]); -- assert_not_match(&r, &[]); -- let r = req("x"); -- assert_match(&r, &["0.9.1", "2.9.0", "0.0.9", "1.0.1", "1.1.1"]); -- assert_not_match(&r, &[]); -- let r = req("X"); -- assert_match(&r, &["0.9.1", "2.9.0", "0.0.9", "1.0.1", "1.1.1"]); -- assert_not_match(&r, &[]); -- -- let r = req("1.*"); -- assert_match(&r, &["1.2.0", "1.2.1", "1.1.1", "1.3.0"]); -- assert_not_match(&r, &["0.0.9"]); -- let r = req("1.x"); -- assert_match(&r, &["1.2.0", "1.2.1", "1.1.1", "1.3.0"]); -- assert_not_match(&r, &["0.0.9"]); -- let r = req("1.X"); -- assert_match(&r, &["1.2.0", "1.2.1", "1.1.1", "1.3.0"]); -- assert_not_match(&r, &["0.0.9"]); -- -- let r = req("1.2.*"); -- assert_match(&r, &["1.2.0", "1.2.2", "1.2.4"]); -- assert_not_match(&r, &["1.9.0", "1.0.9", "2.0.1", "0.1.3"]); -- let r = req("1.2.x"); -- assert_match(&r, &["1.2.0", "1.2.2", "1.2.4"]); -- assert_not_match(&r, &["1.9.0", "1.0.9", "2.0.1", "0.1.3"]); -- let r = req("1.2.X"); -- assert_match(&r, &["1.2.0", "1.2.2", "1.2.4"]); -- assert_not_match(&r, &["1.9.0", "1.0.9", "2.0.1", "0.1.3"]); -- } -- -- #[test] -- pub fn test_any() { -- let r = VersionReq::any(); -- assert_match(&r, &["0.0.1", "0.1.0", "1.0.0"]); -- } -- -- #[test] -- pub fn test_pre() { -- let r = req("=2.1.1-really.0"); -- assert_match(&r, &["2.1.1-really.0"]); -- } -- -- // #[test] -- // pub fn test_parse_errors() { -- // assert_eq!(Err(InvalidVersionRequirement), VersionReq::parse("\0")); -- // assert_eq!(Err(OpAlreadySet), VersionReq::parse(">= >= 0.0.2")); -- // assert_eq!(Err(InvalidSigil), VersionReq::parse(">== 0.0.2")); -- // assert_eq!(Err(VersionComponentsMustBeNumeric), -- // VersionReq::parse("a.0.0")); -- // assert_eq!(Err(InvalidIdentifier), VersionReq::parse("1.0.0-")); -- // assert_eq!(Err(MajorVersionRequired), VersionReq::parse(">=")); -- // } -- -- #[test] -- pub fn test_from_str() { -- assert_eq!("1.0.0".parse::<VersionReq>().unwrap().to_string(), -- "^1.0.0".to_string()); -- assert_eq!("=1.0.0".parse::<VersionReq>().unwrap().to_string(), -- "= 1.0.0".to_string()); -- assert_eq!("~1".parse::<VersionReq>().unwrap().to_string(), -- "~1".to_string()); -- assert_eq!("~1.2".parse::<VersionReq>().unwrap().to_string(), -- "~1.2".to_string()); -- assert_eq!("^1".parse::<VersionReq>().unwrap().to_string(), -- "^1".to_string()); -- assert_eq!("^1.1".parse::<VersionReq>().unwrap().to_string(), -- "^1.1".to_string()); -- assert_eq!("*".parse::<VersionReq>().unwrap().to_string(), -- "*".to_string()); -- assert_eq!("1.*".parse::<VersionReq>().unwrap().to_string(), -- "1.*".to_string()); -- assert_eq!("< 1.0.0".parse::<VersionReq>().unwrap().to_string(), -- "< 1.0.0".to_string()); -- } -- -- // #[test] -- // pub fn test_from_str_errors() { -- // assert_eq!(Err(InvalidVersionRequirement), "\0".parse::<VersionReq>()); -- // assert_eq!(Err(OpAlreadySet), ">= >= 0.0.2".parse::<VersionReq>()); -- // assert_eq!(Err(InvalidSigil), ">== 0.0.2".parse::<VersionReq>()); -- // assert_eq!(Err(VersionComponentsMustBeNumeric), -- // "a.0.0".parse::<VersionReq>()); -- // assert_eq!(Err(InvalidIdentifier), "1.0.0-".parse::<VersionReq>()); -- // assert_eq!(Err(MajorVersionRequired), ">=".parse::<VersionReq>()); -- // } -- -- #[test] -- fn test_cargo3202() { -- let v = "0.*.*".parse::<VersionReq>().unwrap(); -- assert_eq!("0.*.*", format!("{}", v.predicates[0])); -- -- let v = "0.0.*".parse::<VersionReq>().unwrap(); -- assert_eq!("0.0.*", format!("{}", v.predicates[0])); -- -- let r = req("0.*.*"); -- assert_match(&r, &["0.5.0"]); -- } -- -- #[test] -- fn test_eq_hash() { -- assert!(req("^1") == req("^1")); -- assert!(calculate_hash(req("^1")) == calculate_hash(req("^1"))); -- assert!(req("^1") != req("^2")); -- } -- -- #[test] -- fn test_ordering() { -- assert!(req("=1") < req("*")); -- assert!(req(">1") < req("*")); -- assert!(req(">=1") < req("*")); -- assert!(req("<1") < req("*")); -- assert!(req("<=1") < req("*")); -- assert!(req("~1") < req("*")); -- assert!(req("^1") < req("*")); -- assert!(req("*") == req("*")); -- } --} -diff --git a/third_party/rust/semver/tests/deprecation.rs b/third_party/rust/semver/tests/deprecation.rs -deleted file mode 100644 ---- a/third_party/rust/semver/tests/deprecation.rs -+++ /dev/null -@@ -1,22 +0,0 @@ --extern crate semver; -- --#[test] --fn test_regressions() { -- use semver::VersionReq; -- use semver::ReqParseError; -- -- let versions = vec![ -- (".*", VersionReq::any()), -- ("0.1.0.", VersionReq::parse("0.1.0").unwrap()), -- ("0.3.1.3", VersionReq::parse("0.3.13").unwrap()), -- ("0.2*", VersionReq::parse("0.2.*").unwrap()), -- ("*.0", VersionReq::any()), -- ]; -- -- for (version, requirement) in versions.into_iter() { -- let parsed = VersionReq::parse(version); -- let error = parsed.err().unwrap(); -- -- assert_eq!(ReqParseError::DeprecatedVersionRequirement(requirement), error); -- } --} -diff --git a/third_party/rust/semver/tests/node/mod.rs b/third_party/rust/semver/tests/node/mod.rs -new file mode 100644 ---- /dev/null -+++ b/third_party/rust/semver/tests/node/mod.rs -@@ -0,0 +1,43 @@ -+#![cfg(test_node_semver)] -+ -+use semver::Version; -+use std::fmt::{self, Display}; -+use std::process::Command; -+ -+#[derive(Default, Eq, PartialEq, Hash, Debug)] -+pub(super) struct VersionReq(semver::VersionReq); -+ -+impl VersionReq { -+ pub(super) const STAR: Self = VersionReq(semver::VersionReq::STAR); -+ -+ pub(super) fn matches(&self, version: &Version) -> bool { -+ let out = Command::new("node") -+ .arg("-e") -+ .arg(format!( -+ "console.log(require('semver').satisfies('{}', '{}'))", -+ version, -+ self.to_string().replace(',', ""), -+ )) -+ .output() -+ .unwrap(); -+ if out.stdout == b"true\n" { -+ true -+ } else if out.stdout == b"false\n" { -+ false -+ } else { -+ let s = String::from_utf8_lossy(&out.stdout) + String::from_utf8_lossy(&out.stderr); -+ panic!("unexpected output: {}", s); -+ } -+ } -+} -+ -+impl Display for VersionReq { -+ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { -+ Display::fmt(&self.0, formatter) -+ } -+} -+ -+#[cfg_attr(not(no_track_caller), track_caller)] -+pub(super) fn req(text: &str) -> VersionReq { -+ VersionReq(crate::util::req(text)) -+} -diff --git a/third_party/rust/semver/tests/regression.rs b/third_party/rust/semver/tests/regression.rs -deleted file mode 100644 ---- a/third_party/rust/semver/tests/regression.rs -+++ /dev/null -@@ -1,25 +0,0 @@ --extern crate semver; --extern crate crates_index; --extern crate tempdir; -- --// This test checks to see if every existing crate parses successfully. Important to not break the --// Rust universe! -- --#[cfg(feature = "ci")] --#[test] --fn test_regressions() { -- use tempdir::TempDir; -- use crates_index::Index; -- use semver::Version; -- -- let dir = TempDir::new("semver").unwrap(); -- let index = Index::new(dir.into_path()); -- index.clone().unwrap(); -- -- for krate in index.crates() { -- for version in krate.versions() { -- let v = version.version(); -- assert!(Version::parse(v).is_ok(), "failed: {} ({})", version.name(), v); -- } -- } --} -diff --git a/third_party/rust/semver/tests/serde.rs b/third_party/rust/semver/tests/serde.rs -deleted file mode 100644 ---- a/third_party/rust/semver/tests/serde.rs -+++ /dev/null -@@ -1,90 +0,0 @@ --#![cfg(feature = "serde")] -- --#[macro_use] --extern crate serde_derive; -- --extern crate semver; --extern crate serde_json; -- --use semver::{Identifier, Version, VersionReq}; -- --#[derive(Serialize, Deserialize, PartialEq, Debug)] --struct Identified { -- name: String, -- identifier: Identifier, --} -- --#[derive(Serialize, Deserialize, PartialEq, Debug)] --struct Versioned { -- name: String, -- vers: Version, --} -- --#[test] --fn serialize_identifier() { -- let id = Identified { -- name: "serde".to_owned(), -- identifier: Identifier::Numeric(100), -- }; -- let j = serde_json::to_string(&id).unwrap(); -- assert_eq!(j, r#"{"name":"serde","identifier":100}"#); -- -- let id = Identified { -- name: "serde".to_owned(), -- identifier: Identifier::AlphaNumeric("b100".to_owned()), -- }; -- let j = serde_json::to_string(&id).unwrap(); -- assert_eq!(j, r#"{"name":"serde","identifier":"b100"}"#); --} -- --#[test] --fn deserialize_identifier() { -- let j = r#"{"name":"serde","identifier":100}"#; -- let id = serde_json::from_str::<Identified>(j).unwrap(); -- let expected = Identified { -- name: "serde".to_owned(), -- identifier: Identifier::Numeric(100), -- }; -- assert_eq!(id, expected); -- -- let j = r#"{"name":"serde","identifier":"b100"}"#; -- let id = serde_json::from_str::<Identified>(j).unwrap(); -- let expected = Identified { -- name: "serde".to_owned(), -- identifier: Identifier::AlphaNumeric("b100".to_owned()), -- }; -- assert_eq!(id, expected); --} -- --#[test] --fn serialize_version() { -- let v = Versioned { -- name: "serde".to_owned(), -- vers: Version::parse("1.0.0").unwrap(), -- }; -- let j = serde_json::to_string(&v).unwrap(); -- assert_eq!(j, r#"{"name":"serde","vers":"1.0.0"}"#); --} -- --#[test] --fn deserialize_version() { -- let j = r#"{"name":"serde","vers":"1.0.0"}"#; -- let v = serde_json::from_str::<Versioned>(j).unwrap(); -- let expected = Versioned { -- name: "serde".to_owned(), -- vers: Version::parse("1.0.0").unwrap(), -- }; -- assert_eq!(v, expected); --} -- --#[test] --fn serialize_versionreq() { -- let v = VersionReq::exact(&Version::parse("1.0.0").unwrap()); -- -- assert_eq!(serde_json::to_string(&v).unwrap(), r#""= 1.0.0""#); --} -- --#[test] --fn deserialize_versionreq() { -- assert_eq!("1.0.0".parse::<VersionReq>().unwrap(), serde_json::from_str(r#""1.0.0""#).unwrap()); --} -diff --git a/third_party/rust/semver/tests/test_autotrait.rs b/third_party/rust/semver/tests/test_autotrait.rs -new file mode 100644 ---- /dev/null -+++ b/third_party/rust/semver/tests/test_autotrait.rs -@@ -0,0 +1,12 @@ -+fn assert_send_sync<T: Send + Sync>() {} -+ -+#[test] -+fn test() { -+ assert_send_sync::<semver::BuildMetadata>(); -+ assert_send_sync::<semver::Comparator>(); -+ assert_send_sync::<semver::Error>(); -+ assert_send_sync::<semver::Prerelease>(); -+ assert_send_sync::<semver::Version>(); -+ assert_send_sync::<semver::VersionReq>(); -+ assert_send_sync::<semver::Op>(); -+} -diff --git a/third_party/rust/semver/tests/test_identifier.rs b/third_party/rust/semver/tests/test_identifier.rs -new file mode 100644 ---- /dev/null -+++ b/third_party/rust/semver/tests/test_identifier.rs -@@ -0,0 +1,45 @@ -+#![allow( -+ clippy::eq_op, -+ clippy::needless_pass_by_value, -+ clippy::toplevel_ref_arg, -+ clippy::wildcard_imports -+)] -+ -+mod util; -+ -+use crate::util::*; -+use semver::Prerelease; -+ -+#[test] -+fn test_new() { -+ fn test(identifier: Prerelease, expected: &str) { -+ assert_eq!(identifier.is_empty(), expected.is_empty()); -+ assert_eq!(identifier.len(), expected.len()); -+ assert_eq!(identifier.as_str(), expected); -+ assert_eq!(identifier, identifier); -+ assert_eq!(identifier, identifier.clone()); -+ } -+ -+ let ref mut string = String::new(); -+ let limit = if cfg!(miri) { 40 } else { 280 }; // miri is slow -+ for _ in 0..limit { -+ test(prerelease(string), string); -+ string.push('1'); -+ } -+ -+ if !cfg!(miri) { -+ let ref string = string.repeat(20000); -+ test(prerelease(string), string); -+ } -+} -+ -+#[test] -+fn test_eq() { -+ assert_eq!(prerelease("-"), prerelease("-")); -+ assert_ne!(prerelease("a"), prerelease("aa")); -+ assert_ne!(prerelease("aa"), prerelease("a")); -+ assert_ne!(prerelease("aaaaaaaaa"), prerelease("a")); -+ assert_ne!(prerelease("a"), prerelease("aaaaaaaaa")); -+ assert_ne!(prerelease("aaaaaaaaa"), prerelease("bbbbbbbbb")); -+ assert_ne!(build_metadata("1"), build_metadata("001")); -+} -diff --git a/third_party/rust/semver/tests/test_version.rs b/third_party/rust/semver/tests/test_version.rs -new file mode 100644 ---- /dev/null -+++ b/third_party/rust/semver/tests/test_version.rs -@@ -0,0 +1,241 @@ -+#![allow( -+ clippy::nonminimal_bool, -+ clippy::too_many_lines, -+ clippy::wildcard_imports -+)] -+ -+mod util; -+ -+use crate::util::*; -+use semver::{BuildMetadata, Prerelease, Version}; -+ -+#[test] -+fn test_parse() { -+ let err = version_err(""); -+ assert_to_string( -+ err, -+ "unexpected end of input while parsing major version number", -+ ); -+ -+ let err = version_err(" "); -+ assert_to_string( -+ err, -+ "unexpected character ' ' while parsing major version number", -+ ); -+ -+ let err = version_err("1"); -+ assert_to_string( -+ err, -+ "unexpected end of input while parsing major version number", -+ ); -+ -+ let err = version_err("1.2"); -+ assert_to_string( -+ err, -+ "unexpected end of input while parsing minor version number", -+ ); -+ -+ let err = version_err("1.2.3-"); -+ assert_to_string(err, "empty identifier segment in pre-release identifier"); -+ -+ let err = version_err("a.b.c"); -+ assert_to_string( -+ err, -+ "unexpected character 'a' while parsing major version number", -+ ); -+ -+ let err = version_err("1.2.3 abc"); -+ assert_to_string(err, "unexpected character ' ' after patch version number"); -+ -+ let err = version_err("1.2.3-01"); -+ assert_to_string(err, "invalid leading zero in pre-release identifier"); -+ -+ let parsed = version("1.2.3"); -+ let expected = Version::new(1, 2, 3); -+ assert_eq!(parsed, expected); -+ let expected = Version { -+ major: 1, -+ minor: 2, -+ patch: 3, -+ pre: Prerelease::EMPTY, -+ build: BuildMetadata::EMPTY, -+ }; -+ assert_eq!(parsed, expected); -+ -+ let parsed = version("1.2.3-alpha1"); -+ let expected = Version { -+ major: 1, -+ minor: 2, -+ patch: 3, -+ pre: prerelease("alpha1"), -+ build: BuildMetadata::EMPTY, -+ }; -+ assert_eq!(parsed, expected); -+ -+ let parsed = version("1.2.3+build5"); -+ let expected = Version { -+ major: 1, -+ minor: 2, -+ patch: 3, -+ pre: Prerelease::EMPTY, -+ build: build_metadata("build5"), -+ }; -+ assert_eq!(parsed, expected); -+ -+ let parsed = version("1.2.3+5build"); -+ let expected = Version { -+ major: 1, -+ minor: 2, -+ patch: 3, -+ pre: Prerelease::EMPTY, -+ build: build_metadata("5build"), -+ }; -+ assert_eq!(parsed, expected); -+ -+ let parsed = version("1.2.3-alpha1+build5"); -+ let expected = Version { -+ major: 1, -+ minor: 2, -+ patch: 3, -+ pre: prerelease("alpha1"), -+ build: build_metadata("build5"), -+ }; -+ assert_eq!(parsed, expected); -+ -+ let parsed = version("1.2.3-1.alpha1.9+build5.7.3aedf"); -+ let expected = Version { -+ major: 1, -+ minor: 2, -+ patch: 3, -+ pre: prerelease("1.alpha1.9"), -+ build: build_metadata("build5.7.3aedf"), -+ }; -+ assert_eq!(parsed, expected); -+ -+ let parsed = version("1.2.3-0a.alpha1.9+05build.7.3aedf"); -+ let expected = Version { -+ major: 1, -+ minor: 2, -+ patch: 3, -+ pre: prerelease("0a.alpha1.9"), -+ build: build_metadata("05build.7.3aedf"), -+ }; -+ assert_eq!(parsed, expected); -+ -+ let parsed = version("0.4.0-beta.1+0851523"); -+ let expected = Version { -+ major: 0, -+ minor: 4, -+ patch: 0, -+ pre: prerelease("beta.1"), -+ build: build_metadata("0851523"), -+ }; -+ assert_eq!(parsed, expected); -+ -+ // for https://nodejs.org/dist/index.json, where some older npm versions are "1.1.0-beta-10" -+ let parsed = version("1.1.0-beta-10"); -+ let expected = Version { -+ major: 1, -+ minor: 1, -+ patch: 0, -+ pre: prerelease("beta-10"), -+ build: BuildMetadata::EMPTY, -+ }; -+ assert_eq!(parsed, expected); -+} -+ -+#[test] -+fn test_eq() { -+ assert_eq!(version("1.2.3"), version("1.2.3")); -+ assert_eq!(version("1.2.3-alpha1"), version("1.2.3-alpha1")); -+ assert_eq!(version("1.2.3+build.42"), version("1.2.3+build.42")); -+ assert_eq!(version("1.2.3-alpha1+42"), version("1.2.3-alpha1+42")); -+} -+ -+#[test] -+fn test_ne() { -+ assert_ne!(version("0.0.0"), version("0.0.1")); -+ assert_ne!(version("0.0.0"), version("0.1.0")); -+ assert_ne!(version("0.0.0"), version("1.0.0")); -+ assert_ne!(version("1.2.3-alpha"), version("1.2.3-beta")); -+ assert_ne!(version("1.2.3+23"), version("1.2.3+42")); -+} -+ -+#[test] -+fn test_display() { -+ assert_to_string(version("1.2.3"), "1.2.3"); -+ assert_to_string(version("1.2.3-alpha1"), "1.2.3-alpha1"); -+ assert_to_string(version("1.2.3+build.42"), "1.2.3+build.42"); -+ assert_to_string(version("1.2.3-alpha1+42"), "1.2.3-alpha1+42"); -+} -+ -+#[test] -+fn test_lt() { -+ assert!(version("0.0.0") < version("1.2.3-alpha2")); -+ assert!(version("1.0.0") < version("1.2.3-alpha2")); -+ assert!(version("1.2.0") < version("1.2.3-alpha2")); -+ assert!(version("1.2.3-alpha1") < version("1.2.3")); -+ assert!(version("1.2.3-alpha1") < version("1.2.3-alpha2")); -+ assert!(!(version("1.2.3-alpha2") < version("1.2.3-alpha2"))); -+ assert!(version("1.2.3+23") < version("1.2.3+42")); -+} -+ -+#[test] -+fn test_le() { -+ assert!(version("0.0.0") <= version("1.2.3-alpha2")); -+ assert!(version("1.0.0") <= version("1.2.3-alpha2")); -+ assert!(version("1.2.0") <= version("1.2.3-alpha2")); -+ assert!(version("1.2.3-alpha1") <= version("1.2.3-alpha2")); -+ assert!(version("1.2.3-alpha2") <= version("1.2.3-alpha2")); -+ assert!(version("1.2.3+23") <= version("1.2.3+42")); -+} -+ -+#[test] -+fn test_gt() { -+ assert!(version("1.2.3-alpha2") > version("0.0.0")); -+ assert!(version("1.2.3-alpha2") > version("1.0.0")); -+ assert!(version("1.2.3-alpha2") > version("1.2.0")); -+ assert!(version("1.2.3-alpha2") > version("1.2.3-alpha1")); -+ assert!(version("1.2.3") > version("1.2.3-alpha2")); -+ assert!(!(version("1.2.3-alpha2") > version("1.2.3-alpha2"))); -+ assert!(!(version("1.2.3+23") > version("1.2.3+42"))); -+} -+ -+#[test] -+fn test_ge() { -+ assert!(version("1.2.3-alpha2") >= version("0.0.0")); -+ assert!(version("1.2.3-alpha2") >= version("1.0.0")); -+ assert!(version("1.2.3-alpha2") >= version("1.2.0")); -+ assert!(version("1.2.3-alpha2") >= version("1.2.3-alpha1")); -+ assert!(version("1.2.3-alpha2") >= version("1.2.3-alpha2")); -+ assert!(!(version("1.2.3+23") >= version("1.2.3+42"))); -+} -+ -+#[test] -+fn test_spec_order() { -+ let vs = [ -+ "1.0.0-alpha", -+ "1.0.0-alpha.1", -+ "1.0.0-alpha.beta", -+ "1.0.0-beta", -+ "1.0.0-beta.2", -+ "1.0.0-beta.11", -+ "1.0.0-rc.1", -+ "1.0.0", -+ ]; -+ let mut i = 1; -+ while i < vs.len() { -+ let a = version(vs[i - 1]); -+ let b = version(vs[i]); -+ assert!(a < b, "nope {:?} < {:?}", a, b); -+ i += 1; -+ } -+} -+ -+#[test] -+fn test_align() { -+ let version = version("1.2.3-rc1"); -+ assert_eq!("1.2.3-rc1 ", format!("{:20}", version)); -+ assert_eq!("*****1.2.3-rc1******", format!("{:*^20}", version)); -+ assert_eq!(" 1.2.3-rc1", format!("{:>20}", version)); -+} -diff --git a/third_party/rust/semver/tests/test_version_req.rs b/third_party/rust/semver/tests/test_version_req.rs -new file mode 100644 ---- /dev/null -+++ b/third_party/rust/semver/tests/test_version_req.rs -@@ -0,0 +1,443 @@ -+#![allow( -+ clippy::missing_panics_doc, -+ clippy::shadow_unrelated, -+ clippy::toplevel_ref_arg, -+ clippy::wildcard_imports -+)] -+ -+mod node; -+mod util; -+ -+use crate::util::*; -+use std::collections::hash_map::DefaultHasher; -+use std::hash::{Hash, Hasher}; -+ -+#[cfg(test_node_semver)] -+use node::{req, VersionReq}; -+#[cfg(not(test_node_semver))] -+use semver::VersionReq; -+ -+#[cfg_attr(not(no_track_caller), track_caller)] -+fn assert_match_all(req: &VersionReq, versions: &[&str]) { -+ for string in versions { -+ let parsed = version(string); -+ assert!(req.matches(&parsed), "did not match {}", string); -+ } -+} -+ -+#[cfg_attr(not(no_track_caller), track_caller)] -+fn assert_match_none(req: &VersionReq, versions: &[&str]) { -+ for string in versions { -+ let parsed = version(string); -+ assert!(!req.matches(&parsed), "matched {}", string); -+ } -+} -+ -+#[test] -+fn test_basic() { -+ let ref r = req("1.0.0"); -+ assert_to_string(r, "^1.0.0"); -+ assert_match_all(r, &["1.0.0", "1.1.0", "1.0.1"]); -+ assert_match_none(r, &["0.9.9", "0.10.0", "0.1.0", "1.0.0-pre", "1.0.1-pre"]); -+} -+ -+#[test] -+#[cfg(not(no_const_vec_new))] -+fn test_default() { -+ let ref r = VersionReq::default(); -+ assert_eq!(r, &VersionReq::STAR); -+} -+ -+#[test] -+fn test_exact() { -+ let ref r = req("=1.0.0"); -+ assert_to_string(r, "=1.0.0"); -+ assert_match_all(r, &["1.0.0"]); -+ assert_match_none(r, &["1.0.1", "0.9.9", "0.10.0", "0.1.0", "1.0.0-pre"]); -+ -+ let ref r = req("=0.9.0"); -+ assert_to_string(r, "=0.9.0"); -+ assert_match_all(r, &["0.9.0"]); -+ assert_match_none(r, &["0.9.1", "1.9.0", "0.0.9", "0.9.0-pre"]); -+ -+ let ref r = req("=0.0.2"); -+ assert_to_string(r, "=0.0.2"); -+ assert_match_all(r, &["0.0.2"]); -+ assert_match_none(r, &["0.0.1", "0.0.3", "0.0.2-pre"]); -+ -+ let ref r = req("=0.1.0-beta2.a"); -+ assert_to_string(r, "=0.1.0-beta2.a"); -+ assert_match_all(r, &["0.1.0-beta2.a"]); -+ assert_match_none(r, &["0.9.1", "0.1.0", "0.1.1-beta2.a", "0.1.0-beta2"]); -+ -+ let ref r = req("=0.1.0+meta"); -+ assert_to_string(r, "=0.1.0"); -+ assert_match_all(r, &["0.1.0", "0.1.0+meta", "0.1.0+any"]); -+} -+ -+#[test] -+pub fn test_greater_than() { -+ let ref r = req(">= 1.0.0"); -+ assert_to_string(r, ">=1.0.0"); -+ assert_match_all(r, &["1.0.0", "2.0.0"]); -+ assert_match_none(r, &["0.1.0", "0.0.1", "1.0.0-pre", "2.0.0-pre"]); -+ -+ let ref r = req(">= 2.1.0-alpha2"); -+ assert_to_string(r, ">=2.1.0-alpha2"); -+ assert_match_all(r, &["2.1.0-alpha2", "2.1.0-alpha3", "2.1.0", "3.0.0"]); -+ assert_match_none( -+ r, -+ &["2.0.0", "2.1.0-alpha1", "2.0.0-alpha2", "3.0.0-alpha2"], -+ ); -+} -+ -+#[test] -+pub fn test_less_than() { -+ let ref r = req("< 1.0.0"); -+ assert_to_string(r, "<1.0.0"); -+ assert_match_all(r, &["0.1.0", "0.0.1"]); -+ assert_match_none(r, &["1.0.0", "1.0.0-beta", "1.0.1", "0.9.9-alpha"]); -+ -+ let ref r = req("<= 2.1.0-alpha2"); -+ assert_match_all(r, &["2.1.0-alpha2", "2.1.0-alpha1", "2.0.0", "1.0.0"]); -+ assert_match_none( -+ r, -+ &["2.1.0", "2.2.0-alpha1", "2.0.0-alpha2", "1.0.0-alpha2"], -+ ); -+ -+ let ref r = req(">1.0.0-alpha, <1.0.0"); -+ assert_match_all(r, &["1.0.0-beta"]); -+ -+ let ref r = req(">1.0.0-alpha, <1.0"); -+ assert_match_none(r, &["1.0.0-beta"]); -+ -+ let ref r = req(">1.0.0-alpha, <1"); -+ assert_match_none(r, &["1.0.0-beta"]); -+} -+ -+#[test] -+pub fn test_multiple() { -+ let ref r = req("> 0.0.9, <= 2.5.3"); -+ assert_to_string(r, ">0.0.9, <=2.5.3"); -+ assert_match_all(r, &["0.0.10", "1.0.0", "2.5.3"]); -+ assert_match_none(r, &["0.0.8", "2.5.4"]); -+ -+ let ref r = req("0.3.0, 0.4.0"); -+ assert_to_string(r, "^0.3.0, ^0.4.0"); -+ assert_match_none(r, &["0.0.8", "0.3.0", "0.4.0"]); -+ -+ let ref r = req("<= 0.2.0, >= 0.5.0"); -+ assert_to_string(r, "<=0.2.0, >=0.5.0"); -+ assert_match_none(r, &["0.0.8", "0.3.0", "0.5.1"]); -+ -+ let ref r = req("0.1.0, 0.1.4, 0.1.6"); -+ assert_to_string(r, "^0.1.0, ^0.1.4, ^0.1.6"); -+ assert_match_all(r, &["0.1.6", "0.1.9"]); -+ assert_match_none(r, &["0.1.0", "0.1.4", "0.2.0"]); -+ -+ let err = req_err("> 0.1.0,"); -+ assert_to_string( -+ err, -+ "unexpected end of input while parsing major version number", -+ ); -+ -+ let err = req_err("> 0.3.0, ,"); -+ assert_to_string( -+ err, -+ "unexpected character ',' while parsing major version number", -+ ); -+ -+ let ref r = req(">=0.5.1-alpha3, <0.6"); -+ assert_to_string(r, ">=0.5.1-alpha3, <0.6"); -+ assert_match_all( -+ r, -+ &[ -+ "0.5.1-alpha3", -+ "0.5.1-alpha4", -+ "0.5.1-beta", -+ "0.5.1", -+ "0.5.5", -+ ], -+ ); -+ assert_match_none( -+ r, -+ &["0.5.1-alpha1", "0.5.2-alpha3", "0.5.5-pre", "0.5.0-pre"], -+ ); -+ assert_match_none(r, &["0.6.0", "0.6.0-pre"]); -+ -+ // https://github.com/steveklabnik/semver/issues/56 -+ let err = req_err("1.2.3 - 2.3.4"); -+ assert_to_string(err, "expected comma after patch version number, found '-'"); -+} -+ -+#[test] -+pub fn test_whitespace_delimited_comparator_sets() { -+ // https://github.com/steveklabnik/semver/issues/55 -+ let err = req_err("> 0.0.9 <= 2.5.3"); -+ assert_to_string(err, "expected comma after patch version number, found '<'"); -+} -+ -+#[test] -+pub fn test_tilde() { -+ let ref r = req("~1"); -+ assert_match_all(r, &["1.0.0", "1.0.1", "1.1.1"]); -+ assert_match_none(r, &["0.9.1", "2.9.0", "0.0.9"]); -+ -+ let ref r = req("~1.2"); -+ assert_match_all(r, &["1.2.0", "1.2.1"]); -+ assert_match_none(r, &["1.1.1", "1.3.0", "0.0.9"]); -+ -+ let ref r = req("~1.2.2"); -+ assert_match_all(r, &["1.2.2", "1.2.4"]); -+ assert_match_none(r, &["1.2.1", "1.9.0", "1.0.9", "2.0.1", "0.1.3"]); -+ -+ let ref r = req("~1.2.3-beta.2"); -+ assert_match_all(r, &["1.2.3", "1.2.4", "1.2.3-beta.2", "1.2.3-beta.4"]); -+ assert_match_none(r, &["1.3.3", "1.1.4", "1.2.3-beta.1", "1.2.4-beta.2"]); -+} -+ -+#[test] -+pub fn test_caret() { -+ let ref r = req("^1"); -+ assert_match_all(r, &["1.1.2", "1.1.0", "1.2.1", "1.0.1"]); -+ assert_match_none(r, &["0.9.1", "2.9.0", "0.1.4"]); -+ assert_match_none(r, &["1.0.0-beta1", "0.1.0-alpha", "1.0.1-pre"]); -+ -+ let ref r = req("^1.1"); -+ assert_match_all(r, &["1.1.2", "1.1.0", "1.2.1"]); -+ assert_match_none(r, &["0.9.1", "2.9.0", "1.0.1", "0.1.4"]); -+ -+ let ref r = req("^1.1.2"); -+ assert_match_all(r, &["1.1.2", "1.1.4", "1.2.1"]); -+ assert_match_none(r, &["0.9.1", "2.9.0", "1.1.1", "0.0.1"]); -+ assert_match_none(r, &["1.1.2-alpha1", "1.1.3-alpha1", "2.9.0-alpha1"]); -+ -+ let ref r = req("^0.1.2"); -+ assert_match_all(r, &["0.1.2", "0.1.4"]); -+ assert_match_none(r, &["0.9.1", "2.9.0", "1.1.1", "0.0.1"]); -+ assert_match_none(r, &["0.1.2-beta", "0.1.3-alpha", "0.2.0-pre"]); -+ -+ let ref r = req("^0.5.1-alpha3"); -+ assert_match_all( -+ r, -+ &[ -+ "0.5.1-alpha3", -+ "0.5.1-alpha4", -+ "0.5.1-beta", -+ "0.5.1", -+ "0.5.5", -+ ], -+ ); -+ assert_match_none( -+ r, -+ &[ -+ "0.5.1-alpha1", -+ "0.5.2-alpha3", -+ "0.5.5-pre", -+ "0.5.0-pre", -+ "0.6.0", -+ ], -+ ); -+ -+ let ref r = req("^0.0.2"); -+ assert_match_all(r, &["0.0.2"]); -+ assert_match_none(r, &["0.9.1", "2.9.0", "1.1.1", "0.0.1", "0.1.4"]); -+ -+ let ref r = req("^0.0"); -+ assert_match_all(r, &["0.0.2", "0.0.0"]); -+ assert_match_none(r, &["0.9.1", "2.9.0", "1.1.1", "0.1.4"]); -+ -+ let ref r = req("^0"); -+ assert_match_all(r, &["0.9.1", "0.0.2", "0.0.0"]); -+ assert_match_none(r, &["2.9.0", "1.1.1"]); -+ -+ let ref r = req("^1.4.2-beta.5"); -+ assert_match_all( -+ r, -+ &["1.4.2", "1.4.3", "1.4.2-beta.5", "1.4.2-beta.6", "1.4.2-c"], -+ ); -+ assert_match_none( -+ r, -+ &[ -+ "0.9.9", -+ "2.0.0", -+ "1.4.2-alpha", -+ "1.4.2-beta.4", -+ "1.4.3-beta.5", -+ ], -+ ); -+} -+ -+#[test] -+pub fn test_wildcard() { -+ let err = req_err(""); -+ assert_to_string( -+ err, -+ "unexpected end of input while parsing major version number", -+ ); -+ -+ let ref r = req("*"); -+ assert_match_all(r, &["0.9.1", "2.9.0", "0.0.9", "1.0.1", "1.1.1"]); -+ assert_match_none(r, &["1.0.0-pre"]); -+ -+ for s in &["x", "X"] { -+ assert_eq!(*r, req(s)); -+ } -+ -+ let ref r = req("1.*"); -+ assert_match_all(r, &["1.2.0", "1.2.1", "1.1.1", "1.3.0"]); -+ assert_match_none(r, &["0.0.9", "1.2.0-pre"]); -+ -+ for s in &["1.x", "1.X", "1.*.*"] { -+ assert_eq!(*r, req(s)); -+ } -+ -+ let ref r = req("1.2.*"); -+ assert_match_all(r, &["1.2.0", "1.2.2", "1.2.4"]); -+ assert_match_none(r, &["1.9.0", "1.0.9", "2.0.1", "0.1.3", "1.2.2-pre"]); -+ -+ for s in &["1.2.x", "1.2.X"] { -+ assert_eq!(*r, req(s)); -+ } -+} -+ -+#[test] -+pub fn test_logical_or() { -+ // https://github.com/steveklabnik/semver/issues/57 -+ let err = req_err("=1.2.3 || =2.3.4"); -+ assert_to_string(err, "expected comma after patch version number, found '|'"); -+ -+ let err = req_err("1.1 || =1.2.3"); -+ assert_to_string(err, "expected comma after minor version number, found '|'"); -+ -+ let err = req_err("6.* || 8.* || >= 10.*"); -+ assert_to_string(err, "expected comma after minor version number, found '|'"); -+} -+ -+#[test] -+pub fn test_any() { -+ #[cfg(not(no_const_vec_new))] -+ let ref r = VersionReq::STAR; -+ #[cfg(no_const_vec_new)] -+ let ref r = VersionReq { -+ comparators: Vec::new(), -+ }; -+ assert_match_all(r, &["0.0.1", "0.1.0", "1.0.0"]); -+} -+ -+#[test] -+pub fn test_pre() { -+ let ref r = req("=2.1.1-really.0"); -+ assert_match_all(r, &["2.1.1-really.0"]); -+} -+ -+#[test] -+pub fn test_parse_errors() { -+ let err = req_err("\0"); -+ assert_to_string( -+ err, -+ "unexpected character '\\0' while parsing major version number", -+ ); -+ -+ let err = req_err(">= >= 0.0.2"); -+ assert_to_string( -+ err, -+ "unexpected character '>' while parsing major version number", -+ ); -+ -+ let err = req_err(">== 0.0.2"); -+ assert_to_string( -+ err, -+ "unexpected character '=' while parsing major version number", -+ ); -+ -+ let err = req_err("a.0.0"); -+ assert_to_string( -+ err, -+ "unexpected character 'a' while parsing major version number", -+ ); -+ -+ let err = req_err("1.0.0-"); -+ assert_to_string(err, "empty identifier segment in pre-release identifier"); -+ -+ let err = req_err(">="); -+ assert_to_string( -+ err, -+ "unexpected end of input while parsing major version number", -+ ); -+} -+ -+#[test] -+fn test_cargo3202() { -+ let ref r = req("0.*.*"); -+ assert_to_string(r, "0.*"); -+ assert_match_all(r, &["0.5.0"]); -+ -+ let ref r = req("0.0.*"); -+ assert_to_string(r, "0.0.*"); -+} -+ -+#[test] -+fn test_digit_after_wildcard() { -+ let err = req_err("*.1"); -+ assert_to_string(err, "unexpected character after wildcard in version req"); -+ -+ let err = req_err("1.*.1"); -+ assert_to_string(err, "unexpected character after wildcard in version req"); -+ -+ let err = req_err(">=1.*.1"); -+ assert_to_string(err, "unexpected character after wildcard in version req"); -+} -+ -+#[test] -+fn test_eq_hash() { -+ fn calculate_hash(value: impl Hash) -> u64 { -+ let mut hasher = DefaultHasher::new(); -+ value.hash(&mut hasher); -+ hasher.finish() -+ } -+ -+ assert!(req("^1") == req("^1")); -+ assert!(calculate_hash(req("^1")) == calculate_hash(req("^1"))); -+ assert!(req("^1") != req("^2")); -+} -+ -+#[test] -+fn test_leading_digit_in_pre_and_build() { -+ for op in &["=", ">", ">=", "<", "<=", "~", "^"] { -+ // digit then alpha -+ req(&format!("{} 1.2.3-1a", op)); -+ req(&format!("{} 1.2.3+1a", op)); -+ -+ // digit then alpha (leading zero) -+ req(&format!("{} 1.2.3-01a", op)); -+ req(&format!("{} 1.2.3+01", op)); -+ -+ // multiple -+ req(&format!("{} 1.2.3-1+1", op)); -+ req(&format!("{} 1.2.3-1-1+1-1-1", op)); -+ req(&format!("{} 1.2.3-1a+1a", op)); -+ req(&format!("{} 1.2.3-1a-1a+1a-1a-1a", op)); -+ } -+} -+ -+#[test] -+fn test_wildcard_and_another() { -+ let err = req_err("*, 0.20.0-any"); -+ assert_to_string( -+ err, -+ "wildcard req (*) must be the only comparator in the version req", -+ ); -+ -+ let err = req_err("0.20.0-any, *"); -+ assert_to_string( -+ err, -+ "wildcard req (*) must be the only comparator in the version req", -+ ); -+ -+ let err = req_err("0.20.0-any, *, 1.0"); -+ assert_to_string( -+ err, -+ "wildcard req (*) must be the only comparator in the version req", -+ ); -+} -diff --git a/third_party/rust/semver/tests/util/mod.rs b/third_party/rust/semver/tests/util/mod.rs -new file mode 100644 ---- /dev/null -+++ b/third_party/rust/semver/tests/util/mod.rs -@@ -0,0 +1,39 @@ -+#![allow(dead_code)] -+ -+use semver::{BuildMetadata, Error, Prerelease, Version, VersionReq}; -+use std::fmt::Display; -+ -+#[cfg_attr(not(no_track_caller), track_caller)] -+pub(super) fn version(text: &str) -> Version { -+ Version::parse(text).unwrap() -+} -+ -+#[cfg_attr(not(no_track_caller), track_caller)] -+pub(super) fn version_err(text: &str) -> Error { -+ Version::parse(text).unwrap_err() -+} -+ -+#[cfg_attr(not(no_track_caller), track_caller)] -+pub(super) fn req(text: &str) -> VersionReq { -+ VersionReq::parse(text).unwrap() -+} -+ -+#[cfg_attr(not(no_track_caller), track_caller)] -+pub(super) fn req_err(text: &str) -> Error { -+ VersionReq::parse(text).unwrap_err() -+} -+ -+#[cfg_attr(not(no_track_caller), track_caller)] -+pub(super) fn prerelease(text: &str) -> Prerelease { -+ Prerelease::new(text).unwrap() -+} -+ -+#[cfg_attr(not(no_track_caller), track_caller)] -+pub(super) fn build_metadata(text: &str) -> BuildMetadata { -+ BuildMetadata::new(text).unwrap() -+} -+ -+#[cfg_attr(not(no_track_caller), track_caller)] -+pub(super) fn assert_to_string(value: impl Display, expected: &str) { -+ assert_eq!(value.to_string(), expected); -+} -diff --git a/toolkit/library/rust/shared/Cargo.toml b/toolkit/library/rust/shared/Cargo.toml ---- a/toolkit/library/rust/shared/Cargo.toml -+++ b/toolkit/library/rust/shared/Cargo.toml -@@ -16,17 +16,17 @@ nsstring = { path = "../../../../xpcom/r - netwerk_helper = { path = "../../../../netwerk/base/rust-helper" } - xpcom = { path = "../../../../xpcom/rust/xpcom" } - prefs_parser = { path = "../../../../modules/libpref/parser" } - static_prefs = { path = "../../../../modules/libpref/init/static_prefs" } - profiler_helper = { path = "../../../../tools/profiler/rust-helper", optional = true } - mozurl = { path = "../../../../netwerk/base/mozurl" } - webrender_bindings = { path = "../../../../gfx/webrender_bindings" } - cubeb-coreaudio = { git = "https://github.com/mozilla/cubeb-coreaudio-rs", rev = "44eca95823bb57e964cf7b6d9791ed2ccb4b2108", optional = true } --cubeb-pulse = { git = "https://github.com/mozilla/cubeb-pulse-rs", rev="df4dc0288b07b865440f4c7e41ca49ca9ccffc63", optional = true, features=["pulse-dlopen"] } -+cubeb-pulse = { git = "https://github.com/mozilla/cubeb-pulse-rs", rev="1f1fe1e08e01a9a534ec7f079702a583a0899ce7", optional = true, features=["pulse-dlopen"] } - cubeb-sys = { version = "0.10", optional = true, features=["gecko-in-tree"] } - audioipc2-client = { git = "https://github.com/kinetiknz/audioipc-2", rev = "85e9839059f4bf8f68130825b8fd02c39a6a51b9", optional = true } # macos (v2) branch - audioipc2-server = { git = "https://github.com/kinetiknz/audioipc-2", rev = "85e9839059f4bf8f68130825b8fd02c39a6a51b9", optional = true } # macos (v2) branch - audioipc-client = { git = "https://github.com/mozilla/audioipc-2", rev = "c144368c4e084ec0f076af6262970655c2d99e8d", optional = true } - audioipc-server = { git = "https://github.com/mozilla/audioipc-2", rev = "c144368c4e084ec0f076af6262970655c2d99e8d", optional = true } - encoding_glue = { path = "../../../../intl/encoding_glue" } - authenticator = "0.3.1" - gkrust_utils = { path = "../../../../xpcom/rust/gkrust_utils" } -diff --git a/xpcom/rust/gkrust_utils/Cargo.toml b/xpcom/rust/gkrust_utils/Cargo.toml ---- a/xpcom/rust/gkrust_utils/Cargo.toml -+++ b/xpcom/rust/gkrust_utils/Cargo.toml -@@ -1,8 +1,8 @@ - [package] - name = "gkrust_utils" - version = "0.1.0" - authors = ["Jonathan Kingston <jkt@mozilla.com>"] - - [dependencies] --semver = "0.9" -+semver = "1.0" - nsstring = { path = "../nsstring" } -
participants (1)
-
crux@crux.nu