lint: port enum intrinsics diagnostics
Signed-off-by: David Wood <david.wood@huawei.com>
This commit is contained in:
parent
0f4c4c5e18
commit
2a69640eb2
2 changed files with 15 additions and 23 deletions
|
@ -4,3 +4,11 @@ lint-array-into-iter =
|
||||||
.remove-into-iter-suggestion = or remove `.into_iter()` to iterate by value
|
.remove-into-iter-suggestion = or remove `.into_iter()` to iterate by value
|
||||||
.use-explicit-into-iter-suggestion =
|
.use-explicit-into-iter-suggestion =
|
||||||
or use `IntoIterator::into_iter(..)` instead of `.into_iter()` to explicitly iterate by value
|
or use `IntoIterator::into_iter(..)` instead of `.into_iter()` to explicitly iterate by value
|
||||||
|
|
||||||
|
lint-enum-intrinsics-mem-discriminant =
|
||||||
|
the return value of `mem::discriminant` is unspecified when called with a non-enum type
|
||||||
|
.note = the argument to `discriminant` should be a reference to an enum, but it was passed a reference to a `{$ty_param}`, which is not an enum.
|
||||||
|
|
||||||
|
lint-enum-intrinsics-mem-variant =
|
||||||
|
the return value of `mem::variant_count` is unspecified when called with a non-enum type
|
||||||
|
.note = the type parameter of `variant_count` should be an enum, but it was instantiated with the type `{$ty_param}`, which is not an enum.
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
use crate::{context::LintContext, LateContext, LateLintPass};
|
use crate::{context::LintContext, LateContext, LateLintPass};
|
||||||
|
use rustc_errors::fluent;
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_middle::ty::{fold::TypeFoldable, Ty};
|
use rustc_middle::ty::{fold::TypeFoldable, Ty};
|
||||||
use rustc_span::{symbol::sym, Span};
|
use rustc_span::{symbol::sym, Span};
|
||||||
|
@ -51,19 +52,9 @@ fn enforce_mem_discriminant(
|
||||||
if is_non_enum(ty_param) {
|
if is_non_enum(ty_param) {
|
||||||
cx.struct_span_lint(ENUM_INTRINSICS_NON_ENUMS, expr_span, |builder| {
|
cx.struct_span_lint(ENUM_INTRINSICS_NON_ENUMS, expr_span, |builder| {
|
||||||
builder
|
builder
|
||||||
.build(
|
.build(fluent::lint::enum_intrinsics_mem_discriminant)
|
||||||
"the return value of `mem::discriminant` is \
|
.set_arg("ty_param", ty_param)
|
||||||
unspecified when called with a non-enum type",
|
.span_note(args_span, fluent::lint::note)
|
||||||
)
|
|
||||||
.span_note(
|
|
||||||
args_span,
|
|
||||||
&format!(
|
|
||||||
"the argument to `discriminant` should be a \
|
|
||||||
reference to an enum, but it was passed \
|
|
||||||
a reference to a `{}`, which is not an enum.",
|
|
||||||
ty_param,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
.emit();
|
.emit();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -74,16 +65,9 @@ fn enforce_mem_variant_count(cx: &LateContext<'_>, func_expr: &hir::Expr<'_>, sp
|
||||||
if is_non_enum(ty_param) {
|
if is_non_enum(ty_param) {
|
||||||
cx.struct_span_lint(ENUM_INTRINSICS_NON_ENUMS, span, |builder| {
|
cx.struct_span_lint(ENUM_INTRINSICS_NON_ENUMS, span, |builder| {
|
||||||
builder
|
builder
|
||||||
.build(
|
.build(fluent::lint::enum_intrinsics_mem_variant)
|
||||||
"the return value of `mem::variant_count` is \
|
.set_arg("ty_param", ty_param)
|
||||||
unspecified when called with a non-enum type",
|
.note(fluent::lint::note)
|
||||||
)
|
|
||||||
.note(&format!(
|
|
||||||
"the type parameter of `variant_count` should \
|
|
||||||
be an enum, but it was instantiated with \
|
|
||||||
the type `{}`, which is not an enum.",
|
|
||||||
ty_param,
|
|
||||||
))
|
|
||||||
.emit();
|
.emit();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue