Rollup merge of #83744 - bjorn3:deprecate_cfg_attr_crate_type_name, r=Mark-Simulacrum
Deprecate crate_type and crate_name nested inside #![cfg_attr] This implements the proposal in https://github.com/rust-lang/rust/pull/83676#issuecomment-811213956, with a future compatibility lint imposed on usage of crate_type/crate_name inside cfg's. This is a compromise between removing `#![crate_type]` and `#![crate_name]` completely and keeping them as a whole, which requires somewhat of a hack in rustc and is impossible to support by gcc-rust. By only removing `#![crate_type]` and `#![crate_name]` nested inside `#![cfg_attr]` it becomes possible to parse them before a big chunk of the compiler has started. Replaces https://github.com/rust-lang/rust/pull/83676 ```rust #![crate_type = "lib"] // remains working #![cfg_attr(foo, crate_type = "bin")] // will stop working ``` # Rationale As it currently is it is possible to try to access the stable crate id before it is actually set, which will panic. The fact that the Session contains mutable state beyond debugging things also doesn't completely sit well with me. Especially once parallel rustc becomes the default. I think there is currently also a cyclic dependency where you need to set the stable crate id to be able to load crates, but you need to load crates to expand proc macro attributes that may define #![crate_name] or #![crate_type]. Currently crate level proc macro attributes are unstable or completely unsupported (can't remember which), so this is not a problem, but it may become an issue in the future. Finally if we want to add incremental compilation to macro expansion or even parsing, we need the StableCrateId to be created together with the Session or even earlier as incremental compilation determines the incremental compilation session dir based on the StableCrateId.
This commit is contained in:
commit
da158c04c4
6 changed files with 92 additions and 13 deletions
|
|
@ -1,6 +0,0 @@
|
|||
// no-prefer-dynamic
|
||||
// compile-flags: --cfg foo
|
||||
|
||||
#![cfg_attr(foo, crate_type="lib")]
|
||||
|
||||
pub fn foo() {}
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
// run-pass
|
||||
// aux-build:crate-attributes-using-cfg_attr.rs
|
||||
|
||||
extern crate crate_attributes_using_cfg_attr;
|
||||
|
||||
pub fn main() {}
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
// check-fail
|
||||
// compile-flags:--cfg foo
|
||||
|
||||
#![deny(warnings)]
|
||||
#![cfg_attr(foo, crate_type="bin")]
|
||||
//~^ERROR `crate_type` within
|
||||
//~| WARN this was previously accepted
|
||||
#![cfg_attr(foo, crate_name="bar")]
|
||||
//~^ERROR `crate_name` within
|
||||
//~| WARN this was previously accepted
|
||||
|
||||
fn main() {}
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
error: `crate_type` within an `#![cfg_attr] attribute is deprecated`
|
||||
--> $DIR/future-compat-crate-attributes-using-cfg_attr.rs:5:18
|
||||
|
|
||||
LL | #![cfg_attr(foo, crate_type="bin")]
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/future-compat-crate-attributes-using-cfg_attr.rs:4:9
|
||||
|
|
||||
LL | #![deny(warnings)]
|
||||
| ^^^^^^^^
|
||||
= note: `#[deny(deprecated_cfg_attr_crate_type_name)]` implied by `#[deny(warnings)]`
|
||||
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
||||
= note: for more information, see issue #91632 <https://github.com/rust-lang/rust/issues/91632>
|
||||
|
||||
error: `crate_name` within an `#![cfg_attr] attribute is deprecated`
|
||||
--> $DIR/future-compat-crate-attributes-using-cfg_attr.rs:8:18
|
||||
|
|
||||
LL | #![cfg_attr(foo, crate_name="bar")]
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
||||
= note: for more information, see issue #91632 <https://github.com/rust-lang/rust/issues/91632>
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue