Update bytemuck to 1.21.0

Test: m
Change-Id: Ia9a0ad89470b8bb47cfd61cac4549bcf06b7aa28
diff --git a/crates/bytemuck/.android-checksum.json b/crates/bytemuck/.android-checksum.json
index c366fab..e656abb 100644
--- a/crates/bytemuck/.android-checksum.json
+++ b/crates/bytemuck/.android-checksum.json
@@ -1 +1 @@
-{"package":null,"files":{".cargo-checksum.json":"611988967ee97aea7f05e00cfa027906b204dfc1dc47696e2c502e0524c3fa7a","Android.bp":"7954e136a195b0d26a4a0730f26a18f010fde3cc928b6f83522cc77b62fd6d26","Cargo.toml":"5fed6f33707c14e08f181a0f19bc5c9a7b4307d8cf5373b83a0eb91e73241930","LICENSE":"26c86e25199583069f0f8205e7a76be5bc10af20d9204df80f281a2ea9520941","LICENSE-APACHE":"26c86e25199583069f0f8205e7a76be5bc10af20d9204df80f281a2ea9520941","LICENSE-MIT":"cec4013700872627ee18d2128d3bbde3e1bf1912a61eec493299dc0f434300fb","LICENSE-ZLIB":"a5748e7b6f484bb179d81e382c7cf9526f2da5dc1b027844ae85ed0b739cb56d","METADATA":"9c740a8e8a247f3f164cf039d36add1e74f8b7bfa24b3245f128cfb1fa42e944","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"f6af7c3c0ef64c3625910cbf81cf69fe64d0ca6de5103379ae05cccc082c6a46","TEST_MAPPING":"56f237fe59538452b8639ea7252252654ac69662663eb2ea34ad388b1dae7572","cargo_embargo.json":"e0c03e048791d1e8f84c21f1e4d0b0db189a2ac3ca1d3feefdbc61d164342272","changelog.md":"68997787e8d711fa2e509feb230e7dd00a1556d9e45c1af43478d14585a7fea8","rustfmt.toml":"4dc084ed1f8eee76d5623a48573701dbb3eed85d0c858e50ad79c262598cc1c4","src/allocation.rs":"d0b8464cba876373fd2cd892f98ab8d7a8738bc850183ee084fb811c63c39912","src/anybitpattern.rs":"ae2f6c7567ac0050fd81bbe64c4552386f82c410d8c8f95844f348a523afa099","src/checked.rs":"be6b0edd1e7e65b06f109994e074f117b14378d0422d2da554745681566beeab","src/contiguous.rs":"5f226111b202ae4af33a67aebd72d5d4783b124f5aa2871aee7f5161e1f6d7fb","src/internal.rs":"77ac39d72f4c0c2baa2a9132574470dc603bce34c4f2a53e773c68538f83ac05","src/lib.rs":"3e83eb476477ad4f256e5c6258b86d9cac394dde53bf59866866d00d5529b82f","src/must.rs":"3e44ff35e8691b18f80ee897b2c521cac3cca4b13b1cfb77dbefc37ec4497a24","src/no_uninit.rs":"06a546319aac8a0cee275815860594121b16f5f740ee14aa62d28529242a9bb1","src/offset_of.rs":"d0726ced360c280d4c9f6d4dc709db482049c71434baa4810ea8782510b05989","src/pod.rs":"8f8d08e26cb5b784c682f50c9cc7432f1a592bb1d4ae72283ecbd13771736b51","src/pod_in_option.rs":"e88a449242133014c7490ae6c0ee4c164f3f41de80f329ce823299ce0fbc0692","src/transparent.rs":"43d6b547d72aa58fb31482fa61dcf2e5beb7075e2419805ae20c16915aa15083","src/zeroable.rs":"551b8f8fdec212afef7aa1d608542a78f994e404a0928b7baed251ec23391ae3","src/zeroable_in_option.rs":"e7e1842d2ae5af18cc040b2de9b4300b0ad8a29ffec2a0e1eea554f742765740","tests/array_tests.rs":"63a1f7bf11d09234d456f1eda4f7c59f7af313ee7f692f085fec6c7a303ab0a0","tests/cast_slice_tests.rs":"0fccf1f772c3eed58e24dd3cd0ef7e6c3f580fbc21867a849a35094a906a16b5","tests/checked_tests.rs":"2bee46585c6b6608df216381b1326c2fd56e05c8d7d121db4d37368eeff5fc7e","tests/derive.rs":"4d90facd45007555640269a46a0ef1c904c8665ee1ace879fa0c722977dc0acd","tests/doc_tests.rs":"ebc71de72bfe4499e0b512c94df4c06daa2cb09b6a519690e1f5d9d9e5ebc4dc","tests/offset_of_tests.rs":"fab12e44f1a5f7b86047b5bfa922d800081a2a3a27d58a9f72e374a73aec7f4f","tests/std_tests.rs":"45484e668354e80608df356860805ece04402ec4698760600d87dfc628089f3e","tests/transparent.rs":"66bb171f783a5ede3955ee63562352d538ca11eb16a9bfe72cc38b0f72e5a230","tests/wrapper_forgets.rs":"436c24e0834ff341db64b4b52bceb5c18c83415d01f830c2ec0fcad7266d4ba5"}}
\ No newline at end of file
+{"package":null,"files":{".cargo-checksum.json":"f0c247a14128bd7289a47cbbdb5d1df42f665bc16ea40c12fc5a1085774d6097","Android.bp":"9f13e6a1a13a7085aada8ac14c907fca0dd5e7f9f53dc41fd00cb75502d1f3e0","Cargo.toml":"0c59d16070f73859f051853924caf7fbeb7d052b55f9f4fd6c7e8960ec0c0e89","LICENSE":"26c86e25199583069f0f8205e7a76be5bc10af20d9204df80f281a2ea9520941","LICENSE-APACHE":"26c86e25199583069f0f8205e7a76be5bc10af20d9204df80f281a2ea9520941","LICENSE-MIT":"cec4013700872627ee18d2128d3bbde3e1bf1912a61eec493299dc0f434300fb","LICENSE-ZLIB":"a5748e7b6f484bb179d81e382c7cf9526f2da5dc1b027844ae85ed0b739cb56d","METADATA":"3f628b4d272e28eaed30808a93030c4c88c268a7d362c2610d30ca5e527361df","MODULE_LICENSE_APACHE2":"0d6f8afa3940b7f06bebee651376d43bc8b0d5b437337be2696d30377451e93a","README.md":"f6af7c3c0ef64c3625910cbf81cf69fe64d0ca6de5103379ae05cccc082c6a46","TEST_MAPPING":"56f237fe59538452b8639ea7252252654ac69662663eb2ea34ad388b1dae7572","cargo_embargo.json":"e0c03e048791d1e8f84c21f1e4d0b0db189a2ac3ca1d3feefdbc61d164342272","changelog.md":"2e0e62c563845a666a56ffe666acc2c99464207fb90087b4b8b3335e0d71a510","rustfmt.toml":"4dc084ed1f8eee76d5623a48573701dbb3eed85d0c858e50ad79c262598cc1c4","src/allocation.rs":"d0b8464cba876373fd2cd892f98ab8d7a8738bc850183ee084fb811c63c39912","src/anybitpattern.rs":"ae2f6c7567ac0050fd81bbe64c4552386f82c410d8c8f95844f348a523afa099","src/checked.rs":"8cdfa353780fcac3d085d1f00d170f7be08214fe899ce7dc921de221159f6e5c","src/contiguous.rs":"5f226111b202ae4af33a67aebd72d5d4783b124f5aa2871aee7f5161e1f6d7fb","src/internal.rs":"77ac39d72f4c0c2baa2a9132574470dc603bce34c4f2a53e773c68538f83ac05","src/lib.rs":"d358cc206da405c292132e28a485f00e7736051fd9e7ae56c7b1b2984b314ce9","src/must.rs":"ebe31709688108949d832d516f6115a76915da723c27b015f4f5c04f0f788027","src/no_uninit.rs":"06a546319aac8a0cee275815860594121b16f5f740ee14aa62d28529242a9bb1","src/offset_of.rs":"d0726ced360c280d4c9f6d4dc709db482049c71434baa4810ea8782510b05989","src/pod.rs":"7b1b485d33ed7dfeb4be4887f7c8b8d5304588b41cddd458acb532a51823bcbd","src/pod_in_option.rs":"e88a449242133014c7490ae6c0ee4c164f3f41de80f329ce823299ce0fbc0692","src/transparent.rs":"43d6b547d72aa58fb31482fa61dcf2e5beb7075e2419805ae20c16915aa15083","src/zeroable.rs":"f6da412d43d593906000113da6534b6964f3a18f0db14c0877f371b2c1e8e020","src/zeroable_in_option.rs":"e7e1842d2ae5af18cc040b2de9b4300b0ad8a29ffec2a0e1eea554f742765740","tests/array_tests.rs":"63a1f7bf11d09234d456f1eda4f7c59f7af313ee7f692f085fec6c7a303ab0a0","tests/cast_slice_tests.rs":"0fccf1f772c3eed58e24dd3cd0ef7e6c3f580fbc21867a849a35094a906a16b5","tests/checked_tests.rs":"2bee46585c6b6608df216381b1326c2fd56e05c8d7d121db4d37368eeff5fc7e","tests/derive.rs":"4d90facd45007555640269a46a0ef1c904c8665ee1ace879fa0c722977dc0acd","tests/doc_tests.rs":"ebc71de72bfe4499e0b512c94df4c06daa2cb09b6a519690e1f5d9d9e5ebc4dc","tests/offset_of_tests.rs":"fab12e44f1a5f7b86047b5bfa922d800081a2a3a27d58a9f72e374a73aec7f4f","tests/std_tests.rs":"45484e668354e80608df356860805ece04402ec4698760600d87dfc628089f3e","tests/transparent.rs":"66bb171f783a5ede3955ee63562352d538ca11eb16a9bfe72cc38b0f72e5a230","tests/wrapper_forgets.rs":"436c24e0834ff341db64b4b52bceb5c18c83415d01f830c2ec0fcad7266d4ba5"}}
\ No newline at end of file
diff --git a/crates/bytemuck/.cargo-checksum.json b/crates/bytemuck/.cargo-checksum.json
index e94d33d..2d9934f 100644
--- a/crates/bytemuck/.cargo-checksum.json
+++ b/crates/bytemuck/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"Cargo.toml":"3649299f411a320ac0451f7c2f169ccd0b9246b93a95e3fb319a68dac04064fb","LICENSE-APACHE":"870e20c217d15bcfcbe53d7c5867cd8fac44a4ca0b41fc1eb843557e16063eba","LICENSE-MIT":"0b2d108c9c686a74ac312990ee8377902756a2a081a7af3b0f9d68abf0a8f1a1","LICENSE-ZLIB":"682b4c81b85e83ce6cc6e1ace38fdd97aeb4de0e972bd2b44aa0916c54af8c96","README.md":"167493de1f1ad16d13c778494ae344cd71306622c89d19002eaf7f4185c1f728","changelog.md":"8c79c066f7cccfac1e02badcbc8193de5511745ece3eae7a788dffbbfa8df239","rustfmt.toml":"f4c215534437936f924c937dbb1677f614761589300d6b389f3b518b3eb551b8","src/allocation.rs":"be0c1075015d32698722183523dae7d9cd679f93f6692e733dd6a361214404c9","src/anybitpattern.rs":"172bcc22ba7b38a9a36e34d0aa5efc8716bba77569a3c142f16f8103046f1d45","src/checked.rs":"f60c88558dbf7e1d7d2be43dce7efb100c8710cf57455d3cf586ddad4f274b14","src/contiguous.rs":"bb340c0f20a06aa725bb625edcb493146ba64980fd1fd9e450654aa37384c564","src/internal.rs":"2b5b4fdc1a5d14462dd604ca1f4f23116f40639d7d8b4c1a7189ce276edd8272","src/lib.rs":"ae83f2eb38d059356410b004024b4be500f4beebbe4d83face255f3912c47507","src/must.rs":"e14643ef6a89d2caf87b9907a5cc5624962074963ec1a046ed7ee4b37cd7eb83","src/no_uninit.rs":"4ab2f5ed29bff0b33630661154eb548f3e55581bfcf576a90397b7f8d5323201","src/offset_of.rs":"2afd190ef0462b30ade786fe813a91e7bf41cc2fa99a1d79002cbafab5964f37","src/pod.rs":"b149ec10657dc45039b0be57ef89a4be638ab54d7d15bb7a5094c48f5b067ee5","src/pod_in_option.rs":"73bbe1d69f32d909695ce26d131aa2d81eaa31e2b4532256ebfe1a6ba68675c1","src/transparent.rs":"5e555d6d83f5fe215ce2dbc949e87977aa92ab8d6f7a9be8479f63fdeda2359f","src/zeroable.rs":"fc38a6e1c6ff8f36407279752ee3858fedcb9b94a334273d74da0851dbbf89cf","src/zeroable_in_option.rs":"f74799ac3eee50116ec63a0ae4d3e351e0ab7ac807d01b4b59027bf6a68d6de6","tests/array_tests.rs":"98ca7a0dcd93e65f70d4db19643e707cafae5a249561ab151998cedb89b2e036","tests/cast_slice_tests.rs":"1869416e833757f603765afbf48152a6d32a100316529eb494b48fca6c5a8899","tests/checked_tests.rs":"27965acf20e46482b09ee56aaa2536868821be651a3b95052f40e554ecde9917","tests/derive.rs":"93b5ab70ecdd726811af9dee1702e23e964b8ceac59f727889f6a2678ad90d65","tests/doc_tests.rs":"f20708319fde62d8957909d51ee976fce394ad0891ebc4bbcf336ab026a34092","tests/offset_of_tests.rs":"fb5f91e17f984050969f8b06f1de58b5c1e80802c5deb992d3188f5ec274690f","tests/std_tests.rs":"967d4fb4cae24a374633c9b68f1ff65f86ba4c8a0e980adfe69dcaf60a9049c2","tests/transparent.rs":"ecef6e0987e28121b480942e58ce4534f13fe35667bde7f5c6e04e590b02f6a3","tests/wrapper_forgets.rs":"c6330546f6aa696245625056e7323b3916e3fb1a9fbecefe9c9e62d3726812d9"},"package":"8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a"}
\ No newline at end of file
+{"files":{"Cargo.toml":"97a0b8234556120873b15b5bf6ac70930f5fe38900bbcc70ba6283467a52b1f8","LICENSE-APACHE":"870e20c217d15bcfcbe53d7c5867cd8fac44a4ca0b41fc1eb843557e16063eba","LICENSE-MIT":"0b2d108c9c686a74ac312990ee8377902756a2a081a7af3b0f9d68abf0a8f1a1","LICENSE-ZLIB":"682b4c81b85e83ce6cc6e1ace38fdd97aeb4de0e972bd2b44aa0916c54af8c96","README.md":"167493de1f1ad16d13c778494ae344cd71306622c89d19002eaf7f4185c1f728","changelog.md":"bc6a75f248b44c5f9e97f99ed133b8bc6eeeb6aa1f1436442d1f6a6a3b53d6b5","rustfmt.toml":"f4c215534437936f924c937dbb1677f614761589300d6b389f3b518b3eb551b8","src/allocation.rs":"be0c1075015d32698722183523dae7d9cd679f93f6692e733dd6a361214404c9","src/anybitpattern.rs":"172bcc22ba7b38a9a36e34d0aa5efc8716bba77569a3c142f16f8103046f1d45","src/checked.rs":"35f69278bf0106ce2855bff48ae3aeb125a54c3ee4afb123cbfe135d518e68c0","src/contiguous.rs":"bb340c0f20a06aa725bb625edcb493146ba64980fd1fd9e450654aa37384c564","src/internal.rs":"2b5b4fdc1a5d14462dd604ca1f4f23116f40639d7d8b4c1a7189ce276edd8272","src/lib.rs":"752aa0122fa8e3d80dfc48d0bf694aebbbccf7a3686ca2376aca7bb60ed627c3","src/must.rs":"fed78b2a4dac5ef6758bab53a4f3bcabd8da071854bcc07dc70a255b327ec64c","src/no_uninit.rs":"4ab2f5ed29bff0b33630661154eb548f3e55581bfcf576a90397b7f8d5323201","src/offset_of.rs":"2afd190ef0462b30ade786fe813a91e7bf41cc2fa99a1d79002cbafab5964f37","src/pod.rs":"b010341e374a7c26f84286178c435f6df2e9d80f47306cb1dc29fdb0bc4d8e0f","src/pod_in_option.rs":"73bbe1d69f32d909695ce26d131aa2d81eaa31e2b4532256ebfe1a6ba68675c1","src/transparent.rs":"5e555d6d83f5fe215ce2dbc949e87977aa92ab8d6f7a9be8479f63fdeda2359f","src/zeroable.rs":"f44c0dbfe27661e39c17379e9a3a6ad458b8ca004c1fbf3d352a18aed3f093b1","src/zeroable_in_option.rs":"f74799ac3eee50116ec63a0ae4d3e351e0ab7ac807d01b4b59027bf6a68d6de6","tests/array_tests.rs":"98ca7a0dcd93e65f70d4db19643e707cafae5a249561ab151998cedb89b2e036","tests/cast_slice_tests.rs":"1869416e833757f603765afbf48152a6d32a100316529eb494b48fca6c5a8899","tests/checked_tests.rs":"27965acf20e46482b09ee56aaa2536868821be651a3b95052f40e554ecde9917","tests/derive.rs":"93b5ab70ecdd726811af9dee1702e23e964b8ceac59f727889f6a2678ad90d65","tests/doc_tests.rs":"f20708319fde62d8957909d51ee976fce394ad0891ebc4bbcf336ab026a34092","tests/offset_of_tests.rs":"fb5f91e17f984050969f8b06f1de58b5c1e80802c5deb992d3188f5ec274690f","tests/std_tests.rs":"967d4fb4cae24a374633c9b68f1ff65f86ba4c8a0e980adfe69dcaf60a9049c2","tests/transparent.rs":"ecef6e0987e28121b480942e58ce4534f13fe35667bde7f5c6e04e590b02f6a3","tests/wrapper_forgets.rs":"c6330546f6aa696245625056e7323b3916e3fb1a9fbecefe9c9e62d3726812d9"},"package":"ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3"}
\ No newline at end of file
diff --git a/crates/bytemuck/Android.bp b/crates/bytemuck/Android.bp
index 2f2a854..6f363de 100644
--- a/crates/bytemuck/Android.bp
+++ b/crates/bytemuck/Android.bp
@@ -18,7 +18,7 @@
     host_supported: true,
     crate_name: "array_tests",
     cargo_env_compat: true,
-    cargo_pkg_version: "1.20.0",
+    cargo_pkg_version: "1.21.0",
     crate_root: "tests/array_tests.rs",
     test_suites: ["general-tests"],
     auto_gen_config: true,
@@ -41,7 +41,7 @@
     host_supported: true,
     crate_name: "cast_slice_tests",
     cargo_env_compat: true,
-    cargo_pkg_version: "1.20.0",
+    cargo_pkg_version: "1.21.0",
     crate_root: "tests/cast_slice_tests.rs",
     test_suites: ["general-tests"],
     auto_gen_config: true,
@@ -64,7 +64,7 @@
     host_supported: true,
     crate_name: "checked_tests",
     cargo_env_compat: true,
-    cargo_pkg_version: "1.20.0",
+    cargo_pkg_version: "1.21.0",
     crate_root: "tests/checked_tests.rs",
     test_suites: ["general-tests"],
     auto_gen_config: true,
@@ -87,7 +87,7 @@
     host_supported: true,
     crate_name: "doc_tests",
     cargo_env_compat: true,
-    cargo_pkg_version: "1.20.0",
+    cargo_pkg_version: "1.21.0",
     crate_root: "tests/doc_tests.rs",
     test_suites: ["general-tests"],
     auto_gen_config: true,
@@ -110,7 +110,7 @@
     host_supported: true,
     crate_name: "offset_of_tests",
     cargo_env_compat: true,
-    cargo_pkg_version: "1.20.0",
+    cargo_pkg_version: "1.21.0",
     crate_root: "tests/offset_of_tests.rs",
     test_suites: ["general-tests"],
     auto_gen_config: true,
@@ -133,7 +133,7 @@
     host_supported: true,
     crate_name: "std_tests",
     cargo_env_compat: true,
-    cargo_pkg_version: "1.20.0",
+    cargo_pkg_version: "1.21.0",
     crate_root: "tests/std_tests.rs",
     test_suites: ["general-tests"],
     auto_gen_config: true,
@@ -156,7 +156,7 @@
     host_supported: true,
     crate_name: "transparent",
     cargo_env_compat: true,
-    cargo_pkg_version: "1.20.0",
+    cargo_pkg_version: "1.21.0",
     crate_root: "tests/transparent.rs",
     test_suites: ["general-tests"],
     auto_gen_config: true,
@@ -179,7 +179,7 @@
     host_supported: true,
     crate_name: "bytemuck",
     cargo_env_compat: true,
-    cargo_pkg_version: "1.20.0",
+    cargo_pkg_version: "1.21.0",
     crate_root: "src/lib.rs",
     edition: "2018",
     features: [
@@ -202,7 +202,7 @@
     name: "libbytemuck_nostd",
     crate_name: "bytemuck",
     cargo_env_compat: true,
-    cargo_pkg_version: "1.20.0",
+    cargo_pkg_version: "1.21.0",
     crate_root: "src/lib.rs",
     edition: "2018",
     features: [
diff --git a/crates/bytemuck/Cargo.toml b/crates/bytemuck/Cargo.toml
index 94bbf21..4f67c8d 100644
--- a/crates/bytemuck/Cargo.toml
+++ b/crates/bytemuck/Cargo.toml
@@ -12,7 +12,7 @@
 [package]
 edition = "2018"
 name = "bytemuck"
-version = "1.20.0"
+version = "1.21.0"
 authors = ["Lokathor <zefria@gmail.com>"]
 build = false
 exclude = ["/pedantic.bat"]
@@ -97,25 +97,30 @@
 aarch64_simd = []
 align_offset = []
 alloc_uninit = []
+avx512_simd = []
 const_zeroed = []
 derive = ["bytemuck_derive"]
 extern_crate_alloc = []
 extern_crate_std = ["extern_crate_alloc"]
 latest_stable_rust = [
     "aarch64_simd",
+    "avx512_simd",
     "align_offset",
     "alloc_uninit",
     "const_zeroed",
     "derive",
     "min_const_generics",
     "must_cast",
+    "must_cast_extra",
     "track_caller",
+    "transparentwrapper_extra",
     "wasm_simd",
     "zeroable_atomics",
     "zeroable_maybe_uninit",
 ]
 min_const_generics = []
 must_cast = []
+must_cast_extra = ["must_cast"]
 nightly_docs = []
 nightly_float = []
 nightly_portable_simd = []
diff --git a/crates/bytemuck/METADATA b/crates/bytemuck/METADATA
index d2c3394..b5d7f4a 100644
--- a/crates/bytemuck/METADATA
+++ b/crates/bytemuck/METADATA
@@ -1,17 +1,17 @@
 name: "bytemuck"
 description: "A crate for mucking around with piles of bytes."
 third_party {
-  version: "1.20.0"
+  version: "1.21.0"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2024
-    month: 12
-    day: 19
+    year: 2025
+    month: 1
+    day: 14
   }
   homepage: "https://crates.io/crates/bytemuck"
   identifier {
     type: "Archive"
-    value: "https://static.crates.io/crates/bytemuck/bytemuck-1.20.0.crate"
-    version: "1.20.0"
+    value: "https://static.crates.io/crates/bytemuck/bytemuck-1.21.0.crate"
+    version: "1.21.0"
   }
 }
diff --git a/crates/bytemuck/changelog.md b/crates/bytemuck/changelog.md
index 1e22f33..294647c 100644
--- a/crates/bytemuck/changelog.md
+++ b/crates/bytemuck/changelog.md
@@ -1,5 +1,14 @@
 # `bytemuck` changelog

 

+## 1.21

+

+* Implement `Pod` and `Zeroable` for `core::arch::{x86, x86_64}::__m512`, `__m512d` and `__m512i` without nightly.

+  Requires Rust 1.72, and is gated through the `avx512_simd` cargo feature.

+* Allow the use of `must_cast_mut` and `must_cast_slice_mut` in const contexts.

+  Requires Rust 1.83, and is gated through the `must_cast_extra` cargo feature.

+* internal: introduced the `maybe_const_fn` macro that allows defining some function

+  to be const depending upon some `cfg` predicate.

+

 ## 1.20

 

 * New functions to allocate zeroed `Arc` and `Rc`. Requires Rust 1.82

diff --git a/crates/bytemuck/src/checked.rs b/crates/bytemuck/src/checked.rs
index d0c92cb..c81b449 100644
--- a/crates/bytemuck/src/checked.rs
+++ b/crates/bytemuck/src/checked.rs
@@ -438,7 +438,7 @@
 /// Reads the slice into a `T` value.

 ///

 /// ## Panics

-/// * This is like `try_pod_read_unaligned` but will panic on failure.

+/// * This is like [`try_pod_read_unaligned`] but will panic on failure.

 #[inline]

 #[cfg_attr(feature = "track_caller", track_caller)]

 pub fn pod_read_unaligned<T: CheckedBitPattern>(bytes: &[u8]) -> T {

diff --git a/crates/bytemuck/src/lib.rs b/crates/bytemuck/src/lib.rs
index 7679f74..f820762 100644
--- a/crates/bytemuck/src/lib.rs
+++ b/crates/bytemuck/src/lib.rs
@@ -1,5 +1,6 @@
 #![no_std]

 #![warn(missing_docs)]

+#![allow(unused_mut)]

 #![allow(clippy::match_like_matches_macro)]

 #![allow(clippy::uninlined_format_args)]

 #![allow(clippy::result_unit_err)]

@@ -154,6 +155,25 @@
   };

 }

 

+/// A macro for conditionally const-ifying a function.

+/// #[allow(unused)] because currently it is only used with the `must_cast` feature.

+#[allow(unused)]

+macro_rules! maybe_const_fn {

+  (

+      #[cfg($cfg_predicate:meta)]

+      $(#[$attr:meta])*

+      $vis:vis $(unsafe $($unsafe:lifetime)?)? fn $name:ident $($rest:tt)*

+  ) => {

+      #[cfg($cfg_predicate)]

+      $(#[$attr])*

+      $vis const $(unsafe $($unsafe)?)? fn $name $($rest)*

+

+      #[cfg(not($cfg_predicate))]

+      $(#[$attr])*

+      $vis $(unsafe $($unsafe)?)? fn $name $($rest)*

+    };

+}

+

 #[cfg(feature = "extern_crate_std")]

 extern crate std;

 

diff --git a/crates/bytemuck/src/must.rs b/crates/bytemuck/src/must.rs
index 4753651..1bb5ccc 100644
--- a/crates/bytemuck/src/must.rs
+++ b/crates/bytemuck/src/must.rs
@@ -70,36 +70,39 @@
   unsafe { &*(a as *const A as *const B) }

 }

 

-/// Convert a `&mut A` into `&mut B` if infalliable, or fail to compile.

-///

-/// As [`must_cast_ref`], but `mut`.

-///

-/// ## Examples

-/// ```

-/// let mut i = 12_u16;

-/// // compiles:

-/// let bytes: &mut [u8; 2] = bytemuck::must_cast_mut(&mut i);

-/// ```

-/// ```compile_fail,E0080

-/// # let mut bytes: &mut [u8; 2] = &mut [1, 2];

-/// // fails to compile (alignment requirements increased):

-/// let i : &mut u16 = bytemuck::must_cast_mut(bytes);

-/// ```

-/// ```compile_fail,E0080

-/// # let mut i = 12_u16;

-/// // fails to compile (size mismatch):

-/// let bytes : &mut [u8; 3] = bytemuck::must_cast_mut(&mut i);

-/// ```

-#[inline]

-pub fn must_cast_mut<

-  A: NoUninit + AnyBitPattern,

-  B: NoUninit + AnyBitPattern,

->(

-  a: &mut A,

-) -> &mut B {

-  let _ = Cast::<A, B>::ASSERT_SIZE_EQUAL;

-  let _ = Cast::<A, B>::ASSERT_ALIGN_GREATER_THAN_EQUAL;

-  unsafe { &mut *(a as *mut A as *mut B) }

+maybe_const_fn! {

+  #[cfg(feature = "must_cast_extra")]

+  /// Convert a `&mut A` into `&mut B` if infalliable, or fail to compile.

+  ///

+  /// As [`must_cast_ref`], but `mut`.

+  ///

+  /// ## Examples

+  /// ```

+  /// let mut i = 12_u16;

+  /// // compiles:

+  /// let bytes: &mut [u8; 2] = bytemuck::must_cast_mut(&mut i);

+  /// ```

+  /// ```compile_fail,E0080

+  /// # let mut bytes: &mut [u8; 2] = &mut [1, 2];

+  /// // fails to compile (alignment requirements increased):

+  /// let i : &mut u16 = bytemuck::must_cast_mut(bytes);

+  /// ```

+  /// ```compile_fail,E0080

+  /// # let mut i = 12_u16;

+  /// // fails to compile (size mismatch):

+  /// let bytes : &mut [u8; 3] = bytemuck::must_cast_mut(&mut i);

+  /// ```

+  #[inline]

+  pub fn must_cast_mut<

+    A: NoUninit + AnyBitPattern,

+    B: NoUninit + AnyBitPattern,

+  >(

+    a: &mut A,

+  ) -> &mut B {

+    let _ = Cast::<A, B>::ASSERT_SIZE_EQUAL;

+    let _ = Cast::<A, B>::ASSERT_ALIGN_GREATER_THAN_EQUAL;

+    unsafe { &mut *(a as *mut A as *mut B) }

+  }

 }

 

 /// Convert `&[A]` into `&[B]` (possibly with a change in length) if

@@ -154,53 +157,56 @@
   unsafe { core::slice::from_raw_parts(a.as_ptr() as *const B, new_len) }

 }

 

-/// Convert `&mut [A]` into `&mut [B]` (possibly with a change in length) if

-/// infalliable, or fail to compile.

-///

-/// As [`must_cast_slice`], but `&mut`.

-///

-/// ## Examples

-/// ```

-/// let mut indicies = [1, 2, 3];

-/// let indicies: &mut [u16] = &mut indicies;

-/// // compiles:

-/// let bytes: &mut [u8] = bytemuck::must_cast_slice_mut(indicies);

-/// ```

-/// ```

-/// let zsts: &mut [()] = &mut [(), (), ()];

-/// // compiles:

-/// let bytes: &mut [u8] = bytemuck::must_cast_slice_mut(zsts);

-/// ```

-/// ```compile_fail,E0080

-/// # let mut bytes = [1, 0, 2, 0, 3, 0];

-/// # let bytes : &mut [u8] = &mut bytes[..];

-/// // fails to compile (bytes.len() might not be a multiple of 2):

-/// let byte_pairs : &mut [[u8; 2]] = bytemuck::must_cast_slice_mut(bytes);

-/// ```

-/// ```compile_fail,E0080

-/// # let mut byte_pairs = [[1, 0], [2, 0], [3, 0]];

-/// # let byte_pairs : &mut [[u8; 2]] = &mut byte_pairs[..];

-/// // fails to compile (alignment requirements increased):

-/// let indicies : &mut [u16] = bytemuck::must_cast_slice_mut(byte_pairs);

-/// ```

-/// ```compile_fail,E0080

-/// let bytes: &mut [u8] = &mut [];

-/// // fails to compile: (bytes.len() might not be 0)

-/// let zsts: &mut [()] = bytemuck::must_cast_slice_mut(bytes);

-/// ```

-#[inline]

-pub fn must_cast_slice_mut<

-  A: NoUninit + AnyBitPattern,

-  B: NoUninit + AnyBitPattern,

->(

-  a: &mut [A],

-) -> &mut [B] {

-  let _ = Cast::<A, B>::ASSERT_SIZE_MULTIPLE_OF_OR_INPUT_ZST;

-  let _ = Cast::<A, B>::ASSERT_ALIGN_GREATER_THAN_EQUAL;

-  let new_len = if size_of::<A>() == size_of::<B>() {

-    a.len()

-  } else {

-    a.len() * (size_of::<A>() / size_of::<B>())

-  };

-  unsafe { core::slice::from_raw_parts_mut(a.as_mut_ptr() as *mut B, new_len) }

+maybe_const_fn! {

+  #[cfg(feature = "must_cast_extra")]

+  /// Convert `&mut [A]` into `&mut [B]` (possibly with a change in length) if

+  /// infalliable, or fail to compile.

+  ///

+  /// As [`must_cast_slice`], but `&mut`.

+  ///

+  /// ## Examples

+  /// ```

+  /// let mut indicies = [1, 2, 3];

+  /// let indicies: &mut [u16] = &mut indicies;

+  /// // compiles:

+  /// let bytes: &mut [u8] = bytemuck::must_cast_slice_mut(indicies);

+  /// ```

+  /// ```

+  /// let zsts: &mut [()] = &mut [(), (), ()];

+  /// // compiles:

+  /// let bytes: &mut [u8] = bytemuck::must_cast_slice_mut(zsts);

+  /// ```

+  /// ```compile_fail,E0080

+  /// # let mut bytes = [1, 0, 2, 0, 3, 0];

+  /// # let bytes : &mut [u8] = &mut bytes[..];

+  /// // fails to compile (bytes.len() might not be a multiple of 2):

+  /// let byte_pairs : &mut [[u8; 2]] = bytemuck::must_cast_slice_mut(bytes);

+  /// ```

+  /// ```compile_fail,E0080

+  /// # let mut byte_pairs = [[1, 0], [2, 0], [3, 0]];

+  /// # let byte_pairs : &mut [[u8; 2]] = &mut byte_pairs[..];

+  /// // fails to compile (alignment requirements increased):

+  /// let indicies : &mut [u16] = bytemuck::must_cast_slice_mut(byte_pairs);

+  /// ```

+  /// ```compile_fail,E0080

+  /// let bytes: &mut [u8] = &mut [];

+  /// // fails to compile: (bytes.len() might not be 0)

+  /// let zsts: &mut [()] = bytemuck::must_cast_slice_mut(bytes);

+  /// ```

+  #[inline]

+  pub fn must_cast_slice_mut<

+    A: NoUninit + AnyBitPattern,

+    B: NoUninit + AnyBitPattern,

+  >(

+    a: &mut [A],

+  ) -> &mut [B] {

+    let _ = Cast::<A, B>::ASSERT_SIZE_MULTIPLE_OF_OR_INPUT_ZST;

+    let _ = Cast::<A, B>::ASSERT_ALIGN_GREATER_THAN_EQUAL;

+    let new_len = if size_of::<A>() == size_of::<B>() {

+      a.len()

+    } else {

+      a.len() * (size_of::<A>() / size_of::<B>())

+    };

+    unsafe { core::slice::from_raw_parts_mut(a.as_mut_ptr() as *mut B, new_len) }

+  }

 }

diff --git a/crates/bytemuck/src/pod.rs b/crates/bytemuck/src/pod.rs
index 7fdf5a6..7a60b08 100644
--- a/crates/bytemuck/src/pod.rs
+++ b/crates/bytemuck/src/pod.rs
@@ -153,17 +153,29 @@
 }

 

 impl_unsafe_marker_for_simd!(

+  #[cfg(all(target_arch = "x86", any(feature = "nightly_stdsimd", feature = "avx512_simd")))]

+  unsafe impl Pod for x86::{

+    __m512, __m512d, __m512i

+  }

+);

+

+impl_unsafe_marker_for_simd!(

+  #[cfg(all(target_arch = "x86_64", any(feature = "nightly_stdsimd", feature = "avx512_simd")))]

+  unsafe impl Pod for x86_64::{

+    __m512, __m512d, __m512i

+  }

+);

+

+impl_unsafe_marker_for_simd!(

   #[cfg(all(target_arch = "x86", feature = "nightly_stdsimd"))]

   unsafe impl Pod for x86::{

-    __m128bh, __m256bh, __m512,

-    __m512bh, __m512d, __m512i,

+    __m128bh, __m256bh, __m512bh

   }

 );

 

 impl_unsafe_marker_for_simd!(

   #[cfg(all(target_arch = "x86_64", feature = "nightly_stdsimd"))]

   unsafe impl Pod for x86_64::{

-    __m128bh, __m256bh, __m512,

-    __m512bh, __m512d, __m512i,

+    __m128bh, __m256bh, __m512bh

   }

 );

diff --git a/crates/bytemuck/src/zeroable.rs b/crates/bytemuck/src/zeroable.rs
index 7eb476f..9d371a7 100644
--- a/crates/bytemuck/src/zeroable.rs
+++ b/crates/bytemuck/src/zeroable.rs
@@ -233,17 +233,29 @@
 }

 

 impl_unsafe_marker_for_simd!(

+  #[cfg(all(target_arch = "x86", any(feature = "nightly_stdsimd", feature = "avx512_simd")))]

+  unsafe impl Zeroable for x86::{

+    __m512, __m512d, __m512i

+  }

+);

+

+impl_unsafe_marker_for_simd!(

+  #[cfg(all(target_arch = "x86_64", any(feature = "nightly_stdsimd", feature = "avx512_simd")))]

+  unsafe impl Zeroable for x86_64::{

+    __m512, __m512d, __m512i

+  }

+);

+

+impl_unsafe_marker_for_simd!(

   #[cfg(all(target_arch = "x86", feature = "nightly_stdsimd"))]

   unsafe impl Zeroable for x86::{

-    __m128bh, __m256bh, __m512,

-    __m512bh, __m512d, __m512i,

+    __m128bh, __m256bh, __m512bh

   }

 );

 

 impl_unsafe_marker_for_simd!(

   #[cfg(all(target_arch = "x86_64", feature = "nightly_stdsimd"))]

   unsafe impl Zeroable for x86_64::{

-    __m128bh, __m256bh, __m512,

-    __m512bh, __m512d, __m512i,

+    __m128bh, __m256bh, __m512bh

   }

 );

diff --git a/pseudo_crate/Cargo.lock b/pseudo_crate/Cargo.lock
index 39eaecd..e9892e4 100644
--- a/pseudo_crate/Cargo.lock
+++ b/pseudo_crate/Cargo.lock
@@ -991,9 +991,9 @@
 
 [[package]]
 name = "bytemuck"
-version = "1.20.0"
+version = "1.21.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a"
+checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3"
 dependencies = [
  "bytemuck_derive",
 ]
diff --git a/pseudo_crate/Cargo.toml b/pseudo_crate/Cargo.toml
index 419e9da..51c78c0 100644
--- a/pseudo_crate/Cargo.toml
+++ b/pseudo_crate/Cargo.toml
@@ -41,7 +41,7 @@
 bitreader = "=0.3.11"
 bstr = "=1.3.0"
 buddy_system_allocator = "=0.11.0"
-bytemuck = "=1.20.0"
+bytemuck = "=1.21.0"
 bytemuck_derive = "=1.8.0"
 byteorder = "=1.5.0"
 bytes = "=1.9.0"