Vendor things
This commit is contained in:
parent
5deceec006
commit
977e3c17e5
19434 changed files with 10682014 additions and 0 deletions
1
third-party/vendor/zerocopy/.cargo-checksum.json
vendored
Normal file
1
third-party/vendor/zerocopy/.cargo-checksum.json
vendored
Normal file
File diff suppressed because one or more lines are too long
215
third-party/vendor/zerocopy/CONTRIBUTING.md
vendored
Normal file
215
third-party/vendor/zerocopy/CONTRIBUTING.md
vendored
Normal file
|
|
@ -0,0 +1,215 @@
|
|||
<!-- Copyright 2022 The Fuchsia Authors
|
||||
|
||||
Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
<LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
This file may not be copied, modified, or distributed except according to
|
||||
those terms. -->
|
||||
|
||||
# How to Contribute
|
||||
|
||||
We'd love to accept your patches and contributions to zerocopy. There are just a
|
||||
few small guidelines you need to follow.
|
||||
|
||||
Once you've read the rest of this doc, check out our [good-first-issue
|
||||
label][good-first-issue] for some good issues you can use to get your toes wet!
|
||||
|
||||
## Contributor License Agreement
|
||||
|
||||
Contributions to this project must be accompanied by a Contributor License
|
||||
Agreement. You (or your employer) retain the copyright to your contribution;
|
||||
this simply gives us permission to use and redistribute your contributions as
|
||||
part of the project. Head over to <https://cla.developers.google.com/> to see
|
||||
your current agreements on file or to sign a new one.
|
||||
|
||||
You generally only need to submit a CLA once, so if you've already submitted one
|
||||
(even if it was for a different project), you probably don't need to do it
|
||||
again.
|
||||
|
||||
## Code Reviews
|
||||
|
||||
All submissions, including submissions by project members, require review. We
|
||||
use GitHub pull requests for this purpose. Consult [GitHub
|
||||
Help][about_pull_requests] for more information on using pull requests.
|
||||
|
||||
## Code Guidelines
|
||||
|
||||
### Philosophy
|
||||
|
||||
This section is inspired by [Flutter's style guide][flutter_philosophy], which
|
||||
contains many general principles that you should apply to all your programming
|
||||
work. Read it. The below calls out specific aspects that we feel are
|
||||
particularly important.
|
||||
|
||||
#### Dogfood Your Features
|
||||
|
||||
In non-library code, it's often advised to only implement features you need.
|
||||
After all, it's hard to correctly design code without a concrete use case to
|
||||
guide its design. Since zerocopy is a library, this advice is not as applicable;
|
||||
we want our API surface to be featureful and complete even if not every feature
|
||||
or method has a known use case. However, the observation that unused code is
|
||||
hard to design still holds.
|
||||
|
||||
Thus, when designing external-facing features, try to make use of them somehow.
|
||||
This could be by using them to implement other features, or it could be by
|
||||
writing prototype code which won't actually be checked in anywhere. If you're
|
||||
feeling ambitious, you could even add (and check in) a [Cargo
|
||||
example][cargo_example] that exercises the new feature.
|
||||
|
||||
#### Go Down the Rabbit Hole
|
||||
|
||||
You will occasionally encounter behavior that surprises you or seems wrong. It
|
||||
probably is! Invest the time to find the root cause - you will either learn
|
||||
something, or fix something, and both are worth your time. Do not work around
|
||||
behavior you don't understand.
|
||||
|
||||
### Avoid Duplication
|
||||
|
||||
Avoid duplicating code whenever possible. In cases where existing code is not
|
||||
exposed in a manner suitable to your needs, prefer to extract the necessary
|
||||
parts into a common dependency.
|
||||
|
||||
### Comments
|
||||
|
||||
When writing comments, take a moment to consider the future reader of your
|
||||
comment. Ensure that your comments are complete sentences with proper grammar
|
||||
and punctuation. Note that adding more comments or more verbose comments is not
|
||||
always better; for example, avoid comments that repeat the code they're anchored
|
||||
on.
|
||||
|
||||
Documentation comments should be self-contained; in other words, do not assume
|
||||
that the reader is aware of documentation in adjacent files or on adjacent
|
||||
structures. Avoid documentation comments on types which describe _instances_ of
|
||||
the type; for example, `AddressSet is a set of client addresses.` is a comment
|
||||
that describes a field of type `AddressSet`, but the type may be used to hold
|
||||
any kind of `Address`, not just a client's.
|
||||
|
||||
Phrase your comments to avoid references that might become stale; for example:
|
||||
do not mention a variable or type by name when possible (certain doc comments
|
||||
are necessary exceptions). Also avoid references to past or future versions of
|
||||
or past or future work surrounding the item being documented; explain things
|
||||
from first principles rather than making external references (including past
|
||||
revisions).
|
||||
|
||||
When writing TODOs:
|
||||
|
||||
1. Include an issue reference using the format `TODO(#123):`
|
||||
1. Phrase the text as an action that is to be taken; it should be possible for
|
||||
another contributor to pick up the TODO without consulting any external
|
||||
sources, including the referenced issue.
|
||||
|
||||
### Tests
|
||||
|
||||
Much of the code in zerocopy has the property that, if it is buggy, those bugs
|
||||
may not cause user code to fail. This makes it extra important to write thorough
|
||||
tests, but it also makes it harder to write those tests correctly. Here are some
|
||||
guidelines on how to test code in zerocopy:
|
||||
1. All code added to zerocopy must include tests that exercise it completely.
|
||||
1. Tests must be deterministic. Threaded or time-dependent code, random number
|
||||
generators (RNGs), and communication with external processes are common
|
||||
sources of nondeterminism. See [Write reproducible, deterministic
|
||||
tests][determinism] for tips.
|
||||
1. Avoid [change detector tests][change_detector_tests]; tests that are
|
||||
unnecessarily sensitive to changes, especially ones external to the code
|
||||
under test, can hamper feature development and refactoring.
|
||||
1. Since we run tests in [Miri][miri], make sure that tests exist which exercise
|
||||
any potential [undefined behavior][undefined_behavior] so that Miri can catch
|
||||
it.
|
||||
1. If there's some user code that should be impossible to compile, add a
|
||||
[trybuild test][trybuild] to ensure that it's properly rejected.
|
||||
|
||||
### Source Control Best Practices
|
||||
|
||||
Commits should be arranged for ease of reading; that is, incidental changes
|
||||
such as code movement or formatting changes should be committed separately from
|
||||
actual code changes.
|
||||
|
||||
Commits should always be focused. For example, a commit could add a feature,
|
||||
fix a bug, or refactor code, but not a mixture.
|
||||
|
||||
Commits should be thoughtfully sized; avoid overly large or complex commits
|
||||
which can be logically separated, but also avoid overly separated commits that
|
||||
require code reviews to load multiple commits into their mental working memory
|
||||
in order to properly understand how the various pieces fit together.
|
||||
|
||||
#### Commit Messages
|
||||
|
||||
Commit messages should be _concise_ but self-contained (avoid relying on issue
|
||||
references as explanations for changes) and written such that they are helpful
|
||||
to people reading in the future (include rationale and any necessary context).
|
||||
|
||||
Avoid superfluous details or narrative.
|
||||
|
||||
Commit messages should consist of a brief subject line and a separate
|
||||
explanatory paragraph in accordance with the following:
|
||||
|
||||
1. [Separate subject from body with a blank line](https://chris.beams.io/posts/git-commit/#separate)
|
||||
1. [Limit the subject line to 50 characters](https://chris.beams.io/posts/git-commit/#limit-50)
|
||||
1. [Capitalize the subject line](https://chris.beams.io/posts/git-commit/#capitalize)
|
||||
1. [Do not end the subject line with a period](https://chris.beams.io/posts/git-commit/#end)
|
||||
1. [Use the imperative mood in the subject line](https://chris.beams.io/posts/git-commit/#imperative)
|
||||
1. [Wrap the body at 72 characters](https://chris.beams.io/posts/git-commit/#wrap-72)
|
||||
1. [Use the body to explain what and why vs. how](https://chris.beams.io/posts/git-commit/#why-not-how)
|
||||
|
||||
If the code affects a particular subsystem, prefix the subject line with the
|
||||
name of that subsystem in square brackets, omitting any "zerocopy" prefix
|
||||
(that's implicit). For example, for a commit adding a feature to the
|
||||
zerocopy-derive crate:
|
||||
|
||||
```text
|
||||
[derive] Support AsBytes on types with parameters
|
||||
```
|
||||
|
||||
The body may be omitted if the subject is self-explanatory; e.g. when fixing a
|
||||
typo. The git book contains a [Commit Guidelines][commit_guidelines] section
|
||||
with much of the same advice, and the list above is part of a [blog
|
||||
post][beams_git_commit] by [Chris Beams][chris_beams].
|
||||
|
||||
Commit messages should make use of issue integration. Including an issue
|
||||
reference like `#123` will cause the GitHub UI to link the text of that
|
||||
reference to the referenced issue, and will also make it so that the referenced
|
||||
issue back-links to the commit. Use "Closes", "Fixes", or "Resolves" on its own
|
||||
line to automatically close an issue when your commit is merged:
|
||||
|
||||
```text
|
||||
Closes #123
|
||||
Fixes #123
|
||||
Resolves #123
|
||||
```
|
||||
|
||||
When using issue integration, don't omit necessary context that may also be
|
||||
included in the relevant issue (see "Commit messages should be _concise_ but
|
||||
self-contained" above). Git history is more likely to be retained indefinitely
|
||||
than issue history (for example, if this repository is migrated away from GitHub
|
||||
at some point in the future).
|
||||
|
||||
Commit messages should never contain references to any of:
|
||||
|
||||
1. Relative moments in time
|
||||
1. Non-public URLs
|
||||
1. Individuals
|
||||
1. Hosted code reviews (such as on https://github.com/google/zerocopy/pulls)
|
||||
+ Refer to commits in this repository by their SHA-1 hash
|
||||
+ Refer to commits in other repositories by public web address (such as
|
||||
https://github.com/google/zerocopy/commit/789b3deb)
|
||||
1. Other entities which may not make sense to arbitrary future readers
|
||||
|
||||
## Community Guidelines
|
||||
|
||||
This project follows [Google's Open Source Community
|
||||
Guidelines][google_open_source_guidelines].
|
||||
|
||||
[about_pull_requests]: https://help.github.com/articles/about-pull-requests/
|
||||
[beams_git_commit]: https://chris.beams.io/posts/git-commit/
|
||||
[cargo_example]: http://xion.io/post/code/rust-examples.html
|
||||
[change_detector_tests]: https://testing.googleblog.com/2015/01/testing-on-toilet-change-detector-tests.html
|
||||
[chris_beams]: https://chris.beams.io/
|
||||
[commit_guidelines]: https://www.git-scm.com/book/en/v2/Distributed-Git-Contributing-to-a-Project#_commit_guidelines
|
||||
[determinism]: https://fuchsia.dev/fuchsia-src/contribute/testing/best-practices#write_reproducible_deterministic_tests
|
||||
[flutter_philosophy]: https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo#philosophy
|
||||
[good-first-issue]: https://github.com/google/zerocopy/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22
|
||||
[google_open_source_guidelines]: https://opensource.google/conduct/
|
||||
[magic_number]: https://en.wikipedia.org/wiki/Magic_number_(programming)
|
||||
[miri]: https://github.com/rust-lang/miri
|
||||
[trybuild]: https://crates.io/crates/trybuild
|
||||
[undefined_behavior]: https://raphlinus.github.io/programming/rust/2018/08/17/undefined-behavior.html
|
||||
87
third-party/vendor/zerocopy/Cargo.toml
vendored
Normal file
87
third-party/vendor/zerocopy/Cargo.toml
vendored
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
|
||||
#
|
||||
# When uploading crates to the registry Cargo will automatically
|
||||
# "normalize" Cargo.toml files for maximal compatibility
|
||||
# with all versions of Cargo and also rewrite `path` dependencies
|
||||
# to registry (e.g., crates.io) dependencies.
|
||||
#
|
||||
# If you 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.60.0"
|
||||
name = "zerocopy"
|
||||
version = "0.7.32"
|
||||
authors = ["Joshua Liebow-Feeser <joshlf@google.com>"]
|
||||
exclude = [".*"]
|
||||
description = "Utilities for zero-copy parsing and serialization"
|
||||
readme = "README.md"
|
||||
license = "BSD-2-Clause OR Apache-2.0 OR MIT"
|
||||
repository = "https://github.com/google/zerocopy"
|
||||
|
||||
[package.metadata.ci]
|
||||
pinned-nightly = "nightly-2023-12-05"
|
||||
pinned-stable = "1.74.0"
|
||||
|
||||
[package.metadata.docs.rs]
|
||||
all-features = true
|
||||
rustdoc-args = [
|
||||
"--cfg",
|
||||
"doc_cfg",
|
||||
"--generate-link-to-definition",
|
||||
]
|
||||
|
||||
[package.metadata.playground]
|
||||
features = ["__internal_use_only_features_that_work_on_stable"]
|
||||
|
||||
[dependencies.byteorder]
|
||||
version = "1.3"
|
||||
optional = true
|
||||
default-features = false
|
||||
|
||||
[dependencies.zerocopy-derive]
|
||||
version = "=0.7.32"
|
||||
optional = true
|
||||
|
||||
[dev-dependencies.assert_matches]
|
||||
version = "1.5"
|
||||
|
||||
[dev-dependencies.elain]
|
||||
version = "0.3.0"
|
||||
|
||||
[dev-dependencies.itertools]
|
||||
version = "0.11"
|
||||
|
||||
[dev-dependencies.rand]
|
||||
version = "0.8.5"
|
||||
features = ["small_rng"]
|
||||
|
||||
[dev-dependencies.rustversion]
|
||||
version = "1.0"
|
||||
|
||||
[dev-dependencies.static_assertions]
|
||||
version = "1.1"
|
||||
|
||||
[dev-dependencies.trybuild]
|
||||
version = "=1.0.85"
|
||||
features = ["diff"]
|
||||
|
||||
[dev-dependencies.zerocopy-derive]
|
||||
version = "=0.7.32"
|
||||
|
||||
[features]
|
||||
__internal_use_only_features_that_work_on_stable = [
|
||||
"alloc",
|
||||
"derive",
|
||||
"simd",
|
||||
]
|
||||
alloc = []
|
||||
default = ["byteorder"]
|
||||
derive = ["zerocopy-derive"]
|
||||
simd = []
|
||||
simd-nightly = ["simd"]
|
||||
|
||||
[target."cfg(any())".dependencies.zerocopy-derive]
|
||||
version = "=0.7.32"
|
||||
44
third-party/vendor/zerocopy/INTERNAL.md
vendored
Normal file
44
third-party/vendor/zerocopy/INTERNAL.md
vendored
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
<!-- Copyright 2022 The Fuchsia Authors
|
||||
|
||||
Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
<LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
This file may not be copied, modified, or distributed except according to
|
||||
those terms. -->
|
||||
|
||||
# Internal details
|
||||
|
||||
This file documents various internal details of zerocopy and its infrastructure
|
||||
that consumers don't need to be concerned about. It focuses on details that
|
||||
affect multiple files, and allows each affected code location to reference this
|
||||
document rather than requiring us to repeat the same explanation in multiple
|
||||
locations.
|
||||
|
||||
## CI and toolchain versions
|
||||
|
||||
In CI (`.github/workflows/ci.yml`), we pin to specific versions or dates of the
|
||||
stable and nightly toolchains. The reason is twofold: First, our UI tests (see
|
||||
`tests/trybuild.rs` and `zerocopy-derive/tests/trybuild.rs`) depend on the
|
||||
format of rustc's error messages, and that format can change between toolchain
|
||||
versions (we also maintain multiple copies of our UI tests - one for each
|
||||
toolchain version pinned in CI - for this reason). Second, not all nightlies
|
||||
have a working Miri, so we need to pin to one that does (see
|
||||
https://rust-lang.github.io/rustup-components-history/).
|
||||
|
||||
Updating the versions pinned in CI may cause the UI tests to break. In order to
|
||||
fix UI tests after a version update, run:
|
||||
|
||||
```
|
||||
$ TRYBUILD=overwrite ./cargo.sh +all test
|
||||
```
|
||||
|
||||
## Crate versions
|
||||
|
||||
We ensure that the crate versions of zerocopy and zerocopy-derive are always the
|
||||
same in-tree, and that zerocopy depends upon zerocopy-derive using an exact
|
||||
version match to the current version in-tree. This has the result that, even
|
||||
when published on crates.io, both crates effectively constitute a single atomic
|
||||
version. So long as the code in zerocopy is compatible with the code in
|
||||
zerocopy-derive in the same Git commit, then publishing them both is fine. This
|
||||
frees us from the normal task of reasoning about compatibility with a range of
|
||||
semver-compatible versions of different crates.
|
||||
202
third-party/vendor/zerocopy/LICENSE-APACHE
vendored
Normal file
202
third-party/vendor/zerocopy/LICENSE-APACHE
vendored
Normal file
|
|
@ -0,0 +1,202 @@
|
|||
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 2023 The Fuchsia Authors
|
||||
|
||||
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.
|
||||
|
||||
24
third-party/vendor/zerocopy/LICENSE-BSD
vendored
Normal file
24
third-party/vendor/zerocopy/LICENSE-BSD
vendored
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
Copyright 2019 The Fuchsia Authors.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following disclaimer
|
||||
in the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
26
third-party/vendor/zerocopy/LICENSE-MIT
vendored
Normal file
26
third-party/vendor/zerocopy/LICENSE-MIT
vendored
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
Copyright 2023 The Fuchsia Authors
|
||||
|
||||
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.
|
||||
|
||||
103
third-party/vendor/zerocopy/POLICIES.md
vendored
Normal file
103
third-party/vendor/zerocopy/POLICIES.md
vendored
Normal file
|
|
@ -0,0 +1,103 @@
|
|||
<!-- Copyright 2023 The Fuchsia Authors
|
||||
|
||||
Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
<LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
This file may not be copied, modified, or distributed except according to
|
||||
those terms. -->
|
||||
|
||||
# Zerocopy's Policies
|
||||
|
||||
## Soundness
|
||||
|
||||
Zerocopy is expressly designed for use in security-critical contexts. It is used
|
||||
in hardware security firmware, cryptographic implementations, hypervisors, and
|
||||
more. We understand that software in these contexts has a very high bar for
|
||||
correctness, and we take our responsibility to meet that bar very seriously.
|
||||
|
||||
This section describes policies which are designed to ensure the correctness and
|
||||
soundness of our code and prevent regressions.
|
||||
|
||||
### Forwards-compatibility
|
||||
|
||||
Rust does not currently have a formal memory model. As such, while Rust provides
|
||||
guarantees about the semantics of some operations, the semantics of many
|
||||
operations is up in the air and subject to change.
|
||||
|
||||
Zerocopy strives to ensure that our code - and code emitted by our custom
|
||||
derives - is sound under any version of Rust as early as our MSRV, and will
|
||||
continue to be sound under any future version of Rust. The policies in this
|
||||
section are designed to help ensure that we live up to this goal.
|
||||
|
||||
### Safety comments
|
||||
|
||||
Each non-test `unsafe` block must be annotated with a "safety comment" which
|
||||
provides a rationale for its soundness. In order to ensure that our soundness is
|
||||
forwards-compatible, safety comments must satisfy the following criteria:
|
||||
- Safety comments must constitute a (possibly informal) proof that all of Rust's
|
||||
soundness rules are upheld.
|
||||
- Safety comments must only rely for their correctness on statements which
|
||||
appear in the stable versions of the [Rust Reference] or standard library
|
||||
documentation (ie, the docs for [core], [alloc], and [std]); arguments which
|
||||
rely on text from the beta or nightly versions of these documents are not
|
||||
considered complete.
|
||||
- All statements from the Reference or standard library documentation which are
|
||||
relied upon for soundness must be quoted in the safety comment. This ensures
|
||||
that there is no ambiguity as to what aspect of the text is being cited. This
|
||||
is especially important in cases where the text of these documents changes in
|
||||
the future. Such changes are of course required to be backwards-compatible,
|
||||
but may change the manner in which a particular guarantee is explained.
|
||||
|
||||
We use the [`clippy::undocumented_unsafe_blocks`] lint to ensure that `unsafe`
|
||||
blocks cannot be added without a safety comment. Note that there are a few
|
||||
outstanding uncommented `unsafe` blocks which are tracked in [#429]. Our goal is
|
||||
to reach 100% safety comment coverage and not regress once we've reached it.
|
||||
|
||||
[Rust Reference]: https://doc.rust-lang.org/reference/
|
||||
[core]: https://doc.rust-lang.org/stable/core/
|
||||
[alloc]: https://doc.rust-lang.org/stable/alloc/
|
||||
[std]: https://doc.rust-lang.org/stable/std/
|
||||
[`clippy::undocumented_unsafe_blocks`]: https://rust-lang.github.io/rust-clippy/master/index.html#/undocumented_unsafe_blocks
|
||||
[#429]: https://github.com/google/zerocopy/issues/429
|
||||
|
||||
#### Exceptions to our safety comment policy
|
||||
|
||||
In rare circumstances, the soundness of an `unsafe` block may depend upon
|
||||
semantics which are widely agreed upon but not formally guaranteed. In order to
|
||||
avoid slowing down zerocopy's development to an unreasonable degree, a safety
|
||||
comment may violate our safety comment policy so long as all of the following
|
||||
hold:
|
||||
- The safety comment's correctness may rely on semantics which are not
|
||||
guaranteed in official Rust documentation *so long as* a member of the Rust
|
||||
team has articulated in an official communication (e.g. a comment on a Rust
|
||||
GitHub repo) that Rust intends to guarantee particular semantics.
|
||||
- There exists an active effort to formalize the guarantee in Rust's official
|
||||
documentation.
|
||||
|
||||
### Target architecture support
|
||||
|
||||
Zerocopy bases its soundness on guarantees made about the semantics of Rust
|
||||
which appear in the Rust Reference or standard library documentation; zerocopy
|
||||
is sound so long as these guarantees hold. There are known cases in which these
|
||||
guarantees do not hold on certain target architectures (see
|
||||
[rust-lang/unsafe-code-guidelines#461]); on such target architectures, zerocopy
|
||||
may be unsound. We consider it outside of zerocopy's scope to reason about these
|
||||
cases. Zerocopy makes no effort maintain soundness in cases where Rust's
|
||||
documented guarantees do not hold.
|
||||
|
||||
[rust-lang/unsafe-code-guidelines#461]: https://github.com/rust-lang/unsafe-code-guidelines/issues/461
|
||||
|
||||
## MSRV
|
||||
|
||||
Our minimum supported Rust version (MSRV) is encoded in our `Cargo.toml` file.
|
||||
We consider an increase in MSRV to be a semver-breaking change, and will only
|
||||
increase our MSRV during semver-breaking version changes (e.g., 0.1 -> 0.2, 1.0
|
||||
-> 2.0, etc).
|
||||
|
||||
## Yanking
|
||||
|
||||
Whenever a bug or regression is identified, we will yank any affected versions
|
||||
which are part of the current version train. For example, if the most recent
|
||||
version is 0.10.20 and a bug is uncovered, we will release a fix in 0.10.21 and
|
||||
yank all 0.10.X versions which are affected. We *may* also yank versions in previous
|
||||
version trains on a case-by-case basis, but we don't guarantee it.
|
||||
154
third-party/vendor/zerocopy/README.md
vendored
Normal file
154
third-party/vendor/zerocopy/README.md
vendored
Normal file
|
|
@ -0,0 +1,154 @@
|
|||
<!-- Copyright 2022 The Fuchsia Authors
|
||||
|
||||
Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
<LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
This file may not be copied, modified, or distributed except according to
|
||||
those terms.
|
||||
|
||||
WARNING: DO NOT EDIT THIS FILE. It is generated automatically. Edits should be
|
||||
made in the doc comment on `src/lib.rs` or in `generate-readme.sh`.
|
||||
-->
|
||||
|
||||
# zerocopy
|
||||
|
||||
*<span style="font-size: 100%; color:grey;">Want to help improve zerocopy?
|
||||
Fill out our [user survey][user-survey]!</span>*
|
||||
|
||||
***<span style="font-size: 140%">Fast, safe, <span
|
||||
style="color:red;">compile error</span>. Pick two.</span>***
|
||||
|
||||
Zerocopy makes zero-cost memory manipulation effortless. We write `unsafe`
|
||||
so you don't have to.
|
||||
|
||||
## Overview
|
||||
|
||||
Zerocopy provides four core marker traits, each of which can be derived
|
||||
(e.g., `#[derive(FromZeroes)]`):
|
||||
- `FromZeroes` indicates that a sequence of zero bytes represents a valid
|
||||
instance of a type
|
||||
- `FromBytes` indicates that a type may safely be converted from an
|
||||
arbitrary byte sequence
|
||||
- `AsBytes` indicates that a type may safely be converted *to* a byte
|
||||
sequence
|
||||
- `Unaligned` indicates that a type's alignment requirement is 1
|
||||
|
||||
Types which implement a subset of these traits can then be converted to/from
|
||||
byte sequences with little to no runtime overhead.
|
||||
|
||||
Zerocopy also provides byte-order aware integer types that support these
|
||||
conversions; see the `byteorder` module. These types are especially useful
|
||||
for network parsing.
|
||||
|
||||
[user-survey]: https://docs.google.com/forms/d/e/1FAIpQLSdzBNTN9tzwsmtyZxRFNL02K36IWCdHWW2ZBckyQS2xiO3i8Q/viewform?usp=published_options
|
||||
|
||||
## Cargo Features
|
||||
|
||||
- **`alloc`**
|
||||
By default, `zerocopy` is `no_std`. When the `alloc` feature is enabled,
|
||||
the `alloc` crate is added as a dependency, and some allocation-related
|
||||
functionality is added.
|
||||
|
||||
- **`byteorder`** (enabled by default)
|
||||
Adds the `byteorder` module and a dependency on the `byteorder` crate.
|
||||
The `byteorder` module provides byte order-aware equivalents of the
|
||||
multi-byte primitive numerical types. Unlike their primitive equivalents,
|
||||
the types in this module have no alignment requirement and support byte
|
||||
order conversions. This can be useful in handling file formats, network
|
||||
packet layouts, etc which don't provide alignment guarantees and which may
|
||||
use a byte order different from that of the execution platform.
|
||||
|
||||
- **`derive`**
|
||||
Provides derives for the core marker traits via the `zerocopy-derive`
|
||||
crate. These derives are re-exported from `zerocopy`, so it is not
|
||||
necessary to depend on `zerocopy-derive` directly.
|
||||
|
||||
However, you may experience better compile times if you instead directly
|
||||
depend on both `zerocopy` and `zerocopy-derive` in your `Cargo.toml`,
|
||||
since doing so will allow Rust to compile these crates in parallel. To do
|
||||
so, do *not* enable the `derive` feature, and list both dependencies in
|
||||
your `Cargo.toml` with the same leading non-zero version number; e.g:
|
||||
|
||||
```toml
|
||||
[dependencies]
|
||||
zerocopy = "0.X"
|
||||
zerocopy-derive = "0.X"
|
||||
```
|
||||
|
||||
- **`simd`**
|
||||
When the `simd` feature is enabled, `FromZeroes`, `FromBytes`, and
|
||||
`AsBytes` impls are emitted for all stable SIMD types which exist on the
|
||||
target platform. Note that the layout of SIMD types is not yet stabilized,
|
||||
so these impls may be removed in the future if layout changes make them
|
||||
invalid. For more information, see the Unsafe Code Guidelines Reference
|
||||
page on the [layout of packed SIMD vectors][simd-layout].
|
||||
|
||||
- **`simd-nightly`**
|
||||
Enables the `simd` feature and adds support for SIMD types which are only
|
||||
available on nightly. Since these types are unstable, support for any type
|
||||
may be removed at any point in the future.
|
||||
|
||||
[simd-layout]: https://rust-lang.github.io/unsafe-code-guidelines/layout/packed-simd-vectors.html
|
||||
|
||||
## Security Ethos
|
||||
|
||||
Zerocopy is expressly designed for use in security-critical contexts. We
|
||||
strive to ensure that that zerocopy code is sound under Rust's current
|
||||
memory model, and *any future memory model*. We ensure this by:
|
||||
- **...not 'guessing' about Rust's semantics.**
|
||||
We annotate `unsafe` code with a precise rationale for its soundness that
|
||||
cites a relevant section of Rust's official documentation. When Rust's
|
||||
documented semantics are unclear, we work with the Rust Operational
|
||||
Semantics Team to clarify Rust's documentation.
|
||||
- **...rigorously testing our implementation.**
|
||||
We run tests using [Miri], ensuring that zerocopy is sound across a wide
|
||||
array of supported target platforms of varying endianness and pointer
|
||||
width, and across both current and experimental memory models of Rust.
|
||||
- **...formally proving the correctness of our implementation.**
|
||||
We apply formal verification tools like [Kani][kani] to prove zerocopy's
|
||||
correctness.
|
||||
|
||||
For more information, see our full [soundness policy].
|
||||
|
||||
[Miri]: https://github.com/rust-lang/miri
|
||||
[Kani]: https://github.com/model-checking/kani
|
||||
[soundness policy]: https://github.com/google/zerocopy/blob/main/POLICIES.md#soundness
|
||||
|
||||
## Relationship to Project Safe Transmute
|
||||
|
||||
[Project Safe Transmute] is an official initiative of the Rust Project to
|
||||
develop language-level support for safer transmutation. The Project consults
|
||||
with crates like zerocopy to identify aspects of safer transmutation that
|
||||
would benefit from compiler support, and has developed an [experimental,
|
||||
compiler-supported analysis][mcp-transmutability] which determines whether,
|
||||
for a given type, any value of that type may be soundly transmuted into
|
||||
another type. Once this functionality is sufficiently mature, zerocopy
|
||||
intends to replace its internal transmutability analysis (implemented by our
|
||||
custom derives) with the compiler-supported one. This change will likely be
|
||||
an implementation detail that is invisible to zerocopy's users.
|
||||
|
||||
Project Safe Transmute will not replace the need for most of zerocopy's
|
||||
higher-level abstractions. The experimental compiler analysis is a tool for
|
||||
checking the soundness of `unsafe` code, not a tool to avoid writing
|
||||
`unsafe` code altogether. For the foreseeable future, crates like zerocopy
|
||||
will still be required in order to provide higher-level abstractions on top
|
||||
of the building block provided by Project Safe Transmute.
|
||||
|
||||
[Project Safe Transmute]: https://rust-lang.github.io/rfcs/2835-project-safe-transmute.html
|
||||
[mcp-transmutability]: https://github.com/rust-lang/compiler-team/issues/411
|
||||
|
||||
## MSRV
|
||||
|
||||
See our [MSRV policy].
|
||||
|
||||
[MSRV policy]: https://github.com/google/zerocopy/blob/main/POLICIES.md#msrv
|
||||
|
||||
## Changelog
|
||||
|
||||
Zerocopy uses [GitHub Releases].
|
||||
|
||||
[GitHub Releases]: https://github.com/google/zerocopy/releases
|
||||
|
||||
## Disclaimer
|
||||
|
||||
Disclaimer: Zerocopy is not an officially supported Google product.
|
||||
120
third-party/vendor/zerocopy/cargo.sh
vendored
Executable file
120
third-party/vendor/zerocopy/cargo.sh
vendored
Executable file
|
|
@ -0,0 +1,120 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Copyright 2023 The Fuchsia Authors
|
||||
#
|
||||
# Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
# <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
# license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
# This file may not be copied, modified, or distributed except according to
|
||||
# those terms.
|
||||
|
||||
# This script is a thin wrapper around Cargo that provides human-friendly
|
||||
# toolchain names which are automatically translated to the toolchain versions
|
||||
# we have pinned in CI.
|
||||
#
|
||||
# cargo.sh --version <toolchain-name> # looks up the version for the named toolchain
|
||||
# cargo.sh +<toolchain-name> [...] # runs cargo commands with the named toolchain
|
||||
# cargo.sh +all [...] # runs cargo commands with each toolchain
|
||||
#
|
||||
# The meta-toolchain "all" instructs this script to run the provided command
|
||||
# once for each toolchain (msrv, stable, nightly).
|
||||
#
|
||||
# A common task that is especially annoying to perform by hand is to update
|
||||
# trybuild's stderr files. Using this script:
|
||||
#
|
||||
# TRYBUILD=overwrite ./cargo.sh +all test --workspace
|
||||
|
||||
set -eo pipefail
|
||||
|
||||
function print-usage-and-exit {
|
||||
echo "Usage:" >&2
|
||||
echo " $0 --version <toolchain-name>" >&2
|
||||
echo " $0 +<toolchain-name> [...]" >&2
|
||||
echo " $0 +all [...]" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
[[ $# -gt 0 ]] || print-usage-and-exit
|
||||
|
||||
function pkg-meta {
|
||||
# NOTE(#547): We set `CARGO_TARGET_DIR` here because `cargo metadata`
|
||||
# sometimes causes the `cargo-metadata` crate to be rebuilt from source using
|
||||
# the default toolchain. This has the effect of clobbering any existing build
|
||||
# artifacts from whatever toolchain the user has specified (e.g., `+nightly`),
|
||||
# causing the subsequent `cargo` invocation to rebuild unnecessarily. By
|
||||
# specifying a separate build directory here, we ensure that this never
|
||||
# clobbers the build artifacts used by the later `cargo` invocation.
|
||||
CARGO_TARGET_DIR=target/cargo-sh cargo metadata --format-version 1 | jq -r ".packages[] | select(.name == \"zerocopy\").$1"
|
||||
}
|
||||
|
||||
function lookup-version {
|
||||
VERSION="$1"
|
||||
case "$VERSION" in
|
||||
msrv)
|
||||
pkg-meta rust_version
|
||||
;;
|
||||
stable)
|
||||
pkg-meta 'metadata.ci."pinned-stable"'
|
||||
;;
|
||||
nightly)
|
||||
pkg-meta 'metadata.ci."pinned-nightly"'
|
||||
;;
|
||||
*)
|
||||
echo "Unrecognized toolchain name: '$VERSION' (options are 'msrv', 'stable', 'nightly')" >&2
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
function get-rustflags {
|
||||
[ "$1" == nightly ] && echo "--cfg __INTERNAL_USE_ONLY_NIGHLTY_FEATURES_IN_TESTS"
|
||||
}
|
||||
|
||||
function prompt {
|
||||
PROMPT="$1"
|
||||
YES="$2"
|
||||
while true; do
|
||||
read -p "$PROMPT " yn
|
||||
case "$yn" in
|
||||
[Yy]) $YES; return $?; ;;
|
||||
[Nn]) return 1; ;;
|
||||
*) break; ;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
# cargo.sh --version <toolchain-name>
|
||||
--version)
|
||||
[[ $# -eq 2 ]] || print-usage-and-exit
|
||||
lookup-version "$2"
|
||||
;;
|
||||
# cargo.sh +all [...]
|
||||
+all)
|
||||
echo "[cargo.sh] warning: running the same command for each toolchain (msrv, stable, nightly)" >&2
|
||||
for toolchain in msrv stable nightly; do
|
||||
echo "[cargo.sh] running with toolchain: $toolchain" >&2
|
||||
$0 "+$toolchain" ${@:2}
|
||||
done
|
||||
exit 0
|
||||
;;
|
||||
# cargo.sh +<toolchain-name> [...]
|
||||
+*)
|
||||
TOOLCHAIN="$(lookup-version ${1:1})"
|
||||
|
||||
cargo "+$TOOLCHAIN" version &>/dev/null && \
|
||||
rustup "+$TOOLCHAIN" component list | grep '^rust-src (installed)$' >/dev/null || {
|
||||
echo "[cargo.sh] missing either toolchain '$TOOLCHAIN' or component 'rust-src'" >&2
|
||||
# If we're running in a GitHub action, then it's better to bail than to
|
||||
# hang waiting for input we're never going to get.
|
||||
[ -z ${GITHUB_RUN_ID+x} ] || exit 1
|
||||
prompt "[cargo.sh] would you like to install toolchain '$TOOLCHAIN' and component 'rust-src' via 'rustup'?" \
|
||||
"rustup toolchain install $TOOLCHAIN -c rust-src"
|
||||
} || exit 1
|
||||
|
||||
RUSTFLAGS="$(get-rustflags ${1:1}) $RUSTFLAGS" cargo "+$TOOLCHAIN" ${@:2}
|
||||
;;
|
||||
*)
|
||||
print-usage-and-exit
|
||||
;;
|
||||
esac
|
||||
10
third-party/vendor/zerocopy/clippy.toml
vendored
Normal file
10
third-party/vendor/zerocopy/clippy.toml
vendored
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
# Copyright 2023 The Fuchsia Authors
|
||||
#
|
||||
# Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
# <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
# license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
# This file may not be copied, modified, or distributed except according to
|
||||
# those terms.
|
||||
|
||||
accept-comment-above-statement = true
|
||||
accept-comment-above-attributes = true
|
||||
50
third-party/vendor/zerocopy/generate-readme.sh
vendored
Executable file
50
third-party/vendor/zerocopy/generate-readme.sh
vendored
Executable file
|
|
@ -0,0 +1,50 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Copyright 2022 The Fuchsia Authors
|
||||
#
|
||||
# Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
# <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
# license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
# This file may not be copied, modified, or distributed except according to
|
||||
# those terms.
|
||||
|
||||
set -eo pipefail
|
||||
|
||||
COPYRIGHT_HEADER=$(mktemp)
|
||||
BODY=$(mktemp)
|
||||
DISCLAIMER_FOOTER=$(mktemp)
|
||||
|
||||
cat > $COPYRIGHT_HEADER <<'EOF'
|
||||
<!-- Copyright 2022 The Fuchsia Authors
|
||||
|
||||
Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
<LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
This file may not be copied, modified, or distributed except according to
|
||||
those terms.
|
||||
|
||||
WARNING: DO NOT EDIT THIS FILE. It is generated automatically. Edits should be
|
||||
made in the doc comment on `src/lib.rs` or in `generate-readme.sh`.
|
||||
-->
|
||||
|
||||
EOF
|
||||
|
||||
# This uses the `cargo readme` tool, which you can install via `cargo install
|
||||
# cargo-readme --version 3.2.0`.
|
||||
#
|
||||
# The `sed` command is used to strip code links like:
|
||||
#
|
||||
# /// Here is a link to [`Vec`].
|
||||
#
|
||||
# These links don't work in a Markdown file, and so we remove the `[` and `]`
|
||||
# characters to convert them to non-link code snippets.
|
||||
cargo readme --no-license | sed 's/\[\(`[^`]*`\)]/\1/g' > $BODY
|
||||
|
||||
cat > $DISCLAIMER_FOOTER <<'EOF'
|
||||
|
||||
## Disclaimer
|
||||
|
||||
Disclaimer: Zerocopy is not an officially supported Google product.
|
||||
EOF
|
||||
|
||||
cat $COPYRIGHT_HEADER $BODY $DISCLAIMER_FOOTER
|
||||
19
third-party/vendor/zerocopy/rustfmt.toml
vendored
Normal file
19
third-party/vendor/zerocopy/rustfmt.toml
vendored
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
# Copyright 2022 The Fuchsia Authors
|
||||
#
|
||||
# Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
# <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
# license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
# This file may not be copied, modified, or distributed except according to
|
||||
# those terms.
|
||||
|
||||
edition = "2021"
|
||||
|
||||
# The "Default" setting has a heuristic which splits lines too aggresively.
|
||||
# We are willing to revisit this setting in future versions of rustfmt.
|
||||
# Bugs:
|
||||
# * https://github.com/rust-lang/rustfmt/issues/3119
|
||||
# * https://github.com/rust-lang/rustfmt/issues/3120
|
||||
use_small_heuristics = "Max"
|
||||
|
||||
# Prevent carriage returns
|
||||
newline_style = "Unix"
|
||||
1075
third-party/vendor/zerocopy/src/byteorder.rs
vendored
Normal file
1075
third-party/vendor/zerocopy/src/byteorder.rs
vendored
Normal file
File diff suppressed because it is too large
Load diff
8256
third-party/vendor/zerocopy/src/lib.rs
vendored
Normal file
8256
third-party/vendor/zerocopy/src/lib.rs
vendored
Normal file
File diff suppressed because it is too large
Load diff
670
third-party/vendor/zerocopy/src/macro_util.rs
vendored
Normal file
670
third-party/vendor/zerocopy/src/macro_util.rs
vendored
Normal file
|
|
@ -0,0 +1,670 @@
|
|||
// Copyright 2022 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
//! Utilities used by macros and by `zerocopy-derive`.
|
||||
//!
|
||||
//! These are defined here `zerocopy` rather than in code generated by macros or
|
||||
//! by `zerocopy-derive` so that they can be compiled once rather than
|
||||
//! recompiled for every invocation (e.g., if they were defined in generated
|
||||
//! code, then deriving `AsBytes` and `FromBytes` on three different types would
|
||||
//! result in the code in question being emitted and compiled six different
|
||||
//! times).
|
||||
|
||||
#![allow(missing_debug_implementations)]
|
||||
|
||||
use core::{marker::PhantomData, mem::ManuallyDrop};
|
||||
|
||||
// TODO(#29), TODO(https://github.com/rust-lang/rust/issues/69835): Remove this
|
||||
// `cfg` when `size_of_val_raw` is stabilized.
|
||||
#[cfg(__INTERNAL_USE_ONLY_NIGHLTY_FEATURES_IN_TESTS)]
|
||||
use core::ptr::{self, NonNull};
|
||||
|
||||
/// A compile-time check that should be one particular value.
|
||||
pub trait ShouldBe<const VALUE: bool> {}
|
||||
|
||||
/// A struct for checking whether `T` contains padding.
|
||||
pub struct HasPadding<T: ?Sized, const VALUE: bool>(PhantomData<T>);
|
||||
|
||||
impl<T: ?Sized, const VALUE: bool> ShouldBe<VALUE> for HasPadding<T, VALUE> {}
|
||||
|
||||
/// A type whose size is equal to `align_of::<T>()`.
|
||||
#[repr(C)]
|
||||
pub struct AlignOf<T> {
|
||||
// This field ensures that:
|
||||
// - The size is always at least 1 (the minimum possible alignment).
|
||||
// - If the alignment is greater than 1, Rust has to round up to the next
|
||||
// multiple of it in order to make sure that `Align`'s size is a multiple
|
||||
// of that alignment. Without this field, its size could be 0, which is a
|
||||
// valid multiple of any alignment.
|
||||
_u: u8,
|
||||
_a: [T; 0],
|
||||
}
|
||||
|
||||
impl<T> AlignOf<T> {
|
||||
#[inline(never)] // Make `missing_inline_in_public_items` happy.
|
||||
pub fn into_t(self) -> T {
|
||||
unreachable!()
|
||||
}
|
||||
}
|
||||
|
||||
/// A type whose size is equal to `max(align_of::<T>(), align_of::<U>())`.
|
||||
#[repr(C)]
|
||||
pub union MaxAlignsOf<T, U> {
|
||||
_t: ManuallyDrop<AlignOf<T>>,
|
||||
_u: ManuallyDrop<AlignOf<U>>,
|
||||
}
|
||||
|
||||
impl<T, U> MaxAlignsOf<T, U> {
|
||||
#[inline(never)] // Make `missing_inline_in_public_items` happy.
|
||||
pub fn new(_t: T, _u: U) -> MaxAlignsOf<T, U> {
|
||||
unreachable!()
|
||||
}
|
||||
}
|
||||
|
||||
const _64K: usize = 1 << 16;
|
||||
|
||||
// TODO(#29), TODO(https://github.com/rust-lang/rust/issues/69835): Remove this
|
||||
// `cfg` when `size_of_val_raw` is stabilized.
|
||||
#[cfg(__INTERNAL_USE_ONLY_NIGHLTY_FEATURES_IN_TESTS)]
|
||||
#[repr(C, align(65536))]
|
||||
struct Aligned64kAllocation([u8; _64K]);
|
||||
|
||||
/// A pointer to an aligned allocation of size 2^16.
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// `ALIGNED_64K_ALLOCATION` is guaranteed to point to the entirety of an
|
||||
/// allocation with size and alignment 2^16, and to have valid provenance.
|
||||
// TODO(#29), TODO(https://github.com/rust-lang/rust/issues/69835): Remove this
|
||||
// `cfg` when `size_of_val_raw` is stabilized.
|
||||
#[cfg(__INTERNAL_USE_ONLY_NIGHLTY_FEATURES_IN_TESTS)]
|
||||
pub const ALIGNED_64K_ALLOCATION: NonNull<[u8]> = {
|
||||
const REF: &Aligned64kAllocation = &Aligned64kAllocation([0; _64K]);
|
||||
let ptr: *const Aligned64kAllocation = REF;
|
||||
let ptr: *const [u8] = ptr::slice_from_raw_parts(ptr.cast(), _64K);
|
||||
// SAFETY:
|
||||
// - `ptr` is derived from a Rust reference, which is guaranteed to be
|
||||
// non-null.
|
||||
// - `ptr` is derived from an `&Aligned64kAllocation`, which has size and
|
||||
// alignment `_64K` as promised. Its length is initialized to `_64K`,
|
||||
// which means that it refers to the entire allocation.
|
||||
// - `ptr` is derived from a Rust reference, which is guaranteed to have
|
||||
// valid provenance.
|
||||
//
|
||||
// TODO(#429): Once `NonNull::new_unchecked` docs document that it preserves
|
||||
// provenance, cite those docs.
|
||||
// TODO: Replace this `as` with `ptr.cast_mut()` once our MSRV >= 1.65
|
||||
#[allow(clippy::as_conversions)]
|
||||
unsafe {
|
||||
NonNull::new_unchecked(ptr as *mut _)
|
||||
}
|
||||
};
|
||||
|
||||
/// Computes the offset of the base of the field `$trailing_field_name` within
|
||||
/// the type `$ty`.
|
||||
///
|
||||
/// `trailing_field_offset!` produces code which is valid in a `const` context.
|
||||
// TODO(#29), TODO(https://github.com/rust-lang/rust/issues/69835): Remove this
|
||||
// `cfg` when `size_of_val_raw` is stabilized.
|
||||
#[cfg(__INTERNAL_USE_ONLY_NIGHLTY_FEATURES_IN_TESTS)]
|
||||
#[doc(hidden)] // `#[macro_export]` bypasses this module's `#[doc(hidden)]`.
|
||||
#[macro_export]
|
||||
macro_rules! trailing_field_offset {
|
||||
($ty:ty, $trailing_field_name:tt) => {{
|
||||
let min_size = {
|
||||
let zero_elems: *const [()] =
|
||||
$crate::macro_util::core_reexport::ptr::slice_from_raw_parts(
|
||||
$crate::macro_util::core_reexport::ptr::NonNull::<()>::dangling()
|
||||
.as_ptr()
|
||||
.cast_const(),
|
||||
0,
|
||||
);
|
||||
// SAFETY:
|
||||
// - If `$ty` is `Sized`, `size_of_val_raw` is always safe to call.
|
||||
// - Otherwise:
|
||||
// - If `$ty` is not a slice DST, this pointer conversion will
|
||||
// fail due to "mismatched vtable kinds", and compilation will
|
||||
// fail.
|
||||
// - If `$ty` is a slice DST, the safety requirement is that "the
|
||||
// length of the slice tail must be an initialized integer, and
|
||||
// the size of the entire value (dynamic tail length +
|
||||
// statically sized prefix) must fit in isize." The length is
|
||||
// initialized to 0 above, and Rust guarantees that no type's
|
||||
// minimum size may overflow `isize`. [1]
|
||||
//
|
||||
// [1] TODO(#429),
|
||||
// TODO(https://github.com/rust-lang/unsafe-code-guidelines/issues/465#issuecomment-1782206516):
|
||||
// Citation for this?
|
||||
unsafe {
|
||||
#[allow(clippy::as_conversions)]
|
||||
$crate::macro_util::core_reexport::mem::size_of_val_raw(zero_elems as *const $ty)
|
||||
}
|
||||
};
|
||||
|
||||
assert!(min_size <= _64K);
|
||||
|
||||
#[allow(clippy::as_conversions)]
|
||||
let ptr = ALIGNED_64K_ALLOCATION.as_ptr() as *const $ty;
|
||||
|
||||
// SAFETY:
|
||||
// - Thanks to the preceding `assert!`, we know that the value with zero
|
||||
// elements fits in `_64K` bytes, and thus in the allocation addressed
|
||||
// by `ALIGNED_64K_ALLOCATION`. The offset of the trailing field is
|
||||
// guaranteed to be no larger than this size, so this field projection
|
||||
// is guaranteed to remain in-bounds of its allocation.
|
||||
// - Because the minimum size is no larger than `_64K` bytes, and
|
||||
// because an object's size must always be a multiple of its alignment
|
||||
// [1], we know that `$ty`'s alignment is no larger than `_64K`. The
|
||||
// allocation addressed by `ALIGNED_64K_ALLOCATION` is guaranteed to
|
||||
// be aligned to `_64K`, so `ptr` is guaranteed to satisfy `$ty`'s
|
||||
// alignment.
|
||||
//
|
||||
// Note that, as of [2], this requirement is technically unnecessary
|
||||
// for Rust versions >= 1.75.0, but no harm in guaranteeing it anyway
|
||||
// until we bump our MSRV.
|
||||
//
|
||||
// [1] Per https://doc.rust-lang.org/reference/type-layout.html:
|
||||
//
|
||||
// The size of a value is always a multiple of its alignment.
|
||||
//
|
||||
// [2] https://github.com/rust-lang/reference/pull/1387
|
||||
let field = unsafe {
|
||||
$crate::macro_util::core_reexport::ptr::addr_of!((*ptr).$trailing_field_name)
|
||||
};
|
||||
// SAFETY:
|
||||
// - Both `ptr` and `field` are derived from the same allocated object.
|
||||
// - By the preceding safety comment, `field` is in bounds of that
|
||||
// allocated object.
|
||||
// - The distance, in bytes, between `ptr` and `field` is required to be
|
||||
// a multiple of the size of `u8`, which is trivially true because
|
||||
// `u8`'s size is 1.
|
||||
// - The distance, in bytes, cannot overflow `isize`. This is guaranteed
|
||||
// because no allocated object can have a size larger than can fit in
|
||||
// `isize`. [1]
|
||||
// - The distance being in-bounds cannot rely on wrapping around the
|
||||
// address space. This is guaranteed because the same is guaranteed of
|
||||
// allocated objects. [1]
|
||||
//
|
||||
// [1] TODO(#429), TODO(https://github.com/rust-lang/rust/pull/116675):
|
||||
// Once these are guaranteed in the Reference, cite it.
|
||||
let offset = unsafe { field.cast::<u8>().offset_from(ptr.cast::<u8>()) };
|
||||
// Guaranteed not to be lossy: `field` comes after `ptr`, so the offset
|
||||
// from `ptr` to `field` is guaranteed to be positive.
|
||||
assert!(offset >= 0);
|
||||
Some(
|
||||
#[allow(clippy::as_conversions)]
|
||||
{
|
||||
offset as usize
|
||||
},
|
||||
)
|
||||
}};
|
||||
}
|
||||
|
||||
/// Computes alignment of `$ty: ?Sized`.
|
||||
///
|
||||
/// `align_of!` produces code which is valid in a `const` context.
|
||||
// TODO(#29), TODO(https://github.com/rust-lang/rust/issues/69835): Remove this
|
||||
// `cfg` when `size_of_val_raw` is stabilized.
|
||||
#[cfg(__INTERNAL_USE_ONLY_NIGHLTY_FEATURES_IN_TESTS)]
|
||||
#[doc(hidden)] // `#[macro_export]` bypasses this module's `#[doc(hidden)]`.
|
||||
#[macro_export]
|
||||
macro_rules! align_of {
|
||||
($ty:ty) => {{
|
||||
// SAFETY: `OffsetOfTrailingIsAlignment` is `repr(C)`, and its layout is
|
||||
// guaranteed [1] to begin with the single-byte layout for `_byte`,
|
||||
// followed by the padding needed to align `_trailing`, then the layout
|
||||
// for `_trailing`, and finally any trailing padding bytes needed to
|
||||
// correctly-align the entire struct.
|
||||
//
|
||||
// This macro computes the alignment of `$ty` by counting the number of
|
||||
// bytes preceeding `_trailing`. For instance, if the alignment of `$ty`
|
||||
// is `1`, then no padding is required align `_trailing` and it will be
|
||||
// located immediately after `_byte` at offset 1. If the alignment of
|
||||
// `$ty` is 2, then a single padding byte is required before
|
||||
// `_trailing`, and `_trailing` will be located at offset 2.
|
||||
|
||||
// This correspondence between offset and alignment holds for all valid
|
||||
// Rust alignments, and we confirm this exhaustively (or, at least up to
|
||||
// the maximum alignment supported by `trailing_field_offset!`) in
|
||||
// `test_align_of_dst`.
|
||||
//
|
||||
// [1]: https://doc.rust-lang.org/nomicon/other-reprs.html#reprc
|
||||
|
||||
#[repr(C)]
|
||||
struct OffsetOfTrailingIsAlignment {
|
||||
_byte: u8,
|
||||
_trailing: $ty,
|
||||
}
|
||||
|
||||
trailing_field_offset!(OffsetOfTrailingIsAlignment, _trailing)
|
||||
}};
|
||||
}
|
||||
|
||||
/// Does the struct type `$t` have padding?
|
||||
///
|
||||
/// `$ts` is the list of the type of every field in `$t`. `$t` must be a
|
||||
/// struct type, or else `struct_has_padding!`'s result may be meaningless.
|
||||
///
|
||||
/// Note that `struct_has_padding!`'s results are independent of `repr` since
|
||||
/// they only consider the size of the type and the sizes of the fields.
|
||||
/// Whatever the repr, the size of the type already takes into account any
|
||||
/// padding that the compiler has decided to add. Structs with well-defined
|
||||
/// representations (such as `repr(C)`) can use this macro to check for padding.
|
||||
/// Note that while this may yield some consistent value for some `repr(Rust)`
|
||||
/// structs, it is not guaranteed across platforms or compilations.
|
||||
#[doc(hidden)] // `#[macro_export]` bypasses this module's `#[doc(hidden)]`.
|
||||
#[macro_export]
|
||||
macro_rules! struct_has_padding {
|
||||
($t:ty, $($ts:ty),*) => {
|
||||
core::mem::size_of::<$t>() > 0 $(+ core::mem::size_of::<$ts>())*
|
||||
};
|
||||
}
|
||||
|
||||
/// Does the union type `$t` have padding?
|
||||
///
|
||||
/// `$ts` is the list of the type of every field in `$t`. `$t` must be a
|
||||
/// union type, or else `union_has_padding!`'s result may be meaningless.
|
||||
///
|
||||
/// Note that `union_has_padding!`'s results are independent of `repr` since
|
||||
/// they only consider the size of the type and the sizes of the fields.
|
||||
/// Whatever the repr, the size of the type already takes into account any
|
||||
/// padding that the compiler has decided to add. Unions with well-defined
|
||||
/// representations (such as `repr(C)`) can use this macro to check for padding.
|
||||
/// Note that while this may yield some consistent value for some `repr(Rust)`
|
||||
/// unions, it is not guaranteed across platforms or compilations.
|
||||
#[doc(hidden)] // `#[macro_export]` bypasses this module's `#[doc(hidden)]`.
|
||||
#[macro_export]
|
||||
macro_rules! union_has_padding {
|
||||
($t:ty, $($ts:ty),*) => {
|
||||
false $(|| core::mem::size_of::<$t>() != core::mem::size_of::<$ts>())*
|
||||
};
|
||||
}
|
||||
|
||||
/// Does `t` have alignment greater than or equal to `u`? If not, this macro
|
||||
/// produces a compile error. It must be invoked in a dead codepath. This is
|
||||
/// used in `transmute_ref!` and `transmute_mut!`.
|
||||
#[doc(hidden)] // `#[macro_export]` bypasses this module's `#[doc(hidden)]`.
|
||||
#[macro_export]
|
||||
macro_rules! assert_align_gt_eq {
|
||||
($t:ident, $u: ident) => {{
|
||||
// The comments here should be read in the context of this macro's
|
||||
// invocations in `transmute_ref!` and `transmute_mut!`.
|
||||
if false {
|
||||
// The type wildcard in this bound is inferred to be `T` because
|
||||
// `align_of.into_t()` is assigned to `t` (which has type `T`).
|
||||
let align_of: $crate::macro_util::AlignOf<_> = unreachable!();
|
||||
$t = align_of.into_t();
|
||||
// `max_aligns` is inferred to have type `MaxAlignsOf<T, U>` because
|
||||
// of the inferred types of `t` and `u`.
|
||||
let mut max_aligns = $crate::macro_util::MaxAlignsOf::new($t, $u);
|
||||
|
||||
// This transmute will only compile successfully if
|
||||
// `align_of::<T>() == max(align_of::<T>(), align_of::<U>())` - in
|
||||
// other words, if `align_of::<T>() >= align_of::<U>()`.
|
||||
//
|
||||
// SAFETY: This code is never run.
|
||||
max_aligns = unsafe { $crate::macro_util::core_reexport::mem::transmute(align_of) };
|
||||
} else {
|
||||
loop {}
|
||||
}
|
||||
}};
|
||||
}
|
||||
|
||||
/// Do `t` and `u` have the same size? If not, this macro produces a compile
|
||||
/// error. It must be invoked in a dead codepath. This is used in
|
||||
/// `transmute_ref!` and `transmute_mut!`.
|
||||
#[doc(hidden)] // `#[macro_export]` bypasses this module's `#[doc(hidden)]`.
|
||||
#[macro_export]
|
||||
macro_rules! assert_size_eq {
|
||||
($t:ident, $u: ident) => {{
|
||||
// The comments here should be read in the context of this macro's
|
||||
// invocations in `transmute_ref!` and `transmute_mut!`.
|
||||
if false {
|
||||
// SAFETY: This code is never run.
|
||||
$u = unsafe {
|
||||
// Clippy: It's okay to transmute a type to itself.
|
||||
#[allow(clippy::useless_transmute)]
|
||||
$crate::macro_util::core_reexport::mem::transmute($t)
|
||||
};
|
||||
} else {
|
||||
loop {}
|
||||
}
|
||||
}};
|
||||
}
|
||||
|
||||
/// Transmutes a reference of one type to a reference of another type.
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// The caller must guarantee that:
|
||||
/// - `Src: AsBytes`
|
||||
/// - `Dst: FromBytes`
|
||||
/// - `size_of::<Src>() == size_of::<Dst>()`
|
||||
/// - `align_of::<Src>() >= align_of::<Dst>()`
|
||||
#[inline(always)]
|
||||
pub const unsafe fn transmute_ref<'dst, 'src: 'dst, Src: 'src, Dst: 'dst>(
|
||||
src: &'src Src,
|
||||
) -> &'dst Dst {
|
||||
let src: *const Src = src;
|
||||
let dst = src.cast::<Dst>();
|
||||
// SAFETY:
|
||||
// - We know that it is sound to view the target type of the input reference
|
||||
// (`Src`) as the target type of the output reference (`Dst`) because the
|
||||
// caller has guaranteed that `Src: AsBytes`, `Dst: FromBytes`, and
|
||||
// `size_of::<Src>() == size_of::<Dst>()`.
|
||||
// - We know that there are no `UnsafeCell`s, and thus we don't have to
|
||||
// worry about `UnsafeCell` overlap, because `Src: AsBytes` and `Dst:
|
||||
// FromBytes` both forbid `UnsafeCell`s.
|
||||
// - The caller has guaranteed that alignment is not increased.
|
||||
// - We know that the returned lifetime will not outlive the input lifetime
|
||||
// thanks to the lifetime bounds on this function.
|
||||
unsafe { &*dst }
|
||||
}
|
||||
|
||||
/// Transmutes a mutable reference of one type to a mutable reference of another
|
||||
/// type.
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// The caller must guarantee that:
|
||||
/// - `Src: FromBytes + AsBytes`
|
||||
/// - `Dst: FromBytes + AsBytes`
|
||||
/// - `size_of::<Src>() == size_of::<Dst>()`
|
||||
/// - `align_of::<Src>() >= align_of::<Dst>()`
|
||||
#[inline(always)]
|
||||
pub unsafe fn transmute_mut<'dst, 'src: 'dst, Src: 'src, Dst: 'dst>(
|
||||
src: &'src mut Src,
|
||||
) -> &'dst mut Dst {
|
||||
let src: *mut Src = src;
|
||||
let dst = src.cast::<Dst>();
|
||||
// SAFETY:
|
||||
// - We know that it is sound to view the target type of the input reference
|
||||
// (`Src`) as the target type of the output reference (`Dst`) and
|
||||
// vice-versa because the caller has guaranteed that `Src: FromBytes +
|
||||
// AsBytes`, `Dst: FromBytes + AsBytes`, and `size_of::<Src>() ==
|
||||
// size_of::<Dst>()`.
|
||||
// - We know that there are no `UnsafeCell`s, and thus we don't have to
|
||||
// worry about `UnsafeCell` overlap, because `Src: FromBytes + AsBytes`
|
||||
// and `Dst: FromBytes + AsBytes` forbid `UnsafeCell`s.
|
||||
// - The caller has guaranteed that alignment is not increased.
|
||||
// - We know that the returned lifetime will not outlive the input lifetime
|
||||
// thanks to the lifetime bounds on this function.
|
||||
unsafe { &mut *dst }
|
||||
}
|
||||
|
||||
// NOTE: We can't change this to a `pub use core as core_reexport` until [1] is
|
||||
// fixed or we update to a semver-breaking version (as of this writing, 0.8.0)
|
||||
// on the `main` branch.
|
||||
//
|
||||
// [1] https://github.com/obi1kenobi/cargo-semver-checks/issues/573
|
||||
pub mod core_reexport {
|
||||
pub use core::*;
|
||||
|
||||
pub mod mem {
|
||||
pub use core::mem::*;
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use core::mem;
|
||||
|
||||
use super::*;
|
||||
use crate::util::testutil::*;
|
||||
|
||||
#[test]
|
||||
fn test_align_of() {
|
||||
macro_rules! test {
|
||||
($ty:ty) => {
|
||||
assert_eq!(mem::size_of::<AlignOf<$ty>>(), mem::align_of::<$ty>());
|
||||
};
|
||||
}
|
||||
|
||||
test!(());
|
||||
test!(u8);
|
||||
test!(AU64);
|
||||
test!([AU64; 2]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_max_aligns_of() {
|
||||
macro_rules! test {
|
||||
($t:ty, $u:ty) => {
|
||||
assert_eq!(
|
||||
mem::size_of::<MaxAlignsOf<$t, $u>>(),
|
||||
core::cmp::max(mem::align_of::<$t>(), mem::align_of::<$u>())
|
||||
);
|
||||
};
|
||||
}
|
||||
|
||||
test!(u8, u8);
|
||||
test!(u8, AU64);
|
||||
test!(AU64, u8);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_typed_align_check() {
|
||||
// Test that the type-based alignment check used in
|
||||
// `assert_align_gt_eq!` behaves as expected.
|
||||
|
||||
macro_rules! assert_t_align_gteq_u_align {
|
||||
($t:ty, $u:ty, $gteq:expr) => {
|
||||
assert_eq!(
|
||||
mem::size_of::<MaxAlignsOf<$t, $u>>() == mem::size_of::<AlignOf<$t>>(),
|
||||
$gteq
|
||||
);
|
||||
};
|
||||
}
|
||||
|
||||
assert_t_align_gteq_u_align!(u8, u8, true);
|
||||
assert_t_align_gteq_u_align!(AU64, AU64, true);
|
||||
assert_t_align_gteq_u_align!(AU64, u8, true);
|
||||
assert_t_align_gteq_u_align!(u8, AU64, false);
|
||||
}
|
||||
|
||||
// TODO(#29), TODO(https://github.com/rust-lang/rust/issues/69835): Remove
|
||||
// this `cfg` when `size_of_val_raw` is stabilized.
|
||||
#[allow(clippy::decimal_literal_representation)]
|
||||
#[cfg(__INTERNAL_USE_ONLY_NIGHLTY_FEATURES_IN_TESTS)]
|
||||
#[test]
|
||||
fn test_trailing_field_offset() {
|
||||
assert_eq!(mem::align_of::<Aligned64kAllocation>(), _64K);
|
||||
|
||||
macro_rules! test {
|
||||
(#[$cfg:meta] ($($ts:ty),* ; $trailing_field_ty:ty) => $expect:expr) => {{
|
||||
#[$cfg]
|
||||
struct Test($($ts,)* $trailing_field_ty);
|
||||
assert_eq!(test!(@offset $($ts),* ; $trailing_field_ty), $expect);
|
||||
}};
|
||||
(#[$cfg:meta] $(#[$cfgs:meta])* ($($ts:ty),* ; $trailing_field_ty:ty) => $expect:expr) => {
|
||||
test!(#[$cfg] ($($ts),* ; $trailing_field_ty) => $expect);
|
||||
test!($(#[$cfgs])* ($($ts),* ; $trailing_field_ty) => $expect);
|
||||
};
|
||||
(@offset ; $_trailing:ty) => { trailing_field_offset!(Test, 0) };
|
||||
(@offset $_t:ty ; $_trailing:ty) => { trailing_field_offset!(Test, 1) };
|
||||
}
|
||||
|
||||
test!(#[repr(C)] #[repr(transparent)] #[repr(packed)](; u8) => Some(0));
|
||||
test!(#[repr(C)] #[repr(transparent)] #[repr(packed)](; [u8]) => Some(0));
|
||||
test!(#[repr(C)] #[repr(packed)] (u8; u8) => Some(1));
|
||||
test!(#[repr(C)] (; AU64) => Some(0));
|
||||
test!(#[repr(C)] (; [AU64]) => Some(0));
|
||||
test!(#[repr(C)] (u8; AU64) => Some(8));
|
||||
test!(#[repr(C)] (u8; [AU64]) => Some(8));
|
||||
test!(#[repr(C)] (; Nested<u8, AU64>) => Some(0));
|
||||
test!(#[repr(C)] (; Nested<u8, [AU64]>) => Some(0));
|
||||
test!(#[repr(C)] (u8; Nested<u8, AU64>) => Some(8));
|
||||
test!(#[repr(C)] (u8; Nested<u8, [AU64]>) => Some(8));
|
||||
|
||||
// Test that `packed(N)` limits the offset of the trailing field.
|
||||
test!(#[repr(C, packed( 1))] (u8; elain::Align< 2>) => Some( 1));
|
||||
test!(#[repr(C, packed( 2))] (u8; elain::Align< 4>) => Some( 2));
|
||||
test!(#[repr(C, packed( 4))] (u8; elain::Align< 8>) => Some( 4));
|
||||
test!(#[repr(C, packed( 8))] (u8; elain::Align< 16>) => Some( 8));
|
||||
test!(#[repr(C, packed( 16))] (u8; elain::Align< 32>) => Some( 16));
|
||||
test!(#[repr(C, packed( 32))] (u8; elain::Align< 64>) => Some( 32));
|
||||
test!(#[repr(C, packed( 64))] (u8; elain::Align< 128>) => Some( 64));
|
||||
test!(#[repr(C, packed( 128))] (u8; elain::Align< 256>) => Some( 128));
|
||||
test!(#[repr(C, packed( 256))] (u8; elain::Align< 512>) => Some( 256));
|
||||
test!(#[repr(C, packed( 512))] (u8; elain::Align< 1024>) => Some( 512));
|
||||
test!(#[repr(C, packed( 1024))] (u8; elain::Align< 2048>) => Some( 1024));
|
||||
test!(#[repr(C, packed( 2048))] (u8; elain::Align< 4096>) => Some( 2048));
|
||||
test!(#[repr(C, packed( 4096))] (u8; elain::Align< 8192>) => Some( 4096));
|
||||
test!(#[repr(C, packed( 8192))] (u8; elain::Align< 16384>) => Some( 8192));
|
||||
test!(#[repr(C, packed( 16384))] (u8; elain::Align< 32768>) => Some( 16384));
|
||||
test!(#[repr(C, packed( 32768))] (u8; elain::Align< 65536>) => Some( 32768));
|
||||
test!(#[repr(C, packed( 65536))] (u8; elain::Align< 131072>) => Some( 65536));
|
||||
/* Alignments above 65536 are not yet supported.
|
||||
test!(#[repr(C, packed( 131072))] (u8; elain::Align< 262144>) => Some( 131072));
|
||||
test!(#[repr(C, packed( 262144))] (u8; elain::Align< 524288>) => Some( 262144));
|
||||
test!(#[repr(C, packed( 524288))] (u8; elain::Align< 1048576>) => Some( 524288));
|
||||
test!(#[repr(C, packed( 1048576))] (u8; elain::Align< 2097152>) => Some( 1048576));
|
||||
test!(#[repr(C, packed( 2097152))] (u8; elain::Align< 4194304>) => Some( 2097152));
|
||||
test!(#[repr(C, packed( 4194304))] (u8; elain::Align< 8388608>) => Some( 4194304));
|
||||
test!(#[repr(C, packed( 8388608))] (u8; elain::Align< 16777216>) => Some( 8388608));
|
||||
test!(#[repr(C, packed( 16777216))] (u8; elain::Align< 33554432>) => Some( 16777216));
|
||||
test!(#[repr(C, packed( 33554432))] (u8; elain::Align< 67108864>) => Some( 33554432));
|
||||
test!(#[repr(C, packed( 67108864))] (u8; elain::Align< 33554432>) => Some( 67108864));
|
||||
test!(#[repr(C, packed( 33554432))] (u8; elain::Align<134217728>) => Some( 33554432));
|
||||
test!(#[repr(C, packed(134217728))] (u8; elain::Align<268435456>) => Some(134217728));
|
||||
test!(#[repr(C, packed(268435456))] (u8; elain::Align<268435456>) => Some(268435456));
|
||||
*/
|
||||
|
||||
// Test that `align(N)` does not limit the offset of the trailing field.
|
||||
test!(#[repr(C, align( 1))] (u8; elain::Align< 2>) => Some( 2));
|
||||
test!(#[repr(C, align( 2))] (u8; elain::Align< 4>) => Some( 4));
|
||||
test!(#[repr(C, align( 4))] (u8; elain::Align< 8>) => Some( 8));
|
||||
test!(#[repr(C, align( 8))] (u8; elain::Align< 16>) => Some( 16));
|
||||
test!(#[repr(C, align( 16))] (u8; elain::Align< 32>) => Some( 32));
|
||||
test!(#[repr(C, align( 32))] (u8; elain::Align< 64>) => Some( 64));
|
||||
test!(#[repr(C, align( 64))] (u8; elain::Align< 128>) => Some( 128));
|
||||
test!(#[repr(C, align( 128))] (u8; elain::Align< 256>) => Some( 256));
|
||||
test!(#[repr(C, align( 256))] (u8; elain::Align< 512>) => Some( 512));
|
||||
test!(#[repr(C, align( 512))] (u8; elain::Align< 1024>) => Some( 1024));
|
||||
test!(#[repr(C, align( 1024))] (u8; elain::Align< 2048>) => Some( 2048));
|
||||
test!(#[repr(C, align( 2048))] (u8; elain::Align< 4096>) => Some( 4096));
|
||||
test!(#[repr(C, align( 4096))] (u8; elain::Align< 8192>) => Some( 8192));
|
||||
test!(#[repr(C, align( 8192))] (u8; elain::Align< 16384>) => Some( 16384));
|
||||
test!(#[repr(C, align( 16384))] (u8; elain::Align< 32768>) => Some( 32768));
|
||||
test!(#[repr(C, align( 32768))] (u8; elain::Align< 65536>) => Some( 65536));
|
||||
/* Alignments above 65536 are not yet supported.
|
||||
test!(#[repr(C, align( 65536))] (u8; elain::Align< 131072>) => Some( 131072));
|
||||
test!(#[repr(C, align( 131072))] (u8; elain::Align< 262144>) => Some( 262144));
|
||||
test!(#[repr(C, align( 262144))] (u8; elain::Align< 524288>) => Some( 524288));
|
||||
test!(#[repr(C, align( 524288))] (u8; elain::Align< 1048576>) => Some( 1048576));
|
||||
test!(#[repr(C, align( 1048576))] (u8; elain::Align< 2097152>) => Some( 2097152));
|
||||
test!(#[repr(C, align( 2097152))] (u8; elain::Align< 4194304>) => Some( 4194304));
|
||||
test!(#[repr(C, align( 4194304))] (u8; elain::Align< 8388608>) => Some( 8388608));
|
||||
test!(#[repr(C, align( 8388608))] (u8; elain::Align< 16777216>) => Some( 16777216));
|
||||
test!(#[repr(C, align( 16777216))] (u8; elain::Align< 33554432>) => Some( 33554432));
|
||||
test!(#[repr(C, align( 33554432))] (u8; elain::Align< 67108864>) => Some( 67108864));
|
||||
test!(#[repr(C, align( 67108864))] (u8; elain::Align< 33554432>) => Some( 33554432));
|
||||
test!(#[repr(C, align( 33554432))] (u8; elain::Align<134217728>) => Some(134217728));
|
||||
test!(#[repr(C, align(134217728))] (u8; elain::Align<268435456>) => Some(268435456));
|
||||
*/
|
||||
}
|
||||
|
||||
// TODO(#29), TODO(https://github.com/rust-lang/rust/issues/69835): Remove
|
||||
// this `cfg` when `size_of_val_raw` is stabilized.
|
||||
#[allow(clippy::decimal_literal_representation)]
|
||||
#[cfg(__INTERNAL_USE_ONLY_NIGHLTY_FEATURES_IN_TESTS)]
|
||||
#[test]
|
||||
fn test_align_of_dst() {
|
||||
// Test that `align_of!` correctly computes the alignment of DSTs.
|
||||
assert_eq!(align_of!([elain::Align<1>]), Some(1));
|
||||
assert_eq!(align_of!([elain::Align<2>]), Some(2));
|
||||
assert_eq!(align_of!([elain::Align<4>]), Some(4));
|
||||
assert_eq!(align_of!([elain::Align<8>]), Some(8));
|
||||
assert_eq!(align_of!([elain::Align<16>]), Some(16));
|
||||
assert_eq!(align_of!([elain::Align<32>]), Some(32));
|
||||
assert_eq!(align_of!([elain::Align<64>]), Some(64));
|
||||
assert_eq!(align_of!([elain::Align<128>]), Some(128));
|
||||
assert_eq!(align_of!([elain::Align<256>]), Some(256));
|
||||
assert_eq!(align_of!([elain::Align<512>]), Some(512));
|
||||
assert_eq!(align_of!([elain::Align<1024>]), Some(1024));
|
||||
assert_eq!(align_of!([elain::Align<2048>]), Some(2048));
|
||||
assert_eq!(align_of!([elain::Align<4096>]), Some(4096));
|
||||
assert_eq!(align_of!([elain::Align<8192>]), Some(8192));
|
||||
assert_eq!(align_of!([elain::Align<16384>]), Some(16384));
|
||||
assert_eq!(align_of!([elain::Align<32768>]), Some(32768));
|
||||
assert_eq!(align_of!([elain::Align<65536>]), Some(65536));
|
||||
/* Alignments above 65536 are not yet supported.
|
||||
assert_eq!(align_of!([elain::Align<131072>]), Some(131072));
|
||||
assert_eq!(align_of!([elain::Align<262144>]), Some(262144));
|
||||
assert_eq!(align_of!([elain::Align<524288>]), Some(524288));
|
||||
assert_eq!(align_of!([elain::Align<1048576>]), Some(1048576));
|
||||
assert_eq!(align_of!([elain::Align<2097152>]), Some(2097152));
|
||||
assert_eq!(align_of!([elain::Align<4194304>]), Some(4194304));
|
||||
assert_eq!(align_of!([elain::Align<8388608>]), Some(8388608));
|
||||
assert_eq!(align_of!([elain::Align<16777216>]), Some(16777216));
|
||||
assert_eq!(align_of!([elain::Align<33554432>]), Some(33554432));
|
||||
assert_eq!(align_of!([elain::Align<67108864>]), Some(67108864));
|
||||
assert_eq!(align_of!([elain::Align<33554432>]), Some(33554432));
|
||||
assert_eq!(align_of!([elain::Align<134217728>]), Some(134217728));
|
||||
assert_eq!(align_of!([elain::Align<268435456>]), Some(268435456));
|
||||
*/
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_struct_has_padding() {
|
||||
// Test that, for each provided repr, `struct_has_padding!` reports the
|
||||
// expected value.
|
||||
macro_rules! test {
|
||||
(#[$cfg:meta] ($($ts:ty),*) => $expect:expr) => {{
|
||||
#[$cfg]
|
||||
struct Test($($ts),*);
|
||||
assert_eq!(struct_has_padding!(Test, $($ts),*), $expect);
|
||||
}};
|
||||
(#[$cfg:meta] $(#[$cfgs:meta])* ($($ts:ty),*) => $expect:expr) => {
|
||||
test!(#[$cfg] ($($ts),*) => $expect);
|
||||
test!($(#[$cfgs])* ($($ts),*) => $expect);
|
||||
};
|
||||
}
|
||||
|
||||
test!(#[repr(C)] #[repr(transparent)] #[repr(packed)] () => false);
|
||||
test!(#[repr(C)] #[repr(transparent)] #[repr(packed)] (u8) => false);
|
||||
test!(#[repr(C)] #[repr(transparent)] #[repr(packed)] (u8, ()) => false);
|
||||
test!(#[repr(C)] #[repr(packed)] (u8, u8) => false);
|
||||
|
||||
test!(#[repr(C)] (u8, AU64) => true);
|
||||
// Rust won't let you put `#[repr(packed)]` on a type which contains a
|
||||
// `#[repr(align(n > 1))]` type (`AU64`), so we have to use `u64` here.
|
||||
// It's not ideal, but it definitely has align > 1 on /some/ of our CI
|
||||
// targets, and this isn't a particularly complex macro we're testing
|
||||
// anyway.
|
||||
test!(#[repr(packed)] (u8, u64) => false);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_union_has_padding() {
|
||||
// Test that, for each provided repr, `union_has_padding!` reports the
|
||||
// expected value.
|
||||
macro_rules! test {
|
||||
(#[$cfg:meta] {$($fs:ident: $ts:ty),*} => $expect:expr) => {{
|
||||
#[$cfg]
|
||||
#[allow(unused)] // fields are never read
|
||||
union Test{ $($fs: $ts),* }
|
||||
assert_eq!(union_has_padding!(Test, $($ts),*), $expect);
|
||||
}};
|
||||
(#[$cfg:meta] $(#[$cfgs:meta])* {$($fs:ident: $ts:ty),*} => $expect:expr) => {
|
||||
test!(#[$cfg] {$($fs: $ts),*} => $expect);
|
||||
test!($(#[$cfgs])* {$($fs: $ts),*} => $expect);
|
||||
};
|
||||
}
|
||||
|
||||
test!(#[repr(C)] #[repr(packed)] {a: u8} => false);
|
||||
test!(#[repr(C)] #[repr(packed)] {a: u8, b: u8} => false);
|
||||
|
||||
// Rust won't let you put `#[repr(packed)]` on a type which contains a
|
||||
// `#[repr(align(n > 1))]` type (`AU64`), so we have to use `u64` here.
|
||||
// It's not ideal, but it definitely has align > 1 on /some/ of our CI
|
||||
// targets, and this isn't a particularly complex macro we're testing
|
||||
// anyway.
|
||||
test!(#[repr(C)] #[repr(packed)] {a: u8, b: u64} => true);
|
||||
}
|
||||
}
|
||||
417
third-party/vendor/zerocopy/src/macros.rs
vendored
Normal file
417
third-party/vendor/zerocopy/src/macros.rs
vendored
Normal file
|
|
@ -0,0 +1,417 @@
|
|||
// Copyright 2023 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
/// Documents multiple unsafe blocks with a single safety comment.
|
||||
///
|
||||
/// Invoked as:
|
||||
///
|
||||
/// ```rust,ignore
|
||||
/// safety_comment! {
|
||||
/// // Non-doc comments come first.
|
||||
/// /// SAFETY:
|
||||
/// /// Safety comment starts on its own line.
|
||||
/// macro_1!(args);
|
||||
/// macro_2! { args };
|
||||
/// /// SAFETY:
|
||||
/// /// Subsequent safety comments are allowed but not required.
|
||||
/// macro_3! { args };
|
||||
/// }
|
||||
/// ```
|
||||
///
|
||||
/// The macro invocations are emitted, each decorated with the following
|
||||
/// attribute: `#[allow(clippy::undocumented_unsafe_blocks)]`.
|
||||
macro_rules! safety_comment {
|
||||
(#[doc = r" SAFETY:"] $($(#[$attr:meta])* $macro:ident!$args:tt;)*) => {
|
||||
#[allow(clippy::undocumented_unsafe_blocks, unused_attributes)]
|
||||
const _: () = { $($(#[$attr])* $macro!$args;)* };
|
||||
}
|
||||
}
|
||||
|
||||
/// Unsafely implements trait(s) for a type.
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// The trait impl must be sound.
|
||||
///
|
||||
/// When implementing `TryFromBytes`:
|
||||
/// - If no `is_bit_valid` impl is provided, then it must be valid for
|
||||
/// `is_bit_valid` to unconditionally return `true`. In other words, it must
|
||||
/// be the case that any initialized sequence of bytes constitutes a valid
|
||||
/// instance of `$ty`.
|
||||
/// - If an `is_bit_valid` impl is provided, then:
|
||||
/// - Regardless of whether the provided closure takes a `Ptr<$repr>` or
|
||||
/// `&$repr` argument, it must be the case that, given `t: *mut $ty` and
|
||||
/// `let r = t as *mut $repr`, `r` refers to an object of equal or lesser
|
||||
/// size than the object referred to by `t`.
|
||||
/// - If the provided closure takes a `&$repr` argument, then given a `Ptr<'a,
|
||||
/// $ty>` which satisfies the preconditions of
|
||||
/// `TryFromBytes::<$ty>::is_bit_valid`, it must be guaranteed that the
|
||||
/// memory referenced by that `Ptr` always contains a valid `$repr`.
|
||||
/// - The alignment of `$repr` is less than or equal to the alignment of
|
||||
/// `$ty`.
|
||||
/// - The impl of `is_bit_valid` must only return `true` for its argument
|
||||
/// `Ptr<$repr>` if the original `Ptr<$ty>` refers to a valid `$ty`.
|
||||
macro_rules! unsafe_impl {
|
||||
// Implement `$trait` for `$ty` with no bounds.
|
||||
($(#[$attr:meta])* $ty:ty: $trait:ident $(; |$candidate:ident: &$repr:ty| $is_bit_valid:expr)?) => {
|
||||
$(#[$attr])*
|
||||
unsafe impl $trait for $ty {
|
||||
unsafe_impl!(@method $trait $(; |$candidate: &$repr| $is_bit_valid)?);
|
||||
}
|
||||
};
|
||||
// Implement all `$traits` for `$ty` with no bounds.
|
||||
($ty:ty: $($traits:ident),*) => {
|
||||
$( unsafe_impl!($ty: $traits); )*
|
||||
};
|
||||
// This arm is identical to the following one, except it contains a
|
||||
// preceding `const`. If we attempt to handle these with a single arm, there
|
||||
// is an inherent ambiguity between `const` (the keyword) and `const` (the
|
||||
// ident match for `$tyvar:ident`).
|
||||
//
|
||||
// To explain how this works, consider the following invocation:
|
||||
//
|
||||
// unsafe_impl!(const N: usize, T: ?Sized + Copy => Clone for Foo<T>);
|
||||
//
|
||||
// In this invocation, here are the assignments to meta-variables:
|
||||
//
|
||||
// |---------------|------------|
|
||||
// | Meta-variable | Assignment |
|
||||
// |---------------|------------|
|
||||
// | $constname | N |
|
||||
// | $constty | usize |
|
||||
// | $tyvar | T |
|
||||
// | $optbound | Sized |
|
||||
// | $bound | Copy |
|
||||
// | $trait | Clone |
|
||||
// | $ty | Foo<T> |
|
||||
// |---------------|------------|
|
||||
//
|
||||
// The following arm has the same behavior with the exception of the lack of
|
||||
// support for a leading `const` parameter.
|
||||
(
|
||||
$(#[$attr:meta])*
|
||||
const $constname:ident : $constty:ident $(,)?
|
||||
$($tyvar:ident $(: $(? $optbound:ident $(+)?)* $($bound:ident $(+)?)* )?),*
|
||||
=> $trait:ident for $ty:ty $(; |$candidate:ident $(: &$ref_repr:ty)? $(: Ptr<$ptr_repr:ty>)?| $is_bit_valid:expr)?
|
||||
) => {
|
||||
unsafe_impl!(
|
||||
@inner
|
||||
$(#[$attr])*
|
||||
@const $constname: $constty,
|
||||
$($tyvar $(: $(? $optbound +)* + $($bound +)*)?,)*
|
||||
=> $trait for $ty $(; |$candidate $(: &$ref_repr)? $(: Ptr<$ptr_repr>)?| $is_bit_valid)?
|
||||
);
|
||||
};
|
||||
(
|
||||
$(#[$attr:meta])*
|
||||
$($tyvar:ident $(: $(? $optbound:ident $(+)?)* $($bound:ident $(+)?)* )?),*
|
||||
=> $trait:ident for $ty:ty $(; |$candidate:ident $(: &$ref_repr:ty)? $(: Ptr<$ptr_repr:ty>)?| $is_bit_valid:expr)?
|
||||
) => {
|
||||
unsafe_impl!(
|
||||
@inner
|
||||
$(#[$attr])*
|
||||
$($tyvar $(: $(? $optbound +)* + $($bound +)*)?,)*
|
||||
=> $trait for $ty $(; |$candidate $(: &$ref_repr)? $(: Ptr<$ptr_repr>)?| $is_bit_valid)?
|
||||
);
|
||||
};
|
||||
(
|
||||
@inner
|
||||
$(#[$attr:meta])*
|
||||
$(@const $constname:ident : $constty:ident,)*
|
||||
$($tyvar:ident $(: $(? $optbound:ident +)* + $($bound:ident +)* )?,)*
|
||||
=> $trait:ident for $ty:ty $(; |$candidate:ident $(: &$ref_repr:ty)? $(: Ptr<$ptr_repr:ty>)?| $is_bit_valid:expr)?
|
||||
) => {
|
||||
$(#[$attr])*
|
||||
unsafe impl<$(const $constname: $constty,)* $($tyvar $(: $(? $optbound +)* $($bound +)*)?),*> $trait for $ty {
|
||||
unsafe_impl!(@method $trait $(; |$candidate: $(&$ref_repr)? $(Ptr<$ptr_repr>)?| $is_bit_valid)?);
|
||||
}
|
||||
};
|
||||
|
||||
(@method TryFromBytes ; |$candidate:ident: &$repr:ty| $is_bit_valid:expr) => {
|
||||
#[inline]
|
||||
unsafe fn is_bit_valid(candidate: Ptr<'_, Self>) -> bool {
|
||||
// SAFETY:
|
||||
// - The argument to `cast_unsized` is `|p| p as *mut _` as required
|
||||
// by that method's safety precondition.
|
||||
// - The caller has promised that the cast results in an object of
|
||||
// equal or lesser size.
|
||||
// - The caller has promised that `$repr`'s alignment is less than
|
||||
// or equal to `Self`'s alignment.
|
||||
#[allow(clippy::as_conversions)]
|
||||
let candidate = unsafe { candidate.cast_unsized::<$repr, _>(|p| p as *mut _) };
|
||||
// SAFETY:
|
||||
// - The caller has promised that the referenced memory region will
|
||||
// contain a valid `$repr` for `'a`.
|
||||
// - The memory may not be referenced by any mutable references.
|
||||
// This is a precondition of `is_bit_valid`.
|
||||
// - The memory may not be mutated even via `UnsafeCell`s. This is a
|
||||
// precondition of `is_bit_valid`.
|
||||
// - There must not exist any references to the same memory region
|
||||
// which contain `UnsafeCell`s at byte ranges which are not
|
||||
// identical to the byte ranges at which `T` contains
|
||||
// `UnsafeCell`s. This is a precondition of `is_bit_valid`.
|
||||
let $candidate: &$repr = unsafe { candidate.as_ref() };
|
||||
$is_bit_valid
|
||||
}
|
||||
};
|
||||
(@method TryFromBytes ; |$candidate:ident: Ptr<$repr:ty>| $is_bit_valid:expr) => {
|
||||
#[inline]
|
||||
unsafe fn is_bit_valid(candidate: Ptr<'_, Self>) -> bool {
|
||||
// SAFETY:
|
||||
// - The argument to `cast_unsized` is `|p| p as *mut _` as required
|
||||
// by that method's safety precondition.
|
||||
// - The caller has promised that the cast results in an object of
|
||||
// equal or lesser size.
|
||||
// - The caller has promised that `$repr`'s alignment is less than
|
||||
// or equal to `Self`'s alignment.
|
||||
#[allow(clippy::as_conversions)]
|
||||
let $candidate = unsafe { candidate.cast_unsized::<$repr, _>(|p| p as *mut _) };
|
||||
$is_bit_valid
|
||||
}
|
||||
};
|
||||
(@method TryFromBytes) => { #[inline(always)] unsafe fn is_bit_valid(_: Ptr<'_, Self>) -> bool { true } };
|
||||
(@method $trait:ident) => {
|
||||
#[allow(clippy::missing_inline_in_public_items)]
|
||||
fn only_derive_is_allowed_to_implement_this_trait() {}
|
||||
};
|
||||
(@method $trait:ident; |$_candidate:ident $(: &$_ref_repr:ty)? $(: NonNull<$_ptr_repr:ty>)?| $_is_bit_valid:expr) => {
|
||||
compile_error!("Can't provide `is_bit_valid` impl for trait other than `TryFromBytes`");
|
||||
};
|
||||
}
|
||||
|
||||
/// Implements a trait for a type, bounding on each memeber of the power set of
|
||||
/// a set of type variables. This is useful for implementing traits for tuples
|
||||
/// or `fn` types.
|
||||
///
|
||||
/// The last argument is the name of a macro which will be called in every
|
||||
/// `impl` block, and is expected to expand to the name of the type for which to
|
||||
/// implement the trait.
|
||||
///
|
||||
/// For example, the invocation:
|
||||
/// ```ignore
|
||||
/// unsafe_impl_for_power_set!(A, B => Foo for type!(...))
|
||||
/// ```
|
||||
/// ...expands to:
|
||||
/// ```ignore
|
||||
/// unsafe impl Foo for type!() { ... }
|
||||
/// unsafe impl<B> Foo for type!(B) { ... }
|
||||
/// unsafe impl<A, B> Foo for type!(A, B) { ... }
|
||||
/// ```
|
||||
macro_rules! unsafe_impl_for_power_set {
|
||||
($first:ident $(, $rest:ident)* $(-> $ret:ident)? => $trait:ident for $macro:ident!(...)) => {
|
||||
unsafe_impl_for_power_set!($($rest),* $(-> $ret)? => $trait for $macro!(...));
|
||||
unsafe_impl_for_power_set!(@impl $first $(, $rest)* $(-> $ret)? => $trait for $macro!(...));
|
||||
};
|
||||
($(-> $ret:ident)? => $trait:ident for $macro:ident!(...)) => {
|
||||
unsafe_impl_for_power_set!(@impl $(-> $ret)? => $trait for $macro!(...));
|
||||
};
|
||||
(@impl $($vars:ident),* $(-> $ret:ident)? => $trait:ident for $macro:ident!(...)) => {
|
||||
unsafe impl<$($vars,)* $($ret)?> $trait for $macro!($($vars),* $(-> $ret)?) {
|
||||
#[allow(clippy::missing_inline_in_public_items)]
|
||||
fn only_derive_is_allowed_to_implement_this_trait() {}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/// Expands to an `Option<extern "C" fn>` type with the given argument types and
|
||||
/// return type. Designed for use with `unsafe_impl_for_power_set`.
|
||||
macro_rules! opt_extern_c_fn {
|
||||
($($args:ident),* -> $ret:ident) => { Option<extern "C" fn($($args),*) -> $ret> };
|
||||
}
|
||||
|
||||
/// Expands to a `Option<fn>` type with the given argument types and return
|
||||
/// type. Designed for use with `unsafe_impl_for_power_set`.
|
||||
macro_rules! opt_fn {
|
||||
($($args:ident),* -> $ret:ident) => { Option<fn($($args),*) -> $ret> };
|
||||
}
|
||||
|
||||
/// Implements trait(s) for a type or verifies the given implementation by
|
||||
/// referencing an existing (derived) implementation.
|
||||
///
|
||||
/// This macro exists so that we can provide zerocopy-derive as an optional
|
||||
/// dependency and still get the benefit of using its derives to validate that
|
||||
/// our trait impls are sound.
|
||||
///
|
||||
/// When compiling without `--cfg 'feature = "derive"` and without `--cfg test`,
|
||||
/// `impl_or_verify!` emits the provided trait impl. When compiling with either
|
||||
/// of those cfgs, it is expected that the type in question is deriving the
|
||||
/// traits instead. In this case, `impl_or_verify!` emits code which validates
|
||||
/// that the given trait impl is at least as restrictive as the the impl emitted
|
||||
/// by the custom derive. This has the effect of confirming that the impl which
|
||||
/// is emitted when the `derive` feature is disabled is actually sound (on the
|
||||
/// assumption that the impl emitted by the custom derive is sound).
|
||||
///
|
||||
/// The caller is still required to provide a safety comment (e.g. using the
|
||||
/// `safety_comment!` macro) . The reason for this restriction is that, while
|
||||
/// `impl_or_verify!` can guarantee that the provided impl is sound when it is
|
||||
/// compiled with the appropriate cfgs, there is no way to guarantee that it is
|
||||
/// ever compiled with those cfgs. In particular, it would be possible to
|
||||
/// accidentally place an `impl_or_verify!` call in a context that is only ever
|
||||
/// compiled when the `derive` feature is disabled. If that were to happen,
|
||||
/// there would be nothing to prevent an unsound trait impl from being emitted.
|
||||
/// Requiring a safety comment reduces the likelihood of emitting an unsound
|
||||
/// impl in this case, and also provides useful documentation for readers of the
|
||||
/// code.
|
||||
///
|
||||
/// ## Example
|
||||
///
|
||||
/// ```rust,ignore
|
||||
/// // Note that these derives are gated by `feature = "derive"`
|
||||
/// #[cfg_attr(any(feature = "derive", test), derive(FromZeroes, FromBytes, AsBytes, Unaligned))]
|
||||
/// #[repr(transparent)]
|
||||
/// struct Wrapper<T>(T);
|
||||
///
|
||||
/// safety_comment! {
|
||||
/// /// SAFETY:
|
||||
/// /// `Wrapper<T>` is `repr(transparent)`, so it is sound to implement any
|
||||
/// /// zerocopy trait if `T` implements that trait.
|
||||
/// impl_or_verify!(T: FromZeroes => FromZeroes for Wrapper<T>);
|
||||
/// impl_or_verify!(T: FromBytes => FromBytes for Wrapper<T>);
|
||||
/// impl_or_verify!(T: AsBytes => AsBytes for Wrapper<T>);
|
||||
/// impl_or_verify!(T: Unaligned => Unaligned for Wrapper<T>);
|
||||
/// }
|
||||
/// ```
|
||||
macro_rules! impl_or_verify {
|
||||
// The following two match arms follow the same pattern as their
|
||||
// counterparts in `unsafe_impl!`; see the documentation on those arms for
|
||||
// more details.
|
||||
(
|
||||
const $constname:ident : $constty:ident $(,)?
|
||||
$($tyvar:ident $(: $(? $optbound:ident $(+)?)* $($bound:ident $(+)?)* )?),*
|
||||
=> $trait:ident for $ty:ty
|
||||
) => {
|
||||
impl_or_verify!(@impl { unsafe_impl!(
|
||||
const $constname: $constty, $($tyvar $(: $(? $optbound +)* $($bound +)*)?),* => $trait for $ty
|
||||
); });
|
||||
impl_or_verify!(@verify $trait, {
|
||||
impl<const $constname: $constty, $($tyvar $(: $(? $optbound +)* $($bound +)*)?),*> Subtrait for $ty {}
|
||||
});
|
||||
};
|
||||
(
|
||||
$($tyvar:ident $(: $(? $optbound:ident $(+)?)* $($bound:ident $(+)?)* )?),*
|
||||
=> $trait:ident for $ty:ty
|
||||
) => {
|
||||
impl_or_verify!(@impl { unsafe_impl!(
|
||||
$($tyvar $(: $(? $optbound +)* $($bound +)*)?),* => $trait for $ty
|
||||
); });
|
||||
impl_or_verify!(@verify $trait, {
|
||||
impl<$($tyvar $(: $(? $optbound +)* $($bound +)*)?),*> Subtrait for $ty {}
|
||||
});
|
||||
};
|
||||
(
|
||||
$($tyvar:ident $(: $(? $optbound:ident $(+)?)* $($bound:ident $(+)?)* )?),*
|
||||
=> $trait:ident for $ty:ty
|
||||
) => {
|
||||
unsafe_impl!(
|
||||
@inner
|
||||
$($tyvar $(: $(? $optbound +)* + $($bound +)*)?,)*
|
||||
=> $trait for $ty
|
||||
);
|
||||
};
|
||||
(@impl $impl_block:tt) => {
|
||||
#[cfg(not(any(feature = "derive", test)))]
|
||||
const _: () = { $impl_block };
|
||||
};
|
||||
(@verify $trait:ident, $impl_block:tt) => {
|
||||
#[cfg(any(feature = "derive", test))]
|
||||
const _: () = {
|
||||
trait Subtrait: $trait {}
|
||||
$impl_block
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
/// Implements `KnownLayout` for a sized type.
|
||||
macro_rules! impl_known_layout {
|
||||
($(const $constvar:ident : $constty:ty, $tyvar:ident $(: ?$optbound:ident)? => $ty:ty),* $(,)?) => {
|
||||
$(impl_known_layout!(@inner const $constvar: $constty, $tyvar $(: ?$optbound)? => $ty);)*
|
||||
};
|
||||
($($tyvar:ident $(: ?$optbound:ident)? => $ty:ty),* $(,)?) => {
|
||||
$(impl_known_layout!(@inner , $tyvar $(: ?$optbound)? => $ty);)*
|
||||
};
|
||||
($($ty:ty),*) => { $(impl_known_layout!(@inner , => $ty);)* };
|
||||
(@inner $(const $constvar:ident : $constty:ty)? , $($tyvar:ident $(: ?$optbound:ident)?)? => $ty:ty) => {
|
||||
const _: () = {
|
||||
use core::ptr::NonNull;
|
||||
|
||||
// SAFETY: Delegates safety to `DstLayout::for_type`.
|
||||
unsafe impl<$(const $constvar : $constty,)? $($tyvar $(: ?$optbound)?)?> KnownLayout for $ty {
|
||||
#[allow(clippy::missing_inline_in_public_items)]
|
||||
fn only_derive_is_allowed_to_implement_this_trait() where Self: Sized {}
|
||||
|
||||
const LAYOUT: DstLayout = DstLayout::for_type::<$ty>();
|
||||
|
||||
// SAFETY: `.cast` preserves address and provenance.
|
||||
//
|
||||
// TODO(#429): Add documentation to `.cast` that promises that
|
||||
// it preserves provenance.
|
||||
#[inline(always)]
|
||||
fn raw_from_ptr_len(bytes: NonNull<u8>, _elems: usize) -> NonNull<Self> {
|
||||
bytes.cast::<Self>()
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
/// Implements `KnownLayout` for a type in terms of the implementation of
|
||||
/// another type with the same representation.
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// - `$ty` and `$repr` must have the same:
|
||||
/// - Fixed prefix size
|
||||
/// - Alignment
|
||||
/// - (For DSTs) trailing slice element size
|
||||
/// - It must be valid to perform an `as` cast from `*mut $repr` to `*mut $ty`,
|
||||
/// and this operation must preserve referent size (ie, `size_of_val_raw`).
|
||||
macro_rules! unsafe_impl_known_layout {
|
||||
($($tyvar:ident: ?Sized + KnownLayout =>)? #[repr($repr:ty)] $ty:ty) => {
|
||||
const _: () = {
|
||||
use core::ptr::NonNull;
|
||||
|
||||
unsafe impl<$($tyvar: ?Sized + KnownLayout)?> KnownLayout for $ty {
|
||||
#[allow(clippy::missing_inline_in_public_items)]
|
||||
fn only_derive_is_allowed_to_implement_this_trait() {}
|
||||
|
||||
const LAYOUT: DstLayout = <$repr as KnownLayout>::LAYOUT;
|
||||
|
||||
// SAFETY: All operations preserve address and provenance.
|
||||
// Caller has promised that the `as` cast preserves size.
|
||||
//
|
||||
// TODO(#429): Add documentation to `NonNull::new_unchecked`
|
||||
// that it preserves provenance.
|
||||
#[inline(always)]
|
||||
#[allow(unused_qualifications)] // for `core::ptr::NonNull`
|
||||
fn raw_from_ptr_len(bytes: NonNull<u8>, elems: usize) -> NonNull<Self> {
|
||||
#[allow(clippy::as_conversions)]
|
||||
let ptr = <$repr>::raw_from_ptr_len(bytes, elems).as_ptr() as *mut Self;
|
||||
// SAFETY: `ptr` was converted from `bytes`, which is non-null.
|
||||
unsafe { NonNull::new_unchecked(ptr) }
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
/// Uses `align_of` to confirm that a type or set of types have alignment 1.
|
||||
///
|
||||
/// Note that `align_of<T>` requires `T: Sized`, so this macro doesn't work for
|
||||
/// unsized types.
|
||||
macro_rules! assert_unaligned {
|
||||
($ty:ty) => {
|
||||
// We only compile this assertion under `cfg(test)` to avoid taking an
|
||||
// extra non-dev dependency (and making this crate more expensive to
|
||||
// compile for our dependents).
|
||||
#[cfg(test)]
|
||||
static_assertions::const_assert_eq!(core::mem::align_of::<$ty>(), 1);
|
||||
};
|
||||
($($ty:ty),*) => {
|
||||
$(assert_unaligned!($ty);)*
|
||||
};
|
||||
}
|
||||
118
third-party/vendor/zerocopy/src/post_monomorphization_compile_fail_tests.rs
vendored
Normal file
118
third-party/vendor/zerocopy/src/post_monomorphization_compile_fail_tests.rs
vendored
Normal file
|
|
@ -0,0 +1,118 @@
|
|||
// Copyright 2018 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under the 2-Clause BSD License <LICENSE-BSD or
|
||||
// https://opensource.org/license/bsd-2-clause>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
//! Code that should fail to compile during the post-monomorphization compiler
|
||||
//! pass.
|
||||
//!
|
||||
//! Due to [a limitation with the `trybuild` crate][trybuild-issue], we cannot
|
||||
//! use our UI testing framework to test compilation failures that are
|
||||
//! encountered after monomorphization has complated. This module has one item
|
||||
//! for each such test we would prefer to have as a UI test, with the code in
|
||||
//! question appearing as a rustdoc example which is marked with `compile_fail`.
|
||||
//! This has the effect of causing doctests to fail if any of these examples
|
||||
//! compile successfully.
|
||||
//!
|
||||
//! This is very much a hack and not a complete replacement for UI tests - most
|
||||
//! notably because this only provides a single "compile vs fail" bit of
|
||||
//! information, but does not allow us to depend upon the specific error that
|
||||
//! causes compilation to fail.
|
||||
//!
|
||||
//! [trybuild-issue]: https://github.com/dtolnay/trybuild/issues/241
|
||||
|
||||
// Miri doesn't detect post-monimorphization failures as compile-time failures,
|
||||
// but instead as runtime failures.
|
||||
#![cfg(not(miri))]
|
||||
|
||||
/// ```compile_fail
|
||||
/// use core::cell::{Ref, RefCell};
|
||||
///
|
||||
/// let refcell = RefCell::new([0u8, 1, 2, 3]);
|
||||
/// let core_ref = refcell.borrow();
|
||||
/// let core_ref = Ref::map(core_ref, |bytes| &bytes[..]);
|
||||
///
|
||||
/// // `zc_ref` now stores `core_ref` internally.
|
||||
/// let zc_ref = zerocopy::Ref::<_, u32>::new(core_ref).unwrap();
|
||||
///
|
||||
/// // This causes `core_ref` to get dropped and synthesizes a Rust
|
||||
/// // reference to the memory `core_ref` was pointing at.
|
||||
/// let rust_ref = zc_ref.into_ref();
|
||||
///
|
||||
/// // UB!!! This mutates `rust_ref`'s referent while it's alive.
|
||||
/// *refcell.borrow_mut() = [0, 0, 0, 0];
|
||||
///
|
||||
/// println!("{}", rust_ref);
|
||||
/// ```
|
||||
#[allow(unused)]
|
||||
const REFCELL_REF_INTO_REF: () = ();
|
||||
|
||||
/// ```compile_fail
|
||||
/// use core::cell::{RefCell, RefMut};
|
||||
///
|
||||
/// let refcell = RefCell::new([0u8, 1, 2, 3]);
|
||||
/// let core_ref_mut = refcell.borrow_mut();
|
||||
/// let core_ref_mut = RefMut::map(core_ref_mut, |bytes| &mut bytes[..]);
|
||||
///
|
||||
/// // `zc_ref` now stores `core_ref_mut` internally.
|
||||
/// let zc_ref = zerocopy::Ref::<_, u32>::new(core_ref_mut).unwrap();
|
||||
///
|
||||
/// // This causes `core_ref_mut` to get dropped and synthesizes a Rust
|
||||
/// // reference to the memory `core_ref` was pointing at.
|
||||
/// let rust_ref_mut = zc_ref.into_mut();
|
||||
///
|
||||
/// // UB!!! This mutates `rust_ref_mut`'s referent while it's alive.
|
||||
/// *refcell.borrow_mut() = [0, 0, 0, 0];
|
||||
///
|
||||
/// println!("{}", rust_ref_mut);
|
||||
/// ```
|
||||
#[allow(unused)]
|
||||
const REFCELL_REFMUT_INTO_MUT: () = ();
|
||||
|
||||
/// ```compile_fail
|
||||
/// use core::cell::{Ref, RefCell};
|
||||
///
|
||||
/// let refcell = RefCell::new([0u8, 1, 2, 3]);
|
||||
/// let core_ref = refcell.borrow();
|
||||
/// let core_ref = Ref::map(core_ref, |bytes| &bytes[..]);
|
||||
///
|
||||
/// // `zc_ref` now stores `core_ref` internally.
|
||||
/// let zc_ref = zerocopy::Ref::<_, [u16]>::new_slice(core_ref).unwrap();
|
||||
///
|
||||
/// // This causes `core_ref` to get dropped and synthesizes a Rust
|
||||
/// // reference to the memory `core_ref` was pointing at.
|
||||
/// let rust_ref = zc_ref.into_slice();
|
||||
///
|
||||
/// // UB!!! This mutates `rust_ref`'s referent while it's alive.
|
||||
/// *refcell.borrow_mut() = [0, 0, 0, 0];
|
||||
///
|
||||
/// println!("{:?}", rust_ref);
|
||||
/// ```
|
||||
#[allow(unused)]
|
||||
const REFCELL_REFMUT_INTO_SLICE: () = ();
|
||||
|
||||
/// ```compile_fail
|
||||
/// use core::cell::{RefCell, RefMut};
|
||||
///
|
||||
/// let refcell = RefCell::new([0u8, 1, 2, 3]);
|
||||
/// let core_ref_mut = refcell.borrow_mut();
|
||||
/// let core_ref_mut = RefMut::map(core_ref_mut, |bytes| &mut bytes[..]);
|
||||
///
|
||||
/// // `zc_ref` now stores `core_ref_mut` internally.
|
||||
/// let zc_ref = zerocopy::Ref::<_, [u16]>::new_slice(core_ref_mut).unwrap();
|
||||
///
|
||||
/// // This causes `core_ref_mut` to get dropped and synthesizes a Rust
|
||||
/// // reference to the memory `core_ref` was pointing at.
|
||||
/// let rust_ref_mut = zc_ref.into_mut_slice();
|
||||
///
|
||||
/// // UB!!! This mutates `rust_ref_mut`'s referent while it's alive.
|
||||
/// *refcell.borrow_mut() = [0, 0, 0, 0];
|
||||
///
|
||||
/// println!("{:?}", rust_ref_mut);
|
||||
/// ```
|
||||
#[allow(unused)]
|
||||
const REFCELL_REFMUT_INTO_MUT_SLICE: () = ();
|
||||
176
third-party/vendor/zerocopy/src/third_party/rust/LICENSE-APACHE
vendored
Normal file
176
third-party/vendor/zerocopy/src/third_party/rust/LICENSE-APACHE
vendored
Normal file
|
|
@ -0,0 +1,176 @@
|
|||
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
|
||||
23
third-party/vendor/zerocopy/src/third_party/rust/LICENSE-MIT
vendored
Normal file
23
third-party/vendor/zerocopy/src/third_party/rust/LICENSE-MIT
vendored
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
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.
|
||||
7
third-party/vendor/zerocopy/src/third_party/rust/README.fuchsia
vendored
Normal file
7
third-party/vendor/zerocopy/src/third_party/rust/README.fuchsia
vendored
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
Name: rust
|
||||
License File: LICENSE-APACHE
|
||||
License File: LICENSE-MIT
|
||||
Description:
|
||||
|
||||
See https://github.com/google/zerocopy/pull/492 for an explanation of why this
|
||||
file exists.
|
||||
45
third-party/vendor/zerocopy/src/third_party/rust/layout.rs
vendored
Normal file
45
third-party/vendor/zerocopy/src/third_party/rust/layout.rs
vendored
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
use core::num::NonZeroUsize;
|
||||
|
||||
/// Returns the amount of padding we must insert after `len` bytes to ensure
|
||||
/// that the following address will satisfy `align` (measured in bytes).
|
||||
///
|
||||
/// e.g., if `len` is 9, then `padding_needed_for(len, 4)` returns 3, because
|
||||
/// that is the minimum number of bytes of padding required to get a 4-aligned
|
||||
/// address (assuming that the corresponding memory block starts at a 4-aligned
|
||||
/// address).
|
||||
///
|
||||
/// The return value of this function has no meaning if `align` is not a
|
||||
/// power-of-two.
|
||||
///
|
||||
/// # Panics
|
||||
///
|
||||
/// May panic if `align` is not a power of two.
|
||||
//
|
||||
// TODO(#419): Replace `len` with a witness type for region size.
|
||||
#[allow(unused)]
|
||||
#[inline(always)]
|
||||
pub(crate) const fn padding_needed_for(len: usize, align: NonZeroUsize) -> usize {
|
||||
// Rounded up value is:
|
||||
// len_rounded_up = (len + align - 1) & !(align - 1);
|
||||
// and then we return the padding difference: `len_rounded_up - len`.
|
||||
//
|
||||
// We use modular arithmetic throughout:
|
||||
//
|
||||
// 1. align is guaranteed to be > 0, so align - 1 is always
|
||||
// valid.
|
||||
//
|
||||
// 2. `len + align - 1` can overflow by at most `align - 1`,
|
||||
// so the &-mask with `!(align - 1)` will ensure that in the
|
||||
// case of overflow, `len_rounded_up` will itself be 0.
|
||||
// Thus the returned padding, when added to `len`, yields 0,
|
||||
// which trivially satisfies the alignment `align`.
|
||||
//
|
||||
// (Of course, attempts to allocate blocks of memory whose
|
||||
// size and padding overflow in the above manner should cause
|
||||
// the allocator to yield an error anyway.)
|
||||
|
||||
let align = align.get();
|
||||
debug_assert!(align.is_power_of_two());
|
||||
let len_rounded_up = len.wrapping_add(align).wrapping_sub(1) & !align.wrapping_sub(1);
|
||||
len_rounded_up.wrapping_sub(len)
|
||||
}
|
||||
808
third-party/vendor/zerocopy/src/util.rs
vendored
Normal file
808
third-party/vendor/zerocopy/src/util.rs
vendored
Normal file
|
|
@ -0,0 +1,808 @@
|
|||
// Copyright 2023 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
#[path = "third_party/rust/layout.rs"]
|
||||
pub(crate) mod core_layout;
|
||||
|
||||
use core::{mem, num::NonZeroUsize};
|
||||
|
||||
pub(crate) mod ptr {
|
||||
use core::{
|
||||
fmt::{Debug, Formatter},
|
||||
marker::PhantomData,
|
||||
ptr::NonNull,
|
||||
};
|
||||
|
||||
use crate::{util::AsAddress, KnownLayout, _CastType};
|
||||
|
||||
/// A raw pointer with more restrictions.
|
||||
///
|
||||
/// `Ptr<T>` is similar to `NonNull<T>`, but it is more restrictive in the
|
||||
/// following ways:
|
||||
/// - It must derive from a valid allocation
|
||||
/// - It must reference a byte range which is contained inside the
|
||||
/// allocation from which it derives
|
||||
/// - As a consequence, the byte range it references must have a size
|
||||
/// which does not overflow `isize`
|
||||
/// - It must satisfy `T`'s alignment requirement
|
||||
///
|
||||
/// Thanks to these restrictions, it is easier to prove the soundness of
|
||||
/// some operations using `Ptr`s.
|
||||
///
|
||||
/// `Ptr<'a, T>` is [covariant] in `'a` and `T`.
|
||||
///
|
||||
/// [covariant]: https://doc.rust-lang.org/reference/subtyping.html
|
||||
pub struct Ptr<'a, T: 'a + ?Sized> {
|
||||
// INVARIANTS:
|
||||
// 1. `ptr` is derived from some valid Rust allocation, `A`
|
||||
// 2. `ptr` has the same provenance as `A`
|
||||
// 3. `ptr` addresses a byte range which is entirely contained in `A`
|
||||
// 4. `ptr` addresses a byte range whose length fits in an `isize`
|
||||
// 5. `ptr` addresses a byte range which does not wrap around the address
|
||||
// space
|
||||
// 6. `ptr` is validly-aligned for `T`
|
||||
// 7. `A` is guaranteed to live for at least `'a`
|
||||
// 8. `T: 'a`
|
||||
ptr: NonNull<T>,
|
||||
_lifetime: PhantomData<&'a ()>,
|
||||
}
|
||||
|
||||
impl<'a, T: ?Sized> Copy for Ptr<'a, T> {}
|
||||
impl<'a, T: ?Sized> Clone for Ptr<'a, T> {
|
||||
#[inline]
|
||||
fn clone(&self) -> Self {
|
||||
*self
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, T: ?Sized> Ptr<'a, T> {
|
||||
/// Returns a shared reference to the value.
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// For the duration of `'a`:
|
||||
/// - The referenced memory must contain a validly-initialized `T` for
|
||||
/// the duration of `'a`.
|
||||
/// - The referenced memory must not also be referenced by any mutable
|
||||
/// references.
|
||||
/// - The referenced memory must not be mutated, even via an
|
||||
/// [`UnsafeCell`].
|
||||
/// - There must not exist any references to the same memory region
|
||||
/// which contain `UnsafeCell`s at byte ranges which are not identical
|
||||
/// to the byte ranges at which `T` contains `UnsafeCell`s.
|
||||
///
|
||||
/// [`UnsafeCell`]: core::cell::UnsafeCell
|
||||
// TODO(#429): The safety requirements are likely overly-restrictive.
|
||||
// Notably, mutation via `UnsafeCell`s is probably fine. Once the rules
|
||||
// are more clearly defined, we should relax the safety requirements.
|
||||
// For an example of why this is subtle, see:
|
||||
// https://github.com/rust-lang/unsafe-code-guidelines/issues/463#issuecomment-1736771593
|
||||
#[allow(unused)]
|
||||
pub(crate) unsafe fn as_ref(&self) -> &'a T {
|
||||
// SAFETY:
|
||||
// - By invariant, `self.ptr` is properly-aligned for `T`.
|
||||
// - By invariant, `self.ptr` is "dereferenceable" in that it points
|
||||
// to a single allocation.
|
||||
// - By invariant, the allocation is live for `'a`.
|
||||
// - The caller promises that no mutable references exist to this
|
||||
// region during `'a`.
|
||||
// - The caller promises that `UnsafeCell`s match exactly.
|
||||
// - The caller promises that no mutation will happen during `'a`,
|
||||
// even via `UnsafeCell`s.
|
||||
// - The caller promises that the memory region contains a
|
||||
// validly-intialized `T`.
|
||||
unsafe { self.ptr.as_ref() }
|
||||
}
|
||||
|
||||
/// Casts to a different (unsized) target type.
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// The caller promises that
|
||||
/// - `cast(p)` is implemented exactly as follows: `|p: *mut T| p as
|
||||
/// *mut U`.
|
||||
/// - The size of the object referenced by the resulting pointer is less
|
||||
/// than or equal to the size of the object referenced by `self`.
|
||||
/// - The alignment of `U` is less than or equal to the alignment of
|
||||
/// `T`.
|
||||
pub(crate) unsafe fn cast_unsized<U: 'a + ?Sized, F: FnOnce(*mut T) -> *mut U>(
|
||||
self,
|
||||
cast: F,
|
||||
) -> Ptr<'a, U> {
|
||||
let ptr = cast(self.ptr.as_ptr());
|
||||
// SAFETY: Caller promises that `cast` is just an `as` cast. We call
|
||||
// `cast` on `self.ptr.as_ptr()`, which is non-null by construction.
|
||||
let ptr = unsafe { NonNull::new_unchecked(ptr) };
|
||||
// SAFETY:
|
||||
// - By invariant, `self.ptr` is derived from some valid Rust
|
||||
// allocation, and since `ptr` is just `self.ptr as *mut U`, so is
|
||||
// `ptr`.
|
||||
// - By invariant, `self.ptr` has the same provenance as `A`, and so
|
||||
// the same is true of `ptr`.
|
||||
// - By invariant, `self.ptr` addresses a byte range which is
|
||||
// entirely contained in `A`, and so the same is true of `ptr`.
|
||||
// - By invariant, `self.ptr` addresses a byte range whose length
|
||||
// fits in an `isize`, and so the same is true of `ptr`.
|
||||
// - By invariant, `self.ptr` addresses a byte range which does not
|
||||
// wrap around the address space, and so the same is true of
|
||||
// `ptr`.
|
||||
// - By invariant, `self.ptr` is validly-aligned for `T`. Since
|
||||
// `ptr` has the same address, and since the caller promises that
|
||||
// the alignment of `U` is less than or equal to the alignment of
|
||||
// `T`, `ptr` is validly-aligned for `U`.
|
||||
// - By invariant, `A` is guaranteed to live for at least `'a`.
|
||||
// - `U: 'a`
|
||||
Ptr { ptr, _lifetime: PhantomData }
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> Ptr<'a, [u8]> {
|
||||
/// Attempts to cast `self` to a `U` using the given cast type.
|
||||
///
|
||||
/// Returns `None` if the resulting `U` would be invalidly-aligned or if
|
||||
/// no `U` can fit in `self`. On success, returns a pointer to the
|
||||
/// largest-possible `U` which fits in `self`.
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// The caller may assume that this implementation is correct, and may
|
||||
/// rely on that assumption for the soundness of their code. In
|
||||
/// particular, the caller may assume that, if `try_cast_into` returns
|
||||
/// `Some((ptr, split_at))`, then:
|
||||
/// - If this is a prefix cast, `ptr` refers to the byte range `[0,
|
||||
/// split_at)` in `self`.
|
||||
/// - If this is a suffix cast, `ptr` refers to the byte range
|
||||
/// `[split_at, self.len())` in `self`.
|
||||
///
|
||||
/// # Panics
|
||||
///
|
||||
/// Panics if `U` is a DST whose trailing slice element is zero-sized.
|
||||
pub(crate) fn try_cast_into<U: 'a + ?Sized + KnownLayout>(
|
||||
&self,
|
||||
cast_type: _CastType,
|
||||
) -> Option<(Ptr<'a, U>, usize)> {
|
||||
// PANICS: By invariant, the byte range addressed by `self.ptr` does
|
||||
// not wrap around the address space. This implies that the sum of
|
||||
// the address (represented as a `usize`) and length do not overflow
|
||||
// `usize`, as required by `validate_cast_and_convert_metadata`.
|
||||
// Thus, this call to `validate_cast_and_convert_metadata` won't
|
||||
// panic.
|
||||
let (elems, split_at) = U::LAYOUT.validate_cast_and_convert_metadata(
|
||||
AsAddress::addr(self.ptr.as_ptr()),
|
||||
self.len(),
|
||||
cast_type,
|
||||
)?;
|
||||
let offset = match cast_type {
|
||||
_CastType::_Prefix => 0,
|
||||
_CastType::_Suffix => split_at,
|
||||
};
|
||||
|
||||
let ptr = self.ptr.cast::<u8>().as_ptr();
|
||||
// SAFETY: `offset` is either `0` or `split_at`.
|
||||
// `validate_cast_and_convert_metadata` promises that `split_at` is
|
||||
// in the range `[0, self.len()]`. Thus, in both cases, `offset` is
|
||||
// in `[0, self.len()]`. Thus:
|
||||
// - The resulting pointer is in or one byte past the end of the
|
||||
// same byte range as `self.ptr`. Since, by invariant, `self.ptr`
|
||||
// addresses a byte range entirely contained within a single
|
||||
// allocation, the pointer resulting from this operation is within
|
||||
// or one byte past the end of that same allocation.
|
||||
// - By invariant, `self.len() <= isize::MAX`. Since `offset <=
|
||||
// self.len()`, `offset <= isize::MAX`.
|
||||
// - By invariant, `self.ptr` addresses a byte range which does not
|
||||
// wrap around the address space. This means that the base pointer
|
||||
// plus the `self.len()` does not overflow `usize`. Since `offset
|
||||
// <= self.len()`, this addition does not overflow `usize`.
|
||||
let base = unsafe { ptr.add(offset) };
|
||||
// SAFETY: Since `add` is not allowed to wrap around, the preceding line
|
||||
// produces a pointer whose address is greater than or equal to that of
|
||||
// `ptr`. Since `ptr` is a `NonNull`, `base` is also non-null.
|
||||
let base = unsafe { NonNull::new_unchecked(base) };
|
||||
let ptr = U::raw_from_ptr_len(base, elems);
|
||||
// SAFETY:
|
||||
// - By invariant, `self.ptr` is derived from some valid Rust
|
||||
// allocation, `A`, and has the same provenance as `A`. All
|
||||
// operations performed on `self.ptr` and values derived from it
|
||||
// in this method preserve provenance, so:
|
||||
// - `ptr` is derived from a valid Rust allocation, `A`.
|
||||
// - `ptr` has the same provenance as `A`.
|
||||
// - `validate_cast_and_convert_metadata` promises that the object
|
||||
// described by `elems` and `split_at` lives at a byte range which
|
||||
// is a subset of the input byte range. Thus:
|
||||
// - Since, by invariant, `self.ptr` addresses a byte range
|
||||
// entirely contained in `A`, so does `ptr`.
|
||||
// - Since, by invariant, `self.ptr` addresses a range whose
|
||||
// length is not longer than `isize::MAX` bytes, so does `ptr`.
|
||||
// - Since, by invariant, `self.ptr` addresses a range which does
|
||||
// not wrap around the address space, so does `ptr`.
|
||||
// - `validate_cast_and_convert_metadata` promises that the object
|
||||
// described by `split_at` is validly-aligned for `U`.
|
||||
// - By invariant on `self`, `A` is guaranteed to live for at least
|
||||
// `'a`.
|
||||
// - `U: 'a` by trait bound.
|
||||
Some((Ptr { ptr, _lifetime: PhantomData }, split_at))
|
||||
}
|
||||
|
||||
/// Attempts to cast `self` into a `U`, failing if all of the bytes of
|
||||
/// `self` cannot be treated as a `U`.
|
||||
///
|
||||
/// In particular, this method fails if `self` is not validly-aligned
|
||||
/// for `U` or if `self`'s size is not a valid size for `U`.
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// On success, the caller may assume that the returned pointer
|
||||
/// references the same byte range as `self`.
|
||||
#[allow(unused)]
|
||||
#[inline(always)]
|
||||
pub(crate) fn try_cast_into_no_leftover<U: 'a + ?Sized + KnownLayout>(
|
||||
&self,
|
||||
) -> Option<Ptr<'a, U>> {
|
||||
// TODO(#67): Remove this allow. See NonNulSlicelExt for more
|
||||
// details.
|
||||
#[allow(unstable_name_collisions)]
|
||||
match self.try_cast_into(_CastType::_Prefix) {
|
||||
Some((slf, split_at)) if split_at == self.len() => Some(slf),
|
||||
Some(_) | None => None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, T> Ptr<'a, [T]> {
|
||||
/// The number of slice elements referenced by `self`.
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// Unsafe code my rely on `len` satisfying the above contract.
|
||||
fn len(&self) -> usize {
|
||||
#[allow(clippy::as_conversions)]
|
||||
let slc = self.ptr.as_ptr() as *const [()];
|
||||
// SAFETY:
|
||||
// - `()` has alignment 1, so `slc` is trivially aligned.
|
||||
// - `slc` was derived from a non-null pointer.
|
||||
// - The size is 0 regardless of the length, so it is sound to
|
||||
// materialize a reference regardless of location.
|
||||
// - By invariant, `self.ptr` has valid provenance.
|
||||
let slc = unsafe { &*slc };
|
||||
// This is correct because the preceding `as` cast preserves the
|
||||
// number of slice elements. Per
|
||||
// https://doc.rust-lang.org/nightly/reference/expressions/operator-expr.html#slice-dst-pointer-to-pointer-cast:
|
||||
//
|
||||
// For slice types like `[T]` and `[U]`, the raw pointer types
|
||||
// `*const [T]`, `*mut [T]`, `*const [U]`, and `*mut [U]` encode
|
||||
// the number of elements in this slice. Casts between these raw
|
||||
// pointer types preserve the number of elements. Note that, as a
|
||||
// consequence, such casts do *not* necessarily preserve the size
|
||||
// of the pointer's referent (e.g., casting `*const [u16]` to
|
||||
// `*const [u8]` will result in a raw pointer which refers to an
|
||||
// object of half the size of the original). The same holds for
|
||||
// `str` and any compound type whose unsized tail is a slice type,
|
||||
// such as struct `Foo(i32, [u8])` or `(u64, Foo)`.
|
||||
//
|
||||
// TODO(#429),
|
||||
// TODO(https://github.com/rust-lang/reference/pull/1417): Once this
|
||||
// text is available on the Stable docs, cite those instead of the
|
||||
// Nightly docs.
|
||||
slc.len()
|
||||
}
|
||||
|
||||
pub(crate) fn iter(&self) -> impl Iterator<Item = Ptr<'a, T>> {
|
||||
// TODO(#429): Once `NonNull::cast` documents that it preserves
|
||||
// provenance, cite those docs.
|
||||
let base = self.ptr.cast::<T>().as_ptr();
|
||||
(0..self.len()).map(move |i| {
|
||||
// TODO(https://github.com/rust-lang/rust/issues/74265): Use
|
||||
// `NonNull::get_unchecked_mut`.
|
||||
|
||||
// SAFETY: If the following conditions are not satisfied
|
||||
// `pointer::cast` may induce Undefined Behavior [1]:
|
||||
// > 1. Both the starting and resulting pointer must be either
|
||||
// > in bounds or one byte past the end of the same allocated
|
||||
// > object.
|
||||
// > 2. The computed offset, in bytes, cannot overflow an
|
||||
// > `isize`.
|
||||
// > 3. The offset being in bounds cannot rely on “wrapping
|
||||
// > around” the address space. That is, the
|
||||
// > infinite-precision sum must fit in a `usize`.
|
||||
//
|
||||
// [1] https://doc.rust-lang.org/std/primitive.pointer.html#method.add
|
||||
//
|
||||
// We satisfy all three of these conditions here:
|
||||
// 1. `base` (by invariant on `self`) points to an allocated
|
||||
// object. By contract, `self.len()` accurately reflects the
|
||||
// number of elements in the slice. `i` is in bounds of
|
||||
// `c.len()` by construction, and so the result of this
|
||||
// addition cannot overflow past the end of the allocation
|
||||
// referred to by `c`.
|
||||
// 2. By invariant on `Ptr`, `self` addresses a byte range whose
|
||||
// length fits in an `isize`. Since `elem` is contained in
|
||||
// `self`, the computed offset of `elem` must fit within
|
||||
// `isize.`
|
||||
// 3. By invariant on `Ptr`, `self` addresses a byte range which
|
||||
// does not wrap around the address space. Since `elem` is
|
||||
// contained in `self`, the computed offset of `elem` must
|
||||
// wrap around the address space.
|
||||
//
|
||||
// TODO(#429): Once `pointer::add` documents that it preserves
|
||||
// provenance, cite those docs.
|
||||
let elem = unsafe { base.add(i) };
|
||||
|
||||
// SAFETY:
|
||||
// - `elem` must not be null. `base` is constructed from a
|
||||
// `NonNull` pointer, and the addition that produces `elem`
|
||||
// must not overflow or wrap around, so `elem >= base > 0`.
|
||||
//
|
||||
// TODO(#429): Once `NonNull::new_unchecked` documents that it
|
||||
// preserves provenance, cite those docs.
|
||||
let elem = unsafe { NonNull::new_unchecked(elem) };
|
||||
|
||||
// SAFETY: The safety invariants of `Ptr` (see definition) are
|
||||
// satisfied:
|
||||
// 1. `elem` is derived from a valid Rust allocation, because
|
||||
// `self` is derived from a valid Rust allocation, by
|
||||
// invariant on `Ptr`
|
||||
// 2. `elem` has the same provenance as `self`, because it
|
||||
// derived from `self` using a series of
|
||||
// provenance-preserving operations
|
||||
// 3. `elem` is entirely contained in the allocation of `self`
|
||||
// (see above)
|
||||
// 4. `elem` addresses a byte range whose length fits in an
|
||||
// `isize` (see above)
|
||||
// 5. `elem` addresses a byte range which does not wrap around
|
||||
// the address space (see above)
|
||||
// 6. `elem` is validly-aligned for `T`. `self`, which
|
||||
// represents a `[T]` is validly aligned for `T`, and `elem`
|
||||
// is an element within that `[T]`
|
||||
// 7. The allocation of `elem` is guaranteed to live for at
|
||||
// least `'a`, because `elem` is entirely contained in
|
||||
// `self`, which lives for at least `'a` by invariant on
|
||||
// `Ptr`.
|
||||
// 8. `T: 'a`, because `elem` is an element within `[T]`, and
|
||||
// `[T]: 'a` by invariant on `Ptr`
|
||||
Ptr { ptr: elem, _lifetime: PhantomData }
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, T: 'a + ?Sized> From<&'a T> for Ptr<'a, T> {
|
||||
#[inline(always)]
|
||||
fn from(t: &'a T) -> Ptr<'a, T> {
|
||||
// SAFETY: `t` points to a valid Rust allocation, `A`, by
|
||||
// construction. Thus:
|
||||
// - `ptr` is derived from `A`
|
||||
// - Since we use `NonNull::from`, which preserves provenance, `ptr`
|
||||
// has the same provenance as `A`
|
||||
// - Since `NonNull::from` creates a pointer which addresses the
|
||||
// same bytes as `t`, `ptr` addresses a byte range entirely
|
||||
// contained in (in this case, identical to) `A`
|
||||
// - Since `t: &T`, it addresses no more than `isize::MAX` bytes [1]
|
||||
// - Since `t: &T`, it addresses a byte range which does not wrap
|
||||
// around the address space [2]
|
||||
// - Since it is constructed from a valid `&T`, `ptr` is
|
||||
// validly-aligned for `T`
|
||||
// - Since `t: &'a T`, the allocation `A` is guaranteed to live for
|
||||
// at least `'a`
|
||||
// - `T: 'a` by trait bound
|
||||
//
|
||||
// TODO(#429),
|
||||
// TODO(https://github.com/rust-lang/rust/issues/116181): Once it's
|
||||
// documented, reference the guarantee that `NonNull::from`
|
||||
// preserves provenance.
|
||||
//
|
||||
// TODO(#429),
|
||||
// TODO(https://github.com/rust-lang/unsafe-code-guidelines/issues/465):
|
||||
// - [1] Where does the reference document that allocations fit in
|
||||
// `isize`?
|
||||
// - [2] Where does the reference document that allocations don't
|
||||
// wrap around the address space?
|
||||
Ptr { ptr: NonNull::from(t), _lifetime: PhantomData }
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, T: 'a + ?Sized> Debug for Ptr<'a, T> {
|
||||
#[inline]
|
||||
fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
|
||||
self.ptr.fmt(f)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use core::mem::{self, MaybeUninit};
|
||||
|
||||
use super::*;
|
||||
use crate::{util::testutil::AU64, FromBytes};
|
||||
|
||||
#[test]
|
||||
fn test_ptrtry_cast_into_soundness() {
|
||||
// This test is designed so that if `Ptr::try_cast_into_xxx` are
|
||||
// buggy, it will manifest as unsoundness that Miri can detect.
|
||||
|
||||
// - If `size_of::<T>() == 0`, `N == 4`
|
||||
// - Else, `N == 4 * size_of::<T>()`
|
||||
fn test<const N: usize, T: ?Sized + KnownLayout + FromBytes>() {
|
||||
let mut bytes = [MaybeUninit::<u8>::uninit(); N];
|
||||
let initialized = [MaybeUninit::new(0u8); N];
|
||||
for start in 0..=bytes.len() {
|
||||
for end in start..=bytes.len() {
|
||||
// Set all bytes to uninitialized other than those in
|
||||
// the range we're going to pass to `try_cast_from`.
|
||||
// This allows Miri to detect out-of-bounds reads
|
||||
// because they read uninitialized memory. Without this,
|
||||
// some out-of-bounds reads would still be in-bounds of
|
||||
// `bytes`, and so might spuriously be accepted.
|
||||
bytes = [MaybeUninit::<u8>::uninit(); N];
|
||||
let bytes = &mut bytes[start..end];
|
||||
// Initialize only the byte range we're going to pass to
|
||||
// `try_cast_from`.
|
||||
bytes.copy_from_slice(&initialized[start..end]);
|
||||
|
||||
let bytes = {
|
||||
let bytes: *const [MaybeUninit<u8>] = bytes;
|
||||
#[allow(clippy::as_conversions)]
|
||||
let bytes = bytes as *const [u8];
|
||||
// SAFETY: We just initialized these bytes to valid
|
||||
// `u8`s.
|
||||
unsafe { &*bytes }
|
||||
};
|
||||
|
||||
/// # Safety
|
||||
///
|
||||
/// - `slf` must reference a byte range which is
|
||||
/// entirely initialized.
|
||||
/// - `slf` must reference a byte range which is only
|
||||
/// referenced by shared references which do not
|
||||
/// contain `UnsafeCell`s during its lifetime.
|
||||
unsafe fn validate_and_get_len<T: ?Sized + KnownLayout + FromBytes>(
|
||||
slf: Ptr<'_, T>,
|
||||
) -> usize {
|
||||
// SAFETY:
|
||||
// - Since all bytes in `slf` are initialized and
|
||||
// `T: FromBytes`, `slf` contains a valid `T`.
|
||||
// - The caller promises that the referenced memory
|
||||
// is not also referenced by any mutable
|
||||
// references.
|
||||
// - The caller promises that the referenced memory
|
||||
// is not also referenced as a type which contains
|
||||
// `UnsafeCell`s.
|
||||
let t = unsafe { slf.as_ref() };
|
||||
|
||||
let bytes = {
|
||||
let len = mem::size_of_val(t);
|
||||
let t: *const T = t;
|
||||
// SAFETY:
|
||||
// - We know `t`'s bytes are all initialized
|
||||
// because we just read it from `slf`, which
|
||||
// points to an initialized range of bytes. If
|
||||
// there's a bug and this doesn't hold, then
|
||||
// that's exactly what we're hoping Miri will
|
||||
// catch!
|
||||
// - Since `T: FromBytes`, `T` doesn't contain
|
||||
// any `UnsafeCell`s, so it's okay for `t: T`
|
||||
// and a `&[u8]` to the same memory to be
|
||||
// alive concurrently.
|
||||
unsafe { core::slice::from_raw_parts(t.cast::<u8>(), len) }
|
||||
};
|
||||
|
||||
// This assertion ensures that `t`'s bytes are read
|
||||
// and compared to another value, which in turn
|
||||
// ensures that Miri gets a chance to notice if any
|
||||
// of `t`'s bytes are uninitialized, which they
|
||||
// shouldn't be (see the comment above).
|
||||
assert_eq!(bytes, vec![0u8; bytes.len()]);
|
||||
|
||||
mem::size_of_val(t)
|
||||
}
|
||||
|
||||
for cast_type in [_CastType::_Prefix, _CastType::_Suffix] {
|
||||
if let Some((slf, split_at)) =
|
||||
Ptr::from(bytes).try_cast_into::<T>(cast_type)
|
||||
{
|
||||
// SAFETY: All bytes in `bytes` have been
|
||||
// initialized.
|
||||
let len = unsafe { validate_and_get_len(slf) };
|
||||
match cast_type {
|
||||
_CastType::_Prefix => assert_eq!(split_at, len),
|
||||
_CastType::_Suffix => assert_eq!(split_at, bytes.len() - len),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if let Some(slf) = Ptr::from(bytes).try_cast_into_no_leftover::<T>() {
|
||||
// SAFETY: All bytes in `bytes` have been
|
||||
// initialized.
|
||||
let len = unsafe { validate_and_get_len(slf) };
|
||||
assert_eq!(len, bytes.len());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
macro_rules! test {
|
||||
($($ty:ty),*) => {
|
||||
$({
|
||||
const S: usize = core::mem::size_of::<$ty>();
|
||||
const N: usize = if S == 0 { 4 } else { S * 4 };
|
||||
test::<N, $ty>();
|
||||
// We don't support casting into DSTs whose trailing slice
|
||||
// element is a ZST.
|
||||
if S > 0 {
|
||||
test::<N, [$ty]>();
|
||||
}
|
||||
// TODO: Test with a slice DST once we have any that
|
||||
// implement `KnownLayout + FromBytes`.
|
||||
})*
|
||||
};
|
||||
}
|
||||
|
||||
test!(());
|
||||
test!(u8, u16, u32, u64, u128, usize, AU64);
|
||||
test!(i8, i16, i32, i64, i128, isize);
|
||||
test!(f32, f64);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) trait AsAddress {
|
||||
fn addr(self) -> usize;
|
||||
}
|
||||
|
||||
impl<'a, T: ?Sized> AsAddress for &'a T {
|
||||
#[inline(always)]
|
||||
fn addr(self) -> usize {
|
||||
let ptr: *const T = self;
|
||||
AsAddress::addr(ptr)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, T: ?Sized> AsAddress for &'a mut T {
|
||||
#[inline(always)]
|
||||
fn addr(self) -> usize {
|
||||
let ptr: *const T = self;
|
||||
AsAddress::addr(ptr)
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: ?Sized> AsAddress for *const T {
|
||||
#[inline(always)]
|
||||
fn addr(self) -> usize {
|
||||
// TODO(#181), TODO(https://github.com/rust-lang/rust/issues/95228): Use
|
||||
// `.addr()` instead of `as usize` once it's stable, and get rid of this
|
||||
// `allow`. Currently, `as usize` is the only way to accomplish this.
|
||||
#[allow(clippy::as_conversions)]
|
||||
#[cfg_attr(__INTERNAL_USE_ONLY_NIGHLTY_FEATURES_IN_TESTS, allow(lossy_provenance_casts))]
|
||||
return self.cast::<()>() as usize;
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: ?Sized> AsAddress for *mut T {
|
||||
#[inline(always)]
|
||||
fn addr(self) -> usize {
|
||||
let ptr: *const T = self;
|
||||
AsAddress::addr(ptr)
|
||||
}
|
||||
}
|
||||
|
||||
/// Is `t` aligned to `mem::align_of::<U>()`?
|
||||
#[inline(always)]
|
||||
pub(crate) fn aligned_to<T: AsAddress, U>(t: T) -> bool {
|
||||
// `mem::align_of::<U>()` is guaranteed to return a non-zero value, which in
|
||||
// turn guarantees that this mod operation will not panic.
|
||||
#[allow(clippy::arithmetic_side_effects)]
|
||||
let remainder = t.addr() % mem::align_of::<U>();
|
||||
remainder == 0
|
||||
}
|
||||
|
||||
/// Round `n` down to the largest value `m` such that `m <= n` and `m % align ==
|
||||
/// 0`.
|
||||
///
|
||||
/// # Panics
|
||||
///
|
||||
/// May panic if `align` is not a power of two. Even if it doesn't panic in this
|
||||
/// case, it will produce nonsense results.
|
||||
#[inline(always)]
|
||||
pub(crate) const fn round_down_to_next_multiple_of_alignment(
|
||||
n: usize,
|
||||
align: NonZeroUsize,
|
||||
) -> usize {
|
||||
let align = align.get();
|
||||
debug_assert!(align.is_power_of_two());
|
||||
|
||||
// Subtraction can't underflow because `align.get() >= 1`.
|
||||
#[allow(clippy::arithmetic_side_effects)]
|
||||
let mask = !(align - 1);
|
||||
n & mask
|
||||
}
|
||||
|
||||
pub(crate) const fn max(a: NonZeroUsize, b: NonZeroUsize) -> NonZeroUsize {
|
||||
if a.get() < b.get() {
|
||||
b
|
||||
} else {
|
||||
a
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) const fn min(a: NonZeroUsize, b: NonZeroUsize) -> NonZeroUsize {
|
||||
if a.get() > b.get() {
|
||||
b
|
||||
} else {
|
||||
a
|
||||
}
|
||||
}
|
||||
|
||||
/// Since we support multiple versions of Rust, there are often features which
|
||||
/// have been stabilized in the most recent stable release which do not yet
|
||||
/// exist (stably) on our MSRV. This module provides polyfills for those
|
||||
/// features so that we can write more "modern" code, and just remove the
|
||||
/// polyfill once our MSRV supports the corresponding feature. Without this,
|
||||
/// we'd have to write worse/more verbose code and leave TODO comments sprinkled
|
||||
/// throughout the codebase to update to the new pattern once it's stabilized.
|
||||
///
|
||||
/// Each trait is imported as `_` at the crate root; each polyfill should "just
|
||||
/// work" at usage sites.
|
||||
pub(crate) mod polyfills {
|
||||
use core::ptr::{self, NonNull};
|
||||
|
||||
// A polyfill for `NonNull::slice_from_raw_parts` that we can use before our
|
||||
// MSRV is 1.70, when that function was stabilized.
|
||||
//
|
||||
// TODO(#67): Once our MSRV is 1.70, remove this.
|
||||
pub(crate) trait NonNullExt<T> {
|
||||
fn slice_from_raw_parts(data: Self, len: usize) -> NonNull<[T]>;
|
||||
}
|
||||
|
||||
impl<T> NonNullExt<T> for NonNull<T> {
|
||||
#[inline(always)]
|
||||
fn slice_from_raw_parts(data: Self, len: usize) -> NonNull<[T]> {
|
||||
let ptr = ptr::slice_from_raw_parts_mut(data.as_ptr(), len);
|
||||
// SAFETY: `ptr` is converted from `data`, which is non-null.
|
||||
unsafe { NonNull::new_unchecked(ptr) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
pub(crate) mod testutil {
|
||||
use core::fmt::{self, Display, Formatter};
|
||||
|
||||
use crate::*;
|
||||
|
||||
/// A `T` which is aligned to at least `align_of::<A>()`.
|
||||
#[derive(Default)]
|
||||
pub(crate) struct Align<T, A> {
|
||||
pub(crate) t: T,
|
||||
_a: [A; 0],
|
||||
}
|
||||
|
||||
impl<T: Default, A> Align<T, A> {
|
||||
pub(crate) fn set_default(&mut self) {
|
||||
self.t = T::default();
|
||||
}
|
||||
}
|
||||
|
||||
impl<T, A> Align<T, A> {
|
||||
pub(crate) const fn new(t: T) -> Align<T, A> {
|
||||
Align { t, _a: [] }
|
||||
}
|
||||
}
|
||||
|
||||
// A `u64` with alignment 8.
|
||||
//
|
||||
// Though `u64` has alignment 8 on some platforms, it's not guaranteed.
|
||||
// By contrast, `AU64` is guaranteed to have alignment 8.
|
||||
#[derive(
|
||||
KnownLayout,
|
||||
FromZeroes,
|
||||
FromBytes,
|
||||
AsBytes,
|
||||
Eq,
|
||||
PartialEq,
|
||||
Ord,
|
||||
PartialOrd,
|
||||
Default,
|
||||
Debug,
|
||||
Copy,
|
||||
Clone,
|
||||
)]
|
||||
#[repr(C, align(8))]
|
||||
pub(crate) struct AU64(pub(crate) u64);
|
||||
|
||||
impl AU64 {
|
||||
// Converts this `AU64` to bytes using this platform's endianness.
|
||||
pub(crate) fn to_bytes(self) -> [u8; 8] {
|
||||
crate::transmute!(self)
|
||||
}
|
||||
}
|
||||
|
||||
impl Display for AU64 {
|
||||
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
||||
Display::fmt(&self.0, f)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(
|
||||
FromZeroes, FromBytes, Eq, PartialEq, Ord, PartialOrd, Default, Debug, Copy, Clone,
|
||||
)]
|
||||
#[repr(C)]
|
||||
pub(crate) struct Nested<T, U: ?Sized> {
|
||||
_t: T,
|
||||
_u: U,
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_round_down_to_next_multiple_of_alignment() {
|
||||
fn alt_impl(n: usize, align: NonZeroUsize) -> usize {
|
||||
let mul = n / align.get();
|
||||
mul * align.get()
|
||||
}
|
||||
|
||||
for align in [1, 2, 4, 8, 16] {
|
||||
for n in 0..256 {
|
||||
let align = NonZeroUsize::new(align).unwrap();
|
||||
let want = alt_impl(n, align);
|
||||
let got = round_down_to_next_multiple_of_alignment(n, align);
|
||||
assert_eq!(got, want, "round_down_to_next_multiple_of_alignment({n}, {align})");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(kani)]
|
||||
mod proofs {
|
||||
use super::*;
|
||||
|
||||
#[kani::proof]
|
||||
fn prove_round_down_to_next_multiple_of_alignment() {
|
||||
fn model_impl(n: usize, align: NonZeroUsize) -> usize {
|
||||
assert!(align.get().is_power_of_two());
|
||||
let mul = n / align.get();
|
||||
mul * align.get()
|
||||
}
|
||||
|
||||
let align: NonZeroUsize = kani::any();
|
||||
kani::assume(align.get().is_power_of_two());
|
||||
let n: usize = kani::any();
|
||||
|
||||
let expected = model_impl(n, align);
|
||||
let actual = round_down_to_next_multiple_of_alignment(n, align);
|
||||
assert_eq!(expected, actual, "round_down_to_next_multiple_of_alignment({n}, {align})");
|
||||
}
|
||||
|
||||
// Restricted to nightly since we use the unstable `usize::next_multiple_of`
|
||||
// in our model implementation.
|
||||
#[cfg(__INTERNAL_USE_ONLY_NIGHLTY_FEATURES_IN_TESTS)]
|
||||
#[kani::proof]
|
||||
fn prove_padding_needed_for() {
|
||||
fn model_impl(len: usize, align: NonZeroUsize) -> usize {
|
||||
let padded = len.next_multiple_of(align.get());
|
||||
let padding = padded - len;
|
||||
padding
|
||||
}
|
||||
|
||||
let align: NonZeroUsize = kani::any();
|
||||
kani::assume(align.get().is_power_of_two());
|
||||
let len: usize = kani::any();
|
||||
// Constrain `len` to valid Rust lengths, since our model implementation
|
||||
// isn't robust to overflow.
|
||||
kani::assume(len <= isize::MAX as usize);
|
||||
kani::assume(align.get() < 1 << 29);
|
||||
|
||||
let expected = model_impl(len, align);
|
||||
let actual = core_layout::padding_needed_for(len, align);
|
||||
assert_eq!(expected, actual, "padding_needed_for({len}, {align})");
|
||||
|
||||
let padded_len = actual + len;
|
||||
assert_eq!(padded_len % align, 0);
|
||||
assert!(padded_len / align >= len / align);
|
||||
}
|
||||
}
|
||||
503
third-party/vendor/zerocopy/src/wrappers.rs
vendored
Normal file
503
third-party/vendor/zerocopy/src/wrappers.rs
vendored
Normal file
|
|
@ -0,0 +1,503 @@
|
|||
// Copyright 2023 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
use core::{
|
||||
cmp::Ordering,
|
||||
fmt::{self, Debug, Display, Formatter},
|
||||
hash::Hash,
|
||||
mem::{self, ManuallyDrop},
|
||||
ops::{Deref, DerefMut},
|
||||
ptr,
|
||||
};
|
||||
|
||||
use super::*;
|
||||
|
||||
/// A type with no alignment requirement.
|
||||
///
|
||||
/// An `Unalign` wraps a `T`, removing any alignment requirement. `Unalign<T>`
|
||||
/// has the same size and bit validity as `T`, but not necessarily the same
|
||||
/// alignment [or ABI]. This is useful if a type with an alignment requirement
|
||||
/// needs to be read from a chunk of memory which provides no alignment
|
||||
/// guarantees.
|
||||
///
|
||||
/// Since `Unalign` has no alignment requirement, the inner `T` may not be
|
||||
/// properly aligned in memory. There are five ways to access the inner `T`:
|
||||
/// - by value, using [`get`] or [`into_inner`]
|
||||
/// - by reference inside of a callback, using [`update`]
|
||||
/// - fallibly by reference, using [`try_deref`] or [`try_deref_mut`]; these can
|
||||
/// fail if the `Unalign` does not satisfy `T`'s alignment requirement at
|
||||
/// runtime
|
||||
/// - unsafely by reference, using [`deref_unchecked`] or
|
||||
/// [`deref_mut_unchecked`]; it is the caller's responsibility to ensure that
|
||||
/// the `Unalign` satisfies `T`'s alignment requirement
|
||||
/// - (where `T: Unaligned`) infallibly by reference, using [`Deref::deref`] or
|
||||
/// [`DerefMut::deref_mut`]
|
||||
///
|
||||
/// [or ABI]: https://github.com/google/zerocopy/issues/164
|
||||
/// [`get`]: Unalign::get
|
||||
/// [`into_inner`]: Unalign::into_inner
|
||||
/// [`update`]: Unalign::update
|
||||
/// [`try_deref`]: Unalign::try_deref
|
||||
/// [`try_deref_mut`]: Unalign::try_deref_mut
|
||||
/// [`deref_unchecked`]: Unalign::deref_unchecked
|
||||
/// [`deref_mut_unchecked`]: Unalign::deref_mut_unchecked
|
||||
// NOTE: This type is sound to use with types that need to be dropped. The
|
||||
// reason is that the compiler-generated drop code automatically moves all
|
||||
// values to aligned memory slots before dropping them in-place. This is not
|
||||
// well-documented, but it's hinted at in places like [1] and [2]. However, this
|
||||
// also means that `T` must be `Sized`; unless something changes, we can never
|
||||
// support unsized `T`. [3]
|
||||
//
|
||||
// [1] https://github.com/rust-lang/rust/issues/54148#issuecomment-420529646
|
||||
// [2] https://github.com/google/zerocopy/pull/126#discussion_r1018512323
|
||||
// [3] https://github.com/google/zerocopy/issues/209
|
||||
#[allow(missing_debug_implementations)]
|
||||
#[derive(Default, Copy)]
|
||||
#[cfg_attr(
|
||||
any(feature = "derive", test),
|
||||
derive(KnownLayout, FromZeroes, FromBytes, AsBytes, Unaligned)
|
||||
)]
|
||||
#[repr(C, packed)]
|
||||
pub struct Unalign<T>(T);
|
||||
|
||||
#[cfg(not(any(feature = "derive", test)))]
|
||||
impl_known_layout!(T => Unalign<T>);
|
||||
|
||||
safety_comment! {
|
||||
/// SAFETY:
|
||||
/// - `Unalign<T>` is `repr(packed)`, so it is unaligned regardless of the
|
||||
/// alignment of `T`, and so we don't require that `T: Unaligned`
|
||||
/// - `Unalign<T>` has the same bit validity as `T`, and so it is
|
||||
/// `FromZeroes`, `FromBytes`, or `AsBytes` exactly when `T` is as well.
|
||||
impl_or_verify!(T => Unaligned for Unalign<T>);
|
||||
impl_or_verify!(T: FromZeroes => FromZeroes for Unalign<T>);
|
||||
impl_or_verify!(T: FromBytes => FromBytes for Unalign<T>);
|
||||
impl_or_verify!(T: AsBytes => AsBytes for Unalign<T>);
|
||||
}
|
||||
|
||||
// Note that `Unalign: Clone` only if `T: Copy`. Since the inner `T` may not be
|
||||
// aligned, there's no way to safely call `T::clone`, and so a `T: Clone` bound
|
||||
// is not sufficient to implement `Clone` for `Unalign`.
|
||||
impl<T: Copy> Clone for Unalign<T> {
|
||||
#[inline(always)]
|
||||
fn clone(&self) -> Unalign<T> {
|
||||
*self
|
||||
}
|
||||
}
|
||||
|
||||
impl<T> Unalign<T> {
|
||||
/// Constructs a new `Unalign`.
|
||||
#[inline(always)]
|
||||
pub const fn new(val: T) -> Unalign<T> {
|
||||
Unalign(val)
|
||||
}
|
||||
|
||||
/// Consumes `self`, returning the inner `T`.
|
||||
#[inline(always)]
|
||||
pub const fn into_inner(self) -> T {
|
||||
// Use this instead of `mem::transmute` since the latter can't tell
|
||||
// that `Unalign<T>` and `T` have the same size.
|
||||
#[repr(C)]
|
||||
union Transmute<T> {
|
||||
u: ManuallyDrop<Unalign<T>>,
|
||||
t: ManuallyDrop<T>,
|
||||
}
|
||||
|
||||
// SAFETY: Since `Unalign` is `#[repr(C, packed)]`, it has the same
|
||||
// layout as `T`. `ManuallyDrop<U>` is guaranteed to have the same
|
||||
// layout as `U`, and so `ManuallyDrop<Unalign<T>>` has the same layout
|
||||
// as `ManuallyDrop<T>`. Since `Transmute<T>` is `#[repr(C)]`, its `t`
|
||||
// and `u` fields both start at the same offset (namely, 0) within the
|
||||
// union.
|
||||
//
|
||||
// We do this instead of just destructuring in order to prevent
|
||||
// `Unalign`'s `Drop::drop` from being run, since dropping is not
|
||||
// supported in `const fn`s.
|
||||
//
|
||||
// TODO(https://github.com/rust-lang/rust/issues/73255): Destructure
|
||||
// instead of using unsafe.
|
||||
unsafe { ManuallyDrop::into_inner(Transmute { u: ManuallyDrop::new(self) }.t) }
|
||||
}
|
||||
|
||||
/// Attempts to return a reference to the wrapped `T`, failing if `self` is
|
||||
/// not properly aligned.
|
||||
///
|
||||
/// If `self` does not satisfy `mem::align_of::<T>()`, then it is unsound to
|
||||
/// return a reference to the wrapped `T`, and `try_deref` returns `None`.
|
||||
///
|
||||
/// If `T: Unaligned`, then `Unalign<T>` implements [`Deref`], and callers
|
||||
/// may prefer [`Deref::deref`], which is infallible.
|
||||
#[inline(always)]
|
||||
pub fn try_deref(&self) -> Option<&T> {
|
||||
if !crate::util::aligned_to::<_, T>(self) {
|
||||
return None;
|
||||
}
|
||||
|
||||
// SAFETY: `deref_unchecked`'s safety requirement is that `self` is
|
||||
// aligned to `align_of::<T>()`, which we just checked.
|
||||
unsafe { Some(self.deref_unchecked()) }
|
||||
}
|
||||
|
||||
/// Attempts to return a mutable reference to the wrapped `T`, failing if
|
||||
/// `self` is not properly aligned.
|
||||
///
|
||||
/// If `self` does not satisfy `mem::align_of::<T>()`, then it is unsound to
|
||||
/// return a reference to the wrapped `T`, and `try_deref_mut` returns
|
||||
/// `None`.
|
||||
///
|
||||
/// If `T: Unaligned`, then `Unalign<T>` implements [`DerefMut`], and
|
||||
/// callers may prefer [`DerefMut::deref_mut`], which is infallible.
|
||||
#[inline(always)]
|
||||
pub fn try_deref_mut(&mut self) -> Option<&mut T> {
|
||||
if !crate::util::aligned_to::<_, T>(&*self) {
|
||||
return None;
|
||||
}
|
||||
|
||||
// SAFETY: `deref_mut_unchecked`'s safety requirement is that `self` is
|
||||
// aligned to `align_of::<T>()`, which we just checked.
|
||||
unsafe { Some(self.deref_mut_unchecked()) }
|
||||
}
|
||||
|
||||
/// Returns a reference to the wrapped `T` without checking alignment.
|
||||
///
|
||||
/// If `T: Unaligned`, then `Unalign<T>` implements[ `Deref`], and callers
|
||||
/// may prefer [`Deref::deref`], which is safe.
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// If `self` does not satisfy `mem::align_of::<T>()`, then
|
||||
/// `self.deref_unchecked()` may cause undefined behavior.
|
||||
#[inline(always)]
|
||||
pub const unsafe fn deref_unchecked(&self) -> &T {
|
||||
// SAFETY: `Unalign<T>` is `repr(transparent)`, so there is a valid `T`
|
||||
// at the same memory location as `self`. It has no alignment guarantee,
|
||||
// but the caller has promised that `self` is properly aligned, so we
|
||||
// know that it is sound to create a reference to `T` at this memory
|
||||
// location.
|
||||
//
|
||||
// We use `mem::transmute` instead of `&*self.get_ptr()` because
|
||||
// dereferencing pointers is not stable in `const` on our current MSRV
|
||||
// (1.56 as of this writing).
|
||||
unsafe { mem::transmute(self) }
|
||||
}
|
||||
|
||||
/// Returns a mutable reference to the wrapped `T` without checking
|
||||
/// alignment.
|
||||
///
|
||||
/// If `T: Unaligned`, then `Unalign<T>` implements[ `DerefMut`], and
|
||||
/// callers may prefer [`DerefMut::deref_mut`], which is safe.
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// If `self` does not satisfy `mem::align_of::<T>()`, then
|
||||
/// `self.deref_mut_unchecked()` may cause undefined behavior.
|
||||
#[inline(always)]
|
||||
pub unsafe fn deref_mut_unchecked(&mut self) -> &mut T {
|
||||
// SAFETY: `self.get_mut_ptr()` returns a raw pointer to a valid `T` at
|
||||
// the same memory location as `self`. It has no alignment guarantee,
|
||||
// but the caller has promised that `self` is properly aligned, so we
|
||||
// know that the pointer itself is aligned, and thus that it is sound to
|
||||
// create a reference to a `T` at this memory location.
|
||||
unsafe { &mut *self.get_mut_ptr() }
|
||||
}
|
||||
|
||||
/// Gets an unaligned raw pointer to the inner `T`.
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// The returned raw pointer is not necessarily aligned to
|
||||
/// `align_of::<T>()`. Most functions which operate on raw pointers require
|
||||
/// those pointers to be aligned, so calling those functions with the result
|
||||
/// of `get_ptr` will be undefined behavior if alignment is not guaranteed
|
||||
/// using some out-of-band mechanism. In general, the only functions which
|
||||
/// are safe to call with this pointer are those which are explicitly
|
||||
/// documented as being sound to use with an unaligned pointer, such as
|
||||
/// [`read_unaligned`].
|
||||
///
|
||||
/// [`read_unaligned`]: core::ptr::read_unaligned
|
||||
#[inline(always)]
|
||||
pub const fn get_ptr(&self) -> *const T {
|
||||
ptr::addr_of!(self.0)
|
||||
}
|
||||
|
||||
/// Gets an unaligned mutable raw pointer to the inner `T`.
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// The returned raw pointer is not necessarily aligned to
|
||||
/// `align_of::<T>()`. Most functions which operate on raw pointers require
|
||||
/// those pointers to be aligned, so calling those functions with the result
|
||||
/// of `get_ptr` will be undefined behavior if alignment is not guaranteed
|
||||
/// using some out-of-band mechanism. In general, the only functions which
|
||||
/// are safe to call with this pointer are those which are explicitly
|
||||
/// documented as being sound to use with an unaligned pointer, such as
|
||||
/// [`read_unaligned`].
|
||||
///
|
||||
/// [`read_unaligned`]: core::ptr::read_unaligned
|
||||
// TODO(https://github.com/rust-lang/rust/issues/57349): Make this `const`.
|
||||
#[inline(always)]
|
||||
pub fn get_mut_ptr(&mut self) -> *mut T {
|
||||
ptr::addr_of_mut!(self.0)
|
||||
}
|
||||
|
||||
/// Sets the inner `T`, dropping the previous value.
|
||||
// TODO(https://github.com/rust-lang/rust/issues/57349): Make this `const`.
|
||||
#[inline(always)]
|
||||
pub fn set(&mut self, t: T) {
|
||||
*self = Unalign::new(t);
|
||||
}
|
||||
|
||||
/// Updates the inner `T` by calling a function on it.
|
||||
///
|
||||
/// If [`T: Unaligned`], then `Unalign<T>` implements [`DerefMut`], and that
|
||||
/// impl should be preferred over this method when performing updates, as it
|
||||
/// will usually be faster and more ergonomic.
|
||||
///
|
||||
/// For large types, this method may be expensive, as it requires copying
|
||||
/// `2 * size_of::<T>()` bytes. \[1\]
|
||||
///
|
||||
/// \[1\] Since the inner `T` may not be aligned, it would not be sound to
|
||||
/// invoke `f` on it directly. Instead, `update` moves it into a
|
||||
/// properly-aligned location in the local stack frame, calls `f` on it, and
|
||||
/// then moves it back to its original location in `self`.
|
||||
///
|
||||
/// [`T: Unaligned`]: Unaligned
|
||||
#[inline]
|
||||
pub fn update<O, F: FnOnce(&mut T) -> O>(&mut self, f: F) -> O {
|
||||
// On drop, this moves `copy` out of itself and uses `ptr::write` to
|
||||
// overwrite `slf`.
|
||||
struct WriteBackOnDrop<T> {
|
||||
copy: ManuallyDrop<T>,
|
||||
slf: *mut Unalign<T>,
|
||||
}
|
||||
|
||||
impl<T> Drop for WriteBackOnDrop<T> {
|
||||
fn drop(&mut self) {
|
||||
// SAFETY: We never use `copy` again as required by
|
||||
// `ManuallyDrop::take`.
|
||||
let copy = unsafe { ManuallyDrop::take(&mut self.copy) };
|
||||
// SAFETY: `slf` is the raw pointer value of `self`. We know it
|
||||
// is valid for writes and properly aligned because `self` is a
|
||||
// mutable reference, which guarantees both of these properties.
|
||||
unsafe { ptr::write(self.slf, Unalign::new(copy)) };
|
||||
}
|
||||
}
|
||||
|
||||
// SAFETY: We know that `self` is valid for reads, properly aligned, and
|
||||
// points to an initialized `Unalign<T>` because it is a mutable
|
||||
// reference, which guarantees all of these properties.
|
||||
//
|
||||
// Since `T: !Copy`, it would be unsound in the general case to allow
|
||||
// both the original `Unalign<T>` and the copy to be used by safe code.
|
||||
// We guarantee that the copy is used to overwrite the original in the
|
||||
// `Drop::drop` impl of `WriteBackOnDrop`. So long as this `drop` is
|
||||
// called before any other safe code executes, soundness is upheld.
|
||||
// While this method can terminate in two ways (by returning normally or
|
||||
// by unwinding due to a panic in `f`), in both cases, `write_back` is
|
||||
// dropped - and its `drop` called - before any other safe code can
|
||||
// execute.
|
||||
let copy = unsafe { ptr::read(self) }.into_inner();
|
||||
let mut write_back = WriteBackOnDrop { copy: ManuallyDrop::new(copy), slf: self };
|
||||
|
||||
let ret = f(&mut write_back.copy);
|
||||
|
||||
drop(write_back);
|
||||
ret
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Copy> Unalign<T> {
|
||||
/// Gets a copy of the inner `T`.
|
||||
// TODO(https://github.com/rust-lang/rust/issues/57349): Make this `const`.
|
||||
#[inline(always)]
|
||||
pub fn get(&self) -> T {
|
||||
let Unalign(val) = *self;
|
||||
val
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Unaligned> Deref for Unalign<T> {
|
||||
type Target = T;
|
||||
|
||||
#[inline(always)]
|
||||
fn deref(&self) -> &T {
|
||||
// SAFETY: `deref_unchecked`'s safety requirement is that `self` is
|
||||
// aligned to `align_of::<T>()`. `T: Unaligned` guarantees that
|
||||
// `align_of::<T>() == 1`, and all pointers are one-aligned because all
|
||||
// addresses are divisible by 1.
|
||||
unsafe { self.deref_unchecked() }
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Unaligned> DerefMut for Unalign<T> {
|
||||
#[inline(always)]
|
||||
fn deref_mut(&mut self) -> &mut T {
|
||||
// SAFETY: `deref_mut_unchecked`'s safety requirement is that `self` is
|
||||
// aligned to `align_of::<T>()`. `T: Unaligned` guarantees that
|
||||
// `align_of::<T>() == 1`, and all pointers are one-aligned because all
|
||||
// addresses are divisible by 1.
|
||||
unsafe { self.deref_mut_unchecked() }
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Unaligned + PartialOrd> PartialOrd<Unalign<T>> for Unalign<T> {
|
||||
#[inline(always)]
|
||||
fn partial_cmp(&self, other: &Unalign<T>) -> Option<Ordering> {
|
||||
PartialOrd::partial_cmp(self.deref(), other.deref())
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Unaligned + Ord> Ord for Unalign<T> {
|
||||
#[inline(always)]
|
||||
fn cmp(&self, other: &Unalign<T>) -> Ordering {
|
||||
Ord::cmp(self.deref(), other.deref())
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Unaligned + PartialEq> PartialEq<Unalign<T>> for Unalign<T> {
|
||||
#[inline(always)]
|
||||
fn eq(&self, other: &Unalign<T>) -> bool {
|
||||
PartialEq::eq(self.deref(), other.deref())
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Unaligned + Eq> Eq for Unalign<T> {}
|
||||
|
||||
impl<T: Unaligned + Hash> Hash for Unalign<T> {
|
||||
#[inline(always)]
|
||||
fn hash<H>(&self, state: &mut H)
|
||||
where
|
||||
H: Hasher,
|
||||
{
|
||||
self.deref().hash(state);
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Unaligned + Debug> Debug for Unalign<T> {
|
||||
#[inline(always)]
|
||||
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
||||
Debug::fmt(self.deref(), f)
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Unaligned + Display> Display for Unalign<T> {
|
||||
#[inline(always)]
|
||||
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
||||
Display::fmt(self.deref(), f)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use core::panic::AssertUnwindSafe;
|
||||
|
||||
use super::*;
|
||||
use crate::util::testutil::*;
|
||||
|
||||
/// A `T` which is guaranteed not to satisfy `align_of::<A>()`.
|
||||
///
|
||||
/// It must be the case that `align_of::<T>() < align_of::<A>()` in order
|
||||
/// fot this type to work properly.
|
||||
#[repr(C)]
|
||||
struct ForceUnalign<T, A> {
|
||||
// The outer struct is aligned to `A`, and, thanks to `repr(C)`, `t` is
|
||||
// placed at the minimum offset that guarantees its alignment. If
|
||||
// `align_of::<T>() < align_of::<A>()`, then that offset will be
|
||||
// guaranteed *not* to satisfy `align_of::<A>()`.
|
||||
_u: u8,
|
||||
t: T,
|
||||
_a: [A; 0],
|
||||
}
|
||||
|
||||
impl<T, A> ForceUnalign<T, A> {
|
||||
const fn new(t: T) -> ForceUnalign<T, A> {
|
||||
ForceUnalign { _u: 0, t, _a: [] }
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_unalign() {
|
||||
// Test methods that don't depend on alignment.
|
||||
let mut u = Unalign::new(AU64(123));
|
||||
assert_eq!(u.get(), AU64(123));
|
||||
assert_eq!(u.into_inner(), AU64(123));
|
||||
assert_eq!(u.get_ptr(), <*const _>::cast::<AU64>(&u));
|
||||
assert_eq!(u.get_mut_ptr(), <*mut _>::cast::<AU64>(&mut u));
|
||||
u.set(AU64(321));
|
||||
assert_eq!(u.get(), AU64(321));
|
||||
|
||||
// Test methods that depend on alignment (when alignment is satisfied).
|
||||
let mut u: Align<_, AU64> = Align::new(Unalign::new(AU64(123)));
|
||||
assert_eq!(u.t.try_deref(), Some(&AU64(123)));
|
||||
assert_eq!(u.t.try_deref_mut(), Some(&mut AU64(123)));
|
||||
// SAFETY: The `Align<_, AU64>` guarantees proper alignment.
|
||||
assert_eq!(unsafe { u.t.deref_unchecked() }, &AU64(123));
|
||||
// SAFETY: The `Align<_, AU64>` guarantees proper alignment.
|
||||
assert_eq!(unsafe { u.t.deref_mut_unchecked() }, &mut AU64(123));
|
||||
*u.t.try_deref_mut().unwrap() = AU64(321);
|
||||
assert_eq!(u.t.get(), AU64(321));
|
||||
|
||||
// Test methods that depend on alignment (when alignment is not
|
||||
// satisfied).
|
||||
let mut u: ForceUnalign<_, AU64> = ForceUnalign::new(Unalign::new(AU64(123)));
|
||||
assert_eq!(u.t.try_deref(), None);
|
||||
assert_eq!(u.t.try_deref_mut(), None);
|
||||
|
||||
// Test methods that depend on `T: Unaligned`.
|
||||
let mut u = Unalign::new(123u8);
|
||||
assert_eq!(u.try_deref(), Some(&123));
|
||||
assert_eq!(u.try_deref_mut(), Some(&mut 123));
|
||||
assert_eq!(u.deref(), &123);
|
||||
assert_eq!(u.deref_mut(), &mut 123);
|
||||
*u = 21;
|
||||
assert_eq!(u.get(), 21);
|
||||
|
||||
// Test that some `Unalign` functions and methods are `const`.
|
||||
const _UNALIGN: Unalign<u64> = Unalign::new(0);
|
||||
const _UNALIGN_PTR: *const u64 = _UNALIGN.get_ptr();
|
||||
const _U64: u64 = _UNALIGN.into_inner();
|
||||
// Make sure all code is considered "used".
|
||||
//
|
||||
// TODO(https://github.com/rust-lang/rust/issues/104084): Remove this
|
||||
// attribute.
|
||||
#[allow(dead_code)]
|
||||
const _: () = {
|
||||
let x: Align<_, AU64> = Align::new(Unalign::new(AU64(123)));
|
||||
// Make sure that `deref_unchecked` is `const`.
|
||||
//
|
||||
// SAFETY: The `Align<_, AU64>` guarantees proper alignment.
|
||||
let au64 = unsafe { x.t.deref_unchecked() };
|
||||
match au64 {
|
||||
AU64(123) => {}
|
||||
_ => unreachable!(),
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_unalign_update() {
|
||||
let mut u = Unalign::new(AU64(123));
|
||||
u.update(|a| a.0 += 1);
|
||||
assert_eq!(u.get(), AU64(124));
|
||||
|
||||
// Test that, even if the callback panics, the original is still
|
||||
// correctly overwritten. Use a `Box` so that Miri is more likely to
|
||||
// catch any unsoundness (which would likely result in two `Box`es for
|
||||
// the same heap object, which is the sort of thing that Miri would
|
||||
// probably catch).
|
||||
let mut u = Unalign::new(Box::new(AU64(123)));
|
||||
let res = std::panic::catch_unwind(AssertUnwindSafe(|| {
|
||||
u.update(|a| {
|
||||
a.0 += 1;
|
||||
panic!();
|
||||
})
|
||||
}));
|
||||
assert!(res.is_err());
|
||||
assert_eq!(u.into_inner(), Box::new(AU64(124)));
|
||||
}
|
||||
}
|
||||
1
third-party/vendor/zerocopy/testdata/include_value/data
vendored
Normal file
1
third-party/vendor/zerocopy/testdata/include_value/data
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
abcd
|
||||
41
third-party/vendor/zerocopy/tests/trybuild.rs
vendored
Normal file
41
third-party/vendor/zerocopy/tests/trybuild.rs
vendored
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
// Copyright 2019 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
use testutil::ToolchainVersion;
|
||||
|
||||
#[test]
|
||||
#[cfg_attr(miri, ignore)]
|
||||
fn ui() {
|
||||
let version = ToolchainVersion::extract_from_pwd().unwrap();
|
||||
// See the doc comment on this method for an explanation of what this does
|
||||
// and why we store source files in different directories.
|
||||
let source_files_dirname = version.get_ui_source_files_dirname_and_maybe_print_warning();
|
||||
|
||||
let t = trybuild::TestCases::new();
|
||||
t.compile_fail(format!("tests/{source_files_dirname}/*.rs"));
|
||||
}
|
||||
|
||||
// The file `invalid-impls.rs` directly includes `src/macros.rs` in order to
|
||||
// test the `impl_or_verify!` macro which is defined in that file. Specifically,
|
||||
// it tests the verification portion of that macro, which is enabled when
|
||||
// `cfg(any(feature = "derive", test))`. While `--cfg test` is of course passed
|
||||
// to the code in the file you're reading right now, `trybuild` does not pass
|
||||
// `--cfg test` when it invokes Cargo. As a result, this `trybuild` test only
|
||||
// tests the correct behavior when the "derive" feature is enabled.
|
||||
#[cfg(feature = "derive")]
|
||||
#[test]
|
||||
#[cfg_attr(miri, ignore)]
|
||||
fn ui_invalid_impls() {
|
||||
let version = ToolchainVersion::extract_from_pwd().unwrap();
|
||||
// See the doc comment on this method for an explanation of what this does
|
||||
// and why we store source files in different directories.
|
||||
let source_files_dirname = version.get_ui_source_files_dirname_and_maybe_print_warning();
|
||||
|
||||
let t = trybuild::TestCases::new();
|
||||
t.compile_fail(format!("tests/{source_files_dirname}/invalid-impls/*.rs"));
|
||||
}
|
||||
12
third-party/vendor/zerocopy/tests/ui-msrv/include_value_not_from_bytes.rs
vendored
Normal file
12
third-party/vendor/zerocopy/tests/ui-msrv/include_value_not_from_bytes.rs
vendored
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
// Copyright 2022 The Fuchsia Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#[macro_use]
|
||||
extern crate zerocopy;
|
||||
|
||||
fn main() {}
|
||||
|
||||
// Should fail because `UnsafeCell<u32>: !FromBytes`.
|
||||
const NOT_FROM_BYTES: core::cell::UnsafeCell<u32> =
|
||||
include_value!("../../testdata/include_value/data");
|
||||
12
third-party/vendor/zerocopy/tests/ui-msrv/include_value_not_from_bytes.stderr
vendored
Normal file
12
third-party/vendor/zerocopy/tests/ui-msrv/include_value_not_from_bytes.stderr
vendored
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
error[E0277]: the trait bound `UnsafeCell<u32>: FromBytes` is not satisfied
|
||||
--> tests/ui-msrv/include_value_not_from_bytes.rs:12:5
|
||||
|
|
||||
12 | include_value!("../../testdata/include_value/data");
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `FromBytes` is not implemented for `UnsafeCell<u32>`
|
||||
|
|
||||
note: required by a bound in `AssertIsFromBytes`
|
||||
--> tests/ui-msrv/include_value_not_from_bytes.rs:12:5
|
||||
|
|
||||
12 | include_value!("../../testdata/include_value/data");
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsFromBytes`
|
||||
= note: this error originates in the macro `$crate::transmute` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
11
third-party/vendor/zerocopy/tests/ui-msrv/include_value_wrong_size.rs
vendored
Normal file
11
third-party/vendor/zerocopy/tests/ui-msrv/include_value_wrong_size.rs
vendored
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
// Copyright 2022 The Fuchsia Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#[macro_use]
|
||||
extern crate zerocopy;
|
||||
|
||||
fn main() {}
|
||||
|
||||
// Should fail because the file is 4 bytes long, not 8.
|
||||
const WRONG_SIZE: u64 = include_value!("../../testdata/include_value/data");
|
||||
9
third-party/vendor/zerocopy/tests/ui-msrv/include_value_wrong_size.stderr
vendored
Normal file
9
third-party/vendor/zerocopy/tests/ui-msrv/include_value_wrong_size.stderr
vendored
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
error[E0512]: cannot transmute between types of different sizes, or dependently-sized types
|
||||
--> tests/ui-msrv/include_value_wrong_size.rs:11:25
|
||||
|
|
||||
11 | const WRONG_SIZE: u64 = include_value!("../../testdata/include_value/data");
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: source type: `[u8; 4]` (32 bits)
|
||||
= note: target type: `u64` (64 bits)
|
||||
= note: this error originates in the macro `$crate::transmute` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
29
third-party/vendor/zerocopy/tests/ui-msrv/invalid-impls/invalid-impls.rs
vendored
Normal file
29
third-party/vendor/zerocopy/tests/ui-msrv/invalid-impls/invalid-impls.rs
vendored
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
// Copyright 2022 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
// Since some macros from `macros.rs` are unused.
|
||||
#![allow(unused)]
|
||||
|
||||
extern crate zerocopy;
|
||||
extern crate zerocopy_derive;
|
||||
|
||||
include!("../../../src/macros.rs");
|
||||
|
||||
use zerocopy::*;
|
||||
use zerocopy_derive::*;
|
||||
|
||||
fn main() {}
|
||||
|
||||
#[derive(FromZeroes, FromBytes, AsBytes, Unaligned)]
|
||||
#[repr(transparent)]
|
||||
struct Foo<T>(T);
|
||||
|
||||
impl_or_verify!(T => FromZeroes for Foo<T>);
|
||||
impl_or_verify!(T => FromBytes for Foo<T>);
|
||||
impl_or_verify!(T => AsBytes for Foo<T>);
|
||||
impl_or_verify!(T => Unaligned for Foo<T>);
|
||||
127
third-party/vendor/zerocopy/tests/ui-msrv/invalid-impls/invalid-impls.stderr
vendored
Normal file
127
third-party/vendor/zerocopy/tests/ui-msrv/invalid-impls/invalid-impls.stderr
vendored
Normal file
|
|
@ -0,0 +1,127 @@
|
|||
error[E0277]: the trait bound `T: zerocopy::FromZeroes` is not satisfied
|
||||
--> tests/ui-msrv/invalid-impls/../../../src/macros.rs
|
||||
|
|
||||
| impl<$($tyvar $(: $(? $optbound +)* $($bound +)*)?),*> Subtrait for $ty {}
|
||||
| ^^^^^^^^ the trait `zerocopy::FromZeroes` is not implemented for `T`
|
||||
|
|
||||
::: tests/ui-msrv/invalid-impls/invalid-impls.rs:26:1
|
||||
|
|
||||
26 | impl_or_verify!(T => FromZeroes for Foo<T>);
|
||||
| ------------------------------------------- in this macro invocation
|
||||
|
|
||||
note: required because of the requirements on the impl of `zerocopy::FromZeroes` for `Foo<T>`
|
||||
--> tests/ui-msrv/invalid-impls/invalid-impls.rs:22:10
|
||||
|
|
||||
22 | #[derive(FromZeroes, FromBytes, AsBytes, Unaligned)]
|
||||
| ^^^^^^^^^^
|
||||
note: required by a bound in `_::Subtrait`
|
||||
--> tests/ui-msrv/invalid-impls/../../../src/macros.rs
|
||||
|
|
||||
| trait Subtrait: $trait {}
|
||||
| ^^^^^^ required by this bound in `_::Subtrait`
|
||||
|
|
||||
::: tests/ui-msrv/invalid-impls/invalid-impls.rs:26:1
|
||||
|
|
||||
26 | impl_or_verify!(T => FromZeroes for Foo<T>);
|
||||
| ------------------------------------------- in this macro invocation
|
||||
= note: this error originates in the macro `impl_or_verify` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
help: consider restricting type parameter `T`
|
||||
|
|
||||
26 | impl_or_verify!(T: zerocopy::FromZeroes => FromZeroes for Foo<T>);
|
||||
| ++++++++++++++++++++++
|
||||
|
||||
error[E0277]: the trait bound `T: zerocopy::FromBytes` is not satisfied
|
||||
--> tests/ui-msrv/invalid-impls/../../../src/macros.rs
|
||||
|
|
||||
| impl<$($tyvar $(: $(? $optbound +)* $($bound +)*)?),*> Subtrait for $ty {}
|
||||
| ^^^^^^^^ the trait `zerocopy::FromBytes` is not implemented for `T`
|
||||
|
|
||||
::: tests/ui-msrv/invalid-impls/invalid-impls.rs:27:1
|
||||
|
|
||||
27 | impl_or_verify!(T => FromBytes for Foo<T>);
|
||||
| ------------------------------------------ in this macro invocation
|
||||
|
|
||||
note: required because of the requirements on the impl of `zerocopy::FromBytes` for `Foo<T>`
|
||||
--> tests/ui-msrv/invalid-impls/invalid-impls.rs:22:22
|
||||
|
|
||||
22 | #[derive(FromZeroes, FromBytes, AsBytes, Unaligned)]
|
||||
| ^^^^^^^^^
|
||||
note: required by a bound in `_::Subtrait`
|
||||
--> tests/ui-msrv/invalid-impls/../../../src/macros.rs
|
||||
|
|
||||
| trait Subtrait: $trait {}
|
||||
| ^^^^^^ required by this bound in `_::Subtrait`
|
||||
|
|
||||
::: tests/ui-msrv/invalid-impls/invalid-impls.rs:27:1
|
||||
|
|
||||
27 | impl_or_verify!(T => FromBytes for Foo<T>);
|
||||
| ------------------------------------------ in this macro invocation
|
||||
= note: this error originates in the macro `impl_or_verify` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
help: consider restricting type parameter `T`
|
||||
|
|
||||
27 | impl_or_verify!(T: zerocopy::FromBytes => FromBytes for Foo<T>);
|
||||
| +++++++++++++++++++++
|
||||
|
||||
error[E0277]: the trait bound `T: zerocopy::AsBytes` is not satisfied
|
||||
--> tests/ui-msrv/invalid-impls/../../../src/macros.rs
|
||||
|
|
||||
| impl<$($tyvar $(: $(? $optbound +)* $($bound +)*)?),*> Subtrait for $ty {}
|
||||
| ^^^^^^^^ the trait `zerocopy::AsBytes` is not implemented for `T`
|
||||
|
|
||||
::: tests/ui-msrv/invalid-impls/invalid-impls.rs:28:1
|
||||
|
|
||||
28 | impl_or_verify!(T => AsBytes for Foo<T>);
|
||||
| ---------------------------------------- in this macro invocation
|
||||
|
|
||||
note: required because of the requirements on the impl of `zerocopy::AsBytes` for `Foo<T>`
|
||||
--> tests/ui-msrv/invalid-impls/invalid-impls.rs:22:33
|
||||
|
|
||||
22 | #[derive(FromZeroes, FromBytes, AsBytes, Unaligned)]
|
||||
| ^^^^^^^
|
||||
note: required by a bound in `_::Subtrait`
|
||||
--> tests/ui-msrv/invalid-impls/../../../src/macros.rs
|
||||
|
|
||||
| trait Subtrait: $trait {}
|
||||
| ^^^^^^ required by this bound in `_::Subtrait`
|
||||
|
|
||||
::: tests/ui-msrv/invalid-impls/invalid-impls.rs:28:1
|
||||
|
|
||||
28 | impl_or_verify!(T => AsBytes for Foo<T>);
|
||||
| ---------------------------------------- in this macro invocation
|
||||
= note: this error originates in the macro `impl_or_verify` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
help: consider restricting type parameter `T`
|
||||
|
|
||||
28 | impl_or_verify!(T: zerocopy::AsBytes => AsBytes for Foo<T>);
|
||||
| +++++++++++++++++++
|
||||
|
||||
error[E0277]: the trait bound `T: zerocopy::Unaligned` is not satisfied
|
||||
--> tests/ui-msrv/invalid-impls/../../../src/macros.rs
|
||||
|
|
||||
| impl<$($tyvar $(: $(? $optbound +)* $($bound +)*)?),*> Subtrait for $ty {}
|
||||
| ^^^^^^^^ the trait `zerocopy::Unaligned` is not implemented for `T`
|
||||
|
|
||||
::: tests/ui-msrv/invalid-impls/invalid-impls.rs:29:1
|
||||
|
|
||||
29 | impl_or_verify!(T => Unaligned for Foo<T>);
|
||||
| ------------------------------------------ in this macro invocation
|
||||
|
|
||||
note: required because of the requirements on the impl of `zerocopy::Unaligned` for `Foo<T>`
|
||||
--> tests/ui-msrv/invalid-impls/invalid-impls.rs:22:42
|
||||
|
|
||||
22 | #[derive(FromZeroes, FromBytes, AsBytes, Unaligned)]
|
||||
| ^^^^^^^^^
|
||||
note: required by a bound in `_::Subtrait`
|
||||
--> tests/ui-msrv/invalid-impls/../../../src/macros.rs
|
||||
|
|
||||
| trait Subtrait: $trait {}
|
||||
| ^^^^^^ required by this bound in `_::Subtrait`
|
||||
|
|
||||
::: tests/ui-msrv/invalid-impls/invalid-impls.rs:29:1
|
||||
|
|
||||
29 | impl_or_verify!(T => Unaligned for Foo<T>);
|
||||
| ------------------------------------------ in this macro invocation
|
||||
= note: this error originates in the macro `impl_or_verify` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
help: consider restricting type parameter `T`
|
||||
|
|
||||
29 | impl_or_verify!(T: zerocopy::Unaligned => Unaligned for Foo<T>);
|
||||
| +++++++++++++++++++++
|
||||
99
third-party/vendor/zerocopy/tests/ui-msrv/max-align.rs
vendored
Normal file
99
third-party/vendor/zerocopy/tests/ui-msrv/max-align.rs
vendored
Normal file
|
|
@ -0,0 +1,99 @@
|
|||
// Copyright 2023 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
#[repr(C, align(1))]
|
||||
struct Align1;
|
||||
|
||||
#[repr(C, align(2))]
|
||||
struct Align2;
|
||||
|
||||
#[repr(C, align(4))]
|
||||
struct Align4;
|
||||
|
||||
#[repr(C, align(8))]
|
||||
struct Align8;
|
||||
|
||||
#[repr(C, align(16))]
|
||||
struct Align16;
|
||||
|
||||
#[repr(C, align(32))]
|
||||
struct Align32;
|
||||
|
||||
#[repr(C, align(64))]
|
||||
struct Align64;
|
||||
|
||||
#[repr(C, align(128))]
|
||||
struct Align128;
|
||||
|
||||
#[repr(C, align(256))]
|
||||
struct Align256;
|
||||
|
||||
#[repr(C, align(512))]
|
||||
struct Align512;
|
||||
|
||||
#[repr(C, align(1024))]
|
||||
struct Align1024;
|
||||
|
||||
#[repr(C, align(2048))]
|
||||
struct Align2048;
|
||||
|
||||
#[repr(C, align(4096))]
|
||||
struct Align4096;
|
||||
|
||||
#[repr(C, align(8192))]
|
||||
struct Align8192;
|
||||
|
||||
#[repr(C, align(16384))]
|
||||
struct Align16384;
|
||||
|
||||
#[repr(C, align(32768))]
|
||||
struct Align32768;
|
||||
|
||||
#[repr(C, align(65536))]
|
||||
struct Align65536;
|
||||
|
||||
#[repr(C, align(131072))]
|
||||
struct Align131072;
|
||||
|
||||
#[repr(C, align(262144))]
|
||||
struct Align262144;
|
||||
|
||||
#[repr(C, align(524288))]
|
||||
struct Align524288;
|
||||
|
||||
#[repr(C, align(1048576))]
|
||||
struct Align1048576;
|
||||
|
||||
#[repr(C, align(2097152))]
|
||||
struct Align2097152;
|
||||
|
||||
#[repr(C, align(4194304))]
|
||||
struct Align4194304;
|
||||
|
||||
#[repr(C, align(8388608))]
|
||||
struct Align8388608;
|
||||
|
||||
#[repr(C, align(16777216))]
|
||||
struct Align16777216;
|
||||
|
||||
#[repr(C, align(33554432))]
|
||||
struct Align33554432;
|
||||
|
||||
#[repr(C, align(67108864))]
|
||||
struct Align67108864;
|
||||
|
||||
#[repr(C, align(134217728))]
|
||||
struct Align13421772;
|
||||
|
||||
#[repr(C, align(268435456))]
|
||||
struct Align26843545;
|
||||
|
||||
#[repr(C, align(1073741824))]
|
||||
struct Align1073741824;
|
||||
|
||||
fn main() {}
|
||||
5
third-party/vendor/zerocopy/tests/ui-msrv/max-align.stderr
vendored
Normal file
5
third-party/vendor/zerocopy/tests/ui-msrv/max-align.stderr
vendored
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
error[E0589]: invalid `repr(align)` attribute: larger than 2^29
|
||||
--> tests/ui-msrv/max-align.rs:96:11
|
||||
|
|
||||
96 | #[repr(C, align(1073741824))]
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
18
third-party/vendor/zerocopy/tests/ui-msrv/transmute-dst-not-frombytes.rs
vendored
Normal file
18
third-party/vendor/zerocopy/tests/ui-msrv/transmute-dst-not-frombytes.rs
vendored
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
// Copyright 2022 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
include!("../../zerocopy-derive/tests/util.rs");
|
||||
|
||||
extern crate zerocopy;
|
||||
|
||||
use zerocopy::transmute;
|
||||
|
||||
fn main() {}
|
||||
|
||||
// `transmute` requires that the destination type implements `FromBytes`
|
||||
const DST_NOT_FROM_BYTES: NotZerocopy = transmute!(AU16(0));
|
||||
12
third-party/vendor/zerocopy/tests/ui-msrv/transmute-dst-not-frombytes.stderr
vendored
Normal file
12
third-party/vendor/zerocopy/tests/ui-msrv/transmute-dst-not-frombytes.stderr
vendored
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
error[E0277]: the trait bound `NotZerocopy: FromBytes` is not satisfied
|
||||
--> tests/ui-msrv/transmute-dst-not-frombytes.rs:18:41
|
||||
|
|
||||
18 | const DST_NOT_FROM_BYTES: NotZerocopy = transmute!(AU16(0));
|
||||
| ^^^^^^^^^^^^^^^^^^^ the trait `FromBytes` is not implemented for `NotZerocopy`
|
||||
|
|
||||
note: required by a bound in `AssertIsFromBytes`
|
||||
--> tests/ui-msrv/transmute-dst-not-frombytes.rs:18:41
|
||||
|
|
||||
18 | const DST_NOT_FROM_BYTES: NotZerocopy = transmute!(AU16(0));
|
||||
| ^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsFromBytes`
|
||||
= note: this error originates in the macro `transmute` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
19
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-alignment-increase.rs
vendored
Normal file
19
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-alignment-increase.rs
vendored
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
// Copyright 2023 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
include!("../../zerocopy-derive/tests/util.rs");
|
||||
|
||||
extern crate zerocopy;
|
||||
|
||||
use zerocopy::transmute_mut;
|
||||
|
||||
fn main() {}
|
||||
|
||||
// `transmute_mut!` does not support transmuting from a type of smaller
|
||||
// alignment to one of larger alignment.
|
||||
const INCREASE_ALIGNMENT: &mut AU16 = transmute_mut!(&mut [0u8; 2]);
|
||||
36
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-alignment-increase.stderr
vendored
Normal file
36
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-alignment-increase.stderr
vendored
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
error[E0512]: cannot transmute between types of different sizes, or dependently-sized types
|
||||
--> tests/ui-msrv/transmute-mut-alignment-increase.rs:19:39
|
||||
|
|
||||
19 | const INCREASE_ALIGNMENT: &mut AU16 = transmute_mut!(&mut [0u8; 2]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: source type: `AlignOf<[u8; 2]>` (8 bits)
|
||||
= note: target type: `MaxAlignsOf<[u8; 2], AU16>` (16 bits)
|
||||
= note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0658]: mutable references are not allowed in constants
|
||||
--> tests/ui-msrv/transmute-mut-alignment-increase.rs:19:54
|
||||
|
|
||||
19 | const INCREASE_ALIGNMENT: &mut AU16 = transmute_mut!(&mut [0u8; 2]);
|
||||
| ^^^^^^^^^^^^^
|
||||
|
|
||||
= note: see issue #57349 <https://github.com/rust-lang/rust/issues/57349> for more information
|
||||
|
||||
error[E0015]: cannot call non-const fn `transmute_mut::<[u8; 2], AU16>` in constants
|
||||
--> tests/ui-msrv/transmute-mut-alignment-increase.rs:19:39
|
||||
|
|
||||
19 | const INCREASE_ALIGNMENT: &mut AU16 = transmute_mut!(&mut [0u8; 2]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||
= note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0716]: temporary value dropped while borrowed
|
||||
--> tests/ui-msrv/transmute-mut-alignment-increase.rs:19:59
|
||||
|
|
||||
19 | const INCREASE_ALIGNMENT: &mut AU16 = transmute_mut!(&mut [0u8; 2]);
|
||||
| --------------------^^^^^^^^-
|
||||
| | |
|
||||
| | creates a temporary which is freed while still in use
|
||||
| temporary value is freed at the end of this statement
|
||||
| using this value as a constant requires that borrow lasts for `'static`
|
||||
20
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-const.rs
vendored
Normal file
20
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-const.rs
vendored
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
// Copyright 2023 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
include!("../../zerocopy-derive/tests/util.rs");
|
||||
|
||||
extern crate zerocopy;
|
||||
|
||||
use zerocopy::transmute_mut;
|
||||
|
||||
fn main() {}
|
||||
|
||||
const ARRAY_OF_U8S: [u8; 2] = [0u8; 2];
|
||||
|
||||
// `transmute_mut!` cannot, generally speaking, be used in const contexts.
|
||||
const CONST_CONTEXT: &mut [u8; 2] = transmute_mut!(&mut ARRAY_OF_U8S);
|
||||
41
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-const.stderr
vendored
Normal file
41
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-const.stderr
vendored
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
warning: taking a mutable reference to a `const` item
|
||||
--> tests/ui-msrv/transmute-mut-const.rs:20:52
|
||||
|
|
||||
20 | const CONST_CONTEXT: &mut [u8; 2] = transmute_mut!(&mut ARRAY_OF_U8S);
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(const_item_mutation)]` on by default
|
||||
= note: each usage of a `const` item creates a new temporary
|
||||
= note: the mutable reference will refer to this temporary, not the original `const` item
|
||||
note: `const` item defined here
|
||||
--> tests/ui-msrv/transmute-mut-const.rs:17:1
|
||||
|
|
||||
17 | const ARRAY_OF_U8S: [u8; 2] = [0u8; 2];
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0658]: mutable references are not allowed in constants
|
||||
--> tests/ui-msrv/transmute-mut-const.rs:20:52
|
||||
|
|
||||
20 | const CONST_CONTEXT: &mut [u8; 2] = transmute_mut!(&mut ARRAY_OF_U8S);
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: see issue #57349 <https://github.com/rust-lang/rust/issues/57349> for more information
|
||||
|
||||
error[E0015]: cannot call non-const fn `transmute_mut::<[u8; 2], [u8; 2]>` in constants
|
||||
--> tests/ui-msrv/transmute-mut-const.rs:20:37
|
||||
|
|
||||
20 | const CONST_CONTEXT: &mut [u8; 2] = transmute_mut!(&mut ARRAY_OF_U8S);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||
= note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0716]: temporary value dropped while borrowed
|
||||
--> tests/ui-msrv/transmute-mut-const.rs:20:57
|
||||
|
|
||||
20 | const CONST_CONTEXT: &mut [u8; 2] = transmute_mut!(&mut ARRAY_OF_U8S);
|
||||
| --------------------^^^^^^^^^^^^-
|
||||
| | |
|
||||
| | creates a temporary which is freed while still in use
|
||||
| temporary value is freed at the end of this statement
|
||||
| using this value as a constant requires that borrow lasts for `'static`
|
||||
18
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-generic.rs
vendored
Normal file
18
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-generic.rs
vendored
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
// Copyright 2023 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
extern crate zerocopy;
|
||||
|
||||
use zerocopy::{transmute_mut, AsBytes, FromBytes};
|
||||
|
||||
fn main() {}
|
||||
|
||||
fn transmute_mut<T: AsBytes + FromBytes>(u: &mut u8) -> &mut T {
|
||||
// `transmute_mut!` requires the destination type to be concrete.
|
||||
transmute_mut!(u)
|
||||
}
|
||||
19
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-generic.stderr
vendored
Normal file
19
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-generic.stderr
vendored
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
error[E0512]: cannot transmute between types of different sizes, or dependently-sized types
|
||||
--> tests/ui-msrv/transmute-mut-dst-generic.rs:17:5
|
||||
|
|
||||
17 | transmute_mut!(u)
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: source type: `u8` (8 bits)
|
||||
= note: target type: `T` (this type does not have a fixed size)
|
||||
= note: this error originates in the macro `$crate::assert_size_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0512]: cannot transmute between types of different sizes, or dependently-sized types
|
||||
--> tests/ui-msrv/transmute-mut-dst-generic.rs:17:5
|
||||
|
|
||||
17 | transmute_mut!(u)
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: source type: `AlignOf<u8>` (8 bits)
|
||||
= note: target type: `MaxAlignsOf<u8, T>` (size can vary because of T)
|
||||
= note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
17
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-a-reference.rs
vendored
Normal file
17
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-a-reference.rs
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
// Copyright 2023 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
extern crate zerocopy;
|
||||
|
||||
use zerocopy::transmute_mut;
|
||||
|
||||
fn main() {}
|
||||
|
||||
// `transmute_mut!` does not support transmuting into a non-reference
|
||||
// destination type.
|
||||
const DST_NOT_A_REFERENCE: usize = transmute_mut!(&mut 0u8);
|
||||
39
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-a-reference.stderr
vendored
Normal file
39
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-a-reference.stderr
vendored
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
error[E0308]: mismatched types
|
||||
--> tests/ui-msrv/transmute-mut-dst-not-a-reference.rs:17:36
|
||||
|
|
||||
17 | const DST_NOT_A_REFERENCE: usize = transmute_mut!(&mut 0u8);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found `&mut _`
|
||||
|
|
||||
= note: expected type `usize`
|
||||
found mutable reference `&mut _`
|
||||
= note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> tests/ui-msrv/transmute-mut-dst-not-a-reference.rs:17:36
|
||||
|
|
||||
17 | const DST_NOT_A_REFERENCE: usize = transmute_mut!(&mut 0u8);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found `&mut _`
|
||||
|
|
||||
= note: expected type `usize`
|
||||
found mutable reference `&mut _`
|
||||
= note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> tests/ui-msrv/transmute-mut-dst-not-a-reference.rs:17:36
|
||||
|
|
||||
17 | const DST_NOT_A_REFERENCE: usize = transmute_mut!(&mut 0u8);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found `&mut _`
|
||||
|
|
||||
= note: expected type `usize`
|
||||
found mutable reference `&mut _`
|
||||
= note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> tests/ui-msrv/transmute-mut-dst-not-a-reference.rs:17:36
|
||||
|
|
||||
17 | const DST_NOT_A_REFERENCE: usize = transmute_mut!(&mut 0u8);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found `&mut _`
|
||||
|
|
||||
= note: expected type `usize`
|
||||
found mutable reference `&mut _`
|
||||
= note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
24
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-asbytes.rs
vendored
Normal file
24
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-asbytes.rs
vendored
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
// Copyright 2023 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
extern crate zerocopy;
|
||||
|
||||
use zerocopy::transmute_mut;
|
||||
|
||||
fn main() {}
|
||||
|
||||
#[derive(zerocopy::FromZeroes, zerocopy::FromBytes, zerocopy::AsBytes)]
|
||||
#[repr(C)]
|
||||
struct Src;
|
||||
|
||||
#[derive(zerocopy::FromZeroes, zerocopy::FromBytes)]
|
||||
#[repr(C)]
|
||||
struct Dst;
|
||||
|
||||
// `transmute_mut` requires that the destination type implements `AsBytes`
|
||||
const DST_NOT_AS_BYTES: &mut Dst = transmute_mut!(&mut Src);
|
||||
12
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-asbytes.stderr
vendored
Normal file
12
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-asbytes.stderr
vendored
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
error[E0277]: the trait bound `Dst: AsBytes` is not satisfied
|
||||
--> tests/ui-msrv/transmute-mut-dst-not-asbytes.rs:24:36
|
||||
|
|
||||
24 | const DST_NOT_AS_BYTES: &mut Dst = transmute_mut!(&mut Src);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `AsBytes` is not implemented for `Dst`
|
||||
|
|
||||
note: required by a bound in `AssertDstIsAsBytes`
|
||||
--> tests/ui-msrv/transmute-mut-dst-not-asbytes.rs:24:36
|
||||
|
|
||||
24 | const DST_NOT_AS_BYTES: &mut Dst = transmute_mut!(&mut Src);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertDstIsAsBytes`
|
||||
= note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
24
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-frombytes.rs
vendored
Normal file
24
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-frombytes.rs
vendored
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
// Copyright 2023 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
extern crate zerocopy;
|
||||
|
||||
use zerocopy::transmute_mut;
|
||||
|
||||
fn main() {}
|
||||
|
||||
#[derive(zerocopy::FromZeroes, zerocopy::FromBytes, zerocopy::AsBytes)]
|
||||
#[repr(C)]
|
||||
struct Src;
|
||||
|
||||
#[derive(zerocopy::AsBytes)]
|
||||
#[repr(C)]
|
||||
struct Dst;
|
||||
|
||||
// `transmute_mut` requires that the destination type implements `FromBytes`
|
||||
const DST_NOT_FROM_BYTES: &mut Dst = transmute_mut!(&mut Src);
|
||||
12
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-frombytes.stderr
vendored
Normal file
12
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-not-frombytes.stderr
vendored
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
error[E0277]: the trait bound `Dst: FromBytes` is not satisfied
|
||||
--> tests/ui-msrv/transmute-mut-dst-not-frombytes.rs:24:38
|
||||
|
|
||||
24 | const DST_NOT_FROM_BYTES: &mut Dst = transmute_mut!(&mut Src);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `FromBytes` is not implemented for `Dst`
|
||||
|
|
||||
note: required by a bound in `AssertDstIsFromBytes`
|
||||
--> tests/ui-msrv/transmute-mut-dst-not-frombytes.rs:24:38
|
||||
|
|
||||
24 | const DST_NOT_FROM_BYTES: &mut Dst = transmute_mut!(&mut Src);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertDstIsFromBytes`
|
||||
= note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
17
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-unsized.rs
vendored
Normal file
17
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-unsized.rs
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
// Copyright 2023 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
extern crate zerocopy;
|
||||
|
||||
use zerocopy::transmute_mut;
|
||||
|
||||
fn main() {}
|
||||
|
||||
// `transmute_mut!` does not support transmuting into an unsized destination
|
||||
// type.
|
||||
const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]);
|
||||
108
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-unsized.stderr
vendored
Normal file
108
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-dst-unsized.stderr
vendored
Normal file
|
|
@ -0,0 +1,108 @@
|
|||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-dst-unsized.rs:17:32
|
||||
|
|
||||
17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `AssertDstIsFromBytes`
|
||||
--> tests/ui-msrv/transmute-mut-dst-unsized.rs:17:32
|
||||
|
|
||||
17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertDstIsFromBytes`
|
||||
= note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-dst-unsized.rs:17:32
|
||||
|
|
||||
17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `AssertDstIsAsBytes`
|
||||
--> tests/ui-msrv/transmute-mut-dst-unsized.rs:17:32
|
||||
|
|
||||
17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertDstIsAsBytes`
|
||||
= note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-dst-unsized.rs:17:32
|
||||
|
|
||||
17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
= note: all local variables must have a statically known size
|
||||
= help: unsized locals are gated as an unstable feature
|
||||
= note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-dst-unsized.rs:17:32
|
||||
|
|
||||
17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `MaxAlignsOf`
|
||||
--> src/macro_util.rs
|
||||
|
|
||||
| pub union MaxAlignsOf<T, U> {
|
||||
| ^ required by this bound in `MaxAlignsOf`
|
||||
= note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-dst-unsized.rs:17:32
|
||||
|
|
||||
17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `transmute`
|
||||
--> $RUST/core/src/intrinsics.rs
|
||||
|
|
||||
| pub fn transmute<T, U>(e: T) -> U;
|
||||
| ^ required by this bound in `transmute`
|
||||
= note: this error originates in the macro `$crate::assert_size_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-dst-unsized.rs:17:32
|
||||
|
|
||||
17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `MaxAlignsOf::<T, U>::new`
|
||||
--> src/macro_util.rs
|
||||
|
|
||||
| impl<T, U> MaxAlignsOf<T, U> {
|
||||
| ^ required by this bound in `MaxAlignsOf::<T, U>::new`
|
||||
= note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-dst-unsized.rs:17:32
|
||||
|
|
||||
17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `MaxAlignsOf`
|
||||
--> src/macro_util.rs
|
||||
|
|
||||
| pub union MaxAlignsOf<T, U> {
|
||||
| ^ required by this bound in `MaxAlignsOf`
|
||||
= note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-dst-unsized.rs:17:32
|
||||
|
|
||||
17 | const DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8; 1]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `transmute_mut`
|
||||
--> src/macro_util.rs
|
||||
|
|
||||
| pub unsafe fn transmute_mut<'dst, 'src: 'dst, Src: 'src, Dst: 'dst>(
|
||||
| ^^^ required by this bound in `transmute_mut`
|
||||
= note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
15
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-illegal-lifetime.rs
vendored
Normal file
15
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-illegal-lifetime.rs
vendored
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
// Copyright 2023 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
fn main() {}
|
||||
|
||||
fn increase_lifetime() {
|
||||
let mut x = 0u64;
|
||||
// It is illegal to increase the lifetime scope.
|
||||
let _: &'static mut u64 = zerocopy::transmute_mut!(&mut x);
|
||||
}
|
||||
9
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-illegal-lifetime.stderr
vendored
Normal file
9
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-illegal-lifetime.stderr
vendored
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
error[E0597]: `x` does not live long enough
|
||||
--> tests/ui-msrv/transmute-mut-illegal-lifetime.rs:14:56
|
||||
|
|
||||
14 | let _: &'static mut u64 = zerocopy::transmute_mut!(&mut x);
|
||||
| ---------------- ^^^^^^ borrowed value does not live long enough
|
||||
| |
|
||||
| type annotation requires that `x` is borrowed for `'static`
|
||||
15 | }
|
||||
| - `x` dropped here while still borrowed
|
||||
17
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-size-decrease.rs
vendored
Normal file
17
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-size-decrease.rs
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
// Copyright 2023 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
extern crate zerocopy;
|
||||
|
||||
use zerocopy::transmute_mut;
|
||||
|
||||
fn main() {}
|
||||
|
||||
// We require that the size of the destination type is not smaller than the size
|
||||
// of the source type.
|
||||
const DECREASE_SIZE: &mut u8 = transmute_mut!(&mut [0u8; 2]);
|
||||
36
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-size-decrease.stderr
vendored
Normal file
36
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-size-decrease.stderr
vendored
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
error[E0512]: cannot transmute between types of different sizes, or dependently-sized types
|
||||
--> tests/ui-msrv/transmute-mut-size-decrease.rs:17:32
|
||||
|
|
||||
17 | const DECREASE_SIZE: &mut u8 = transmute_mut!(&mut [0u8; 2]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: source type: `[u8; 2]` (16 bits)
|
||||
= note: target type: `u8` (8 bits)
|
||||
= note: this error originates in the macro `$crate::assert_size_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0658]: mutable references are not allowed in constants
|
||||
--> tests/ui-msrv/transmute-mut-size-decrease.rs:17:47
|
||||
|
|
||||
17 | const DECREASE_SIZE: &mut u8 = transmute_mut!(&mut [0u8; 2]);
|
||||
| ^^^^^^^^^^^^^
|
||||
|
|
||||
= note: see issue #57349 <https://github.com/rust-lang/rust/issues/57349> for more information
|
||||
|
||||
error[E0015]: cannot call non-const fn `transmute_mut::<[u8; 2], u8>` in constants
|
||||
--> tests/ui-msrv/transmute-mut-size-decrease.rs:17:32
|
||||
|
|
||||
17 | const DECREASE_SIZE: &mut u8 = transmute_mut!(&mut [0u8; 2]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||
= note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0716]: temporary value dropped while borrowed
|
||||
--> tests/ui-msrv/transmute-mut-size-decrease.rs:17:52
|
||||
|
|
||||
17 | const DECREASE_SIZE: &mut u8 = transmute_mut!(&mut [0u8; 2]);
|
||||
| --------------------^^^^^^^^-
|
||||
| | |
|
||||
| | creates a temporary which is freed while still in use
|
||||
| temporary value is freed at the end of this statement
|
||||
| using this value as a constant requires that borrow lasts for `'static`
|
||||
17
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-size-increase.rs
vendored
Normal file
17
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-size-increase.rs
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
// Copyright 2023 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
extern crate zerocopy;
|
||||
|
||||
use zerocopy::transmute_mut;
|
||||
|
||||
fn main() {}
|
||||
|
||||
// `transmute_mut!` does not support transmuting from a smaller type to a larger
|
||||
// one.
|
||||
const INCREASE_SIZE: &mut [u8; 2] = transmute_mut!(&mut 0u8);
|
||||
36
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-size-increase.stderr
vendored
Normal file
36
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-size-increase.stderr
vendored
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
error[E0512]: cannot transmute between types of different sizes, or dependently-sized types
|
||||
--> tests/ui-msrv/transmute-mut-size-increase.rs:17:37
|
||||
|
|
||||
17 | const INCREASE_SIZE: &mut [u8; 2] = transmute_mut!(&mut 0u8);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: source type: `u8` (8 bits)
|
||||
= note: target type: `[u8; 2]` (16 bits)
|
||||
= note: this error originates in the macro `$crate::assert_size_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0658]: mutable references are not allowed in constants
|
||||
--> tests/ui-msrv/transmute-mut-size-increase.rs:17:52
|
||||
|
|
||||
17 | const INCREASE_SIZE: &mut [u8; 2] = transmute_mut!(&mut 0u8);
|
||||
| ^^^^^^^^
|
||||
|
|
||||
= note: see issue #57349 <https://github.com/rust-lang/rust/issues/57349> for more information
|
||||
|
||||
error[E0015]: cannot call non-const fn `transmute_mut::<u8, [u8; 2]>` in constants
|
||||
--> tests/ui-msrv/transmute-mut-size-increase.rs:17:37
|
||||
|
|
||||
17 | const INCREASE_SIZE: &mut [u8; 2] = transmute_mut!(&mut 0u8);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: calls in constants are limited to constant functions, tuple structs and tuple variants
|
||||
= note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0716]: temporary value dropped while borrowed
|
||||
--> tests/ui-msrv/transmute-mut-size-increase.rs:17:57
|
||||
|
|
||||
17 | const INCREASE_SIZE: &mut [u8; 2] = transmute_mut!(&mut 0u8);
|
||||
| --------------------^^^-
|
||||
| | |
|
||||
| | creates a temporary which is freed while still in use
|
||||
| temporary value is freed at the end of this statement
|
||||
| using this value as a constant requires that borrow lasts for `'static`
|
||||
19
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-generic.rs
vendored
Normal file
19
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-generic.rs
vendored
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
// Copyright 2023 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
extern crate zerocopy;
|
||||
|
||||
use zerocopy::{transmute_mut, AsBytes, FromBytes};
|
||||
|
||||
fn main() {}
|
||||
|
||||
fn transmute_mut<T: AsBytes + FromBytes, U: AsBytes + FromBytes>(t: &mut T) -> &mut U {
|
||||
// `transmute_mut!` requires the source and destination types to be
|
||||
// concrete.
|
||||
transmute_mut!(t)
|
||||
}
|
||||
19
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-generic.stderr
vendored
Normal file
19
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-generic.stderr
vendored
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
error[E0512]: cannot transmute between types of different sizes, or dependently-sized types
|
||||
--> tests/ui-msrv/transmute-mut-src-dst-generic.rs:18:5
|
||||
|
|
||||
18 | transmute_mut!(t)
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: source type: `T` (this type does not have a fixed size)
|
||||
= note: target type: `U` (this type does not have a fixed size)
|
||||
= note: this error originates in the macro `$crate::assert_size_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0512]: cannot transmute between types of different sizes, or dependently-sized types
|
||||
--> tests/ui-msrv/transmute-mut-src-dst-generic.rs:18:5
|
||||
|
|
||||
18 | transmute_mut!(t)
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: source type: `AlignOf<T>` (size can vary because of T)
|
||||
= note: target type: `MaxAlignsOf<T, U>` (size can vary because of T)
|
||||
= note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
17
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-not-references.rs
vendored
Normal file
17
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-not-references.rs
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
// Copyright 2023 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
extern crate zerocopy;
|
||||
|
||||
use zerocopy::transmute_mut;
|
||||
|
||||
fn main() {}
|
||||
|
||||
// `transmute_mut!` does not support transmuting between non-reference source
|
||||
// and destination types.
|
||||
const SRC_DST_NOT_REFERENCES: &mut usize = transmute_mut!(0usize);
|
||||
12
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-not-references.stderr
vendored
Normal file
12
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-not-references.stderr
vendored
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
error[E0308]: mismatched types
|
||||
--> tests/ui-msrv/transmute-mut-src-dst-not-references.rs:17:59
|
||||
|
|
||||
17 | const SRC_DST_NOT_REFERENCES: &mut usize = transmute_mut!(0usize);
|
||||
| ---------------^^^^^^-
|
||||
| | |
|
||||
| | expected `&mut _`, found `usize`
|
||||
| | help: consider mutably borrowing here: `&mut 0usize`
|
||||
| expected due to this
|
||||
|
|
||||
= note: expected mutable reference `&mut _`
|
||||
found type `usize`
|
||||
17
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-unsized.rs
vendored
Normal file
17
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-unsized.rs
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
// Copyright 2023 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
extern crate zerocopy;
|
||||
|
||||
use zerocopy::transmute_mut;
|
||||
|
||||
fn main() {}
|
||||
|
||||
// `transmute_mut!` does not support transmuting between unsized source and
|
||||
// destination types.
|
||||
const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]);
|
||||
237
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-unsized.stderr
vendored
Normal file
237
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-dst-unsized.stderr
vendored
Normal file
|
|
@ -0,0 +1,237 @@
|
|||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `AssertSrcIsFromBytes`
|
||||
--> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsFromBytes`
|
||||
= note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `AssertSrcIsFromBytes`
|
||||
--> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsFromBytes`
|
||||
= note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `AssertSrcIsAsBytes`
|
||||
--> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsAsBytes`
|
||||
= note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `AssertSrcIsAsBytes`
|
||||
--> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsAsBytes`
|
||||
= note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `AssertDstIsFromBytes`
|
||||
--> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertDstIsFromBytes`
|
||||
= note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `AssertDstIsAsBytes`
|
||||
--> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertDstIsAsBytes`
|
||||
= note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
= note: all local variables must have a statically known size
|
||||
= help: unsized locals are gated as an unstable feature
|
||||
= note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `transmute`
|
||||
--> $RUST/core/src/intrinsics.rs
|
||||
|
|
||||
| pub fn transmute<T, U>(e: T) -> U;
|
||||
| ^ required by this bound in `transmute`
|
||||
= note: this error originates in the macro `$crate::assert_size_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `AlignOf::<T>::into_t`
|
||||
--> src/macro_util.rs
|
||||
|
|
||||
| impl<T> AlignOf<T> {
|
||||
| ^ required by this bound in `AlignOf::<T>::into_t`
|
||||
= note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
= note: the left-hand-side of an assignment must have a statically known size
|
||||
= note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `AlignOf`
|
||||
--> src/macro_util.rs
|
||||
|
|
||||
| pub struct AlignOf<T> {
|
||||
| ^ required by this bound in `AlignOf`
|
||||
= note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `MaxAlignsOf::<T, U>::new`
|
||||
--> src/macro_util.rs
|
||||
|
|
||||
| impl<T, U> MaxAlignsOf<T, U> {
|
||||
| ^ required by this bound in `MaxAlignsOf::<T, U>::new`
|
||||
= note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `MaxAlignsOf`
|
||||
--> src/macro_util.rs
|
||||
|
|
||||
| pub union MaxAlignsOf<T, U> {
|
||||
| ^ required by this bound in `MaxAlignsOf`
|
||||
= note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `MaxAlignsOf`
|
||||
--> src/macro_util.rs
|
||||
|
|
||||
| pub union MaxAlignsOf<T, U> {
|
||||
| ^ required by this bound in `MaxAlignsOf`
|
||||
= note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `AlignOf`
|
||||
--> src/macro_util.rs
|
||||
|
|
||||
| pub struct AlignOf<T> {
|
||||
| ^ required by this bound in `AlignOf`
|
||||
= note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
= note: all local variables must have a statically known size
|
||||
= help: unsized locals are gated as an unstable feature
|
||||
= note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `transmute_mut`
|
||||
--> src/macro_util.rs
|
||||
|
|
||||
| pub unsafe fn transmute_mut<'dst, 'src: 'dst, Src: 'src, Dst: 'dst>(
|
||||
| ^^^ required by this bound in `transmute_mut`
|
||||
= note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-src-dst-unsized.rs:17:36
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &mut [u8] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
= note: all function arguments must have a statically known size
|
||||
= note: this error originates in the macro `$crate::assert_size_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
18
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-generic.rs
vendored
Normal file
18
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-generic.rs
vendored
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
// Copyright 2023 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
extern crate zerocopy;
|
||||
|
||||
use zerocopy::{transmute_mut, AsBytes};
|
||||
|
||||
fn main() {}
|
||||
|
||||
fn transmute_mut<T: AsBytes + FromBytes>(t: &mut T) -> &mut u8 {
|
||||
// `transmute_mut!` requires the source type to be concrete.
|
||||
transmute_mut!(t)
|
||||
}
|
||||
10
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-generic.stderr
vendored
Normal file
10
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-generic.stderr
vendored
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
error[E0405]: cannot find trait `FromBytes` in this scope
|
||||
--> tests/ui-msrv/transmute-mut-src-generic.rs:15:31
|
||||
|
|
||||
15 | fn transmute_mut<T: AsBytes + FromBytes>(t: &mut T) -> &mut u8 {
|
||||
| ^^^^^^^^^ not found in this scope
|
||||
|
|
||||
help: consider importing this trait
|
||||
|
|
||||
11 | use zerocopy::FromBytes;
|
||||
|
|
||||
18
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-immutable.rs
vendored
Normal file
18
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-immutable.rs
vendored
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
// Copyright 2023 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
extern crate zerocopy;
|
||||
|
||||
use zerocopy::transmute_mut;
|
||||
|
||||
fn main() {}
|
||||
|
||||
fn ref_src_immutable() {
|
||||
// `transmute_mut!` requires that its source type be a mutable reference.
|
||||
let _: &mut u8 = transmute_mut!(&0u8);
|
||||
}
|
||||
11
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-immutable.stderr
vendored
Normal file
11
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-immutable.stderr
vendored
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
error[E0308]: mismatched types
|
||||
--> tests/ui-msrv/transmute-mut-src-immutable.rs:17:37
|
||||
|
|
||||
17 | let _: &mut u8 = transmute_mut!(&0u8);
|
||||
| ---------------^^^^-
|
||||
| | |
|
||||
| | types differ in mutability
|
||||
| expected due to this
|
||||
|
|
||||
= note: expected mutable reference `&mut _`
|
||||
found reference `&u8`
|
||||
17
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-a-reference.rs
vendored
Normal file
17
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-a-reference.rs
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
// Copyright 2023 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
extern crate zerocopy;
|
||||
|
||||
use zerocopy::transmute_mut;
|
||||
|
||||
fn main() {}
|
||||
|
||||
// `transmute_mut!` does not support transmuting from a non-reference source
|
||||
// type.
|
||||
const SRC_NOT_A_REFERENCE: &mut u8 = transmute_mut!(0usize);
|
||||
12
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-a-reference.stderr
vendored
Normal file
12
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-a-reference.stderr
vendored
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
error[E0308]: mismatched types
|
||||
--> tests/ui-msrv/transmute-mut-src-not-a-reference.rs:17:53
|
||||
|
|
||||
17 | const SRC_NOT_A_REFERENCE: &mut u8 = transmute_mut!(0usize);
|
||||
| ---------------^^^^^^-
|
||||
| | |
|
||||
| | expected `&mut _`, found `usize`
|
||||
| | help: consider mutably borrowing here: `&mut 0usize`
|
||||
| expected due to this
|
||||
|
|
||||
= note: expected mutable reference `&mut _`
|
||||
found type `usize`
|
||||
24
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-asbytes.rs
vendored
Normal file
24
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-asbytes.rs
vendored
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
// Copyright 2023 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
extern crate zerocopy;
|
||||
|
||||
use zerocopy::transmute_mut;
|
||||
|
||||
fn main() {}
|
||||
|
||||
#[derive(zerocopy::FromZeroes, zerocopy::FromBytes)]
|
||||
#[repr(C)]
|
||||
struct Src;
|
||||
|
||||
#[derive(zerocopy::FromZeroes, zerocopy::FromBytes, zerocopy::AsBytes)]
|
||||
#[repr(C)]
|
||||
struct Dst;
|
||||
|
||||
// `transmute_mut` requires that the source type implements `AsBytes`
|
||||
const SRC_NOT_AS_BYTES: &mut Dst = transmute_mut!(&mut Src);
|
||||
25
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-asbytes.stderr
vendored
Normal file
25
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-asbytes.stderr
vendored
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
error[E0277]: the trait bound `Src: AsBytes` is not satisfied
|
||||
--> tests/ui-msrv/transmute-mut-src-not-asbytes.rs:24:36
|
||||
|
|
||||
24 | const SRC_NOT_AS_BYTES: &mut Dst = transmute_mut!(&mut Src);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `AsBytes` is not implemented for `Src`
|
||||
|
|
||||
note: required by a bound in `AssertSrcIsAsBytes`
|
||||
--> tests/ui-msrv/transmute-mut-src-not-asbytes.rs:24:36
|
||||
|
|
||||
24 | const SRC_NOT_AS_BYTES: &mut Dst = transmute_mut!(&mut Src);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsAsBytes`
|
||||
= note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the trait bound `Src: AsBytes` is not satisfied
|
||||
--> tests/ui-msrv/transmute-mut-src-not-asbytes.rs:24:36
|
||||
|
|
||||
24 | const SRC_NOT_AS_BYTES: &mut Dst = transmute_mut!(&mut Src);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `AsBytes` is not implemented for `Src`
|
||||
|
|
||||
note: required by a bound in `AssertSrcIsAsBytes`
|
||||
--> tests/ui-msrv/transmute-mut-src-not-asbytes.rs:24:36
|
||||
|
|
||||
24 | const SRC_NOT_AS_BYTES: &mut Dst = transmute_mut!(&mut Src);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsAsBytes`
|
||||
= note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
24
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-frombytes.rs
vendored
Normal file
24
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-frombytes.rs
vendored
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
// Copyright 2023 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
extern crate zerocopy;
|
||||
|
||||
use zerocopy::transmute_mut;
|
||||
|
||||
fn main() {}
|
||||
|
||||
#[derive(zerocopy::AsBytes)]
|
||||
#[repr(C)]
|
||||
struct Src;
|
||||
|
||||
#[derive(zerocopy::FromZeroes, zerocopy::FromBytes, zerocopy::AsBytes)]
|
||||
#[repr(C)]
|
||||
struct Dst;
|
||||
|
||||
// `transmute_mut` requires that the source type implements `FromBytes`
|
||||
const SRC_NOT_FROM_BYTES: &mut Dst = transmute_mut!(&mut Src);
|
||||
25
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-frombytes.stderr
vendored
Normal file
25
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-not-frombytes.stderr
vendored
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
error[E0277]: the trait bound `Src: FromBytes` is not satisfied
|
||||
--> tests/ui-msrv/transmute-mut-src-not-frombytes.rs:24:38
|
||||
|
|
||||
24 | const SRC_NOT_FROM_BYTES: &mut Dst = transmute_mut!(&mut Src);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `FromBytes` is not implemented for `Src`
|
||||
|
|
||||
note: required by a bound in `AssertSrcIsFromBytes`
|
||||
--> tests/ui-msrv/transmute-mut-src-not-frombytes.rs:24:38
|
||||
|
|
||||
24 | const SRC_NOT_FROM_BYTES: &mut Dst = transmute_mut!(&mut Src);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsFromBytes`
|
||||
= note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the trait bound `Src: FromBytes` is not satisfied
|
||||
--> tests/ui-msrv/transmute-mut-src-not-frombytes.rs:24:38
|
||||
|
|
||||
24 | const SRC_NOT_FROM_BYTES: &mut Dst = transmute_mut!(&mut Src);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `FromBytes` is not implemented for `Src`
|
||||
|
|
||||
note: required by a bound in `AssertSrcIsFromBytes`
|
||||
--> tests/ui-msrv/transmute-mut-src-not-frombytes.rs:24:38
|
||||
|
|
||||
24 | const SRC_NOT_FROM_BYTES: &mut Dst = transmute_mut!(&mut Src);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsFromBytes`
|
||||
= note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
16
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-unsized.rs
vendored
Normal file
16
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-unsized.rs
vendored
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
// Copyright 2023 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
extern crate zerocopy;
|
||||
|
||||
use zerocopy::transmute_mut;
|
||||
|
||||
fn main() {}
|
||||
|
||||
// `transmute_mut!` does not support transmuting from an unsized source type.
|
||||
const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]);
|
||||
198
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-unsized.stderr
vendored
Normal file
198
third-party/vendor/zerocopy/tests/ui-msrv/transmute-mut-src-unsized.stderr
vendored
Normal file
|
|
@ -0,0 +1,198 @@
|
|||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35
|
||||
|
|
||||
16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `AssertSrcIsFromBytes`
|
||||
--> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35
|
||||
|
|
||||
16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsFromBytes`
|
||||
= note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35
|
||||
|
|
||||
16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `AssertSrcIsFromBytes`
|
||||
--> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35
|
||||
|
|
||||
16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsFromBytes`
|
||||
= note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35
|
||||
|
|
||||
16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `AssertSrcIsAsBytes`
|
||||
--> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35
|
||||
|
|
||||
16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsAsBytes`
|
||||
= note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35
|
||||
|
|
||||
16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `AssertSrcIsAsBytes`
|
||||
--> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35
|
||||
|
|
||||
16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertSrcIsAsBytes`
|
||||
= note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35
|
||||
|
|
||||
16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
= note: all local variables must have a statically known size
|
||||
= help: unsized locals are gated as an unstable feature
|
||||
= note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35
|
||||
|
|
||||
16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `transmute`
|
||||
--> $RUST/core/src/intrinsics.rs
|
||||
|
|
||||
| pub fn transmute<T, U>(e: T) -> U;
|
||||
| ^ required by this bound in `transmute`
|
||||
= note: this error originates in the macro `$crate::assert_size_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35
|
||||
|
|
||||
16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `AlignOf::<T>::into_t`
|
||||
--> src/macro_util.rs
|
||||
|
|
||||
| impl<T> AlignOf<T> {
|
||||
| ^ required by this bound in `AlignOf::<T>::into_t`
|
||||
= note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35
|
||||
|
|
||||
16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
= note: the left-hand-side of an assignment must have a statically known size
|
||||
= note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35
|
||||
|
|
||||
16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `AlignOf`
|
||||
--> src/macro_util.rs
|
||||
|
|
||||
| pub struct AlignOf<T> {
|
||||
| ^ required by this bound in `AlignOf`
|
||||
= note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35
|
||||
|
|
||||
16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `MaxAlignsOf::<T, U>::new`
|
||||
--> src/macro_util.rs
|
||||
|
|
||||
| impl<T, U> MaxAlignsOf<T, U> {
|
||||
| ^ required by this bound in `MaxAlignsOf::<T, U>::new`
|
||||
= note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35
|
||||
|
|
||||
16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `MaxAlignsOf`
|
||||
--> src/macro_util.rs
|
||||
|
|
||||
| pub union MaxAlignsOf<T, U> {
|
||||
| ^ required by this bound in `MaxAlignsOf`
|
||||
= note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35
|
||||
|
|
||||
16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `MaxAlignsOf`
|
||||
--> src/macro_util.rs
|
||||
|
|
||||
| pub union MaxAlignsOf<T, U> {
|
||||
| ^ required by this bound in `MaxAlignsOf`
|
||||
= note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35
|
||||
|
|
||||
16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `AlignOf`
|
||||
--> src/macro_util.rs
|
||||
|
|
||||
| pub struct AlignOf<T> {
|
||||
| ^ required by this bound in `AlignOf`
|
||||
= note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35
|
||||
|
|
||||
16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `transmute_mut`
|
||||
--> src/macro_util.rs
|
||||
|
|
||||
| pub unsafe fn transmute_mut<'dst, 'src: 'dst, Src: 'src, Dst: 'dst>(
|
||||
| ^^^ required by this bound in `transmute_mut`
|
||||
= note: this error originates in the macro `transmute_mut` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-mut-src-unsized.rs:16:35
|
||||
|
|
||||
16 | const SRC_UNSIZED: &mut [u8; 1] = transmute_mut!(&mut [0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
= note: all function arguments must have a statically known size
|
||||
= note: this error originates in the macro `$crate::assert_size_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
20
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ptr-to-usize.rs
vendored
Normal file
20
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ptr-to-usize.rs
vendored
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
// Copyright 2022 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
extern crate zerocopy;
|
||||
|
||||
use zerocopy::transmute;
|
||||
|
||||
fn main() {}
|
||||
|
||||
// It is unclear whether we can or should support this transmutation, especially
|
||||
// in a const context. This test ensures that even if such a transmutation
|
||||
// becomes valid due to the requisite implementations of `FromBytes` being
|
||||
// added, that we re-examine whether it should specifically be valid in a const
|
||||
// context.
|
||||
const POINTER_VALUE: usize = transmute!(&0usize as *const usize);
|
||||
37
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ptr-to-usize.stderr
vendored
Normal file
37
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ptr-to-usize.stderr
vendored
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
error[E0277]: the trait bound `*const usize: AsBytes` is not satisfied
|
||||
--> tests/ui-msrv/transmute-ptr-to-usize.rs:20:30
|
||||
|
|
||||
20 | const POINTER_VALUE: usize = transmute!(&0usize as *const usize);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `AsBytes` is not implemented for `*const usize`
|
||||
|
|
||||
= help: the following implementations were found:
|
||||
<usize as AsBytes>
|
||||
<f32 as AsBytes>
|
||||
<f64 as AsBytes>
|
||||
<i128 as AsBytes>
|
||||
and $N others
|
||||
note: required by a bound in `AssertIsAsBytes`
|
||||
--> tests/ui-msrv/transmute-ptr-to-usize.rs:20:30
|
||||
|
|
||||
20 | const POINTER_VALUE: usize = transmute!(&0usize as *const usize);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsAsBytes`
|
||||
= note: this error originates in the macro `transmute` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the trait bound `*const usize: AsBytes` is not satisfied
|
||||
--> tests/ui-msrv/transmute-ptr-to-usize.rs:20:30
|
||||
|
|
||||
20 | const POINTER_VALUE: usize = transmute!(&0usize as *const usize);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `AsBytes` is not implemented for `*const usize`
|
||||
|
|
||||
= help: the following implementations were found:
|
||||
<usize as AsBytes>
|
||||
<f32 as AsBytes>
|
||||
<f64 as AsBytes>
|
||||
<i128 as AsBytes>
|
||||
and $N others
|
||||
note: required by a bound in `AssertIsAsBytes`
|
||||
--> tests/ui-msrv/transmute-ptr-to-usize.rs:20:30
|
||||
|
|
||||
20 | const POINTER_VALUE: usize = transmute!(&0usize as *const usize);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsAsBytes`
|
||||
= note: this error originates in the macro `transmute` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
19
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-alignment-increase.rs
vendored
Normal file
19
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-alignment-increase.rs
vendored
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
// Copyright 2023 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
include!("../../zerocopy-derive/tests/util.rs");
|
||||
|
||||
extern crate zerocopy;
|
||||
|
||||
use zerocopy::transmute_ref;
|
||||
|
||||
fn main() {}
|
||||
|
||||
// `transmute_ref!` does not support transmuting from a type of smaller
|
||||
// alignment to one of larger alignment.
|
||||
const INCREASE_ALIGNMENT: &AU16 = transmute_ref!(&[0u8; 2]);
|
||||
9
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-alignment-increase.stderr
vendored
Normal file
9
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-alignment-increase.stderr
vendored
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
error[E0512]: cannot transmute between types of different sizes, or dependently-sized types
|
||||
--> tests/ui-msrv/transmute-ref-alignment-increase.rs:19:35
|
||||
|
|
||||
19 | const INCREASE_ALIGNMENT: &AU16 = transmute_ref!(&[0u8; 2]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: source type: `AlignOf<[u8; 2]>` (8 bits)
|
||||
= note: target type: `MaxAlignsOf<[u8; 2], AU16>` (16 bits)
|
||||
= note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
18
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-generic.rs
vendored
Normal file
18
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-generic.rs
vendored
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
// Copyright 2023 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
extern crate zerocopy;
|
||||
|
||||
use zerocopy::{transmute_ref, FromBytes};
|
||||
|
||||
fn main() {}
|
||||
|
||||
fn transmute_ref<T: FromBytes>(u: &u8) -> &T {
|
||||
// `transmute_ref!` requires the destination type to be concrete.
|
||||
transmute_ref!(u)
|
||||
}
|
||||
19
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-generic.stderr
vendored
Normal file
19
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-generic.stderr
vendored
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
error[E0512]: cannot transmute between types of different sizes, or dependently-sized types
|
||||
--> tests/ui-msrv/transmute-ref-dst-generic.rs:17:5
|
||||
|
|
||||
17 | transmute_ref!(u)
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: source type: `u8` (8 bits)
|
||||
= note: target type: `T` (this type does not have a fixed size)
|
||||
= note: this error originates in the macro `$crate::assert_size_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0512]: cannot transmute between types of different sizes, or dependently-sized types
|
||||
--> tests/ui-msrv/transmute-ref-dst-generic.rs:17:5
|
||||
|
|
||||
17 | transmute_ref!(u)
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: source type: `AlignOf<u8>` (8 bits)
|
||||
= note: target type: `MaxAlignsOf<u8, T>` (size can vary because of T)
|
||||
= note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
19
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-mutable.rs
vendored
Normal file
19
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-mutable.rs
vendored
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
// Copyright 2023 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
extern crate zerocopy;
|
||||
|
||||
use zerocopy::transmute_ref;
|
||||
|
||||
fn main() {}
|
||||
|
||||
fn ref_dst_mutable() {
|
||||
// `transmute_ref!` requires that its destination type be an immutable
|
||||
// reference.
|
||||
let _: &mut u8 = transmute_ref!(&0u8);
|
||||
}
|
||||
29
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-mutable.stderr
vendored
Normal file
29
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-mutable.stderr
vendored
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
error[E0308]: mismatched types
|
||||
--> tests/ui-msrv/transmute-ref-dst-mutable.rs:18:22
|
||||
|
|
||||
18 | let _: &mut u8 = transmute_ref!(&0u8);
|
||||
| ^^^^^^^^^^^^^^^^^^^^ types differ in mutability
|
||||
|
|
||||
= note: expected mutable reference `&mut u8`
|
||||
found reference `&_`
|
||||
= note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> tests/ui-msrv/transmute-ref-dst-mutable.rs:18:22
|
||||
|
|
||||
18 | let _: &mut u8 = transmute_ref!(&0u8);
|
||||
| ^^^^^^^^^^^^^^^^^^^^ types differ in mutability
|
||||
|
|
||||
= note: expected mutable reference `&mut u8`
|
||||
found reference `&_`
|
||||
= note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> tests/ui-msrv/transmute-ref-dst-mutable.rs:18:22
|
||||
|
|
||||
18 | let _: &mut u8 = transmute_ref!(&0u8);
|
||||
| ^^^^^^^^^^^^^^^^^^^^ types differ in mutability
|
||||
|
|
||||
= note: expected mutable reference `&mut u8`
|
||||
found reference `&_`
|
||||
= note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
17
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-not-a-reference.rs
vendored
Normal file
17
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-not-a-reference.rs
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
// Copyright 2023 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
extern crate zerocopy;
|
||||
|
||||
use zerocopy::transmute_ref;
|
||||
|
||||
fn main() {}
|
||||
|
||||
// `transmute_ref!` does not support transmuting into a non-reference
|
||||
// destination type.
|
||||
const DST_NOT_A_REFERENCE: usize = transmute_ref!(&0u8);
|
||||
29
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-not-a-reference.stderr
vendored
Normal file
29
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-not-a-reference.stderr
vendored
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
error[E0308]: mismatched types
|
||||
--> tests/ui-msrv/transmute-ref-dst-not-a-reference.rs:17:36
|
||||
|
|
||||
17 | const DST_NOT_A_REFERENCE: usize = transmute_ref!(&0u8);
|
||||
| ^^^^^^^^^^^^^^^^^^^^ expected `usize`, found reference
|
||||
|
|
||||
= note: expected type `usize`
|
||||
found reference `&_`
|
||||
= note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> tests/ui-msrv/transmute-ref-dst-not-a-reference.rs:17:36
|
||||
|
|
||||
17 | const DST_NOT_A_REFERENCE: usize = transmute_ref!(&0u8);
|
||||
| ^^^^^^^^^^^^^^^^^^^^ expected `usize`, found reference
|
||||
|
|
||||
= note: expected type `usize`
|
||||
found reference `&_`
|
||||
= note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> tests/ui-msrv/transmute-ref-dst-not-a-reference.rs:17:36
|
||||
|
|
||||
17 | const DST_NOT_A_REFERENCE: usize = transmute_ref!(&0u8);
|
||||
| ^^^^^^^^^^^^^^^^^^^^ expected `usize`, found reference
|
||||
|
|
||||
= note: expected type `usize`
|
||||
found reference `&_`
|
||||
= note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
18
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-not-frombytes.rs
vendored
Normal file
18
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-not-frombytes.rs
vendored
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
// Copyright 2023 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
include!("../../zerocopy-derive/tests/util.rs");
|
||||
|
||||
extern crate zerocopy;
|
||||
|
||||
use zerocopy::transmute_ref;
|
||||
|
||||
fn main() {}
|
||||
|
||||
// `transmute_ref` requires that the destination type implements `FromBytes`
|
||||
const DST_NOT_FROM_BYTES: &NotZerocopy = transmute_ref!(&AU16(0));
|
||||
12
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-not-frombytes.stderr
vendored
Normal file
12
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-not-frombytes.stderr
vendored
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
error[E0277]: the trait bound `NotZerocopy: FromBytes` is not satisfied
|
||||
--> tests/ui-msrv/transmute-ref-dst-not-frombytes.rs:18:42
|
||||
|
|
||||
18 | const DST_NOT_FROM_BYTES: &NotZerocopy = transmute_ref!(&AU16(0));
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `FromBytes` is not implemented for `NotZerocopy`
|
||||
|
|
||||
note: required by a bound in `AssertIsFromBytes`
|
||||
--> tests/ui-msrv/transmute-ref-dst-not-frombytes.rs:18:42
|
||||
|
|
||||
18 | const DST_NOT_FROM_BYTES: &NotZerocopy = transmute_ref!(&AU16(0));
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsFromBytes`
|
||||
= note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
17
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-unsized.rs
vendored
Normal file
17
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-unsized.rs
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
// Copyright 2023 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
extern crate zerocopy;
|
||||
|
||||
use zerocopy::transmute_ref;
|
||||
|
||||
fn main() {}
|
||||
|
||||
// `transmute_ref!` does not support transmuting into an unsized destination
|
||||
// type.
|
||||
const DST_UNSIZED: &[u8] = transmute_ref!(&[0u8; 1]);
|
||||
94
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-unsized.stderr
vendored
Normal file
94
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-dst-unsized.stderr
vendored
Normal file
|
|
@ -0,0 +1,94 @@
|
|||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-ref-dst-unsized.rs:17:28
|
||||
|
|
||||
17 | const DST_UNSIZED: &[u8] = transmute_ref!(&[0u8; 1]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `AssertIsFromBytes`
|
||||
--> tests/ui-msrv/transmute-ref-dst-unsized.rs:17:28
|
||||
|
|
||||
17 | const DST_UNSIZED: &[u8] = transmute_ref!(&[0u8; 1]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsFromBytes`
|
||||
= note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-ref-dst-unsized.rs:17:28
|
||||
|
|
||||
17 | const DST_UNSIZED: &[u8] = transmute_ref!(&[0u8; 1]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
= note: all local variables must have a statically known size
|
||||
= help: unsized locals are gated as an unstable feature
|
||||
= note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-ref-dst-unsized.rs:17:28
|
||||
|
|
||||
17 | const DST_UNSIZED: &[u8] = transmute_ref!(&[0u8; 1]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `MaxAlignsOf`
|
||||
--> src/macro_util.rs
|
||||
|
|
||||
| pub union MaxAlignsOf<T, U> {
|
||||
| ^ required by this bound in `MaxAlignsOf`
|
||||
= note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-ref-dst-unsized.rs:17:28
|
||||
|
|
||||
17 | const DST_UNSIZED: &[u8] = transmute_ref!(&[0u8; 1]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `transmute`
|
||||
--> $RUST/core/src/intrinsics.rs
|
||||
|
|
||||
| pub fn transmute<T, U>(e: T) -> U;
|
||||
| ^ required by this bound in `transmute`
|
||||
= note: this error originates in the macro `$crate::assert_size_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-ref-dst-unsized.rs:17:28
|
||||
|
|
||||
17 | const DST_UNSIZED: &[u8] = transmute_ref!(&[0u8; 1]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `MaxAlignsOf::<T, U>::new`
|
||||
--> src/macro_util.rs
|
||||
|
|
||||
| impl<T, U> MaxAlignsOf<T, U> {
|
||||
| ^ required by this bound in `MaxAlignsOf::<T, U>::new`
|
||||
= note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-ref-dst-unsized.rs:17:28
|
||||
|
|
||||
17 | const DST_UNSIZED: &[u8] = transmute_ref!(&[0u8; 1]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `MaxAlignsOf`
|
||||
--> src/macro_util.rs
|
||||
|
|
||||
| pub union MaxAlignsOf<T, U> {
|
||||
| ^ required by this bound in `MaxAlignsOf`
|
||||
= note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-ref-dst-unsized.rs:17:28
|
||||
|
|
||||
17 | const DST_UNSIZED: &[u8] = transmute_ref!(&[0u8; 1]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `transmute_ref`
|
||||
--> src/macro_util.rs
|
||||
|
|
||||
| pub const unsafe fn transmute_ref<'dst, 'src: 'dst, Src: 'src, Dst: 'dst>(
|
||||
| ^^^ required by this bound in `transmute_ref`
|
||||
= note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
15
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-illegal-lifetime.rs
vendored
Normal file
15
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-illegal-lifetime.rs
vendored
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
// Copyright 2023 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
fn main() {}
|
||||
|
||||
fn increase_lifetime() {
|
||||
let x = 0u64;
|
||||
// It is illegal to increase the lifetime scope.
|
||||
let _: &'static u64 = zerocopy::transmute_ref!(&x);
|
||||
}
|
||||
9
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-illegal-lifetime.stderr
vendored
Normal file
9
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-illegal-lifetime.stderr
vendored
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
error[E0597]: `x` does not live long enough
|
||||
--> tests/ui-msrv/transmute-ref-illegal-lifetime.rs:14:52
|
||||
|
|
||||
14 | let _: &'static u64 = zerocopy::transmute_ref!(&x);
|
||||
| ------------ ^^ borrowed value does not live long enough
|
||||
| |
|
||||
| type annotation requires that `x` is borrowed for `'static`
|
||||
15 | }
|
||||
| - `x` dropped here while still borrowed
|
||||
17
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-size-decrease.rs
vendored
Normal file
17
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-size-decrease.rs
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
// Copyright 2023 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
extern crate zerocopy;
|
||||
|
||||
use zerocopy::transmute_ref;
|
||||
|
||||
fn main() {}
|
||||
|
||||
// Although this is not a soundness requirement, we currently require that the
|
||||
// size of the destination type is not smaller than the size of the source type.
|
||||
const DECREASE_SIZE: &u8 = transmute_ref!(&[0u8; 2]);
|
||||
9
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-size-decrease.stderr
vendored
Normal file
9
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-size-decrease.stderr
vendored
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
error[E0512]: cannot transmute between types of different sizes, or dependently-sized types
|
||||
--> tests/ui-msrv/transmute-ref-size-decrease.rs:17:28
|
||||
|
|
||||
17 | const DECREASE_SIZE: &u8 = transmute_ref!(&[0u8; 2]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: source type: `[u8; 2]` (16 bits)
|
||||
= note: target type: `u8` (8 bits)
|
||||
= note: this error originates in the macro `$crate::assert_size_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
17
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-size-increase.rs
vendored
Normal file
17
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-size-increase.rs
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
// Copyright 2023 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
extern crate zerocopy;
|
||||
|
||||
use zerocopy::transmute_ref;
|
||||
|
||||
fn main() {}
|
||||
|
||||
// `transmute_ref!` does not support transmuting from a smaller type to a larger
|
||||
// one.
|
||||
const INCREASE_SIZE: &[u8; 2] = transmute_ref!(&0u8);
|
||||
9
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-size-increase.stderr
vendored
Normal file
9
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-size-increase.stderr
vendored
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
error[E0512]: cannot transmute between types of different sizes, or dependently-sized types
|
||||
--> tests/ui-msrv/transmute-ref-size-increase.rs:17:33
|
||||
|
|
||||
17 | const INCREASE_SIZE: &[u8; 2] = transmute_ref!(&0u8);
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: source type: `u8` (8 bits)
|
||||
= note: target type: `[u8; 2]` (16 bits)
|
||||
= note: this error originates in the macro `$crate::assert_size_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
19
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-generic.rs
vendored
Normal file
19
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-generic.rs
vendored
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
// Copyright 2023 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
extern crate zerocopy;
|
||||
|
||||
use zerocopy::{transmute_ref, AsBytes, FromBytes};
|
||||
|
||||
fn main() {}
|
||||
|
||||
fn transmute_ref<T: AsBytes, U: FromBytes>(t: &T) -> &U {
|
||||
// `transmute_ref!` requires the source and destination types to be
|
||||
// concrete.
|
||||
transmute_ref!(t)
|
||||
}
|
||||
19
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-generic.stderr
vendored
Normal file
19
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-generic.stderr
vendored
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
error[E0512]: cannot transmute between types of different sizes, or dependently-sized types
|
||||
--> tests/ui-msrv/transmute-ref-src-dst-generic.rs:18:5
|
||||
|
|
||||
18 | transmute_ref!(t)
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: source type: `T` (this type does not have a fixed size)
|
||||
= note: target type: `U` (this type does not have a fixed size)
|
||||
= note: this error originates in the macro `$crate::assert_size_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0512]: cannot transmute between types of different sizes, or dependently-sized types
|
||||
--> tests/ui-msrv/transmute-ref-src-dst-generic.rs:18:5
|
||||
|
|
||||
18 | transmute_ref!(t)
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: source type: `AlignOf<T>` (size can vary because of T)
|
||||
= note: target type: `MaxAlignsOf<T, U>` (size can vary because of T)
|
||||
= note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
17
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-not-references.rs
vendored
Normal file
17
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-not-references.rs
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
// Copyright 2023 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
extern crate zerocopy;
|
||||
|
||||
use zerocopy::transmute_ref;
|
||||
|
||||
fn main() {}
|
||||
|
||||
// `transmute_ref!` does not support transmuting between non-reference source
|
||||
// and destination types.
|
||||
const SRC_DST_NOT_REFERENCES: usize = transmute_ref!(0usize);
|
||||
42
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-not-references.stderr
vendored
Normal file
42
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-not-references.stderr
vendored
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
error[E0308]: mismatched types
|
||||
--> tests/ui-msrv/transmute-ref-src-dst-not-references.rs:17:54
|
||||
|
|
||||
17 | const SRC_DST_NOT_REFERENCES: usize = transmute_ref!(0usize);
|
||||
| ---------------^^^^^^-
|
||||
| | |
|
||||
| | expected reference, found `usize`
|
||||
| | help: consider borrowing here: `&0usize`
|
||||
| expected due to this
|
||||
|
|
||||
= note: expected reference `&_`
|
||||
found type `usize`
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> tests/ui-msrv/transmute-ref-src-dst-not-references.rs:17:39
|
||||
|
|
||||
17 | const SRC_DST_NOT_REFERENCES: usize = transmute_ref!(0usize);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found reference
|
||||
|
|
||||
= note: expected type `usize`
|
||||
found reference `&_`
|
||||
= note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> tests/ui-msrv/transmute-ref-src-dst-not-references.rs:17:39
|
||||
|
|
||||
17 | const SRC_DST_NOT_REFERENCES: usize = transmute_ref!(0usize);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found reference
|
||||
|
|
||||
= note: expected type `usize`
|
||||
found reference `&_`
|
||||
= note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> tests/ui-msrv/transmute-ref-src-dst-not-references.rs:17:39
|
||||
|
|
||||
17 | const SRC_DST_NOT_REFERENCES: usize = transmute_ref!(0usize);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found reference
|
||||
|
|
||||
= note: expected type `usize`
|
||||
found reference `&_`
|
||||
= note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
17
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-unsized.rs
vendored
Normal file
17
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-unsized.rs
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
// Copyright 2023 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
extern crate zerocopy;
|
||||
|
||||
use zerocopy::transmute_ref;
|
||||
|
||||
fn main() {}
|
||||
|
||||
// `transmute_ref!` does not support transmuting between unsized source and
|
||||
// destination types.
|
||||
const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]);
|
||||
195
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-unsized.stderr
vendored
Normal file
195
third-party/vendor/zerocopy/tests/ui-msrv/transmute-ref-src-dst-unsized.stderr
vendored
Normal file
|
|
@ -0,0 +1,195 @@
|
|||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `AssertIsAsBytes`
|
||||
--> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsAsBytes`
|
||||
= note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `AssertIsAsBytes`
|
||||
--> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsAsBytes`
|
||||
= note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `AssertIsFromBytes`
|
||||
--> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `AssertIsFromBytes`
|
||||
= note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
= note: all local variables must have a statically known size
|
||||
= help: unsized locals are gated as an unstable feature
|
||||
= note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `transmute`
|
||||
--> $RUST/core/src/intrinsics.rs
|
||||
|
|
||||
| pub fn transmute<T, U>(e: T) -> U;
|
||||
| ^ required by this bound in `transmute`
|
||||
= note: this error originates in the macro `$crate::assert_size_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `AlignOf::<T>::into_t`
|
||||
--> src/macro_util.rs
|
||||
|
|
||||
| impl<T> AlignOf<T> {
|
||||
| ^ required by this bound in `AlignOf::<T>::into_t`
|
||||
= note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
= note: the left-hand-side of an assignment must have a statically known size
|
||||
= note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `AlignOf`
|
||||
--> src/macro_util.rs
|
||||
|
|
||||
| pub struct AlignOf<T> {
|
||||
| ^ required by this bound in `AlignOf`
|
||||
= note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `MaxAlignsOf::<T, U>::new`
|
||||
--> src/macro_util.rs
|
||||
|
|
||||
| impl<T, U> MaxAlignsOf<T, U> {
|
||||
| ^ required by this bound in `MaxAlignsOf::<T, U>::new`
|
||||
= note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `MaxAlignsOf`
|
||||
--> src/macro_util.rs
|
||||
|
|
||||
| pub union MaxAlignsOf<T, U> {
|
||||
| ^ required by this bound in `MaxAlignsOf`
|
||||
= note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `MaxAlignsOf`
|
||||
--> src/macro_util.rs
|
||||
|
|
||||
| pub union MaxAlignsOf<T, U> {
|
||||
| ^ required by this bound in `MaxAlignsOf`
|
||||
= note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `AlignOf`
|
||||
--> src/macro_util.rs
|
||||
|
|
||||
| pub struct AlignOf<T> {
|
||||
| ^ required by this bound in `AlignOf`
|
||||
= note: this error originates in the macro `$crate::assert_align_gt_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
= note: all local variables must have a statically known size
|
||||
= help: unsized locals are gated as an unstable feature
|
||||
= note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
note: required by a bound in `transmute_ref`
|
||||
--> src/macro_util.rs
|
||||
|
|
||||
| pub const unsafe fn transmute_ref<'dst, 'src: 'dst, Src: 'src, Dst: 'dst>(
|
||||
| ^^^ required by this bound in `transmute_ref`
|
||||
= note: this error originates in the macro `transmute_ref` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||
--> tests/ui-msrv/transmute-ref-src-dst-unsized.rs:17:32
|
||||
|
|
||||
17 | const SRC_DST_UNSIZED: &[u8] = transmute_ref!(&[0u8][..]);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[u8]`
|
||||
= note: all function arguments must have a statically known size
|
||||
= note: this error originates in the macro `$crate::assert_size_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue