rust/compiler
bors 9778068cbc Auto merge of #79078 - petrochenkov:derattr, r=Aaron1011
expand/resolve: Turn `#[derive]` into a regular macro attribute

This PR turns `#[derive]` into a regular attribute macro declared in libcore and defined in `rustc_builtin_macros`, like it was previously done with other "active" attributes in https://github.com/rust-lang/rust/pull/62086, https://github.com/rust-lang/rust/pull/62735 and other PRs.
This PR is also a continuation of #65252, #69870 and other PRs linked from them, which layed the ground for converting `#[derive]` specifically.

`#[derive]` still asks `rustc_resolve` to resolve paths inside `derive(...)`, and `rustc_expand` gets those resolution results through some backdoor (which I'll try to address later), but otherwise `#[derive]` is treated as any other macro attributes, which simplifies the resolution-expansion infra pretty significantly.

The change has several observable effects on language and library.
Some of the language changes are **feature-gated** by [`feature(macro_attributes_in_derive_output)`](https://github.com/rust-lang/rust/issues/81119).

#### Library

- `derive` is now available through standard library as `{core,std}::prelude::v1::derive`.

#### Language

- `derive` now goes through name resolution, so it can now be renamed - `use derive as my_derive; #[my_derive(Debug)] struct S;`.
- `derive` now goes through name resolution, so this resolution can fail in corner cases. Crater found one such regression, where import `use foo as derive` goes into a cycle with `#[derive(Something)]`.
- **[feature-gated]** `#[derive]` is now expanded as any other attributes in left-to-right order. This allows to remove the restriction on other macro attributes following `#[derive]` (https://github.com/rust-lang/reference/issues/566). The following macro attributes become a part of the derive's input (this is not a change, non-macro attributes following `#[derive]` were treated in the same way previously).
- `#[derive]` is now expanded as any other attributes in left-to-right order. This means two derive attributes `#[derive(Foo)] #[derive(Bar)]` are now expanded separately rather than together. It doesn't generally make difference, except for esoteric cases. For example `#[derive(Foo)]` can now produce an import bringing `Bar` into scope, but previously both `Foo` and `Bar` were required to be resolved before expanding any of them.
- **[feature-gated]** `#[derive()]` (with empty list in parentheses) actually becomes useful. For historical reasons `#[derive]` *fully configures* its input, eagerly evaluating `cfg` everywhere in its target, for example on fields.
Expansion infra doesn't do that for other attributes, but now when macro attributes attributes are allowed to be written after `#[derive]`, it means that derive can *fully configure* items for them.
    ```rust
	#[derive()]
	#[my_attr]
	struct S {
		#[cfg(FALSE)] // this field in removed by `#[derive()]` and not observed by `#[my_attr]`
		field: u8
	}
    ```
- `#[derive]` on some non-item targets is now prohibited. This was accidentally allowed as noop in the past, but was warned about since early 2018 (#50092), despite that crater found a few such cases in unmaintained crates.
- Derive helper attributes used before their introduction are now reported with a deprecation lint. This change is long overdue (since macro modularization, https://github.com/rust-lang/rust/issues/52226#issuecomment-422605033), but it was hard to do without fixing expansion order for derives. The deprecation is tracked by #79202.
```rust
    #[trait_helper] // warning: derive helper attribute is used before it is introduced
    #[derive(Trait)]
    struct S {}
```

Crater analysis: https://github.com/rust-lang/rust/pull/79078#issuecomment-731436821
2021-02-07 19:36:10 +00:00
..
rustc just max_level_info 2020-09-11 09:37:51 -07:00
rustc_apfloat Backport another LLVM commit to rustc_apfloat 2020-10-04 02:02:25 +02:00
rustc_arena Rollup merge of #80470 - SimonSapin:array-intoiter-type, r=m-ou-se 2021-01-31 01:47:25 +01:00
rustc_ast Rollup merge of #81645 - m-ou-se:panic-lint, r=estebank,flip1995 2021-02-04 21:10:36 +01:00
rustc_ast_lowering lowering of generic args in AssocTyConstraint 2021-02-04 16:20:58 +01:00
rustc_ast_passes Auto merge of #81346 - hug-dev:nonsecure-call-abi, r=jonas-schievink 2021-02-03 06:00:43 +00:00
rustc_ast_pretty Box the biggest ast::ItemKind variants 2021-02-01 09:23:39 +01:00
rustc_attr Never MIR inline functions with a different instruction set 2021-02-05 00:00:00 +00:00
rustc_builtin_macros expand/resolve: Turn #[derive] into a regular macro attribute 2021-02-07 20:08:45 +03:00
rustc_codegen_cranelift Add a new ABI to support cmse_nonsecure_call 2021-02-02 13:04:31 +00:00
rustc_codegen_llvm Rollup merge of #81664 - bjorn3:no_codegen_hir, r=lcnr 2021-02-06 00:14:13 +01:00
rustc_codegen_ssa rustc_codegen_ssa: tune codegen scheduling to reduce memory usage 2021-02-03 18:55:05 -08:00
rustc_data_structures Rollup merge of #81771 - tgnottingham:time-passes-rss-delta, r=oli-obk 2021-02-05 12:26:08 +01:00
rustc_driver Indicate both start and end of pass RSS in time-passes output 2021-01-29 12:46:29 -08:00
rustc_error_codes Rollup merge of #81835 - jesusprubio:improve-long-eplanation-e0546, r=GuillaumeGomez 2021-02-07 14:45:54 +01:00
rustc_errors Make panic/assert calls in rustc compatible with Rust 2021. 2021-02-03 22:42:53 +01:00
rustc_expand Address review comments 2021-02-07 20:08:45 +03:00
rustc_feature Feature gate macro attributes in #[derive] output 2021-02-07 20:08:45 +03:00
rustc_fs_util Optimize away a fs::metadata call. 2021-01-06 08:33:15 -08:00
rustc_graphviz remove redundant closures (clippy::redundant_closure) 2021-01-03 13:34:24 +01:00
rustc_hir Rollup merge of #81680 - camsteffen:primty, r=oli-obk 2021-02-06 17:01:45 +01:00
rustc_hir_pretty hir pretty printing 2021-02-04 16:20:57 +01:00
rustc_incremental Auto merge of #80957 - tgnottingham:direct_serialize_depgraph, r=michaelwoerister 2021-01-19 19:36:41 +00:00
rustc_index Auto merge of #81498 - thomaseizinger:ice-workaround-56935-rustc-index, r=matthewjasper 2021-02-07 08:09:58 +00:00
rustc_infer tidy: Run tidy style against markdown files. 2021-02-04 09:01:50 -08:00
rustc_interface Box the biggest ast::ItemKind variants 2021-02-01 09:23:39 +01:00
rustc_lexer Return EOF_CHAR constant instead of magic char. 2021-01-07 13:20:04 +01:00
rustc_lint expand/resolve: Turn #[derive] into a regular macro attribute 2021-02-07 20:08:45 +03:00
rustc_lint_defs expand/resolve: Turn #[derive] into a regular macro attribute 2021-02-07 20:08:45 +03:00
rustc_llvm Add a new ABI to support cmse_nonsecure_call 2021-02-02 13:04:31 +00:00
rustc_macros Indent the code correctly again after removing the query categories. 2021-01-31 21:40:03 +01:00
rustc_metadata Auto merge of #81215 - cjgillot:defkey-mir, r=oli-obk 2021-02-05 18:21:47 +00:00
rustc_middle path trimming: ignore type aliases 2021-02-06 12:03:48 +02:00
rustc_mir Never MIR inline functions with a different instruction set 2021-02-05 00:00:00 +00:00
rustc_mir_build Auto merge of #80632 - Nadrieril:fix-80501, r=varkor 2021-02-07 16:48:57 +00:00
rustc_parse expand/resolve: Turn #[derive] into a regular macro attribute 2021-02-07 20:08:45 +03:00
rustc_parse_format rustc_parse_format: Fix character indices in find_skips 2021-01-17 17:40:58 +03:00
rustc_passes Bump rustfmt version 2021-02-02 09:09:52 -05:00
rustc_plugin_impl Store ForeignItem in a side table. 2020-11-26 21:29:27 +01:00
rustc_privacy more things are const evaluatable *sparkles* 2021-02-01 20:05:50 +00:00
rustc_query_system Auto merge of #80692 - Aaron1011:feature/query-result-debug, r=estebank 2021-01-26 05:47:23 +00:00
rustc_resolve Feature gate macro attributes in #[derive] output 2021-02-07 20:08:45 +03:00
rustc_save_analysis Use Option::map_or instead of .map(..).unwrap_or(..) 2021-01-14 19:23:59 +01:00
rustc_serialize Revert stabilizing integer::BITS. 2021-02-03 22:23:58 +01:00
rustc_session Auto merge of #79253 - rcvalle:fix-rustc-sysroot-cas, r=nagisa 2021-02-05 22:58:13 +00:00
rustc_span Feature gate macro attributes in #[derive] output 2021-02-07 20:08:45 +03:00
rustc_symbol_mangling Rollup merge of #80959 - jhpratt:unsigned_abs-stabilization, r=m-ou-se 2021-01-30 13:36:44 +09:00
rustc_target Auto merge of #81346 - hug-dev:nonsecure-call-abi, r=jonas-schievink 2021-02-03 06:00:43 +00:00
rustc_trait_selection Rollup merge of #81738 - camelid:misc-small-diag-cleanup, r=lcnr 2021-02-06 17:01:49 +01:00
rustc_traits Update Chalk 2021-02-02 12:37:22 -05:00
rustc_ty_utils Infallible version of def_span. 2021-01-23 13:35:22 +01:00
rustc_type_ir Move a few more types to rustc_type_ir 2021-01-18 21:06:12 +01:00
rustc_typeck Rollup merge of #81738 - camelid:misc-small-diag-cleanup, r=lcnr 2021-02-06 17:01:49 +01:00