Commit graph

14369 commits

Author SHA1 Message Date
Manish Goregaokar
131e25401c
Rollup merge of #73648 - poliorcetics:return-keyword, r=joshtriplett
Document the return keyword

Partial fix of #34601.

This documents the `return` keyword with two short example to explain it is not needed for the last expression in a function and a long example to show its use when interrupting a function execution early.

I did not put a link to the reference since the only link I found was https://doc.rust-lang.org/stable/reference/expressions/return-expr.html#return-expressions.

@rustbot modify labels: T-doc,C-enhancement
2020-06-25 18:00:20 -07:00
Manish Goregaokar
f91330abfa
Rollup merge of #73621 - poliorcetics:mut-keyword, r=steveklabnik
Document the mut keyword

Partial fix for #34601.

Documentation for the `mut` keyword. I think it's okay for it to be quite short, this is not the book not the reference, but if you find something is missing, do not hesitate to tell me.
2020-06-25 18:00:18 -07:00
Manish Goregaokar
01a293a838
Rollup merge of #73619 - poliorcetics:mod-keyword, r=steveklabnik
Document the mod keyword

Partial fix for #34601 .

Documentation for the `mod` keyword.
2020-06-25 18:00:16 -07:00
Manish Goregaokar
5158b3c998
Rollup merge of #72617 - eduardosm:panicking, r=Amanieu
Add a fast path for `std:🧵:panicking`.

This is done by adding a global atomic variable (non-TLS) that counts how many threads are panicking. In order to check if the current thread is panicking, this variable is read and, if it is zero, no thread (including the one where `panicking` is being called) is panicking and `panicking` can return `false` immediately without needing to access TLS. If the global counter is not zero, the local counter is accessed from TLS to check if the current thread is panicking.
2020-06-25 18:00:02 -07:00
Alexis Bourget
3d09017477 Add a compile fail example, binding -> variable, apply suggestions 2020-06-25 10:05:30 +02:00
Dylan DPC
a5839f35b6
Rollup merge of #73688 - poliorcetics:self-keyword, r=joshtriplett
Document the self keyword

Partial fix of #34601.

This documents the `self` keyword, adding several examples and a link to the reference.
2020-06-25 02:03:40 +02:00
Dylan DPC
67db7a2d05
Rollup merge of #72700 - davidtwco:issue-66220-improper-ctypes-declarations, r=lcnr,varkor
`improper_ctypes_definitions` lint

Addresses #19834, #66220, and #66373.

This PR takes another attempt at #65134 (reverted in #66378). Instead of modifying the existing `improper_ctypes` lint to consider `extern "C" fn` definitions in addition to `extern "C" {}` declarations, this PR adds a new lint - `improper_ctypes_definitions` - which only applies to `extern "C" fn` definitions.

In addition, the `improper_ctype_definitions` lint differs from `improper_ctypes` by considering `*T` and `&T` (where `T: Sized`) FFI-safe (addressing #66220).

There wasn't a clear consensus in #66220 (where the issues with #65134 were primarily discussed) on the approach to take, but there has [been some discussion in Zulip](https://rust-lang.zulipchat.com/#narrow/stream/131828-t-compiler/topic/.2366220.20improper_ctypes.20definitions.20vs.20declarations/near/198903086). I fully expect that we'll want to iterate on this before landing.

cc @varkor + @shepmaster (from #19834) @hanna-kruppe (active in discussing #66220), @SimonSapin (#65134 caused problems for Servo, want to make sure that this PR doesn't)
2020-06-25 02:03:32 +02:00
Eduardo Sánchez Muñoz
771a1d8e0a Make std::panicking::panic_count::is_zero inline and move the slow path into a separate cold function. 2020-06-24 18:17:27 +02:00
Dylan DPC
38c85b7393
Rollup merge of #73638 - yuqio:remove-unused-crate-imports, r=nikomatsakis
Remove unused crate imports in 2018 edition crates

Closes #73570
2020-06-24 14:28:33 +02:00
Alexis Bourget
03661630c9 Document the self keyword 2020-06-24 13:52:57 +02:00
David Wood
14ea7a777f
lints: add improper_ctypes_definitions
This commit adds a new lint - `improper_ctypes_definitions` - which
functions identically to `improper_ctypes`, but on `extern "C" fn`
definitions (as opposed to `improper_ctypes`'s `extern "C" {}`
declarations).

Signed-off-by: David Wood <david@davidtw.co>
2020-06-24 12:09:35 +01:00
Alexis Bourget
d8ea10c95f Document the return keyword
Apply suggestions from code review

Co-authored-by: Josh Triplett <josh@joshtriplett.org>
2020-06-24 09:23:55 +02:00
bors
3b1c08c68c Auto merge of #73635 - Dylan-DPC:rollup-b4wbp42, r=Dylan-DPC
Rollup of 7 pull requests

Successful merges:

 - #71756 (add Windows system error codes that should map to io::ErrorKind::TimedOut)
 - #73495 (Converted all platform-specific stdin/stdout/stderr implementations to use io:: traits)
 - #73575 (Fix typo in error_codes doc)
 - #73578 (Make is_freeze and is_copy_modulo_regions take TyCtxtAt)
 - #73586 (switch_ty is redundant)
 - #73600 (Fix spurious 'value moved here in previous iteration of loop' messages)
 - #73610 (Clean up E0699 explanation)

Failed merges:

r? @ghost
2020-06-23 04:03:28 +00:00
yuqio
9267b4f612 Remove unused crate imports in 2018 edition crates 2020-06-23 05:01:20 +02:00
Dylan DPC
5426586cc3
Rollup merge of #73495 - Lucretiel:wasi-io-impls, r=sfackler
Converted all platform-specific stdin/stdout/stderr implementations to use io:: traits

Currently, some of the platform-specific standard streams (`src/libstd/sys/*/stdio.rs`) manually implement parts of the `io::Write` interface directly as methods on the struct, rather than by actually implementing the trait. There doesn't seem to be any reason for this, other than an unused advantage of `fn write(&self, ...)` instead of `fn write(&mut self, ...)`.

Unfortunately, this means that those implementations don't have the default-implemented io methods, like `read_exact` and `write_all`. This caused #72705, which adds forwarding methods to the user-facing standard stream implementations, to fail to compile on those platforms.

This change converts *all* such standard stream structs to use the standard library traits. This change should not cause any breakages, because the changed types are not publicly exported, and in fact are only ever used in `src/libstd/io/stdio.rs`.
2020-06-23 03:16:19 +02:00
Dylan DPC
6276c135d1
Rollup merge of #71756 - carstenandrich:master, r=dtolnay
add Windows system error codes that should map to io::ErrorKind::TimedOut

closes #71646

**Disclaimer:** The author of this pull request has a negligible amount of experience (i.e., kinda zero) with the Windows API. This PR should _definitely_ be reviewed by someone familiar with the API and its error handling.

While porting POSIX software using serial ports to Windows, I found that for many Windows system error codes, an `io::Error` created via `io::Error::from_raw_os_error()` or `io::Error::last_os_error()` is not `io::ErrorKind::TimedOut`. For example, when a (non-overlapped) write to a COM port via [`WriteFile()`](https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-readfile) times out, [`GetLastError()`](https://docs.microsoft.com/en-us/windows/win32/api/errhandlingapi/nf-errhandlingapi-getlasterror) returns `ERROR_SEM_TIMEOUT` ([121](https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--0-499-)). However, an `io::Error` created from this error code will have `io::ErrorKind::Other`.

Currently, only the error codes `ERROR_OPERATION_ABORTED` and `WSAETIMEDOUT` will instantiate `io::Error`s with kind `io::ErrorKind::TimedOut`.
This makes `io::Error::last_os_error()` unsuitable for error handling of syscalls that could time out, because timeouts can not be caught by matching the error's kind against `io::ErrorKind::TimedOut`.

Downloading the [list of Windows system error codes](https://gist.github.com/carstenandrich/c331d557520b8a0e7f44689ca257f805) and grepping anything that sounds like a timeout (`egrep -i "timed?.?(out|limit)"`), I've identified the following error codes that should also have `io::ErrorKind::TimedOut`, because they could be I/O-related:

Name | Code | Description
--- | --- | ---
`ERROR_SEM_TIMEOUT` | [121](https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--0-499-) | The semaphore timeout period has expired.
`WAIT_TIMEOUT` | [258](https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--0-499-) | The wait operation timed out.
`ERROR_DRIVER_CANCEL_TIMEOUT` | [594](https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--500-999-) | The driver %hs failed to complete a cancelled I/O request in the allotted time.
`ERROR_COUNTER_TIMEOUT` | [1121](https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--1000-1299-) | A serial I/O operation completed because the timeout period expired. The IOCTL_SERIAL_XOFF_COUNTER did not reach zero.)
`ERROR_TIMEOUT` | [1460](https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--1300-1699-) | This operation returned because the timeout period expired.
`ERROR_CTX_MODEM_RESPONSE_TIMEOUT` | [7012](https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--6000-8199-) | The modem did not respond to the command sent to it. Verify that the modem is properly cabled and powered on.
`ERROR_CTX_CLIENT_QUERY_TIMEOUT` | [7040](https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--6000-8199-) | The client failed to respond to the server connect message.
`ERROR_DS_TIMELIMIT_EXCEEDED` | [8226](https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--8200-8999-) | The time limit for this request was exceeded.
`DNS_ERROR_RECORD_TIMED_OUT` | [9705](https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--9000-11999-) | DNS record timed out.
`ERROR_IPSEC_IKE_TIMED_OUT` | [13805](https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--12000-15999-) | Negotiation timed out.

The following errors are also timeouts, but they don't seem to be directly related to I/O or network operations:

Name | Code | Description
--- | --- | ---
`ERROR_SERVICE_REQUEST_TIMEOUT` | [1053](https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--1000-1299-) | The service did not respond to the start or control request in a timely fashion.
`ERROR_RESOURCE_CALL_TIMED_OUT` | [5910](https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--4000-5999-) | The call to the cluster resource DLL timed out.
`FRS_ERR_SYSVOL_POPULATE_TIMEOUT` | [8014](https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--6000-8199-) | The file replication service cannot populate the system volume because of an internal timeout. The event log may have more information.
`ERROR_RUNLEVEL_SWITCH_TIMEOUT` | [15402](https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--12000-15999-) | The requested run level switch cannot be completed successfully since one or more services will not stop or restart within the specified timeout.
`ERROR_RUNLEVEL_SWITCH_AGENT_TIMEOUT` | [15403](https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--12000-15999-) | A run level switch agent did not respond within the specified timeout.

Please note that `ERROR_SEM_TIMEOUT` is the only timeout error I have [seen in action](https://gist.github.com/carstenandrich/10b3962fa1abc9e50816b6460010900b). The remainder of the error codes listed above is based purely on reading documentation.

This pull request adds all of the errors listed in both tables, but I'm not sure whether adding all of them makes sense. Someone with actual Windows API experience should decide that.

I expect these changes to be fairly backwards compatible, because only the error's [`.kind()`](https://doc.rust-lang.org/std/io/struct.Error.html#method.kind) will change, but matching the error's code via [`.raw_os_error()`](https://doc.rust-lang.org/std/io/struct.Error.html#method.raw_os_error) will not be affected.
However, code expecting these errors to be `io::ErrorKind::Other` would break. Even though I personally do not think such an implementation would make sense, after all the docs say that `io::ErrorKind` is _intended to grow over time_, a residual risk remains, of course. I took the liberty to ammend the docstring of `io::ErrorKind::Other` with a remark that discourages matching against it.

As per the contributing guidelines I'm adding @steveklabnik due to the changed documentation. Also @retep998 might have some valuable insights on the error codes.

r? @steveklabnik
cc @retep998
cc @Mark-Simulacrum
2020-06-23 03:16:14 +02:00
bors
dcd470fe1b Auto merge of #73007 - yoshuawuyts:socketaddr-from-string-u16, r=sfackler
impl ToSocketAddrs for (String, u16)

This adds a convenience impl of `ToSocketAddrs for (String, u16)`. When authoring HTTP services it's common to take command line options for `host` and `port` and parse them into `String` and `u16` respectively. Consider the following program:
```rust
#[derive(Debug, StructOpt)]
struct Config {
    host: String,
    port: u16,
}

async fn main() -> io::Result<()> {
    let config = Config::from_args();
    let stream = TcpStream::connect((&*config.host, config.port))?; // &* is not ideal
    // ...
}
```

Networking is a pretty common starting point for people new to Rust, and seeing `&*` in basic examples can be confusing. Even as someone that has experience with networking in Rust I tend to forget that `String` can't be passed directly there. Instead with this patch we can omit the `&*` conversion and pass `host` directly:
```rust
#[derive(Debug, StructOpt)]
struct Config {
    host: String,
    port: u16,
}

async fn main() -> io::Result<()> {
    let config = Config::from_args();
    let stream = TcpStream::connect((config.host, config.port))?; // no more conversions!
    // ...
}
```

I think should be an easy and small ergonomics improvement for networking. Thanks!
2020-06-23 00:13:50 +00:00
Alexis Bourget
3c46e36d39 Document the mut keyword 2020-06-22 16:27:23 +02:00
Alexis Bourget
9766a93163 Document the mod keyword 2020-06-22 15:36:09 +02:00
bors
228a0ed7b0 Auto merge of #70946 - jumbatm:clashing-extern-decl, r=nagisa
Add a lint to catch clashing `extern` fn declarations.

Closes #69390.

Adds lint `clashing_extern_decl` to detect when, within a single crate, an extern function of the same name is declared with different types. Because two symbols of the same name cannot be resolved to two different functions at link time, and one function cannot possibly have two types, a clashing extern declaration is almost certainly a mistake.

This lint does not run between crates because a project may have dependencies which both rely on the same extern function, but declare it in a different (but valid) way. For example, they may both declare an opaque type for one or more of the arguments (which would end up distinct types), or use types that are valid conversions in the language the extern fn is defined in. In these cases, we can't say that the clashing declaration is incorrect.

r? @eddyb
2020-06-21 02:20:07 +00:00
Ralf Jung
96b86ea1a8
Rollup merge of #73471 - raoulstrackx:raoul/fpu_tag_word, r=jethrogb
Prevent attacker from manipulating FPU tag word used in SGX enclave

Insufficient sanitization of the x87 FPU tag word in the trusted enclave runtime allowed unprivileged adversaries in the containing host application to induce incoherent or unexpected results for ABI-compliant compiled enclave application code that uses the x87 FPU.

Vulnerability was disclosed to us by Fritz Alder, Jo Van Bulck, David Oswald and Frank Piessens

cc: @jethrogb
2020-06-20 16:39:57 +02:00
Ralf Jung
77efcab0f2
Rollup merge of #73171 - tblah:riscv-qemu-test, r=pietroalbini
RISC-V Emulated Testing

Adds a disabled docker image on which to run RISC-V tests. Based on the armhf image.

Test using
```
./src/ci/docker/run.sh riscv64gc-linux
```

cc: @msizanoen1
2020-06-20 16:39:51 +02:00
jumbatm
6b74e3cbb9 Add ClashingExternDecl lint.
This lint checks that all declarations for extern fns of the same name
are declared with the same types.
2020-06-20 16:54:32 +10:00
Manish Goregaokar
7777b0b03d
Rollup merge of #73484 - poliorcetics:use-prelude-doc, r=sfackler
Update the doc for std::prelude to the correct behavior

Fixes #64686.

One line change to ensure the docs are correct about the behavior of the compiler when inserting`std::prelude::v1`.

I don't think examples are necessary but I can add some (especially those from the original issue) if needed.
2020-06-19 19:43:11 -07:00
Alexis Bourget
8f0bd5ffe6 Update the doc for std::prelude, removing the "technical part" section 2020-06-19 21:19:17 +02:00
Raoul Strackx
33b304c5e0 Using xsave restore to restore complete FPU state 2020-06-19 18:39:07 +02:00
Nathan West
0094f44a0b Remove old commented code 2020-06-19 11:42:58 -04:00
Nathan West
e93362b974 Fixed missing mut 2020-06-19 11:32:36 -04:00
Ralf Jung
f7d833e83d
Rollup merge of #73464 - qy3u:fs-document-format-correction, r=jonas-schievink
Document format correction

Minor amendments to the document.

r? @steveklabnik
2020-06-19 08:56:17 +02:00
Ralf Jung
78f3e9c344
Rollup merge of #73142 - ehuss:std-benches, r=dtolnay
Ensure std benchmarks get tested.

This ensures that the std benchmarks don't break in the future. Currently they aren't compiled or tested on CI, so they can easily bitrot.  Testing a benchmark runs it with one iteration. Adding these should only add a few seconds to CI.

Closes #54176
Closes #61913
2020-06-19 08:56:08 +02:00
Ralf Jung
99be102a6d
Rollup merge of #72486 - Ralith:asinh-fix, r=dtolnay
Fix asinh of negative values

Rust's current implementation of asinh has [large errors](https://www.wolframalpha.com/input/?i=arcsinh%28x%29%2C+ln%28x%2B%28x%5E2%2B1%29%5E0.5%29%2C+x+from+-67452095.07139316+to+0) in its negative range. ~These are (mostly) not numerical, but rather seem due to an incorrect implementation.~ This appears to be due to avoidable catastrophic cancellation.
[Playground before/after](https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=bd04ae6d86d06612e4e389a8b95d19ab).
[glibc uses](81dca813cc/sysdeps/ieee754/dbl-64/s_asinh.c (L56)) abs here.

Many thanks to @danieldeankon for finding this weird behavior, @jebrosen for diagnosing it, and @toasteater for identifying the probable implementation error!
2020-06-19 08:55:59 +02:00
Nathan West
c9c434dd8b Converted all platform-specific stdin/stdout/stderr implementations to io traits 2020-06-19 00:15:11 -04:00
Benjamin Saunders
35a2915bf3 Remove now-redundant branch 2020-06-18 18:52:26 -07:00
Manish Goregaokar
e1549786ff
Rollup merge of #72836 - poliorcetics:std-time-os-specificities, r=shepmaster
Complete the std::time documentation to warn about the inconsistencies between OS

Fixes #48980.

I put the new documentation in `src/libstd/time.rs` at the module-level because it affects all types, even the one that are not directly system dependents if they are used with affected types, but there may be a better place for it.
2020-06-18 15:20:47 -07:00
Manish Goregaokar
49ab0cab61
Rollup merge of #72279 - RalfJung:raw-ref-macros, r=nikomatsakis
add raw_ref macros

In https://github.com/rust-lang/rust/issues/64490, various people were in favor of exposing `&raw` as a macro first before making the actual syntax stable. So this PR (unstably) introduces those macros.

I'll create the tracking issue if we're okay moving forward with this.
2020-06-18 15:20:39 -07:00
Eric Huss
abb5800dd5 Ensure std benchmarks get tested. 2020-06-18 09:11:15 -07:00
Raoul Strackx
daedb7920f Prevent attacker from manipulating FPU tag word used in SGX enclave
Insufficient sanitization of the x87 FPU tag word in the trusted enclave runtime allowed unprivileged adversaries in the containing host application to induce incoherent or unexpected results for ABI-compliant compiled enclave application code that uses the x87 FPU.

Vulnerability was disclosed to us by Fritz Alder, Jo Van Bulck, David Oswald and Frank Piessens
2020-06-18 12:11:39 +02:00
qy3u
d134870bd4 Document format correction 2020-06-18 17:46:27 +08:00
Dylan DPC
3c437e5733
Rollup merge of #73389 - lzutao:from, r=kennytm
Use `Ipv4Addr::from<[u8; 4]>` when possible

Resolve this comment: https://github.com/rust-lang/rust/pull/73331#discussion_r440098369
2020-06-16 15:08:47 +02:00
Dylan DPC
94105c2da3
Rollup merge of #73373 - lzutao:bug-trackcaller, r=Amanieu
Use track caller for bug! macro
2020-06-16 15:08:42 +02:00
Lzu Tao
0e6c333ca6 Use Ipv4Addr::from<[u8; 4]> when possible 2020-06-16 01:54:17 +00:00
Alexis Bourget
9e510085ec Complete the std::time documentation to warn about the inconsistencies between OS 2020-06-15 15:19:02 +02:00
Lzu Tao
64a6de25ea Join mutiple lines if it is more readable 2020-06-15 13:15:47 +00:00
Ralf Jung
54bd077cd6
Rollup merge of #73331 - hermitcore:listen, r=kennytm
extend network support for HermitCore

- add basic support of TcpListerner for HermitCore
- revise TcpStream to support peer_addr
2020-06-15 12:01:14 +02:00
Ralf Jung
202499fb43
Rollup merge of #73304 - dtolnay:socketeq, r=Mark-Simulacrum
Revert heterogeneous SocketAddr PartialEq impls

Originally added in #72239.

These lead to inference regressions (mostly in tests) in code that looks like:

```rust
let socket = SocketAddrV4::new(Ipv4Addr::new(127, 0, 0, 1), 8080);
assert_eq!(socket, "127.0.0.1:8080".parse().unwrap());
```

That compiles as of stable 1.44.0 but fails in beta with:

```console
error[E0284]: type annotations needed
 --> src/main.rs:3:41
  |
3 |     assert_eq!(socket, "127.0.0.1:8080".parse().unwrap());
  |                                         ^^^^^ cannot infer type for type parameter `F` declared on the associated function `parse`
  |
  = note: cannot satisfy `<_ as std::str::FromStr>::Err == _`
help: consider specifying the type argument in the method call
  |
3 |     assert_eq!(socket, "127.0.0.1:8080".parse::<F>().unwrap());
  |
```

Closes #73242.
2020-06-15 12:01:13 +02:00
Ralf Jung
ec6fe42dd4
Rollup merge of #73139 - poliorcetics:cstring-from-vec-with-nul, r=dtolnay
Add methods to go from a nul-terminated Vec<u8> to a CString

Fixes #73100.

Doc tests have been written and the documentation on the error type
updated too.

I used `#[stable(feature = "cstring_from_vec_with_nul", since = "1.46.0")]` but I don't know if the version is correct.
2020-06-15 12:01:09 +02:00
Ralf Jung
7c8b9413b8
Rollup merge of #73104 - poliorcetics:explicit-mutex-drop-example, r=dtolnay
Example about explicit mutex dropping

Fixes #67457.

Following the remarks made in #73074, I added an example on the main `Mutex` type, with a situation where there is mutable data and a computation result.

In my testing it is effectively needed to explicitly drop the lock, else it deadlocks.

r? @dtolnay because you were the one to review the previous PR.
2020-06-15 12:01:07 +02:00
Stefan Lankes
76f1581a25 remove obsolete , to pass the format check 2020-06-15 10:05:14 +02:00
Stefan Lankes
a8e3746e91 add comment about the usage of Arc 2020-06-15 09:29:32 +02:00
Stefan Lankes
6c983a7335 use Ipv6Addr::from to build the IPv6 address 2020-06-15 08:53:58 +02:00