summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_lint/src/lints.rs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/rustc_lint/src/lints.rs')
-rw-r--r--compiler/rustc_lint/src/lints.rs151
1 files changed, 136 insertions, 15 deletions
diff --git a/compiler/rustc_lint/src/lints.rs b/compiler/rustc_lint/src/lints.rs
index d96723a68..9260237fb 100644
--- a/compiler/rustc_lint/src/lints.rs
+++ b/compiler/rustc_lint/src/lints.rs
@@ -10,7 +10,7 @@ use rustc_errors::{
use rustc_hir::def_id::DefId;
use rustc_macros::{LintDiagnostic, Subdiagnostic};
use rustc_middle::ty::{
- inhabitedness::InhabitedPredicate, PolyExistentialTraitRef, Predicate, Ty, TyCtxt,
+ inhabitedness::InhabitedPredicate, Clause, PolyExistentialTraitRef, Ty, TyCtxt,
};
use rustc_session::parse::ParseSess;
use rustc_span::{edition::Edition, sym, symbol::Ident, Span, Symbol};
@@ -352,7 +352,7 @@ impl AddToDiagnostic for BuiltinTypeAliasGenericBoundsSuggestion {
#[diag(lint_builtin_trivial_bounds)]
pub struct BuiltinTrivialBounds<'a> {
pub predicate_kind_name: &'a str,
- pub predicate: Predicate<'a>,
+ pub predicate: Clause<'a>,
}
#[derive(LintDiagnostic)]
@@ -699,6 +699,49 @@ pub struct ForgetCopyDiag<'a> {
pub label: Span,
}
+#[derive(LintDiagnostic)]
+#[diag(lint_undropped_manually_drops)]
+pub struct UndroppedManuallyDropsDiag<'a> {
+ pub arg_ty: Ty<'a>,
+ #[label]
+ pub label: Span,
+ #[subdiagnostic]
+ pub suggestion: UndroppedManuallyDropsSuggestion,
+}
+
+#[derive(Subdiagnostic)]
+#[multipart_suggestion(lint_suggestion, applicability = "machine-applicable")]
+pub struct UndroppedManuallyDropsSuggestion {
+ #[suggestion_part(code = "std::mem::ManuallyDrop::into_inner(")]
+ pub start_span: Span,
+ #[suggestion_part(code = ")")]
+ pub end_span: Span,
+}
+
+// invalid_from_utf8.rs
+#[derive(LintDiagnostic)]
+pub enum InvalidFromUtf8Diag {
+ #[diag(lint_invalid_from_utf8_unchecked)]
+ Unchecked {
+ method: String,
+ valid_up_to: usize,
+ #[label]
+ label: Span,
+ },
+ #[diag(lint_invalid_from_utf8_checked)]
+ Checked {
+ method: String,
+ valid_up_to: usize,
+ #[label]
+ label: Span,
+ },
+}
+
+// reference_casting.rs
+#[derive(LintDiagnostic)]
+#[diag(lint_invalid_reference_casting)]
+pub struct InvalidReferenceCastingDiag;
+
// hidden_unicode_codepoints.rs
#[derive(LintDiagnostic)]
#[diag(lint_hidden_unicode_codepoints)]
@@ -1219,7 +1262,7 @@ pub struct RedundantSemicolonsDiag {
// traits.rs
pub struct DropTraitConstraintsDiag<'a> {
- pub predicate: Predicate<'a>,
+ pub predicate: Clause<'a>,
pub tcx: TyCtxt<'a>,
pub def_id: DefId,
}
@@ -1303,6 +1346,8 @@ pub struct OverflowingBinHex<'a> {
pub sign: OverflowingBinHexSign,
#[subdiagnostic]
pub sub: Option<OverflowingBinHexSub<'a>>,
+ #[subdiagnostic]
+ pub sign_bit_sub: Option<OverflowingBinHexSignBitSub<'a>>,
}
pub enum OverflowingBinHexSign {
@@ -1347,6 +1392,21 @@ pub enum OverflowingBinHexSub<'a> {
Help { suggestion_ty: &'a str },
}
+#[derive(Subdiagnostic)]
+#[suggestion(
+ lint_sign_bit_suggestion,
+ code = "{lit_no_suffix}{uint_ty} as {int_ty}",
+ applicability = "maybe-incorrect"
+)]
+pub struct OverflowingBinHexSignBitSub<'a> {
+ #[primary_span]
+ pub span: Span,
+ pub lit_no_suffix: &'a str,
+ pub negative_val: String,
+ pub uint_ty: &'a str,
+ pub int_ty: &'a str,
+}
+
#[derive(LintDiagnostic)]
#[diag(lint_overflowing_int)]
#[note]
@@ -1395,6 +1455,36 @@ pub struct OverflowingLiteral<'a> {
#[diag(lint_unused_comparisons)]
pub struct UnusedComparisons;
+#[derive(LintDiagnostic)]
+pub enum InvalidNanComparisons {
+ #[diag(lint_invalid_nan_comparisons_eq_ne)]
+ EqNe {
+ #[subdiagnostic]
+ suggestion: InvalidNanComparisonsSuggestion,
+ },
+ #[diag(lint_invalid_nan_comparisons_lt_le_gt_ge)]
+ LtLeGtGe,
+}
+
+#[derive(Subdiagnostic)]
+pub enum InvalidNanComparisonsSuggestion {
+ #[multipart_suggestion(
+ lint_suggestion,
+ style = "verbose",
+ applicability = "machine-applicable"
+ )]
+ Spanful {
+ #[suggestion_part(code = "!")]
+ neg: Option<Span>,
+ #[suggestion_part(code = ".is_nan()")]
+ float: Span,
+ #[suggestion_part(code = "")]
+ nan_plus_binop: Span,
+ },
+ #[help(lint_suggestion)]
+ Spanless,
+}
+
pub struct ImproperCTypes<'a> {
pub ty: Ty<'a>,
pub desc: &'a str,
@@ -1465,8 +1555,29 @@ pub struct UnusedOp<'a> {
pub op: &'a str,
#[label]
pub label: Span,
- #[suggestion(style = "verbose", code = "let _ = ", applicability = "maybe-incorrect")]
- pub suggestion: Span,
+ #[subdiagnostic]
+ pub suggestion: UnusedOpSuggestion,
+}
+
+#[derive(Subdiagnostic)]
+pub enum UnusedOpSuggestion {
+ #[suggestion(
+ lint_suggestion,
+ style = "verbose",
+ code = "let _ = ",
+ applicability = "maybe-incorrect"
+ )]
+ NormalExpr {
+ #[primary_span]
+ span: Span,
+ },
+ #[multipart_suggestion(lint_suggestion, style = "verbose", applicability = "maybe-incorrect")]
+ BlockTailExpr {
+ #[suggestion_part(code = "let _ = ")]
+ before_span: Span,
+ #[suggestion_part(code = ";")]
+ after_span: Span,
+ },
}
#[derive(LintDiagnostic)]
@@ -1509,15 +1620,25 @@ pub struct UnusedDef<'a, 'b> {
}
#[derive(Subdiagnostic)]
-#[suggestion(
- lint_suggestion,
- style = "verbose",
- code = "let _ = ",
- applicability = "maybe-incorrect"
-)]
-pub struct UnusedDefSuggestion {
- #[primary_span]
- pub span: Span,
+
+pub enum UnusedDefSuggestion {
+ #[suggestion(
+ lint_suggestion,
+ style = "verbose",
+ code = "let _ = ",
+ applicability = "maybe-incorrect"
+ )]
+ NormalExpr {
+ #[primary_span]
+ span: Span,
+ },
+ #[multipart_suggestion(lint_suggestion, style = "verbose", applicability = "maybe-incorrect")]
+ BlockTailExpr {
+ #[suggestion_part(code = "let _ = ")]
+ before_span: Span,
+ #[suggestion_part(code = ";")]
+ after_span: Span,
+ },
}
// Needed because of def_path_str
@@ -1531,7 +1652,7 @@ impl<'a> DecorateLint<'a, ()> for UnusedDef<'_, '_> {
diag.set_arg("def", self.cx.tcx.def_path_str(self.def_id));
// check for #[must_use = "..."]
if let Some(note) = self.note {
- diag.note(note.as_str());
+ diag.note(note.to_string());
}
if let Some(sugg) = self.suggestion {
diag.subdiagnostic(sugg);