Add filtering option to `rustc_on_unimplemented` and reword `Iterator` E0277 errors
- Add more targetting filters for arrays to `rustc_on_unimplemented` (Fix#53766)
- Detect one element array of `Range` type, which is potentially a typo:
`for _ in [0..10] {}` where iterating between `0` and `10` was intended.
(Fix#23141)
- Suggest `.bytes()` and `.chars()` for `String`.
- Suggest borrowing or `.iter()` on arrays (Fix#36391)
- Suggest using range literal when iterating on integers (Fix#34353)
- Do not suggest `.iter()` by default (Fix#50773, fix#46806)
- Add regression test (Fix#22872)
reject partial init and reinit of uninitialized data
Reject partial initialization of uninitialized structured types (i.e. structs and tuples) and also reject partial *reinitialization* of such types.
Fix#54986Fix#54499
cc #21232
rustdoc: don't prefer dynamic linking in doc tests
This is an attempt to address the regression in #54478
This may be a case where the cure is worse than the disease, at least in the short term...
cc @alexcrichton
resolve: Scale back hard-coded extern prelude additions on 2015 edition
https://github.com/rust-lang/rust/pull/54404 stabilized `feature(extern_prelude)` on 2015 edition, including the hard-coded parts not passed with `--extern`.
First of all, I'd want to confirm that this is intended stabilization, rather than a part of the "extended beta" scheme that's going to be reverted before releasing stable.
(EDIT: to clarify - this is a question, I'm \*asking\* for confirmation, rather than give it.)
Second, on 2015 edition extern prelude is not so fundamentally tied to imports and is a mere convenience, so this PR scales them back to the uncontroversial subset.
The "uncontroversial subset" means that if libcore is injected it brings `core` into prelude, if libstd is injected it brings `std` and `core` into prelude.
On 2015 edition this can be implemented through the library prelude (rather than hard-coding in the compiler) right now, I'll do it in a follow-up PR.
UPDATE: The change is done for both 2015 and 2018 editions now as discussed below.
Closes https://github.com/rust-lang/rust/issues/53166
nll type annotations in multisegment path
This turned out to be sort of tricky. The problem is that if you have a path like
```
<Foo<&'static u32>>::bar
```
and it comes from an impl like `impl<T> Foo<T>` then the self-type the user gave doesn't *directly* map to the substitutions that the impl wants. To handle this, then, we have to preserve not just the "user-given substs" we used to do, but also a "user-given self-ty", which we have to apply later. This PR makes those changes.
It also removes the code from NLL relate-ops that handled canonical variables and moves to use normal inference variables instead. This simplifies a few things and gives us a bit more flexibility (for example, I predict we are going to have to start normalizing at some point, and it would be easy now).
r? @matthewjasper -- you were just touching this code, do you feel comfortable reviewing this?
Fixes#54574
Make `bad_style` a silent alias for `nonstandard_style`
Now only `nonstandard_style` is suggested in `rustc -W help`, but `bad_style` will not produce a warning. Closes#41646.
r? @Manishearth
Under the semantics of #54986 (our short term plan), the partial
initialization itself will signal an error. We don't need to add noise
to the output by also complaining about `mut`. (In particular, the
user may well revise their code in a way that does not require `mut`.)
(This makes it a little easier to add instrumentation of the entry and
exit by adding `debug!` at the beginning and end, though note that the
function body *does* use the `?` operator...)
A few iterator-related improvements
- typeck: don't collect into a vector when unnecessary
- create only one vector when winnowing candidates
- change a cloning map to `into_iter`
Exit with code 101 on fatal codegen errors
Fixes#54992.
This PR installs a custom fatal error handler that prints the error from LLVM and exits with 101. There should be no visible change in the output from LLVM. This allows distinguishing a fatal LLVM error with a compilation error by exit code.
This PR also modifies the LLVM codegen backend to ICE instead of emitting a fatal error when encountering a LLVM worker thread panic for the same reason.
r? @cuviper
At some point, I had thought to use this code to handle equality
comparisons for the `IfEq` verify bounds; at that point, we might not
have had an infcx to talk about. But we wound up doing "SCC
representatives" instead, so that's fine.
clarify pointer add/sub function safety concerns
Ralf Jung made the same changes to the offset functions' documentation
in commit fb089156. As add/sub just call offset, the same limitation
applies here, as well.
I did not copy the whole explanation ("In particular, the resulting pointer may *not* be used to access a different allocated object [...]") because I'd consider that as being too repetitive. The documentation of add/sub already refers to the offset function, so people interested in the details can look it up, there.
But changing 'an object' to 'the same object' is a small change which improves clarity a lot.
Add missing lifetime fragment specifier to error message.
A very minor issue, `lifetime` was missing from the error list.
I left `literal` in the list, even though it is unstable. It looks like it may stabilize soon anyways.