Add internal_features
lint
It lints against features that are inteded to be internal to the compiler and standard library. Implements MCP #596. We allow `internal_features` in the standard library and compiler as those use many features and this _is_ the standard library from the "internal to the compiler and standard library" after all. Marking some features as internal wasn't exactly the most scientific approach, I just marked some mostly obvious features. While there is a categorization in the macro, it's not very well upheld (should probably be fixed in another PR). We always pass `-Ainternal_features` in the testsuite About 400 UI tests and several other tests use internal features. Instead of throwing the attribute on each one, just always allow them. There's nothing wrong with testing internal features^^
This commit is contained in:
parent
c115ec11d2
commit
5830ca216d
@ -1,4 +1,5 @@
|
||||
#![cfg_attr(feature = "nightly", feature(step_trait, rustc_attrs, min_specialization))]
|
||||
#![cfg_attr(all(not(bootstrap), feature = "nightly"), allow(internal_features))]
|
||||
|
||||
use std::fmt;
|
||||
#[cfg(feature = "nightly")]
|
||||
|
@ -23,6 +23,7 @@
|
||||
#![deny(unsafe_op_in_unsafe_fn)]
|
||||
#![deny(rustc::untranslatable_diagnostic)]
|
||||
#![deny(rustc::diagnostic_outside_of_impl)]
|
||||
#![cfg_attr(not(bootstrap), allow(internal_features))]
|
||||
#![allow(clippy::mut_from_ref)] // Arena allocators are one of the places where this pattern is fine.
|
||||
|
||||
use smallvec::SmallVec;
|
||||
|
@ -11,6 +11,7 @@
|
||||
#![feature(trusted_step)]
|
||||
#![feature(try_blocks)]
|
||||
#![recursion_limit = "256"]
|
||||
#![cfg_attr(not(bootstrap), allow(internal_features))]
|
||||
|
||||
#[macro_use]
|
||||
extern crate rustc_middle;
|
||||
|
@ -37,6 +37,7 @@
|
||||
#![allow(rustc::potential_query_instability)]
|
||||
#![deny(rustc::untranslatable_diagnostic)]
|
||||
#![deny(rustc::diagnostic_outside_of_impl)]
|
||||
#![cfg_attr(not(bootstrap), allow(internal_features))]
|
||||
#![deny(unsafe_op_in_unsafe_fn)]
|
||||
|
||||
#[macro_use]
|
||||
|
@ -4,6 +4,7 @@ Erroneous code example:
|
||||
|
||||
```compile_fail,E0092
|
||||
#![feature(intrinsics)]
|
||||
#![allow(internal_features)]
|
||||
|
||||
extern "rust-intrinsic" {
|
||||
fn atomic_foo(); // error: unrecognized atomic operation
|
||||
@ -17,6 +18,7 @@ functions are defined in `compiler/rustc_codegen_llvm/src/intrinsic.rs` and in
|
||||
|
||||
```
|
||||
#![feature(intrinsics)]
|
||||
#![allow(internal_features)]
|
||||
|
||||
extern "rust-intrinsic" {
|
||||
fn atomic_fence_seqcst(); // ok!
|
||||
|
@ -4,6 +4,7 @@ Erroneous code example:
|
||||
|
||||
```compile_fail,E0093
|
||||
#![feature(intrinsics)]
|
||||
#![allow(internal_features)]
|
||||
|
||||
extern "rust-intrinsic" {
|
||||
fn foo(); // error: unrecognized intrinsic function: `foo`
|
||||
@ -22,6 +23,7 @@ functions are defined in `compiler/rustc_codegen_llvm/src/intrinsic.rs` and in
|
||||
|
||||
```
|
||||
#![feature(intrinsics)]
|
||||
#![allow(internal_features)]
|
||||
|
||||
extern "rust-intrinsic" {
|
||||
fn atomic_fence_seqcst(); // ok!
|
||||
|
@ -4,6 +4,7 @@ Erroneous code example:
|
||||
|
||||
```compile_fail,E0094
|
||||
#![feature(intrinsics)]
|
||||
#![allow(internal_features)]
|
||||
|
||||
extern "rust-intrinsic" {
|
||||
#[rustc_safe_intrinsic]
|
||||
@ -18,6 +19,7 @@ Example:
|
||||
|
||||
```
|
||||
#![feature(intrinsics)]
|
||||
#![allow(internal_features)]
|
||||
|
||||
extern "rust-intrinsic" {
|
||||
#[rustc_safe_intrinsic]
|
||||
|
@ -8,6 +8,7 @@ Erroneous code example:
|
||||
```compile_fail
|
||||
// NOTE: this feature is perma-unstable and should *only* be used for
|
||||
// testing purposes.
|
||||
#![allow(internal_features)]
|
||||
#![feature(rustc_attrs)]
|
||||
|
||||
#[rustc_variance]
|
||||
|
@ -5,6 +5,7 @@ used. Erroneous code examples:
|
||||
|
||||
```compile_fail
|
||||
#![feature(intrinsics)]
|
||||
#![allow(internal_features)]
|
||||
|
||||
extern "rust-intrinsic" {
|
||||
#[rustc_safe_intrinsic]
|
||||
@ -41,6 +42,7 @@ For the first code example, please check the function definition. Example:
|
||||
|
||||
```
|
||||
#![feature(intrinsics)]
|
||||
#![allow(internal_features)]
|
||||
|
||||
extern "rust-intrinsic" {
|
||||
#[rustc_safe_intrinsic]
|
||||
|
@ -5,6 +5,7 @@ compiled:
|
||||
|
||||
```compile_fail,E0230
|
||||
#![feature(rustc_attrs)]
|
||||
#![allow(internal_features)]
|
||||
|
||||
#[rustc_on_unimplemented = "error on `{Self}` with params `<{A},{B}>`"] // error
|
||||
trait BadAnnotation<A> {}
|
||||
|
@ -5,6 +5,7 @@ compiled:
|
||||
|
||||
```compile_fail,E0231
|
||||
#![feature(rustc_attrs)]
|
||||
#![allow(internal_features)]
|
||||
|
||||
#[rustc_on_unimplemented = "error on `{Self}` with params `<{A},{}>`"] // error!
|
||||
trait BadAnnotation<A> {}
|
||||
|
@ -5,6 +5,7 @@ compiled:
|
||||
|
||||
```compile_fail,E0232
|
||||
#![feature(rustc_attrs)]
|
||||
#![allow(internal_features)]
|
||||
|
||||
#[rustc_on_unimplemented(lorem="")] // error!
|
||||
trait BadAnnotation {}
|
||||
|
@ -4,6 +4,7 @@ Erroneous code example:
|
||||
|
||||
```compile_fail,E0264
|
||||
#![feature(lang_items)]
|
||||
#![allow(internal_features)]
|
||||
|
||||
extern "C" {
|
||||
#[lang = "cake"] // error: unknown external lang item: `cake`
|
||||
@ -16,6 +17,7 @@ A list of available external lang items is available in
|
||||
|
||||
```
|
||||
#![feature(lang_items)]
|
||||
#![allow(internal_features)]
|
||||
|
||||
extern "C" {
|
||||
#[lang = "panic_impl"] // ok!
|
||||
|
@ -4,6 +4,7 @@ Erroneous code example:
|
||||
|
||||
```compile_fail,E0539
|
||||
#![feature(staged_api)]
|
||||
#![allow(internal_features)]
|
||||
#![stable(since = "1.0.0", feature = "test")]
|
||||
|
||||
#[deprecated(note)] // error!
|
||||
@ -28,6 +29,7 @@ To fix these issues you need to give required key-value pairs.
|
||||
|
||||
```
|
||||
#![feature(staged_api)]
|
||||
#![allow(internal_features)]
|
||||
#![stable(since = "1.0.0", feature = "test")]
|
||||
|
||||
#[deprecated(since = "1.39.0", note = "reason")] // ok!
|
||||
|
@ -4,6 +4,7 @@ Erroneous code example:
|
||||
|
||||
```compile_fail,E0542
|
||||
#![feature(staged_api)]
|
||||
#![allow(internal_features)]
|
||||
#![stable(since = "1.0.0", feature = "test")]
|
||||
|
||||
#[stable(feature = "_stable_fn")] // invalid
|
||||
@ -23,6 +24,7 @@ To fix this issue, you need to provide the `since` field. Example:
|
||||
|
||||
```
|
||||
#![feature(staged_api)]
|
||||
#![allow(internal_features)]
|
||||
#![stable(since = "1.0.0", feature = "test")]
|
||||
|
||||
#[stable(feature = "_stable_fn", since = "1.0.0")] // ok!
|
||||
|
@ -4,6 +4,7 @@ Erroneous code example:
|
||||
|
||||
```compile_fail,E0543
|
||||
#![feature(staged_api)]
|
||||
#![allow(internal_features)]
|
||||
#![stable(since = "1.0.0", feature = "test")]
|
||||
|
||||
#[stable(since = "0.1.0", feature = "_deprecated_fn")]
|
||||
@ -17,6 +18,7 @@ To fix this issue, you need to provide the `note` field. Example:
|
||||
|
||||
```
|
||||
#![feature(staged_api)]
|
||||
#![allow(internal_features)]
|
||||
#![stable(since = "1.0.0", feature = "test")]
|
||||
|
||||
#[stable(since = "0.1.0", feature = "_deprecated_fn")]
|
||||
|
@ -4,6 +4,7 @@ Erroneous code example:
|
||||
|
||||
```compile_fail,E0544
|
||||
#![feature(staged_api)]
|
||||
#![allow(internal_features)]
|
||||
#![stable(since = "1.0.0", feature = "rust1")]
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
@ -15,6 +16,7 @@ To fix this issue, ensure that each item has at most one stability attribute.
|
||||
|
||||
```
|
||||
#![feature(staged_api)]
|
||||
#![allow(internal_features)]
|
||||
#![stable(since = "1.0.0", feature = "rust1")]
|
||||
|
||||
#[stable(feature = "test", since = "2.0.0")] // ok!
|
||||
|
@ -4,6 +4,7 @@ Erroneous code example:
|
||||
|
||||
```compile_fail,E0545
|
||||
#![feature(staged_api)]
|
||||
#![allow(internal_features)]
|
||||
#![stable(since = "1.0.0", feature = "test")]
|
||||
|
||||
#[unstable(feature = "_unstable_fn", issue = "0")] // invalid
|
||||
@ -18,6 +19,7 @@ Example:
|
||||
|
||||
```
|
||||
#![feature(staged_api)]
|
||||
#![allow(internal_features)]
|
||||
#![stable(since = "1.0.0", feature = "test")]
|
||||
|
||||
#[unstable(feature = "_unstable_fn", issue = "none")] // ok!
|
||||
|
@ -4,6 +4,7 @@ Erroneous code example:
|
||||
|
||||
```compile_fail,E0546
|
||||
#![feature(staged_api)]
|
||||
#![allow(internal_features)]
|
||||
#![stable(since = "1.0.0", feature = "test")]
|
||||
|
||||
#[unstable(issue = "none")] // invalid
|
||||
@ -17,6 +18,7 @@ To fix this issue, you need to provide the `feature` field. Example:
|
||||
|
||||
```
|
||||
#![feature(staged_api)]
|
||||
#![allow(internal_features)]
|
||||
#![stable(since = "1.0.0", feature = "test")]
|
||||
|
||||
#[unstable(feature = "unstable_fn", issue = "none")] // ok!
|
||||
|
@ -4,6 +4,7 @@ Erroneous code example:
|
||||
|
||||
```compile_fail,E0547
|
||||
#![feature(staged_api)]
|
||||
#![allow(internal_features)]
|
||||
#![stable(since = "1.0.0", feature = "test")]
|
||||
|
||||
#[unstable(feature = "_unstable_fn")] // invalid
|
||||
@ -17,6 +18,7 @@ To fix this issue, you need to provide the `issue` field. Example:
|
||||
|
||||
```
|
||||
#![feature(staged_api)]
|
||||
#![allow(internal_features)]
|
||||
#![stable(since = "1.0.0", feature = "test")]
|
||||
|
||||
#[unstable(feature = "_unstable_fn", issue = "none")] // ok!
|
||||
|
@ -5,6 +5,7 @@ Erroneous code example:
|
||||
|
||||
```compile_fail,E0549
|
||||
#![feature(staged_api)]
|
||||
#![allow(internal_features)]
|
||||
#![stable(since = "1.0.0", feature = "test")]
|
||||
|
||||
#[deprecated(
|
||||
@ -19,6 +20,7 @@ Example:
|
||||
|
||||
```
|
||||
#![feature(staged_api)]
|
||||
#![allow(internal_features)]
|
||||
#![stable(since = "1.0.0", feature = "test")]
|
||||
|
||||
#[stable(since = "1.0.0", feature = "test")]
|
||||
|
@ -4,6 +4,8 @@ Erroneous code example:
|
||||
|
||||
```compile_fail,E0622
|
||||
#![feature(intrinsics)]
|
||||
#![allow(internal_features)]
|
||||
|
||||
extern "rust-intrinsic" {
|
||||
pub static breakpoint: fn(); // error: intrinsic must be a function
|
||||
}
|
||||
@ -17,6 +19,8 @@ error, just declare a function. Example:
|
||||
|
||||
```no_run
|
||||
#![feature(intrinsics)]
|
||||
#![allow(internal_features)]
|
||||
|
||||
extern "rust-intrinsic" {
|
||||
pub fn breakpoint(); // ok!
|
||||
}
|
||||
|
@ -5,6 +5,7 @@ Erroneous code example:
|
||||
```compile_fail,E0773
|
||||
#![feature(decl_macro)]
|
||||
#![feature(rustc_attrs)]
|
||||
#![allow(internal_features)]
|
||||
|
||||
#[rustc_builtin_macro]
|
||||
pub macro test($item:item) {
|
||||
@ -24,6 +25,7 @@ To fix the issue, remove the duplicate declaration:
|
||||
```
|
||||
#![feature(decl_macro)]
|
||||
#![feature(rustc_attrs)]
|
||||
#![allow(internal_features)]
|
||||
|
||||
#[rustc_builtin_macro]
|
||||
pub macro test($item:item) {
|
||||
|
@ -10,6 +10,7 @@ Erroneous code example:
|
||||
// used outside of the compiler and standard library.
|
||||
#![feature(rustc_attrs)]
|
||||
#![feature(staged_api)]
|
||||
#![allow(internal_features)]
|
||||
|
||||
#![unstable(feature = "foo_module", reason = "...", issue = "123")]
|
||||
|
||||
|
@ -4,6 +4,7 @@
|
||||
#![feature(type_alias_impl_trait)]
|
||||
#![deny(rustc::untranslatable_diagnostic)]
|
||||
#![deny(rustc::diagnostic_outside_of_impl)]
|
||||
#![cfg_attr(not(bootstrap), allow(internal_features))]
|
||||
|
||||
#[macro_use]
|
||||
extern crate tracing;
|
||||
|
@ -15,6 +15,7 @@
|
||||
#![feature(box_patterns)]
|
||||
#![feature(error_reporter)]
|
||||
#![allow(incomplete_features)]
|
||||
#![cfg_attr(not(bootstrap), allow(internal_features))]
|
||||
|
||||
#[macro_use]
|
||||
extern crate rustc_macros;
|
||||
|
@ -11,6 +11,7 @@
|
||||
#![feature(try_blocks)]
|
||||
#![recursion_limit = "256"]
|
||||
#![deny(rustc::untranslatable_diagnostic)]
|
||||
#![cfg_attr(not(bootstrap), allow(internal_features))]
|
||||
|
||||
#[macro_use]
|
||||
extern crate rustc_macros;
|
||||
|
@ -16,12 +16,22 @@ fn f(features: &mut Features, _: Span) {
|
||||
}};
|
||||
}
|
||||
|
||||
#[derive(PartialEq)]
|
||||
enum FeatureStatus {
|
||||
Default,
|
||||
Incomplete,
|
||||
Internal,
|
||||
}
|
||||
|
||||
macro_rules! declare_features {
|
||||
(__status_to_bool active) => {
|
||||
false
|
||||
(__status_to_enum active) => {
|
||||
FeatureStatus::Default
|
||||
};
|
||||
(__status_to_bool incomplete) => {
|
||||
true
|
||||
(__status_to_enum incomplete) => {
|
||||
FeatureStatus::Incomplete
|
||||
};
|
||||
(__status_to_enum internal) => {
|
||||
FeatureStatus::Internal
|
||||
};
|
||||
($(
|
||||
$(#[doc = $doc:tt])* ($status:ident, $feature:ident, $ver:expr, $issue:expr, $edition:expr),
|
||||
@ -83,7 +93,7 @@ pub fn enabled(&self, feature: Symbol) -> bool {
|
||||
pub fn incomplete(&self, feature: Symbol) -> bool {
|
||||
match feature {
|
||||
$(
|
||||
sym::$feature => declare_features!(__status_to_bool $status),
|
||||
sym::$feature => declare_features!(__status_to_enum $status) == FeatureStatus::Incomplete,
|
||||
)*
|
||||
// accepted and removed features aren't in this file but are never incomplete
|
||||
_ if self.declared_lang_features.iter().any(|f| f.0 == feature) => false,
|
||||
@ -91,6 +101,22 @@ pub fn incomplete(&self, feature: Symbol) -> bool {
|
||||
_ => panic!("`{}` was not listed in `declare_features`", feature),
|
||||
}
|
||||
}
|
||||
|
||||
/// Some features are internal to the compiler and standard library and should not
|
||||
/// be used in normal projects. We warn the user about these
|
||||
/// to alert them.
|
||||
pub fn internal(&self, feature: Symbol) -> bool {
|
||||
match feature {
|
||||
$(
|
||||
sym::$feature => declare_features!(__status_to_enum $status) == FeatureStatus::Internal,
|
||||
)*
|
||||
// accepted and removed features aren't in this file but are never internal
|
||||
// (a removed feature might have been internal, but it doesn't matter anymore)
|
||||
_ if self.declared_lang_features.iter().any(|f| f.0 == feature) => false,
|
||||
_ if self.declared_lib_features.iter().any(|f| f.0 == feature) => false,
|
||||
_ => panic!("`{}` was not listed in `declare_features`", feature),
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
@ -137,29 +163,29 @@ pub fn set(&self, features: &mut Features, span: Span) {
|
||||
/// Allows using the `vectorcall` ABI.
|
||||
(active, abi_vectorcall, "1.7.0", None, None),
|
||||
/// Allows using `#![needs_allocator]`, an implementation detail of `#[global_allocator]`.
|
||||
(active, allocator_internals, "1.20.0", None, None),
|
||||
(internal, allocator_internals, "1.20.0", None, None),
|
||||
/// Allows using `#[allow_internal_unsafe]`. This is an
|
||||
/// attribute on `macro_rules!` and can't use the attribute handling
|
||||
/// below (it has to be checked before expansion possibly makes
|
||||
/// macros disappear).
|
||||
(active, allow_internal_unsafe, "1.0.0", None, None),
|
||||
(internal, allow_internal_unsafe, "1.0.0", None, None),
|
||||
/// Allows using `#[allow_internal_unstable]`. This is an
|
||||
/// attribute on `macro_rules!` and can't use the attribute handling
|
||||
/// below (it has to be checked before expansion possibly makes
|
||||
/// macros disappear).
|
||||
(active, allow_internal_unstable, "1.0.0", None, None),
|
||||
(internal, allow_internal_unstable, "1.0.0", None, None),
|
||||
/// Allows using anonymous lifetimes in argument-position impl-trait.
|
||||
(active, anonymous_lifetime_in_impl_trait, "1.63.0", None, None),
|
||||
/// Allows identifying the `compiler_builtins` crate.
|
||||
(active, compiler_builtins, "1.13.0", None, None),
|
||||
(internal, compiler_builtins, "1.13.0", None, None),
|
||||
/// Allows writing custom MIR
|
||||
(active, custom_mir, "1.65.0", None, None),
|
||||
(internal, custom_mir, "1.65.0", None, None),
|
||||
/// Outputs useful `assert!` messages
|
||||
(active, generic_assert, "1.63.0", None, None),
|
||||
/// Allows using the `rust-intrinsic`'s "ABI".
|
||||
(active, intrinsics, "1.0.0", None, None),
|
||||
(internal, intrinsics, "1.0.0", None, None),
|
||||
/// Allows using `#[lang = ".."]` attribute for linking items to special compiler logic.
|
||||
(active, lang_items, "1.0.0", None, None),
|
||||
(internal, lang_items, "1.0.0", None, None),
|
||||
/// Allows `#[link(..., cfg(..))]`; perma-unstable per #37406
|
||||
(active, link_cfg, "1.14.0", None, None),
|
||||
/// Allows the `multiple_supertrait_upcastable` lint.
|
||||
@ -167,22 +193,22 @@ pub fn set(&self, features: &mut Features, span: Span) {
|
||||
/// Allow negative trait bounds. This is an internal-only feature for testing the trait solver!
|
||||
(incomplete, negative_bounds, "1.71.0", None, None),
|
||||
/// Allows using `#[omit_gdb_pretty_printer_section]`.
|
||||
(active, omit_gdb_pretty_printer_section, "1.5.0", None, None),
|
||||
(internal, omit_gdb_pretty_printer_section, "1.5.0", None, None),
|
||||
/// Allows using `#[prelude_import]` on glob `use` items.
|
||||
(active, prelude_import, "1.2.0", None, None),
|
||||
(internal, prelude_import, "1.2.0", None, None),
|
||||
/// Used to identify crates that contain the profiler runtime.
|
||||
(active, profiler_runtime, "1.18.0", None, None),
|
||||
(internal, profiler_runtime, "1.18.0", None, None),
|
||||
/// Allows using `rustc_*` attributes (RFC 572).
|
||||
(active, rustc_attrs, "1.0.0", None, None),
|
||||
(internal, rustc_attrs, "1.0.0", None, None),
|
||||
/// Allows using the `#[stable]` and `#[unstable]` attributes.
|
||||
(active, staged_api, "1.0.0", None, None),
|
||||
(internal, staged_api, "1.0.0", None, None),
|
||||
/// Added for testing E0705; perma-unstable.
|
||||
(active, test_2018_feature, "1.31.0", None, Some(Edition::Edition2018)),
|
||||
(internal, test_2018_feature, "1.31.0", None, Some(Edition::Edition2018)),
|
||||
/// Added for testing unstable lints; perma-unstable.
|
||||
(active, test_unstable_lint, "1.60.0", None, None),
|
||||
(internal, test_unstable_lint, "1.60.0", None, None),
|
||||
/// Allows non-`unsafe` —and thus, unsound— access to `Pin` constructions.
|
||||
/// Marked `incomplete` since perma-unstable and unsound.
|
||||
(incomplete, unsafe_pin_internals, "1.60.0", None, None),
|
||||
/// Marked `internal` since perma-unstable and unsound.
|
||||
(internal, unsafe_pin_internals, "1.60.0", None, None),
|
||||
/// Use for stable + negative coherence and strict coherence depending on trait's
|
||||
/// rustc_strict_coherence value.
|
||||
(active, with_negative_coherence, "1.60.0", None, None),
|
||||
@ -216,19 +242,19 @@ pub fn set(&self, features: &mut Features, span: Span) {
|
||||
/// Allows using the `#[linkage = ".."]` attribute.
|
||||
(active, linkage, "1.0.0", Some(29603), None),
|
||||
/// Allows declaring with `#![needs_panic_runtime]` that a panic runtime is needed.
|
||||
(active, needs_panic_runtime, "1.10.0", Some(32837), None),
|
||||
(internal, needs_panic_runtime, "1.10.0", Some(32837), None),
|
||||
/// Allows using `+bundled,+whole-archive` native libs.
|
||||
(active, packed_bundled_libs, "1.69.0", Some(108081), None),
|
||||
/// Allows using the `#![panic_runtime]` attribute.
|
||||
(active, panic_runtime, "1.10.0", Some(32837), None),
|
||||
(internal, panic_runtime, "1.10.0", Some(32837), None),
|
||||
/// Allows using `#[rustc_allow_const_fn_unstable]`.
|
||||
/// This is an attribute on `const fn` for the same
|
||||
/// purpose as `#[allow_internal_unstable]`.
|
||||
(active, rustc_allow_const_fn_unstable, "1.49.0", Some(69399), None),
|
||||
(internal, rustc_allow_const_fn_unstable, "1.49.0", Some(69399), None),
|
||||
/// Allows using compiler's own crates.
|
||||
(active, rustc_private, "1.0.0", Some(27812), None),
|
||||
/// Allows using internal rustdoc features like `doc(keyword)`.
|
||||
(active, rustdoc_internals, "1.58.0", Some(90418), None),
|
||||
(internal, rustdoc_internals, "1.58.0", Some(90418), None),
|
||||
/// Allows using the `rustdoc::missing_doc_code_examples` lint
|
||||
(active, rustdoc_missing_doc_code_examples, "1.31.0", Some(101730), None),
|
||||
/// Allows using `#[start]` on a function indicating that it is the program entrypoint.
|
||||
|
@ -13,6 +13,7 @@
|
||||
#![recursion_limit = "256"]
|
||||
#![deny(rustc::untranslatable_diagnostic)]
|
||||
#![deny(rustc::diagnostic_outside_of_impl)]
|
||||
#![cfg_attr(not(bootstrap), allow(internal_features))]
|
||||
|
||||
#[macro_use]
|
||||
extern crate rustc_macros;
|
||||
|
@ -6,6 +6,7 @@
|
||||
//!
|
||||
//! ```
|
||||
//! # #![feature(rustc_attrs)]
|
||||
//! # #![allow(internal_features)]
|
||||
//! #![rustc_partition_reused(module="spike", cfg="rpass2")]
|
||||
//! #![rustc_partition_codegened(module="spike-x", cfg="rpass2")]
|
||||
//! ```
|
||||
|
@ -12,6 +12,7 @@
|
||||
test
|
||||
)
|
||||
)]
|
||||
#![cfg_attr(all(not(bootstrap), feature = "nightly"), allow(internal_features))]
|
||||
|
||||
#[cfg(feature = "nightly")]
|
||||
pub mod bit_set;
|
||||
|
@ -72,6 +72,9 @@ lint_builtin_incomplete_features = the feature `{$name}` is incomplete and may n
|
||||
.note = see issue #{$n} <https://github.com/rust-lang/rust/issues/{$n}> for more information
|
||||
.help = consider using `min_{$name}` instead, which is more stable and complete
|
||||
|
||||
lint_builtin_internal_features = the feature `{$name}` is internal to the compiler or standard library
|
||||
.note = using it is strongly discouraged
|
||||
|
||||
lint_builtin_keyword_idents = `{$kw}` is a keyword in the {$next} edition
|
||||
.suggestion = you can use a raw identifier to stay compatible
|
||||
|
||||
|
@ -28,8 +28,8 @@
|
||||
BuiltinClashingExternSub, BuiltinConstNoMangle, BuiltinDeprecatedAttrLink,
|
||||
BuiltinDeprecatedAttrLinkSuggestion, BuiltinDeprecatedAttrUsed, BuiltinDerefNullptr,
|
||||
BuiltinEllipsisInclusiveRangePatternsLint, BuiltinExplicitOutlives,
|
||||
BuiltinExplicitOutlivesSuggestion, BuiltinIncompleteFeatures,
|
||||
BuiltinIncompleteFeaturesHelp, BuiltinIncompleteFeaturesNote, BuiltinKeywordIdents,
|
||||
BuiltinExplicitOutlivesSuggestion, BuiltinFeatureIssueNote, BuiltinIncompleteFeatures,
|
||||
BuiltinIncompleteFeaturesHelp, BuiltinInternalFeatures, BuiltinKeywordIdents,
|
||||
BuiltinMissingCopyImpl, BuiltinMissingDebugImpl, BuiltinMissingDoc,
|
||||
BuiltinMutablesTransmutes, BuiltinNoMangleGeneric, BuiltinNonShorthandFieldPatterns,
|
||||
BuiltinSpecialModuleNameUsed, BuiltinTrivialBounds, BuiltinTypeAliasGenericBounds,
|
||||
@ -2301,12 +2301,36 @@ fn check_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx hir::Item<'_>) {
|
||||
"incomplete features that may function improperly in some or all cases"
|
||||
}
|
||||
|
||||
declare_lint! {
|
||||
/// The `internal_features` lint detects unstable features enabled with
|
||||
/// the [`feature` attribute] that are internal to the compiler or standard
|
||||
/// library.
|
||||
///
|
||||
/// [`feature` attribute]: https://doc.rust-lang.org/nightly/unstable-book/
|
||||
///
|
||||
/// ### Example
|
||||
///
|
||||
/// ```rust,compile_fail
|
||||
/// #![feature(rustc_attrs)]
|
||||
/// ```
|
||||
///
|
||||
/// {{produces}}
|
||||
///
|
||||
/// ### Explanation
|
||||
///
|
||||
/// These features are an implementation detail of the compiler and standard
|
||||
/// library and are not supposed to be used in user code.
|
||||
pub INTERNAL_FEATURES,
|
||||
Deny,
|
||||
"internal features are not supposed to be used"
|
||||
}
|
||||
|
||||
declare_lint_pass!(
|
||||
/// Check for used feature gates in `INCOMPLETE_FEATURES` in `rustc_feature/src/active.rs`.
|
||||
IncompleteFeatures => [INCOMPLETE_FEATURES]
|
||||
IncompleteInternalFeatures => [INCOMPLETE_FEATURES, INTERNAL_FEATURES]
|
||||
);
|
||||
|
||||
impl EarlyLintPass for IncompleteFeatures {
|
||||
impl EarlyLintPass for IncompleteInternalFeatures {
|
||||
fn check_crate(&mut self, cx: &EarlyContext<'_>, _: &ast::Crate) {
|
||||
let features = cx.sess().features_untracked();
|
||||
features
|
||||
@ -2314,17 +2338,26 @@ fn check_crate(&mut self, cx: &EarlyContext<'_>, _: &ast::Crate) {
|
||||
.iter()
|
||||
.map(|(name, span, _)| (name, span))
|
||||
.chain(features.declared_lib_features.iter().map(|(name, span)| (name, span)))
|
||||
.filter(|(&name, _)| features.incomplete(name))
|
||||
.filter(|(&name, _)| features.incomplete(name) || features.internal(name))
|
||||
.for_each(|(&name, &span)| {
|
||||
let note = rustc_feature::find_feature_issue(name, GateIssue::Language)
|
||||
.map(|n| BuiltinIncompleteFeaturesNote { n });
|
||||
let help =
|
||||
HAS_MIN_FEATURES.contains(&name).then_some(BuiltinIncompleteFeaturesHelp);
|
||||
cx.emit_spanned_lint(
|
||||
INCOMPLETE_FEATURES,
|
||||
span,
|
||||
BuiltinIncompleteFeatures { name, note, help },
|
||||
);
|
||||
.map(|n| BuiltinFeatureIssueNote { n });
|
||||
|
||||
if features.incomplete(name) {
|
||||
let help =
|
||||
HAS_MIN_FEATURES.contains(&name).then_some(BuiltinIncompleteFeaturesHelp);
|
||||
cx.emit_spanned_lint(
|
||||
INCOMPLETE_FEATURES,
|
||||
span,
|
||||
BuiltinIncompleteFeatures { name, note, help },
|
||||
);
|
||||
} else {
|
||||
cx.emit_spanned_lint(
|
||||
INTERNAL_FEATURES,
|
||||
span,
|
||||
BuiltinInternalFeatures { name, note },
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -40,6 +40,7 @@
|
||||
#![recursion_limit = "256"]
|
||||
#![deny(rustc::untranslatable_diagnostic)]
|
||||
#![deny(rustc::diagnostic_outside_of_impl)]
|
||||
#![cfg_attr(not(bootstrap), allow(internal_features))]
|
||||
|
||||
#[macro_use]
|
||||
extern crate rustc_middle;
|
||||
@ -173,7 +174,7 @@ fn lint_mod(tcx: TyCtxt<'_>, module_def_id: LocalDefId) {
|
||||
WhileTrue: WhileTrue,
|
||||
NonAsciiIdents: NonAsciiIdents,
|
||||
HiddenUnicodeCodepoints: HiddenUnicodeCodepoints,
|
||||
IncompleteFeatures: IncompleteFeatures,
|
||||
IncompleteInternalFeatures: IncompleteInternalFeatures,
|
||||
RedundantSemicolons: RedundantSemicolons,
|
||||
UnusedDocComment: UnusedDocComment,
|
||||
UnexpectedCfgs: UnexpectedCfgs,
|
||||
|
@ -405,18 +405,27 @@ pub struct BuiltinExplicitOutlivesSuggestion {
|
||||
pub struct BuiltinIncompleteFeatures {
|
||||
pub name: Symbol,
|
||||
#[subdiagnostic]
|
||||
pub note: Option<BuiltinIncompleteFeaturesNote>,
|
||||
pub note: Option<BuiltinFeatureIssueNote>,
|
||||
#[subdiagnostic]
|
||||
pub help: Option<BuiltinIncompleteFeaturesHelp>,
|
||||
}
|
||||
|
||||
#[derive(LintDiagnostic)]
|
||||
#[diag(lint_builtin_internal_features)]
|
||||
#[note]
|
||||
pub struct BuiltinInternalFeatures {
|
||||
pub name: Symbol,
|
||||
#[subdiagnostic]
|
||||
pub note: Option<BuiltinFeatureIssueNote>,
|
||||
}
|
||||
|
||||
#[derive(Subdiagnostic)]
|
||||
#[help(lint_help)]
|
||||
pub struct BuiltinIncompleteFeaturesHelp;
|
||||
|
||||
#[derive(Subdiagnostic)]
|
||||
#[note(lint_note)]
|
||||
pub struct BuiltinIncompleteFeaturesNote {
|
||||
pub struct BuiltinFeatureIssueNote {
|
||||
pub n: NonZeroU32,
|
||||
}
|
||||
|
||||
|
@ -3925,7 +3925,6 @@
|
||||
///
|
||||
/// // in crate B
|
||||
/// #![feature(non_exhaustive_omitted_patterns_lint)]
|
||||
///
|
||||
/// match Bar::A {
|
||||
/// Bar::A => {},
|
||||
/// #[warn(non_exhaustive_omitted_patterns)]
|
||||
|
@ -7,6 +7,7 @@
|
||||
#![allow(rustc::default_hash_types)]
|
||||
#![deny(rustc::untranslatable_diagnostic)]
|
||||
#![deny(rustc::diagnostic_outside_of_impl)]
|
||||
#![cfg_attr(not(bootstrap), allow(internal_features))]
|
||||
#![recursion_limit = "128"]
|
||||
|
||||
use synstructure::decl_derive;
|
||||
|
@ -64,6 +64,7 @@
|
||||
#![feature(macro_metavar_expr)]
|
||||
#![recursion_limit = "512"]
|
||||
#![allow(rustc::potential_query_instability)]
|
||||
#![cfg_attr(not(bootstrap), allow(internal_features))]
|
||||
|
||||
#[macro_use]
|
||||
extern crate bitflags;
|
||||
|
@ -8,6 +8,7 @@
|
||||
#![feature(never_type)]
|
||||
#![feature(rustc_attrs)]
|
||||
#![recursion_limit = "256"]
|
||||
#![cfg_attr(not(bootstrap), allow(internal_features))]
|
||||
|
||||
#[macro_use]
|
||||
extern crate tracing;
|
||||
|
@ -11,6 +11,7 @@
|
||||
#![allow(rustc::potential_query_instability, unused_parens)]
|
||||
#![deny(rustc::untranslatable_diagnostic)]
|
||||
#![deny(rustc::diagnostic_outside_of_impl)]
|
||||
#![cfg_attr(not(bootstrap), allow(internal_features))]
|
||||
|
||||
#[macro_use]
|
||||
extern crate rustc_middle;
|
||||
|
@ -18,6 +18,7 @@
|
||||
#![recursion_limit = "256"]
|
||||
#![allow(rustdoc::private_intra_doc_links)]
|
||||
#![allow(rustc::potential_query_instability)]
|
||||
#![cfg_attr(not(bootstrap), allow(internal_features))]
|
||||
|
||||
#[macro_use]
|
||||
extern crate tracing;
|
||||
|
@ -10,6 +10,7 @@
|
||||
#![allow(rustc::potential_query_instability)]
|
||||
#![deny(rustc::untranslatable_diagnostic)]
|
||||
#![deny(rustc::diagnostic_outside_of_impl)]
|
||||
#![cfg_attr(not(bootstrap), allow(internal_features))]
|
||||
|
||||
#[macro_use]
|
||||
extern crate rustc_macros;
|
||||
|
@ -23,6 +23,7 @@
|
||||
#![feature(round_char_boundary)]
|
||||
#![deny(rustc::untranslatable_diagnostic)]
|
||||
#![deny(rustc::diagnostic_outside_of_impl)]
|
||||
#![cfg_attr(not(bootstrap), allow(internal_features))]
|
||||
|
||||
#[macro_use]
|
||||
extern crate rustc_macros;
|
||||
|
@ -19,6 +19,7 @@
|
||||
#![feature(step_trait)]
|
||||
#![deny(rustc::untranslatable_diagnostic)]
|
||||
#![deny(rustc::diagnostic_outside_of_impl)]
|
||||
#![cfg_attr(not(bootstrap), allow(internal_features))]
|
||||
|
||||
use std::path::{Path, PathBuf};
|
||||
|
||||
|
@ -6,6 +6,7 @@
|
||||
#![feature(unwrap_infallible)]
|
||||
#![deny(rustc::untranslatable_diagnostic)]
|
||||
#![deny(rustc::diagnostic_outside_of_impl)]
|
||||
#![cfg_attr(not(bootstrap), allow(internal_features))]
|
||||
|
||||
#[macro_use]
|
||||
extern crate bitflags;
|
||||
|
@ -88,6 +88,7 @@
|
||||
#![warn(missing_docs)]
|
||||
#![allow(explicit_outlives_requirements)]
|
||||
#![warn(multiple_supertrait_upcastable)]
|
||||
#![cfg_attr(not(bootstrap), allow(internal_features))]
|
||||
//
|
||||
// Library features:
|
||||
// tidy-alphabetical-start
|
||||
|
@ -14,6 +14,7 @@
|
||||
//!
|
||||
//! ```rust
|
||||
//! #![feature(core_intrinsics, custom_mir)]
|
||||
#![cfg_attr(not(bootstrap), doc = "#![allow(internal_features)]")]
|
||||
//!
|
||||
//! use core::intrinsics::mir::*;
|
||||
//!
|
||||
@ -63,6 +64,7 @@
|
||||
//!
|
||||
//! ```rust
|
||||
//! #![feature(core_intrinsics, custom_mir)]
|
||||
#![cfg_attr(not(bootstrap), doc = "#![allow(internal_features)]")]
|
||||
//!
|
||||
//! use core::intrinsics::mir::*;
|
||||
//!
|
||||
@ -315,6 +317,7 @@ fn Discriminant<T>(place: T) -> <T as ::core::marker::DiscriminantKind>::Discrim
|
||||
/// # Examples
|
||||
///
|
||||
/// ```rust
|
||||
#[cfg_attr(not(bootstrap), doc = "#![allow(internal_features)]")]
|
||||
/// #![feature(custom_mir, core_intrinsics)]
|
||||
///
|
||||
/// use core::intrinsics::mir::*;
|
||||
|
@ -96,6 +96,7 @@
|
||||
#![allow(explicit_outlives_requirements)]
|
||||
#![allow(incomplete_features)]
|
||||
#![warn(multiple_supertrait_upcastable)]
|
||||
#![cfg_attr(not(bootstrap), allow(internal_features))]
|
||||
//
|
||||
// Library features:
|
||||
// tidy-alphabetical-start
|
||||
|
@ -14,6 +14,7 @@
|
||||
#![feature(staged_api)]
|
||||
#![feature(rustc_attrs)]
|
||||
#![feature(c_unwind)]
|
||||
#![cfg_attr(not(bootstrap), allow(internal_features))]
|
||||
|
||||
#[cfg(target_os = "android")]
|
||||
mod android;
|
||||
|
@ -26,6 +26,7 @@
|
||||
#![feature(c_unwind)]
|
||||
// `real_imp` is unused with Miri, so silence warnings.
|
||||
#![cfg_attr(miri, allow(dead_code))]
|
||||
#![cfg_attr(not(bootstrap), allow(internal_features))]
|
||||
|
||||
use alloc::boxed::Box;
|
||||
use core::any::Any;
|
||||
|
@ -33,6 +33,7 @@
|
||||
#![feature(min_specialization)]
|
||||
#![feature(strict_provenance)]
|
||||
#![recursion_limit = "256"]
|
||||
#![cfg_attr(not(bootstrap), allow(internal_features))]
|
||||
|
||||
#[unstable(feature = "proc_macro_internals", issue = "27812")]
|
||||
#[doc(hidden)]
|
||||
|
@ -7,4 +7,5 @@
|
||||
issue = "none"
|
||||
)]
|
||||
#![allow(unused_features)]
|
||||
#![cfg_attr(not(bootstrap), allow(internal_features))]
|
||||
#![feature(staged_api)]
|
||||
|
@ -220,6 +220,7 @@
|
||||
#![warn(missing_debug_implementations)]
|
||||
#![allow(explicit_outlives_requirements)]
|
||||
#![allow(unused_lifetimes)]
|
||||
#![cfg_attr(not(bootstrap), allow(internal_features))]
|
||||
#![deny(rustc::existing_doc_keyword)]
|
||||
#![deny(fuzzy_provenance_casts)]
|
||||
// Ensure that std can be linked against panic_abort despite compiled with `-C panic=unwind`
|
||||
|
@ -21,6 +21,7 @@
|
||||
#![feature(process_exitcode_internals)]
|
||||
#![feature(panic_can_unwind)]
|
||||
#![feature(test)]
|
||||
#![cfg_attr(not(bootstrap), allow(internal_features))]
|
||||
|
||||
// Public reexports
|
||||
pub use self::bench::{black_box, Bencher};
|
||||
|
@ -5,6 +5,7 @@
|
||||
#![feature(c_unwind)]
|
||||
#![feature(cfg_target_abi)]
|
||||
#![cfg_attr(not(target_env = "msvc"), feature(libc))]
|
||||
#![cfg_attr(not(bootstrap), allow(internal_features))]
|
||||
|
||||
cfg_if::cfg_if! {
|
||||
if #[cfg(target_env = "msvc")] {
|
||||
|
@ -200,6 +200,7 @@ To do so, the `#[doc(keyword = "...")]` attribute is used. Example:
|
||||
|
||||
```rust
|
||||
#![feature(rustdoc_internals)]
|
||||
#![allow(internal_features)]
|
||||
|
||||
/// Some documentation about the keyword.
|
||||
#[doc(keyword = "keyword")]
|
||||
|
@ -17,6 +17,7 @@ via a declaration like
|
||||
|
||||
```rust
|
||||
#![feature(intrinsics)]
|
||||
#![allow(internal_features)]
|
||||
# fn main() {}
|
||||
|
||||
extern "rust-intrinsic" {
|
||||
|
@ -17,6 +17,7 @@ sugar for dynamic allocations via `malloc` and `free`:
|
||||
|
||||
```rust,ignore (libc-is-finicky)
|
||||
#![feature(lang_items, start, libc, core_intrinsics, rustc_private, rustc_attrs)]
|
||||
#![allow(internal_features)]
|
||||
#![no_std]
|
||||
use core::intrinsics;
|
||||
use core::panic::PanicInfo;
|
||||
@ -119,6 +120,7 @@ in the same format as C:
|
||||
```rust,ignore (libc-is-finicky)
|
||||
#![feature(lang_items, core_intrinsics, rustc_private)]
|
||||
#![feature(start)]
|
||||
#![allow(internal_features)]
|
||||
#![no_std]
|
||||
use core::intrinsics;
|
||||
use core::panic::PanicInfo;
|
||||
@ -155,6 +157,7 @@ compiler's name mangling too:
|
||||
```rust,ignore (libc-is-finicky)
|
||||
#![feature(lang_items, core_intrinsics, rustc_private)]
|
||||
#![feature(start)]
|
||||
#![allow(internal_features)]
|
||||
#![no_std]
|
||||
#![no_main]
|
||||
use core::intrinsics;
|
||||
|
@ -140,6 +140,7 @@ fn base_config(test_dir: &str) -> compiletest::Config {
|
||||
[
|
||||
"--emit=metadata",
|
||||
"-Aunused",
|
||||
"-Ainternal_features",
|
||||
"-Zui-testing",
|
||||
"-Dwarnings",
|
||||
&format!("-Ldependency={}", deps_path.display()),
|
||||
|
@ -868,6 +868,8 @@ fn print_source(&self, read_from: ReadFrom, pretty_type: &str) -> ProcRes {
|
||||
.args(&["--target", &self.config.target])
|
||||
.arg("-L")
|
||||
.arg(&aux_dir)
|
||||
.arg("-A")
|
||||
.arg("internal_features")
|
||||
.args(&self.props.compile_flags)
|
||||
.envs(self.props.rustc_env.clone());
|
||||
self.maybe_add_external_args(&mut rustc, &self.config.target_rustcflags);
|
||||
@ -936,7 +938,9 @@ fn typecheck_source(&self, src: String) -> ProcRes {
|
||||
.arg("-L")
|
||||
.arg(&self.config.build_base)
|
||||
.arg("-L")
|
||||
.arg(aux_dir);
|
||||
.arg(aux_dir)
|
||||
.arg("-A")
|
||||
.arg("internal_features");
|
||||
self.set_revision_flags(&mut rustc);
|
||||
self.maybe_add_external_args(&mut rustc, &self.config.target_rustcflags);
|
||||
rustc.args(&self.props.compile_flags);
|
||||
@ -1867,6 +1871,8 @@ fn document(&self, out_dir: &Path) -> ProcRes {
|
||||
.arg("--deny")
|
||||
.arg("warnings")
|
||||
.arg(&self.testpaths.file)
|
||||
.arg("-A")
|
||||
.arg("internal_features")
|
||||
.args(&self.props.compile_flags);
|
||||
|
||||
if self.config.mode == RustdocJson {
|
||||
@ -2459,6 +2465,9 @@ fn make_compile_args(
|
||||
rustc.args(&["-A", "unused"]);
|
||||
}
|
||||
|
||||
// Allow tests to use internal features.
|
||||
rustc.args(&["-A", "internal_features"]);
|
||||
|
||||
if self.props.force_host {
|
||||
self.maybe_add_external_args(&mut rustc, &self.config.host_rustcflags);
|
||||
if !is_rustdoc {
|
||||
|
@ -53,6 +53,7 @@ fn test_config(target: &str, path: &str, mode: Mode, with_dependencies: bool) ->
|
||||
// Add some flags we always want.
|
||||
program.args.push("-Dwarnings".into());
|
||||
program.args.push("-Dunused".into());
|
||||
program.args.push("-Ainternal_features".into());
|
||||
if let Ok(extra_flags) = env::var("MIRIFLAGS") {
|
||||
for flag in extra_flags.split_whitespace() {
|
||||
program.args.push(flag.into());
|
||||
|
@ -338,6 +338,7 @@ fn collect_lang_features_in(features: &mut Features, base: &Path, file: &str, ba
|
||||
let level = match parts.next().map(|l| l.trim().trim_start_matches('(')) {
|
||||
Some("active") => Status::Unstable,
|
||||
Some("incomplete") => Status::Unstable,
|
||||
Some("internal") => Status::Unstable,
|
||||
Some("removed") => Status::Removed,
|
||||
Some("accepted") => Status::Stable,
|
||||
_ => continue,
|
||||
|
@ -8,7 +8,7 @@ TARGET_RPATH_ENV = \
|
||||
RUSTC_ORIGINAL := $(RUSTC)
|
||||
BARE_RUSTC := $(HOST_RPATH_ENV) '$(RUSTC)'
|
||||
BARE_RUSTDOC := $(HOST_RPATH_ENV) '$(RUSTDOC)'
|
||||
RUSTC := $(BARE_RUSTC) --out-dir $(TMPDIR) -L $(TMPDIR) $(RUSTFLAGS)
|
||||
RUSTC := $(BARE_RUSTC) --out-dir $(TMPDIR) -L $(TMPDIR) $(RUSTFLAGS) -Ainternal_features
|
||||
RUSTDOC := $(BARE_RUSTDOC) -L $(TARGET_RPATH_DIR)
|
||||
ifdef RUSTC_LINKER
|
||||
RUSTC := $(RUSTC) -Clinker='$(RUSTC_LINKER)'
|
||||
|
@ -1,4 +1,5 @@
|
||||
#![feature(staged_api)]
|
||||
#![allow(internal_features)]
|
||||
#![stable(feature = "some_feature", since = "1.3.5")]
|
||||
|
||||
#[stable(feature = "some_feature", since = "1.3.5")]
|
||||
|
@ -3,6 +3,7 @@
|
||||
#![doc(html_playground_url="https://play.rust-lang.org/")]
|
||||
|
||||
#![crate_name = "test_docs"]
|
||||
#![allow(internal_features)]
|
||||
#![feature(rustdoc_internals)]
|
||||
#![feature(doc_cfg)]
|
||||
#![feature(associated_type_defaults)]
|
||||
|
@ -3,6 +3,7 @@
|
||||
#![doc(test(attr(feature(staged_api))))]
|
||||
|
||||
/// ```
|
||||
/// #![allow(internal_features)]
|
||||
/// #![unstable(feature="test", issue="18199")]
|
||||
/// fn main() {}
|
||||
/// ```
|
||||
|
@ -1,7 +1,7 @@
|
||||
// edition:2018
|
||||
#![forbid(incomplete_features, unsafe_code)]
|
||||
#![forbid(internal_features, unsafe_code)]
|
||||
#![feature(unsafe_pin_internals)]
|
||||
//~^ ERROR the feature `unsafe_pin_internals` is incomplete and may not be safe to use
|
||||
//~^ ERROR the feature `unsafe_pin_internals` is internal to the compiler or standard library
|
||||
|
||||
use core::{marker::PhantomPinned, pin::Pin};
|
||||
|
||||
|
@ -1,14 +1,15 @@
|
||||
error: the feature `unsafe_pin_internals` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||
error: the feature `unsafe_pin_internals` is internal to the compiler or standard library
|
||||
--> $DIR/feature-gate-unsafe_pin_internals.rs:3:12
|
||||
|
|
||||
LL | #![feature(unsafe_pin_internals)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: using it is strongly discouraged
|
||||
note: the lint level is defined here
|
||||
--> $DIR/feature-gate-unsafe_pin_internals.rs:2:11
|
||||
|
|
||||
LL | #![forbid(incomplete_features, unsafe_code)]
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
LL | #![forbid(internal_features, unsafe_code)]
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user