Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

More ErrorKinds for common errnos #79965

Merged
merged 17 commits into from
Jul 3, 2021
Merged

More ErrorKinds for common errnos #79965

merged 17 commits into from
Jul 3, 2021

Conversation

ijackson
Copy link
Contributor

@ijackson ijackson commented Dec 12, 2020

From the commit message of the main commit here (as revised):

There are a number of IO error situations which it would be very
useful for Rust code to be able to recognise without having to resort
to OS-specific code.  Taking some Unix examples, `ENOTEMPTY` and
`EXDEV` have obvious recovery strategies.  Recently I was surprised to
discover that `ENOSPC` came out as `ErrorKind::Other`.

Since I am familiar with Unix I reviwed the list of errno values in
  https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html

Here, I add those that most clearly seem to be needed.

@CraftSpider provided information about Windows, and references, which
I have tried to take into account.

This has to be insta-stable because we can't sensibly have a different
set of ErrorKinds depending on a std feature flag.

I have *not* added these to the mapping tables for any operating
systems other than Unix and Windows.  I hope that it is OK to add them
now for Unix and Windows now, and maybe add them to other OS's mapping
tables as and when someone on that OS is able to consider the
situation.

I adopted the general principle that it was usually a bad idea to map
two distinct error values to the same Rust error code.  I notice that
this principle is already violated in the case of `EACCES` and
`EPERM`, which both map to `PermissionDenied`.  I think this was
probably a mistake but it would be quite hard to change now, so I
don't propose to do anything about that.

However, for Windows, there are sometimes different error codes for
identical situations.  Eg there are WSA* versions of some error
codes as well as ERROR_* ones.  Also Windows seems to have a great
many more erorr codes.  I don't know precisely what best practice
would be for Windows.
Errno values I wasn't sure about so *haven't* included:

EMFILE ENFILE ENOBUFS ENOLCK:

  These are all fairly Unix-specific resource exhaustion situations.
  In practice it seemed not very likely to me that anyone would want
  to handle these differently to `Other`.

ENOMEM ERANGE EDOM EOVERFLOW

  Normally these don't get exposed to the Rust callers I hope.  They
  don't tend to come out of filesystem APIs.

EILSEQ

  Hopefully Rust libraries open files in binary mode and do the
  converstion in Rust.  So Rust code ought not to be exposed to
  EILSEQ.

EIO

  The range of things that could cause this is troublesome.  I found
  it difficult to describe.  I do think it would be useful to add this
  at some point, because EIO on a filesystem operation is much more
  serious than most other errors.

ENETDOWN

  I wasn't sure if this was useful or, indeed, if any modern systems
  use it.

ENOEXEC

  It is not clear to me how a Rust program could respond to this.  It
  seems rather niche.

EPROTO ENETRESET ENODATA ENOMSG ENOPROTOOPT ENOSR ENOSTR ETIME
ENOTRECOVERABLE EOWNERDEAD EBADMSG EPROTONOSUPPORT EPROTOTYPE EIDRM

  These are network or STREAMS related errors which I have never in
  my own Unix programming found the need to do anything with.  I think
  someone who understands these better should be the one to try to
  find good Rust names and descriptions for them.

ENOTTY ENXIO ENODEV EOPNOTSUPP ESRCH EALREADY ECANCELED ECHILD
EINPROGRESS

  These are very hard to get unless you're already doing something
  very Unix-specific, in which case the raw_os_error interface is
  probably more suitable than relying on the Rust ErrorKind mapping.

EFAULT EBADF

  These would seem to be the result of application UB.
(omitted errnos are discussed below, especially in https://github.com//pull/79965#issuecomment-810468334)

@rust-highfive
Copy link
Collaborator

r? @Mark-Simulacrum

(rust-highfive has picked a reviewer for you, use r? to override)

@rust-highfive rust-highfive added the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. label Dec 12, 2020
@ijackson
Copy link
Contributor Author

@rustbot modify labels +T-libs +A-io

@rustbot rustbot added A-io Area: std::io, std::fs, std::net and std::path T-libs-api Relevant to the library API team, which will review and decide on the PR/issue. labels Dec 12, 2020
@Mark-Simulacrum
Copy link
Member

r? @m-ou-se

Probably needs a T-libs decision, maybe discussion.

@nagisa
Copy link
Member

nagisa commented Dec 13, 2020

A similar change to Window's decode_error_kind should happen as part of this PR.

@m-ou-se
Copy link
Member

m-ou-se commented Jan 9, 2021

We've discussed this PR in the library team meeting a few days ago, and we generally felt positive about this change. We discussed two concerns:

  1. This might break code matching specifically on ErrorKind::Other. However, as the documentation already mentions this, this is acceptable.
  2. It might be too Unix-specific. We'd like to see how this works out for the other platforms (especially Windows). Some of these might have a name or description that is too specific for Unix and doesn't fit the equivalent Windows error. Or it might be the case that two related new ErrorKinds are represented as the same error code on Windows, which would make it tricky to map them properly. We'd like to see an implementation for Windows as well, to make sure this won't cause any problems there later.

@m-ou-se m-ou-se added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed I-nominated S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jan 9, 2021
@ijackson
Copy link
Contributor Author

ijackson commented Jan 13, 2021 via email

@m-ou-se
Copy link
Member

m-ou-se commented Jan 13, 2021

Is there some way I could request help from a Rustacean who is an expert in the Windows APIs, to do the Windows part of this ?

You could try asking on Zulip (in #t-libs or #t-compiler/windows) first. If that doesn't work, we can ping a few Windows experts on GitHub here.

It seems to me that it would be best to have distinct ErrorKind values whenever an important platform makes a distinction between two of its own error numbers.

Yes, maybe. But that's easier to see once we have some concrete error for which this is the case.

Copy link
Contributor

@CraftSpider CraftSpider left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not a master of Windows IO, but I took some time to go through and link the system error codes that look like they match the new error types in this PR. If desired, I could split this information into some other location for easier reading.

library/std/src/io/error.rs Show resolved Hide resolved
library/std/src/io/error.rs Show resolved Hide resolved
library/std/src/io/error.rs Show resolved Hide resolved
library/std/src/io/error.rs Show resolved Hide resolved
library/std/src/io/error.rs Show resolved Hide resolved
library/std/src/io/error.rs Show resolved Hide resolved
library/std/src/io/error.rs Outdated Show resolved Hide resolved
library/std/src/io/error.rs Show resolved Hide resolved
library/std/src/io/error.rs Show resolved Hide resolved
library/std/src/io/error.rs Show resolved Hide resolved
@ijackson
Copy link
Contributor Author

@CraftSpider Thank you for that! I have replied to a couple of your comments where I think things are not 100% settled, but I think I should be able to make a plausible Windows implementation out of your suggestions. It will still want a review by someone with Windows expertise.

@JohnCSimon JohnCSimon added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Feb 8, 2021
@ijackson ijackson marked this pull request as draft February 11, 2021 17:48
@rust-log-analyzer

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@ijackson ijackson changed the title More ErrorKinds for common Unix errnos More ErrorKinds for common errnos Feb 25, 2021
@ijackson
Copy link
Contributor Author

(After we've decided on the set of Windows error value numbers needed, I'll fish them out of the docs links @CraftSpider helpfully provided and add them to Windows's c.rs.)

@ijackson
Copy link
Contributor Author

ijackson commented Jul 6, 2021

Thanks everone who helped work on this!

@ChrisDenton, you mentioned some Windows error codes which might usefully have ErrorKinds. Now that this batch is merged, you might want to revisit that question. Feel free to tag me in your MR - I love thinking about error handling :-).

@ijackson
Copy link
Contributor Author

ijackson commented Jul 6, 2021

Also, @zackw you had a list in #79965 (comment) which would be worth revisiting now, if you felt like it. FYI I don't expect to have time to pick that up soon...

@TheBlueMatt
Copy link

This appears to have broken our CI on beta builds now (which assert errors match expected ones after filesystem operations), though I guess that was expected?

@the8472
Copy link
Member

the8472 commented Jul 29, 2021

Breakage should only happen if you're matching against ErrorKind::Other, which is discouraged

@TheBlueMatt
Copy link

if you're matching against ErrorKind::Other

Indeed, it was an assertion checking exactly that.

which is discouraged

Looks like that was added pretty recently (middle of last year). The code in our tests appears to predate that warning pretty substantially. It seems strange that downstream projects would break after a pretty recent warning, or is this intended to land in a future edition and not current ones?

@the8472
Copy link
Member

the8472 commented Jul 29, 2021

It was implicit before. The enum docs have been saying this for 7 years:

/// This list is intended to grow over time and it is not recommended to
/// exhaustively match against it.

And Other said this:

/// Any I/O error not part of this list.

So logically if the list is expanded then new items may cover things that were previously "not part of this list", i.e. Other. The change last year only made it more explicit.

@TheBlueMatt
Copy link

It was implicit before.

Hmm, to some extent I suppose that makes sense. It still seems incredibly strange that this breakage is "expected" given the rustc commitment of running, in-the-wild code not suddenly breaking due to rustc/libstd changes, especially when there is no compile warning anywhere to indicate this.

There's a much more important related issue here, though - I don't even know how I'd address the issue here even if I wanted to. We are some code that checks the error, which seems like a reasonable thing to want. If we want to support new rustc, it seems the only possible way to do so is to never check the error, because otherwise we'd end up bumping the MSRV to get the new variants to check against?

@the8472
Copy link
Member

the8472 commented Jul 29, 2021

When checking IO errors you have several options:

match io_thing() {
   Ok(_)  => println!("success"),
   Err(error) if error.kind() == ErrorKind::NotFound =>
      println!("someone deleted a file? incorrect path? ask the user to check if he passed the right one"),
   #[cfg(unix)]
   Err(error) if error.raw_os_error() == Some(libc::EOPNOTSUPP) =>
      println!("some obscure problem with network filesystems? tell user to not use NFS"),
   Err(_) => println!("general error of unknown type, we don't know how to handle this!")
}

Matching against specific ErrorKind only makes sense if you know the meaning you're trying to match against, e.g. because you know how to handle this particular error. Other has no meaning so a wildcard pattern should be used instead.

@TheBlueMatt
Copy link

When checking IO errors you have several options:

That doesn't address the issue at all. Lets say we have a test (which we do) which wants to check that the error was due to trying to access a directory as a file. We could manually look up libc errors (yuck, platform specific!), or we could match the new error type (bump MSRV to beta), or we could check Other, ensuring its not one of the common error types, which we did.

Sure, its obviously not ideal, but the docs were not super explicit about this being invalid code (they're now a bit clearer), and more importantly rustc did nothing to warn us that what we wrote wasn't just not-ideal (it was a test, after all), but that it was in fact invalid code that exhibits undefined behavior (in the could-break sense, not the C could-eat-your-cat sense). This feels not just unergonomic but a borderline violation of the rustc stability guarantees. I have to admit I'm incredibly dissapointed the response to this is "who cares" not "alright, lets make sure there's a rustc warning for a few releases then we can revisit" or some other reasonably cautious approach to addressing undefined behavior in rust stdlib.

@the8472
Copy link
Member

the8472 commented Jul 29, 2021

We could manually look up libc errors (yuck, platform specific!), or we could match the new error type (bump MSRV to beta), or we could check Other, ensuring its not one of the common error types, which we did.

Well, what you're really checking for is "not any of the currently known variants" on a #[non_exhaustive] enum. There is no good way to express this other than

match test_error() {
  ErrorKind::Foo | ErrorKind::Bar | ErrorKind::Baz | ....  => panic!("these are the ones we know and it shouldn't be any of them"),
  _ => return Ok(())
}

importantly rustc did nothing to warn us that what we wrote wasn't just not-ideal

I'm not sure if this is possible. Error is a user-constructable type, so there are cases where you know that an error really should have that value. So linting against that kind of use may lead to too many false positives. Perhaps the documentation could be improved further.

Anyway, since you consider this a bigger issue than I personally do (I'm not speaking for all of rust!) I think it would make sense to open an issue to bring this to broader attention rather than discussing this in an already landed PR.

@ijackson
Copy link
Contributor Author

Well, what you're really checking for is "not any of the currently known variants" on a #[non_exhaustive] enum. There is no good way to express this other than

match test_error() {
  ErrorKind::Foo | ErrorKind::Bar | ErrorKind::Baz | ....  => panic!("these are the ones we know and it shouldn't be any of them"),
  _ => return Ok(())
}

@TheBlueMatt I think that ^ something like that is precisely what you need to be doing. Because, what you are trying to express is "not one of the ErrorKind variants which existed when I read the docs and wrote this test". (As opposed to "not one of the ErrorKind variants in the current std".)

Short of some madness involving version numbers, I think your best option is to replace your matches against Other with a new function fn is_known_errorkind(ErrorKind) -> bool, containing a match statement cut and pasted from the current stable non-Other ErrorKinds in the docs. That will express precisely what you mean.

That function can't live in stdlib for the same reason as matching against Other doesn't work: you need it to depend on when you wrote the code, freezing your own local ErrorKind list. When you want to match new kinds you can update the function and fix the resulting test failures. Crucially, on your schedule rather than ours.

Anyway, since you consider this a bigger issue than I personally do (I'm not speaking for all of rust!) I think it would make sense to open an issue to bring this to broader attention rather than discussing this in an already landed PR.

@TheBlueMatt I think ^ that is a good suggestion if you want to pursue this. In any case thanks for the feedback and see my other reply #86442 (comment)

@TheBlueMatt
Copy link

TheBlueMatt commented Jul 29, 2021 via email

@pthariensflame
Copy link
Contributor

@XAMPPRocky Was this missed for relnotes?

@SimonSapin
Copy link
Contributor

The new variants still have #[unstable] attributes and are tracked here: #86442

atopia added a commit to atopia/libc that referenced this pull request Oct 18, 2021
Add more errno constants as requested by rustc since commit
1ec9454403e9bb0361d0725524c4bd27030474cc (for a discussion of the
change, see rust-lang/rust#79965).

The constant values and descriptions were taken from
include/uapi/asm-generic/errno.h in the Linux kernel, since "uClibc will
be compiled to match the interfaces available in the provided version of
the Linux kernel headers".

While the fork of uClibc in L4Re nominally has its own errno constants,
they appear to be based on the Linux header file and thus are the same.
atopia added a commit to atopia/libc that referenced this pull request Oct 19, 2021
Add more errno constants as requested by rustc since commit
1ec9454403e9bb0361d0725524c4bd27030474cc (for a discussion of the
change, see rust-lang/rust#79965).

The constant values and descriptions were taken from
include/uapi/asm-generic/errno.h in the Linux kernel, since "uClibc will
be compiled to match the interfaces available in the provided version of
the Linux kernel headers".

While the fork of uClibc in L4Re nominally has its own errno constants,
they appear to be based on the Linux header file and thus are the same.
bors added a commit to rust-lang/libc that referenced this pull request Oct 20, 2021
add more errno constants to uclibc

Add more errno constants as requested by rustc since commit
1ec9454403e9bb0361d0725524c4bd27030474cc (for a discussion of the
change, see rust-lang/rust#79965).

The constant values and descriptions were taken from
include/uapi/asm-generic/errno.h in the Linux kernel, since "uClibc will
be compiled to match the interfaces available in the provided version of
the Linux kernel headers".

While the fork of uClibc in L4Re nominally has its own errno constants,
they appear to be based on the Linux header file and thus are the same.
raoulstrackx pushed a commit to raoulstrackx/libc that referenced this pull request Oct 29, 2021
Add more errno constants as requested by rustc since commit
1ec9454403e9bb0361d0725524c4bd27030474cc (for a discussion of the
change, see rust-lang/rust#79965).

The constant values and descriptions were taken from
include/uapi/asm-generic/errno.h in the Linux kernel, since "uClibc will
be compiled to match the interfaces available in the provided version of
the Linux kernel headers".

While the fork of uClibc in L4Re nominally has its own errno constants,
they appear to be based on the Linux header file and thus are the same.
netbsd-srcmastr pushed a commit to NetBSD/pkgsrc that referenced this pull request Nov 20, 2021
Pkgsrc changes:
 * Bump bootstrap kit version to 1.55.0.
 * Adjust patches as needed, some no longer apply (so removed)
 * Update checksum adjustments.
 * Avoid rust-llvm on SunOS
 * Optionally build docs
 * Remove reference to closed/old PR#54621

Upstream changes:

Version 1.56.1 (2021-11-01)
===========================

- New lints to detect the presence of bidirectional-override Unicode
  codepoints in the compiled source code ([CVE-2021-42574])

[CVE-2021-42574]: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-42574

Version 1.56.0 (2021-10-21)
========================

Language
--------

- [The 2021 Edition is now stable.][rust#88100]
  See [the edition guide][rust-2021-edition-guide] for more details.
- [The pattern in `binding @ pattern` can now also introduce new bindings.]
  [rust#85305]
- [Union field access is permitted in `const fn`.][rust#85769]

[rust-2021-edition-guide]:
  https://doc.rust-lang.org/nightly/edition-guide/rust-2021/index.html

Compiler
--------

- [Upgrade to LLVM 13.][rust#87570]
- [Support memory, address, and thread sanitizers on aarch64-unknown-freebsd.]
  [rust#88023]
- [Allow specifying a deployment target version for all iOS targets][rust#87699]
- [Warnings can be forced on with `--force-warn`.][rust#87472]
  This feature is primarily intended for usage by `cargo fix`, rather than
  end users.
- [Promote `aarch64-apple-ios-sim` to Tier 2\*.][rust#87760]
- [Add `powerpc-unknown-freebsd` at Tier 3\*.][rust#87370]
- [Add `riscv32imc-esp-espidf` at Tier 3\*.][rust#87666]

\* Refer to Rust's [platform support page][platform-support-doc] for more
information on Rust's tiered platform support.

Libraries
---------

- [Allow writing of incomplete UTF-8 sequences via stdout/stderr on Windows.]
  [rust#83342]
  The Windows console still requires valid Unicode, but this change allows
  splitting a UTF-8 character across multiple write calls. This allows, for
  instance, programs that just read and write data buffers (e.g. copying a file
  to stdout) without regard for Unicode or character boundaries.
- [Prefer `AtomicU{64,128}` over Mutex for Instant backsliding protection.]
  [rust#83093]
  For this use case, atomics scale much better under contention.
- [Implement `Extend<(A, B)>` for `(Extend<A>, Extend<B>)`][rust#85835]
- [impl Default, Copy, Clone for std::io::Sink and std::io::Empty][rust#86744]
- [`impl From<[(K, V); N]>` for all collections.][rust#84111]
- [Remove `P: Unpin` bound on impl Future for Pin.][rust#81363]
- [Treat invalid environment variable names as non-existent.][rust#86183]
  Previously, the environment functions would panic if given a
  variable name with an internal null character or equal sign (`=`).
  Now, these functions will just treat such names as non-existent
  variables, since the OS cannot represent the existence of a
  variable with such a name.

Stabilised APIs
---------------

- [`std::os::unix::fs::chroot`]
- [`UnsafeCell::raw_get`]
- [`BufWriter::into_parts`]
- [`core::panic::{UnwindSafe, RefUnwindSafe, AssertUnwindSafe}`]
  These APIs were previously stable in `std`, but are now also available
  in `core`.
- [`Vec::shrink_to`]
- [`String::shrink_to`]
- [`OsString::shrink_to`]
- [`PathBuf::shrink_to`]
- [`BinaryHeap::shrink_to`]
- [`VecDeque::shrink_to`]
- [`HashMap::shrink_to`]
- [`HashSet::shrink_to`]

These APIs are now usable in const contexts:

- [`std::mem::transmute`]
- [`[T]::first`][`slice::first`]
- [`[T]::split_first`][`slice::split_first`]
- [`[T]::last`][`slice::last`]
- [`[T]::split_last`][`slice::split_last`]

Cargo
-----

- [Cargo supports specifying a minimum supported Rust version in Cargo.toml.]
  [`rust-version`]
  This has no effect at present on dependency version selection.
  We encourage crates to specify their minimum supported Rust
  version, and we encourage CI systems that support Rust code to
  include a crate's specified minimum version in the text matrix
  for that crate by default.

Compatibility notes
-------------------

- [Update to new argument parsing rules on Windows.][rust#87580]
  This adjusts Rust's standard library to match the behavior of the standard
  libraries for C/C++. The rules have changed slightly over time, and this PR
  brings us to the latest set of rules (changed in 2008).
- [Disallow the aapcs calling convention on aarch64][rust#88399]
  This was already not supported by LLVM; this change surfaces this lack of
  support with a better error message.
- [Make `SEMICOLON_IN_EXPRESSIONS_FROM_MACROS` warn by default][rust#87385]
- [Warn when an escaped newline skips multiple lines.][rust#87671]
- [Calls to `libc::getpid` / `std::process::id` from `Command::pre_exec`
  may return different values on glibc <= 2.24.][rust#81825]
  Rust now invokes the `clone3` system call directly, when available,
  to use new functionality available via that system call. Older
  versions of glibc cache the result of `getpid`, and only update
  that cache when calling glibc's clone/fork functions, so a direct
  system call bypasses that cache update. glibc 2.25 and newer no
  longer cache `getpid` for exactly this reason.

Internal changes
----------------
These changes provide no direct user facing benefits, but represent
significant improvements to the internals and overall performance
of rustc and related tools.

- [LLVM is compiled with PGO in published x86_64-unknown-linux-gnu artifacts.]
  [rust#88069]
  This improves the performance of most Rust builds.
- [Unify representation of macros in internal data structures.][rust#88019]
  This change fixes a host of bugs with the handling of macros by the compiler,
  as well as rustdoc.

[`std::os::unix::fs::chroot`]: https://doc.rust-lang.org/stable/std/os/unix/fs/fn.chroot.html
[`Iterator::intersperse`]: https://doc.rust-lang.org/stable/std/iter/trait.Iterator.html#method.intersperse
[`Iterator::intersperse_with`]: https://doc.rust-lang.org/stable/std/iter/trait.Iterator.html#method.intersperse
[`UnsafeCell::raw_get`]: https://doc.rust-lang.org/stable/std/cell/struct.UnsafeCell.html#method.raw_get
[`BufWriter::into_parts`]: https://doc.rust-lang.org/stable/std/io/struct.BufWriter.html#method.into_parts
[`core::panic::{UnwindSafe, RefUnwindSafe, AssertUnwindSafe}`]: rust-lang/rust#84662
[`Vec::shrink_to`]: https://doc.rust-lang.org/stable/std/vec/struct.Vec.html#method.shrink_to
[`String::shrink_to`]: https://doc.rust-lang.org/stable/std/string/struct.String.html#method.shrink_to
[`OsString::shrink_to`]: https://doc.rust-lang.org/stable/std/ffi/struct.OsString.html#method.shrink_to
[`PathBuf::shrink_to`]: https://doc.rust-lang.org/stable/std/path/struct.PathBuf.html#method.shrink_to
[`BinaryHeap::shrink_to`]: https://doc.rust-lang.org/stable/std/collections/struct.BinaryHeap.html#method.shrink_to
[`VecDeque::shrink_to`]: https://doc.rust-lang.org/stable/std/collections/struct.VecDeque.html#method.shrink_to
[`HashMap::shrink_to`]: https://doc.rust-lang.org/stable/std/collections/hash_map/struct.HashMap.html#method.shrink_to
[`HashSet::shrink_to`]: https://doc.rust-lang.org/stable/std/collections/hash_set/struct.HashSet.html#method.shrink_to
[`std::mem::transmute`]: https://doc.rust-lang.org/stable/std/mem/fn.transmute.html
[`slice::first`]: https://doc.rust-lang.org/stable/std/primitive.slice.html#method.first
[`slice::split_first`]: https://doc.rust-lang.org/stable/std/primitive.slice.html#method.split_first
[`slice::last`]: https://doc.rust-lang.org/stable/std/primitive.slice.html#method.last
[`slice::split_last`]: https://doc.rust-lang.org/stable/std/primitive.slice.html#method.split_last
[`rust-version`]: https://doc.rust-lang.org/nightly/cargo/reference/manifest.html#the-rust-version-field
[rust#87671]: rust-lang/rust#87671
[rust#86183]: rust-lang/rust#86183
[rust#87385]: rust-lang/rust#87385
[rust#88100]: rust-lang/rust#88100
[rust#86860]: rust-lang/rust#86860
[rust#84039]: rust-lang/rust#84039
[rust#86492]: rust-lang/rust#86492
[rust#88363]: rust-lang/rust#88363
[rust#85305]: rust-lang/rust#85305
[rust#87832]: rust-lang/rust#87832
[rust#88069]: rust-lang/rust#88069
[rust#87472]: rust-lang/rust#87472
[rust#87699]: rust-lang/rust#87699
[rust#87570]: rust-lang/rust#87570
[rust#88023]: rust-lang/rust#88023
[rust#87760]: rust-lang/rust#87760
[rust#87370]: rust-lang/rust#87370
[rust#87580]: rust-lang/rust#87580
[rust#83342]: rust-lang/rust#83342
[rust#83093]: rust-lang/rust#83093
[rust#88177]: rust-lang/rust#88177
[rust#88548]: rust-lang/rust#88548
[rust#88551]: rust-lang/rust#88551
[rust#88299]: rust-lang/rust#88299
[rust#88220]: rust-lang/rust#88220
[rust#85835]: rust-lang/rust#85835
[rust#86879]: rust-lang/rust#86879
[rust#86744]: rust-lang/rust#86744
[rust#84662]: rust-lang/rust#84662
[rust#86593]: rust-lang/rust#86593
[rust#81050]: rust-lang/rust#81050
[rust#81363]: rust-lang/rust#81363
[rust#84111]: rust-lang/rust#84111
[rust#85769]: rust-lang/rust#85769 (comment)
[rust#88490]: rust-lang/rust#88490
[rust#88269]: rust-lang/rust#88269
[rust#84176]: rust-lang/rust#84176
[rust#88399]: rust-lang/rust#88399
[rust#88227]: rust-lang/rust#88227
[rust#88200]: rust-lang/rust#88200
[rust#82776]: rust-lang/rust#82776
[rust#88077]: rust-lang/rust#88077
[rust#87728]: rust-lang/rust#87728
[rust#87050]: rust-lang/rust#87050
[rust#87619]: rust-lang/rust#87619
[rust#81825]: rust-lang/rust#81825 (comment)
[rust#88019]: rust-lang/rust#88019
[rust#87666]: rust-lang/rust#87666

Version 1.55.0 (2021-09-09)
============================

Language
--------
- [You can now write open "from" range patterns (`X..`), which will start
  at `X` and will end at the maximum value of the integer.][83918]
- [You can now explicitly import the prelude of different editions
  through `std::prelude` (e.g. `use std::prelude::rust_2021::*;`).][86294]

Compiler
--------
- [Added tier 3\* support for `powerpc64le-unknown-freebsd`.][83572]

\* Refer to Rust's [platform support page][platform-support-doc] for more
   information on Rust's tiered platform support.

Libraries
---------

- [Updated std's float parsing to use the Eisel-Lemire algorithm.][86761]
  These improvements should in general provide faster string parsing of floats,
  no longer reject certain valid floating point values, and reduce
  the produced code size for non-stripped artifacts.
- [`string::Drain` now implements `AsRef<str>` and `AsRef<[u8]>`.][86858]

Stabilised APIs
---------------

- [`Bound::cloned`]
- [`Drain::as_str`]
- [`IntoInnerError::into_error`]
- [`IntoInnerError::into_parts`]
- [`MaybeUninit::assume_init_mut`]
- [`MaybeUninit::assume_init_ref`]
- [`MaybeUninit::write`]
- [`array::map`]
- [`ops::ControlFlow`]
- [`x86::_bittest`]
- [`x86::_bittestandcomplement`]
- [`x86::_bittestandreset`]
- [`x86::_bittestandset`]
- [`x86_64::_bittest64`]
- [`x86_64::_bittestandcomplement64`]
- [`x86_64::_bittestandreset64`]
- [`x86_64::_bittestandset64`]

The following previously stable functions are now `const`.

- [`str::from_utf8_unchecked`]


Cargo
-----
- [Cargo will now deduplicate compiler diagnostics to the terminal when invoking
  rustc in parallel such as when using `cargo test`.][cargo/9675]
- [The package definition in `cargo metadata` now includes the `"default_run"`
  field from the manifest.][cargo/9550]
- [Added `cargo d` as an alias for `cargo doc`.][cargo/9680]
- [Added `{lib}` as formatting option for `cargo tree` to print the `"lib_name"`
  of packages.][cargo/9663]

Rustdoc
-------
- [Added "Go to item on exact match" search option.][85876]
- [The "Implementors" section on traits no longer shows redundant
  method definitions.][85970]
- [Trait implementations are toggled open by default.][86260] This should
  make the implementations more searchable by tools like `CTRL+F` in
  your browser.
- [Intra-doc links should now correctly resolve associated items (e.g. methods)
  through type aliases.][86334]
- [Traits which are marked with `#[doc(hidden)]` will no longer appear in the
  "Trait Implementations" section.][86513]


Compatibility Notes
-------------------
- [std functions that return an `io::Error` will no longer use the
  `ErrorKind::Other` variant.][85746] This is to better reflect that these
  kinds of errors could be categorised [into newer more specific `ErrorKind`
  variants][79965], and that they do not represent a user error.
- [Using environment variable names with `process::Command` on Windows now
  behaves as expected.][85270] Previously using envionment variables with
  `Command` would cause them to be ASCII-uppercased.
- [Rustdoc will now warn on using rustdoc lints that aren't prefixed
  with `rustdoc::`][86849]

[86849]: rust-lang/rust#86849
[86513]: rust-lang/rust#86513
[86334]: rust-lang/rust#86334
[86260]: rust-lang/rust#86260
[85970]: rust-lang/rust#85970
[85876]: rust-lang/rust#85876
[83572]: rust-lang/rust#83572
[86294]: rust-lang/rust#86294
[86858]: rust-lang/rust#86858
[86761]: rust-lang/rust#86761
[85769]: rust-lang/rust#85769
[85746]: rust-lang/rust#85746
[85305]: rust-lang/rust#85305
[85270]: rust-lang/rust#85270
[84111]: rust-lang/rust#84111
[83918]: rust-lang/rust#83918
[79965]: rust-lang/rust#79965
[87370]: rust-lang/rust#87370
[87298]: rust-lang/rust#87298
[cargo/9663]: rust-lang/cargo#9663
[cargo/9675]: rust-lang/cargo#9675
[cargo/9550]: rust-lang/cargo#9550
[cargo/9680]: rust-lang/cargo#9680
[cargo/9663]: rust-lang/cargo#9663
[`array::map`]: https://doc.rust-lang.org/stable/std/primitive.array.html#method.map
[`Bound::cloned`]: https://doc.rust-lang.org/stable/std/ops/enum.Bound.html#method.cloned
[`Drain::as_str`]: https://doc.rust-lang.org/stable/std/string/struct.Drain.html#method.as_str
[`IntoInnerError::into_error`]: https://doc.rust-lang.org/stable/std/io/struct.IntoInnerError.html#method.into_error
[`IntoInnerError::into_parts`]: https://doc.rust-lang.org/stable/std/io/struct.IntoInnerError.html#method.into_parts
[`MaybeUninit::assume_init_mut`]: https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#method.assume_init_mut
[`MaybeUninit::assume_init_ref`]: https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#method.assume_init_ref
[`MaybeUninit::write`]: https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#method.write
[`Seek::rewind`]: https://doc.rust-lang.org/stable/std/io/trait.Seek.html#method.rewind
[`ops::ControlFlow`]: https://doc.rust-lang.org/stable/std/ops/enum.ControlFlow.html
[`str::from_utf8_unchecked`]: https://doc.rust-lang.org/stable/std/str/fn.from_utf8_unchecked.html
[`x86::_bittest`]: https://doc.rust-lang.org/stable/core/arch/x86/fn._bittest.html
[`x86::_bittestandcomplement`]: https://doc.rust-lang.org/stable/core/arch/x86/fn._bittestandcomplement.html
[`x86::_bittestandreset`]: https://doc.rust-lang.org/stable/core/arch/x86/fn._bittestandreset.html
[`x86::_bittestandset`]: https://doc.rust-lang.org/stable/core/arch/x86/fn._bittestandset.html
[`x86_64::_bittest64`]: https://doc.rust-lang.org/stable/core/arch/x86_64/fn._bittest64.html
[`x86_64::_bittestandcomplement64`]: https://doc.rust-lang.org/stable/core/arch/x86_64/fn._bittestandcomplement64.html
[`x86_64::_bittestandreset64`]: https://doc.rust-lang.org/stable/core/arch/x86_64/fn._bittestandreset64.html
[`x86_64::_bittestandset64`]: https://doc.rust-lang.org/stable/core/arch/x86_64/fn._bittestandset64.html
MOZGIII added a commit to MOZGIII/efivar-rs that referenced this pull request Dec 25, 2022
MOZGIII added a commit to MOZGIII/efivar-rs that referenced this pull request Dec 25, 2022
/// The limit might be from the underlying filesystem or API, or an administratively imposed
/// resource limit.
#[unstable(feature = "io_error_more", issue = "86442")]
FilenameTooLong,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

std uses file_name in functions, rather than filename. It'd be odd to break correspondence between snake_case and CamelCase, so I think this should be FileNameTooLong to match. Same goes for InvalidFileName.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-io Area: std::io, std::fs, std::net and std::path merged-by-bors This PR was explicitly merged by bors. relnotes Marks issues that should be documented in the release notes of the next release. S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. T-libs-api Relevant to the library API team, which will review and decide on the PR/issue.
Projects
None yet
Development

Successfully merging this pull request may close these issues.