Commit Graph

125621 Commits

Author SHA1 Message Date
David Tolnay 336c85a053 rustdoc: Preserve rendering of macro_rules matchers when possible 2021-12-27 14:20:18 -08:00
Matthias Krüger eab81297f7 Rollup merge of #92307 - hiroshi-maybe:fix-minor-typos, r=camelid
Fix minor typos
2021-12-27 21:42:30 +01:00
Matthias Krüger 052eab54ec Rollup merge of #92303 - Patrick-Poitras:issue-26186, r=jackh726
Add test cases for issue #26186

Closes #26186

It seems that issue #26186 has been solved at some point since the issue has been last updated. I've merged together the examples that were supplied by `@Osspial,` `@Mark-Simulacrum,` `@Diggsey,` `@eefriedman` and `@shepmaster,` so that we can add this to the testing suite and prevent these issues from re-occurring.
2021-12-27 21:42:29 +01:00
Matthias Krüger bd77fbfef1 Rollup merge of #92112 - SparrowLii:issue92010, r=cjgillot
Fix the error of checking `base_expr` twice in type_changing_struct_update

Fixes #92010
2021-12-27 21:42:25 +01:00
Matthias Krüger b57a6b38c5 Rollup merge of #90586 - jswrenn:relax-privacy-lints, r=petrochenkov
Relax priv-in-pub lint on generic bounds and where clauses of trait impls.

The priv-in-pub lint is a legacy mechanism of the compiler, supplanted by a reachability-based [type privacy](https://github.com/rust-lang/rfcs/blob/master/text/2145-type-privacy.md) analysis. This PR does **not** relax type privacy; it only relaxes the lint (as proposed by the type privacy RFC) in the case of trait impls.

## Current Behavior
On public trait impls, it's currently an **error** to have a `where` bound constraining a private type with a trait:
```rust
pub trait Trait {}
pub struct Type {}

struct Priv {}
impl Trait for Priv {}

impl Trait for Type
where
    Priv: Trait // ERROR
{}
```

...and it's a **warning** to have have a public type constrained by a private trait:
```rust
pub trait Trait {}
pub struct Type {}

pub struct Pub {}
trait Priv {}
impl Priv for Pub {}

impl Trait for Type
where
    Pub: Priv // WARNING
{}
```

This lint applies to `where` clauses in other contexts, too; e.g. on free functions:
```rust
struct Priv<T>(T);
pub trait Pub {}
impl<T: Pub> Pub for Priv<T> {}

pub fn function<T>()
where
    Priv<T>: Pub // WARNING
{}
```

**These constraints could be relaxed without issue.**

## New Behavior
This lint is relaxed for `where` clauses on trait impls, such that it's okay to have a `where` bound constraining a private type with a trait:
```rust
pub trait Trait {}
pub struct Type {}

struct Priv {}
impl Trait for Priv {}

impl Trait for Type
where
    Priv: Trait // OK
{}
```

...and it's okay to have a public type constrained by a private trait:
```rust
pub trait Trait {}
pub struct Type {}

pub struct Pub {}
trait Priv {}
impl Priv for Pub {}

impl Trait for Type
where
    Pub: Priv // OK
{}
```

## Rationale
While the priv-in-pub lint is not essential for soundness, it *can* help programmers avoid pitfalls that would make their libraries difficult to use by others. For instance, such a lint *is* useful for free functions; e.g. if a downstream crate tries to call the `function` in the previous snippet in a generic context:
```rust
fn callsite<T>()
where
    Priv<T>: Pub // ERROR: omitting this bound is a compile error, but including it is too
{
    function::<T>()
}
```
...it cannot do so without repeating `function`'s `where` bound, which we cannot do because `Priv` is out-of-scope. A lint for this case is arguably helpful.

However, this same reasoning **doesn't** hold for trait impls. To call an unconstrained method on a public trait impl with private bounds, you don't need to forward those private bounds, you can forward the public trait:
```rust
mod upstream {
    pub trait Trait {
        fn method(&self) {}
    }
    pub struct Type<T>(T);

    pub struct Pub<T>(T);
    trait Priv {}
    impl<T: Priv> Priv for Pub<T> {}

    impl<T> Trait for Type<T>
    where
        Pub<T>: Priv // WARNING
    {}
}

mod downstream {
    use super::upstream::*;

    fn function<T>(value: Type<T>)
    where
        Type<T>: Trait // <- no private deets!
    {
        value.method();
    }
}
```

**This PR only eliminates the lint on trait impls.** It leaves it intact for all other contexts, including trait definitions, inherent impls, and function definitions. It doesn't need to exist in those cases either, but I figured I'd first target a case where it's mostly pointless.

## Other Notes
- See discussion [on zulip](https://rust-lang.zulipchat.com/#narrow/stream/213817-t-lang/topic/relax.20priv-in-pub.20lint.20for.20trait.20impl.20.60where.60.20bounds/near/222458397).
- This PR effectively reverts #79291.
2021-12-27 21:42:25 +01:00
Michael Goulet b1529a680a Visit patterns' literal expressions before binding new idents 2021-12-27 12:20:13 -08:00
Wesley Wiser ebc0d0d2a8 Address review comments 2021-12-27 14:07:05 -05:00
Smitty 9702348957 Clarify that repeat count must be positive 2021-12-27 12:31:40 -05:00
Eric Huss 4d6bb4d881 compiletest: Remove some vestigial code 2021-12-26 20:33:10 -08:00
Hiroshi Kori 7a3a668bc9 fix typo: intialized -> initialized 2021-12-26 18:37:11 -08:00
Jack Wrenn ebef8a8cee relax priv-in-pub lint on generic bounds and where clauses in trait impls 2021-12-27 00:22:09 +00:00
PFPoitras fe80124098 Add test cases for issue #26186 2021-12-26 20:13:29 -04:00
bors f8abed9ed4 Auto merge of #92257 - fee1-dead:fix_env_further_bounds, r=oli-obk
normalize env constness for nested obligations

Closes #92230.
2021-12-26 08:52:31 +00:00
Roc Yu bbbeefd860 Remove unneeded call to collect 2021-12-25 21:35:05 -05:00
Roc Yu 141c542052 Remove String allocation in loop 2021-12-25 19:41:19 -05:00
bors 51e8031e14 Auto merge of #92262 - notriddle:notriddle/unused-hash, r=jyn514
rustdoc: remove unused Hash impl
2021-12-25 19:41:11 +00:00
bors c096176fb4 Auto merge of #92227 - Kobzol:rustdoc-doc-hidden, r=jyn514
Rustdoc: use `is_doc_hidden` method on more places

While profiling `rustdoc`, I noticed that finding out if some item is marked with `#[doc(hidden)]` is relatively hot, so I tried to optimize it.

I noticed that there is already a method called `is_doc_hidden` on `TyCtxt`, but it wasn't used much, so I replaced the manual calls to `attrs(...).has_word(...)` with this method. Just by doing that, perf. was improved locally, although I'm not sure if the semantics of the previous calls and this method are the same?

As another step, I tried to querify `is_doc_hidden`, but I didn't include that here until we see the perf. results from the first commit and until I find whether this change is OK at all :)

Can I ask for a perf. run? Thanks.

r? `@jyn514`
2021-12-25 14:47:12 +00:00
bors 67491a22db Auto merge of #92247 - lnicola:rust-analyzer-2021-12-24, r=lnicola
⬆️ rust-analyzer

r? `@ghost`
2021-12-25 02:19:48 +00:00
bors 83bde52116 Auto merge of #92229 - fee1-dead:fix-rustdoc-const-drop, r=dtolnay
Do not display `~const Drop` in rustdoc

Although `T: ~const Drop` is still at an experimental stage, we have already begun inserting these bounds in libstd. This change hides them from rustdoc because 1. `~const` should not be documented in general as it is not yet official syntax; 2. users are not expected to know what `~const Drop` means yet.
2021-12-24 23:12:14 +00:00
Michael Howell 551829b6ad rustdoc: remove unused Hash impl 2021-12-24 13:23:03 -07:00
Aaron Hill da3f196a4e Remove special-cased stable hashing for HIR module
All other 'containers' (e.g. `impl` blocks) hashed their contents
in the normal, order-dependent way. However, `Mod` was hashing
its contents in a (sort-of) order-independent way. However, the
exact order is exposed to consumers through `Mod.item_ids`,
and through query results like `hir_module_items`. Therefore,
stable hashing needs to take the order of items into account,
to avoid fingerprint ICEs.

Unforuntately, I was unable to directly build a reproducer
for the ICE, due to the behavior of `Fingerprint::combine_commutative`.
This operation swaps the upper and lower `u64` when constructing the
result, which makes the function non-associative. Since we start
the hashing of module items by combining `Fingerprint::ZERO` with
the first item, it's difficult to actually build an example where
changing the order of module items leaves the final hash unchanged.

However, this appears to have been hit in practice in #92218
While we're not able to reproduce it, the fact that proc-macros
are involved (which can give an entire module the same span, preventing
any span-related invalidations) makes me confident that the root
cause of that issue is our method of hashing module items.

This PR removes all of the special handling for `Mod`, instead deriving
a `HashStable` implementation. This makes `Mod` consistent with other
'contains' like `Impl`, which hash their contents through the typical
derive of `HashStable`.
2021-12-24 12:38:29 -05:00
Deadbeef bb4c5515c1 bless ui test 2021-12-25 01:33:13 +08:00
Deadbeef 77297e5f1c normalize env constness for nested obligations 2021-12-25 00:33:23 +08:00
Ralf Jung 88fb86251a update Miri 2021-12-24 13:04:15 +01:00
Michael Goulet 5a1c460898 Normalize struct tail type when checking Pointee trait 2021-12-24 01:41:18 -08:00
Laurențiu Nicola 464188488b ⬆️ rust-analyzer 2021-12-24 11:20:13 +02:00
Yacin Tmimi 76eb077fb2 Retain qualified path when rewriting struct literals
Fixes 5151

Details about the qualified path are now passed along so that rustfmt
can include them when formatting struct literals.
2021-12-23 23:04:26 -06:00
David Tolnay 0b2fd9b132 Fix static async closure qualifier order 2021-12-23 23:03:49 -06:00
bors 59337cddd4 Auto merge of #91342 - RalfJung:fn-abi, r=eddyb,oli-obk
CTFE eval_fn_call: use FnAbi to determine argument skipping and compatibility

This makes use of the `FnAbi` type in CTFE/Miri, which `@eddyb` has been saying for years is what we should do.^^ `FnAbi` is used to
- determine which arguments to skip (rather than the previous heuristic of skipping ZST arguments with the Rust ABI)
- impose further restrictions on whether caller and callee are consistent in how a given argument is passed

I was hoping it would also simplify the code, but that is not the case -- the previous type compatibility checks are still required (AFAIK), only the ZST skipping is gone and that took barely any code. We also need some hacks because `FnAbi` assumes a certain way of implementing `caller_location` (by passing extra arguments), but Miri can just read the caller location from the call stack so it doesn't need those arguments. (The fact that every backend has to separately implement support for these arguments seems suboptimal -- looks like this might have been better implemented on the MIR level.) To avoid having to implement those unnecessary arguments in Miri, we just compute *whether* the argument is present on the caller/callee side, but don't actually pass that argument around.

I have no idea if this looks the way `@eddyb` thinks it should look... but it makes Miri's test suite pass. ;)
One of rustc's tests fails unfortunately (`ui/const-generics/issues/issue-67739.rs`), some const generic code that is evaluated too early -- I think that should raise `TooGeneric` but instead it ICEs. My assumption is this is some FnAbi code that has not been properly tested on polymorphic code, but it might also be me calling that FnAbi code the wrong way.

r? `@oli-obk` `@eddyb`
Fixes https://github.com/rust-lang/rust/issues/56166
Miri PR at https://github.com/rust-lang/miri/pull/1928
2021-12-24 04:59:05 +00:00
David Tolnay 55fc986be7 Fix tidy line length lint in stringify tests 2021-12-23 16:55:56 -08:00
David Tolnay ac43ba8bb8 Format with rust-lang/rust's rustfmt settings 2021-12-23 16:54:31 -08:00
David Tolnay a51326f1ba Add a test suite for stringify macro 2021-12-23 16:23:43 -08:00
Roc Yu 91fe2d0ed7 Clean up NestedAttributesExt trait/implementation 2021-12-23 17:58:59 -05:00
bors d6d12b6a5d Auto merge of #92222 - nnethercote:rm-global_allocator-rustc-rustdoc, r=alexcrichton
Remove useless `#[global_allocator]` from rustc and rustdoc.

This was added in #83152, which has several errors in its comments.

This commit also fix up the comments, which are quite wrong and
misleading.

r? `@alexcrichton`
2021-12-23 22:34:13 +00:00
bors c09a9529c5 Auto merge of #92232 - matthiaskrgr:rollup-eqdac7z, r=matthiaskrgr
Rollup of 5 pull requests

Successful merges:

 - #90625 (Add `UnwindSafe` to `Once`)
 - #92121 (disable test with self-referential generator on Miri)
 - #92166 (Fixed a small typo in ui test comments)
 - #92203 (Store a `DefId` instead of an `AdtDef` in `AggregateKind::Adt`)
 - #92231 (Update books)

Failed merges:

r? `@ghost`
`@rustbot` modify labels: rollup
2021-12-23 19:43:04 +00:00
Aaron Hill d9220924dc Import SourceFiles from crate before decoding foreign Span
Fixes #92163
Fixes #92014

When writing to the incremental cache, we encode all `Span`s
we encounter, regardless of whether or not their `SourceFile`
comes from the local crate, or from a foreign crate.

When we decode a `Span`, we use the `StableSourceFileId` we encoded
to locate the matching `SourceFile` in the current session. If this
id corresponds to a `SourceFile` from another crate, then we need to
have already imported that `SourceFile` into our current session.

This usually happens automatically during resolution / macro expansion,
when we try to resolve definitions from other crates. In certain cases,
however, we may try to load a `Span` from a transitive dependency
without having ever imported the `SourceFile`s from that crate, leading
to an ICE.

This PR fixes the issue by calling `imported_source_files()`
when we encounter a `SourceFile` with a foreign `CrateNum`.
This ensures that all `SourceFile`s from that crate are imported
into the current session.
2021-12-23 12:56:12 -05:00
Matthias Krüger 996fb28298 Rollup merge of #92231 - ehuss:update-books, r=ehuss
Update books

## nomicon

1 commits in 49681ea4a9fa81173dbe9ffed74b4d4a35eae9e3..c05c452b36358821bf4122f9c418674edd1d713d
2021-11-24 16:27:28 +0900 to 2021-12-13 15:23:48 +0900
- Update the guidance on uninitialized data with ptr::addr_of_mut (rust-lang/nomicon#325)

## reference

3 commits in 954f3d441ad880737a13e241108f791a4d2a38cd..06f9e61931bcf58b91dfe6c924057e42ce273ee1
2021-11-29 11:11:30 -0800 to 2021-12-17 07:31:40 -0800
- keep consistent for primitive types (rust-lang/reference#1118)
- README.md: link to mdbook docs (rust-lang/reference#1117)
- Say that `...` range patterns are rejected in the 2021 edition (rust-lang/reference#1114)

## book

4 commits in 5f9358faeb1f46e19b8a23a21e79fd7fe150491e..8a0bb3c96e71927b80fa2286d7a5a5f2547c6aa4
2021-12-05 21:33:16 -0500 to 2021-12-22 20:54:27 -0500
- Propagate edits back
- Fix number disagreement. Fixes rust-lang/book#2858.
- Wrap some code in main to make scopes clearer. Fixes rust-lang/book#2830.
- Respond to ch5 nostarch edits

## rustc-dev-guide

9 commits in a374e7d8bb6b79de45b92295d06b4ac0ef35bc09..9bf0028b557798ddd07a6f652e4d0c635d3d6620
2021-12-03 09:26:47 -0800 to 2021-12-20 21:53:57 +0900
- remove rustfix item in test intro (rust-lang/rustc-dev-guide#1277)
- Move date-check comment to fix Markdown syntax
- Update humor docs for special-casing ferris emoji
- Fix some broken links (rust-lang/rustc-dev-guide#1274)
- Update rustdoc internals
- Update HIR chapter to use `HirId` instead of `NodeId`
- Fix some broken links
- Update src/getting-started.md
- Improve documentation on r?
2021-12-23 17:48:32 +01:00
Matthias Krüger cf7ee6974e Rollup merge of #92166 - fee1-dead:patch-2, r=jyn514
Fixed a small typo in ui test comments
2021-12-23 17:48:30 +01:00
Eric Huss b4678870d9 Update books 2021-12-23 08:44:14 -08:00
bors 77497c74f9 Auto merge of #92110 - nagisa:def-inlining, r=nikic
Backport LLVM changes to disable deferred inlining

Fixes #91128

I was thinking of how to best add the test case from the issue, and I think rust perf infrastructure would probably be the best place for something like it.
2021-12-23 16:12:23 +00:00
Deadbeef 2e8b4a753d Do not display ~const Drop in rustdoc 2021-12-23 23:10:48 +08:00
bors 489296d825 Auto merge of #92177 - GuillaumeGomez:pattern-matching-outside-loop, r=camelid
Move pattern matching outside of the loop

Not sure if worth it but it's been bugging me for a while now.

r? `@camelid`
2021-12-23 12:11:27 +00:00
Deadbeef 06a1c14d52 Switch all libraries to the 2021 edition 2021-12-23 19:03:47 +08:00
Jakub Beránek 0ec3199b0a Rustdoc: use is_doc_hidden method on more places 2021-12-23 11:33:47 +01:00
lcnr 484dc1f7a2 update feature gate test 2021-12-23 11:17:03 +01:00
lcnr 0f0556b627 fix clippy 2021-12-23 11:17:03 +01:00
lcnr 77733ba81e fix rustdoc 2021-12-23 10:09:35 +01:00
lcnr e3f5cc6c38 implement generic_arg_infer for array lengths 2021-12-23 10:09:35 +01:00
bors c1d301bb29 Auto merge of #92167 - pierwill:chalk-update, r=jackh726
Update chalk to 0.75.0

- Compute flags in `intern_ty`
- Remove `tracing-serde` from `PERMITTED_DEPENDENCIES`
- Bump `tracing-tree` to 0.2.0
- Bump `tracing-subscriber` to 0.3.3
2021-12-23 08:59:55 +00:00
Nicholas Nethercote bb23bfc2cd Remove useless #[global_allocator] from rustc and rustdoc.
This was added in #83152, which has several errors in its comments.

This commit also fix up the comments, which are quite wrong and
misleading.
2021-12-23 17:23:21 +11:00