rust/src/test
Matthias Krüger 857afc75e6
Rollup merge of #99212 - davidtwco:partial-stability-implies, r=michaelwoerister
introduce `implied_by` in `#[unstable]` attribute

Requested by the library team [on Zulip](https://rust-lang.zulipchat.com/#narrow/stream/131828-t-compiler/topic/better.20support.20for.20partial.20stabilizations/near/285581519).

If part of a feature is stabilized and a new feature is added for the remaining parts, then the `implied_by` meta-item can be added to `#[unstable]` to indicate which now-stable feature was used previously.

```diagnostic
error: the feature `foo` has been partially stabilized since 1.62.0 and is succeeded by the feature `foobar`
  --> $DIR/stability-attribute-implies-using-unstable.rs:3:12
   |
LL | #![feature(foo)]
   |            ^^^
   |
note: the lint level is defined here
  --> $DIR/stability-attribute-implies-using-stable.rs:2:9
   |
LL | #![deny(stable_features)]
   |         ^^^^^^^^^^^^^^^
help: if you are using features which are still unstable, change to using `foobar`
   |
LL | #![feature(foobar)]
   |            ~~~~~~
help: if you are using features which are now stable, remove this line
   |
LL - #![feature(foo)]
   |
```

When a `#![feature(..)]` attribute still exists for the now-stable attribute, then there this has two effects:

- There will not be an stability error for uses of items from the implied feature which are still unstable (until the `#![feature(..)]` is removed or updated to the new feature).
- There will be an improved diagnostic for the remaining use of the feature attribute for the now-stable feature.

```rust
        /// If part of a feature is stabilized and a new feature is added for the remaining parts,
        /// then the `implied_by` attribute is used to indicate which now-stable feature previously
        /// contained a item.
        ///
        /// ```pseudo-Rust
        /// #[unstable(feature = "foo", issue = "...")]
        /// fn foo() {}
        /// #[unstable(feature = "foo", issue = "...")]
        /// fn foobar() {}
        /// ```
        ///
        /// ...becomes...
        ///
        /// ```pseudo-Rust
        /// #[stable(feature = "foo", since = "1.XX.X")]
        /// fn foo() {}
        /// #[unstable(feature = "foobar", issue = "...", implied_by = "foo")]
        /// fn foobar() {}
        /// ```
```

In the Zulip discussion, this was envisioned as `implies` on `#[stable]` but I went with `implied_by` on `#[unstable]` because it means that only the unstable attribute needs to be changed in future, not the new stable attribute, which seems less error-prone. It also isn't particularly feasible for me to detect whether items from the implied feature are used and then only suggest updating _or_ removing the `#![feature(..)]` as appropriate, so I always do both.

There's some new information in the cross-crate metadata as a result of this change, that's a little unfortunate, but without requiring that the `#[unstable]` and `#[stable]` attributes both contain the implication information, it's necessary:

```rust
    /// This mapping is necessary unless both the `#[stable]` and `#[unstable]` attributes should
    /// specify their implications (both `implies` and `implied_by`). If only one of the two
    /// attributes do (as in the current implementation, `implied_by` in `#[unstable]`), then this
    /// mapping is necessary for diagnostics. When a "unnecessary feature attribute" error is
    /// reported, only the `#[stable]` attribute information is available, so the map is necessary
    /// to know that the feature implies another feature. If it were reversed, and the `#[stable]`
    /// attribute had an `implies` meta item, then a map would be necessary when avoiding a "use of
    /// unstable feature" error for a feature that was implied.
```

I also change some comments to documentation comments in the compiler, add a helper for going from a `Span` to a `Span` for the entire line, and fix a incorrect part of the pre-existing stability attribute diagnostics.

cc `@yaahc`
2022-07-20 18:58:14 +02:00
..
assembly Rollup merge of #98998 - workingjubilee:naked-means-no-clothes-enforcement-technology, r=Amanieu 2022-07-18 21:14:43 +05:30
auxiliary
codegen Rollup merge of #99436 - Nilstrieb:toggle-box-noalias, r=fee1-dead 2022-07-20 16:17:20 +05:30
codegen-units Fix/bless tests broken by DSE 2022-05-24 22:50:21 -04:00
debuginfo Fix debuginfo tests. 2022-07-18 10:34:41 +10:00
incremental Rollup merge of #98901 - davidtwco:split-dwarf-incr-workproduct, r=michaelwoerister 2022-07-07 18:06:52 +05:30
mir-opt ignore wasm=32 & bless 2022-07-12 16:02:17 +03:00
pretty Add pp-exact test involving where T: 2022-06-16 17:03:47 -07:00
run-make Rename debugging_opts to unstable_opts 2022-07-13 17:47:06 -05:00
run-make-fulldeps Auto merge of #96544 - m-ysk:feature/issue-96358, r=cjgillot 2022-07-14 21:50:14 +00:00
run-pass-valgrind Change enum->int casts to not go through MIR casts. 2022-06-30 07:47:07 +00:00
rustdoc Auto merge of #98180 - notriddle:notriddle/rustdoc-fn, r=petrochenkov,GuillaumeGomez 2022-07-19 19:36:57 +00:00
rustdoc-gui Add GUI test for source code sidebar auto-expand 2022-07-17 17:04:43 +02:00
rustdoc-js rustdoc: also index raw pointers 2022-05-31 11:21:55 -07:00
rustdoc-js-std Rollup merge of #96887 - notriddle:notriddle/as-raw-fd, r=jsha 2022-05-11 13:16:31 +09:00
rustdoc-json Add tests for JSON non-inlining 2022-07-16 13:39:38 +02:00
rustdoc-ui Rollup merge of #99436 - Nilstrieb:toggle-box-noalias, r=fee1-dead 2022-07-20 16:17:20 +05:30
ui Rollup merge of #99212 - davidtwco:partial-stability-implies, r=michaelwoerister 2022-07-20 18:58:14 +02:00
ui-fulldeps macros: support adding warnings to diags 2022-07-15 16:13:49 +01:00
COMPILER_TESTS.md