diff options
Diffstat (limited to 'compiler/rustc_lint_defs')
-rw-r--r-- | compiler/rustc_lint_defs/src/builtin.rs | 82 | ||||
-rw-r--r-- | compiler/rustc_lint_defs/src/lib.rs | 20 |
2 files changed, 79 insertions, 23 deletions
diff --git a/compiler/rustc_lint_defs/src/builtin.rs b/compiler/rustc_lint_defs/src/builtin.rs index 82b837fba..b6481d70b 100644 --- a/compiler/rustc_lint_defs/src/builtin.rs +++ b/compiler/rustc_lint_defs/src/builtin.rs @@ -708,7 +708,7 @@ declare_lint! { /// /// ### Example /// - /// ```rust + /// ```rust,compile_fail /// pub enum Enum { /// Foo, /// Bar, @@ -743,7 +743,7 @@ declare_lint! { /// [identifier pattern]: https://doc.rust-lang.org/reference/patterns.html#identifier-patterns /// [path pattern]: https://doc.rust-lang.org/reference/patterns.html#path-patterns pub BINDINGS_WITH_VARIANT_NAME, - Warn, + Deny, "detects pattern bindings with the same name as one of the matched variants" } @@ -911,8 +911,7 @@ declare_lint! { declare_lint! { /// The `trivial_casts` lint detects trivial casts which could be replaced - /// with coercion, which may require [type ascription] or a temporary - /// variable. + /// with coercion, which may require a temporary variable. /// /// ### Example /// @@ -934,12 +933,14 @@ declare_lint! { /// with FFI interfaces or complex type aliases, where it triggers /// incorrectly, or in situations where it will be more difficult to /// clearly express the intent. It may be possible that this will become a - /// warning in the future, possibly with [type ascription] providing a - /// convenient way to work around the current issues. See [RFC 401] for - /// historical context. - /// - /// [type ascription]: https://github.com/rust-lang/rust/issues/23416 - /// [RFC 401]: https://github.com/rust-lang/rfcs/blob/master/text/0401-coercions.md + /// warning in the future, possibly with an explicit syntax for coercions + /// providing a convenient way to work around the current issues. + /// See [RFC 401 (coercions)][rfc-401], [RFC 803 (type ascription)][rfc-803] and + /// [RFC 3307 (remove type ascription)][rfc-3307] for historical context. + /// + /// [rfc-401]: https://github.com/rust-lang/rfcs/blob/master/text/0401-coercions.md + /// [rfc-803]: https://github.com/rust-lang/rfcs/blob/master/text/0803-type-ascription.md + /// [rfc-3307]: https://github.com/rust-lang/rfcs/blob/master/text/3307-de-rfc-type-ascription.md pub TRIVIAL_CASTS, Allow, "detects trivial casts which could be removed" @@ -967,12 +968,14 @@ declare_lint! { /// with FFI interfaces or complex type aliases, where it triggers /// incorrectly, or in situations where it will be more difficult to /// clearly express the intent. It may be possible that this will become a - /// warning in the future, possibly with [type ascription] providing a - /// convenient way to work around the current issues. See [RFC 401] for - /// historical context. - /// - /// [type ascription]: https://github.com/rust-lang/rust/issues/23416 - /// [RFC 401]: https://github.com/rust-lang/rfcs/blob/master/text/0401-coercions.md + /// warning in the future, possibly with an explicit syntax for coercions + /// providing a convenient way to work around the current issues. + /// See [RFC 401 (coercions)][rfc-401], [RFC 803 (type ascription)][rfc-803] and + /// [RFC 3307 (remove type ascription)][rfc-3307] for historical context. + /// + /// [rfc-401]: https://github.com/rust-lang/rfcs/blob/master/text/0401-coercions.md + /// [rfc-803]: https://github.com/rust-lang/rfcs/blob/master/text/0803-type-ascription.md + /// [rfc-3307]: https://github.com/rust-lang/rfcs/blob/master/text/3307-de-rfc-type-ascription.md pub TRIVIAL_NUMERIC_CASTS, Allow, "detects trivial casts of numeric types which could be removed" @@ -1017,6 +1020,44 @@ declare_lint! { } declare_lint! { + /// The `invalid_alignment` lint detects dereferences of misaligned pointers during + /// constant evluation. + /// + /// ### Example + /// + /// ```rust,compile_fail + /// #![feature(const_ptr_read)] + /// const FOO: () = unsafe { + /// let x = &[0_u8; 4]; + /// let y = x.as_ptr().cast::<u32>(); + /// y.read(); // the address of a `u8` array is unknown and thus we don't know if + /// // it is aligned enough for reading a `u32`. + /// }; + /// ``` + /// + /// {{produces}} + /// + /// ### Explanation + /// + /// The compiler allowed dereferencing raw pointers irrespective of alignment + /// during const eval due to the const evaluator at the time not making it easy + /// or cheap to check. Now that it is both, this is not accepted anymore. + /// + /// Since it was undefined behaviour to begin with, this breakage does not violate + /// Rust's stability guarantees. Using undefined behaviour can cause arbitrary + /// behaviour, including failure to build. + /// + /// [future-incompatible]: ../index.md#future-incompatible-lints + pub INVALID_ALIGNMENT, + Deny, + "raw pointers must be aligned before dereferencing", + @future_incompatible = FutureIncompatibleInfo { + reference: "issue #68585 <https://github.com/rust-lang/rust/issues/104616>", + reason: FutureIncompatibilityReason::FutureReleaseErrorReportNow, + }; +} + +declare_lint! { /// The `exported_private_dependencies` lint detects private dependencies /// that are exposed in a public interface. /// @@ -1364,7 +1405,7 @@ declare_lint! { /// struct S; /// /// impl S { - /// fn late<'a, 'b>(self, _: &'a u8, _: &'b u8) {} + /// fn late(self, _: &u8, _: &u8) {} /// } /// /// fn main() { @@ -2974,6 +3015,7 @@ declare_lint! { "trailing semicolon in macro body used as expression", @future_incompatible = FutureIncompatibleInfo { reference: "issue #79813 <https://github.com/rust-lang/rust/issues/79813>", + reason: FutureIncompatibilityReason::FutureReleaseErrorReportNow, }; } @@ -3608,7 +3650,7 @@ declare_lint! { /// fn main() { /// let x: String = "3".try_into().unwrap(); /// // ^^^^^^^^ - /// // This call to try_into matches both Foo:try_into and TryInto::try_into as + /// // This call to try_into matches both Foo::try_into and TryInto::try_into as /// // `TryInto` has been added to the Rust prelude in 2021 edition. /// println!("{x}"); /// } @@ -4060,10 +4102,10 @@ declare_lint! { /// /// This can be used to implement an unsound API if used incorrectly. pub IMPLIED_BOUNDS_ENTAILMENT, - Warn, + Deny, "impl method assumes more implied bounds than its corresponding trait method", @future_incompatible = FutureIncompatibleInfo { reference: "issue #105572 <https://github.com/rust-lang/rust/issues/105572>", - reason: FutureIncompatibilityReason::FutureReleaseError, + reason: FutureIncompatibilityReason::FutureReleaseErrorReportNow, }; } diff --git a/compiler/rustc_lint_defs/src/lib.rs b/compiler/rustc_lint_defs/src/lib.rs index aa54b3d8a..7054d1e9f 100644 --- a/compiler/rustc_lint_defs/src/lib.rs +++ b/compiler/rustc_lint_defs/src/lib.rs @@ -6,8 +6,9 @@ extern crate rustc_macros; pub use self::Level::*; -use rustc_ast::node_id::{NodeId, NodeMap}; +use rustc_ast::node_id::NodeId; use rustc_ast::{AttrId, Attribute}; +use rustc_data_structures::fx::FxIndexMap; use rustc_data_structures::stable_hasher::{HashStable, StableHasher, ToStableHashKey}; use rustc_error_messages::{DiagnosticMessage, MultiSpan}; use rustc_hir::HashStableContext; @@ -253,6 +254,19 @@ impl Level { } } + pub fn to_cmd_flag(self) -> &'static str { + match self { + Level::Warn => "-W", + Level::Deny => "-D", + Level::Forbid => "-F", + Level::Allow => "-A", + Level::ForceWarn(_) => "--force-warn", + Level::Expect(_) => { + unreachable!("the expect level does not have a commandline flag") + } + } + } + pub fn is_error(self) -> bool { match self { Level::Allow | Level::Expect(_) | Level::Warn | Level::ForceWarn(_) => false, @@ -489,7 +503,7 @@ pub enum BuiltinLintDiagnostics { param_span: Span, /// Span of the code that should be removed when eliding this lifetime. /// This span should include leading or trailing comma. - deletion_span: Span, + deletion_span: Option<Span>, /// Span of the single use, or None if the lifetime is never used. /// If true, the lifetime will be fully elided. use_span: Option<(Span, bool)>, @@ -531,7 +545,7 @@ pub struct BufferedEarlyLint { #[derive(Default)] pub struct LintBuffer { - pub map: NodeMap<Vec<BufferedEarlyLint>>, + pub map: FxIndexMap<NodeId, Vec<BufferedEarlyLint>>, } impl LintBuffer { |