Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--Cargo.lock19
-rw-r--r--Cargo.toml1
-rw-r--r--crates/hir-def/Cargo.toml1
-rw-r--r--crates/hir-def/src/item_scope.rs4
-rw-r--r--crates/hir-ty/src/consteval/tests/intrinsics.rs1
-rw-r--r--crates/ide-assists/src/tests/generated.rs2
-rw-r--r--crates/ide-db/src/generated/lints.rs1818
-rw-r--r--crates/ide/src/hover/tests.rs17
-rw-r--r--crates/ide/src/status.rs4
-rw-r--r--crates/parser/Cargo.toml1
-rw-r--r--crates/parser/src/syntax_kind/generated.rs2
-rw-r--r--crates/parser/src/tests.rs1
-rw-r--r--crates/profile/Cargo.toml4
-rw-r--r--crates/profile/src/lib.rs7
-rw-r--r--crates/profile/src/stop_watch.rs7
-rw-r--r--crates/rust-analyzer/Cargo.toml1
-rw-r--r--crates/rust-analyzer/src/cli/analysis_stats.rs4
-rw-r--r--crates/rust-analyzer/tests/slow-tests/main.rs3
-rw-r--r--crates/sourcegen/Cargo.toml19
-rw-r--r--crates/sourcegen/src/lib.rs201
-rw-r--r--crates/syntax/src/ast/generated/nodes.rs2
-rw-r--r--crates/syntax/src/ast/generated/tokens.rs2
-rw-r--r--docs/dev/architecture.md2
-rw-r--r--xtask/src/codegen.rs53
-rw-r--r--xtask/src/codegen/assists_doc_tests.rs15
-rw-r--r--xtask/src/codegen/diagnostics_docs.rs5
-rw-r--r--xtask/src/codegen/feature_docs.rs (renamed from crates/rust-analyzer/tests/slow-tests/sourcegen.rs)21
-rw-r--r--xtask/src/codegen/grammar.rs32
-rw-r--r--xtask/src/codegen/lints.rs14
-rw-r--r--xtask/src/codegen/parser_inline_tests.rs (renamed from crates/parser/src/tests/sourcegen_inline_tests.rs)30
-rw-r--r--xtask/src/flags.rs28
-rw-r--r--xtask/src/main.rs3
-rw-r--r--xtask/src/release.rs1
-rw-r--r--xtask/src/tidy.rs (renamed from crates/rust-analyzer/tests/slow-tests/tidy.rs)42
-rw-r--r--xtask/src/util.rs31
35 files changed, 1228 insertions, 1170 deletions
diff --git a/Cargo.lock b/Cargo.lock
index f30f69eb6e..0c105eb996 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -221,11 +221,6 @@ name = "countme"
version = "3.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7704b5fdd17b18ae31c4c1da5a2e0305a2bf17b5249300a9ee9ed7b72114c636"
-dependencies = [
- "dashmap",
- "once_cell",
- "rustc-hash",
-]
[[package]]
name = "cov-mark"
@@ -548,7 +543,6 @@ dependencies = [
"limit",
"mbe",
"once_cell",
- "profile",
"ra-ap-rustc_abi",
"ra-ap-rustc_parse_format",
"rustc-hash",
@@ -1250,7 +1244,6 @@ dependencies = [
"expect-test",
"limit",
"ra-ap-rustc_lexer",
- "sourcegen",
"stdx",
"tracing",
]
@@ -1400,13 +1393,9 @@ name = "profile"
version = "0.0.0"
dependencies = [
"cfg-if",
- "countme",
- "la-arena 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
"libc",
- "once_cell",
"perf-event",
"tikv-jemalloc-ctl",
- "tracing",
"windows-sys 0.52.0",
]
@@ -1681,7 +1670,6 @@ dependencies = [
"semver",
"serde",
"serde_json",
- "sourcegen",
"stdx",
"syntax",
"test-fixture",
@@ -1881,13 +1869,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b"
[[package]]
-name = "sourcegen"
-version = "0.0.0"
-dependencies = [
- "xshell",
-]
-
-[[package]]
name = "span"
version = "0.0.0"
dependencies = [
diff --git a/Cargo.toml b/Cargo.toml
index eea73ac380..bea77b9c85 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -90,7 +90,6 @@ ra-ap-rustc_abi = { version = "0.53.0", default-features = false }
ra-ap-rustc_pattern_analysis = { version = "0.53.0", default-features = false }
# local crates that aren't published to crates.io. These should not have versions.
-sourcegen = { path = "./crates/sourcegen" }
test-fixture = { path = "./crates/test-fixture" }
test-utils = { path = "./crates/test-utils" }
diff --git a/crates/hir-def/Cargo.toml b/crates/hir-def/Cargo.toml
index 41c59ea0d9..660799d610 100644
--- a/crates/hir-def/Cargo.toml
+++ b/crates/hir-def/Cargo.toml
@@ -37,7 +37,6 @@ stdx.workspace = true
intern.workspace = true
base-db.workspace = true
syntax.workspace = true
-profile.workspace = true
hir-expand.workspace = true
mbe.workspace = true
cfg.workspace = true
diff --git a/crates/hir-def/src/item_scope.rs b/crates/hir-def/src/item_scope.rs
index 9c7dfa05b0..d86c0667a0 100644
--- a/crates/hir-def/src/item_scope.rs
+++ b/crates/hir-def/src/item_scope.rs
@@ -8,7 +8,6 @@ use hir_expand::{attrs::AttrId, db::ExpandDatabase, name::Name, AstId, MacroCall
use itertools::Itertools;
use la_arena::Idx;
use once_cell::sync::Lazy;
-use profile::Count;
use rustc_hash::{FxHashMap, FxHashSet};
use smallvec::{smallvec, SmallVec};
use stdx::format_to;
@@ -65,8 +64,6 @@ pub struct ImportId {
#[derive(Debug, Default, PartialEq, Eq)]
pub struct ItemScope {
- _c: Count<Self>,
-
/// Defs visible in this scope. This includes `declarations`, but also
/// imports. The imports belong to this module and can be resolved by using them on
/// the `use_imports_*` fields.
@@ -722,7 +719,6 @@ impl ItemScope {
pub(crate) fn shrink_to_fit(&mut self) {
// Exhaustive match to require handling new fields.
let Self {
- _c: _,
types,
values,
macros,
diff --git a/crates/hir-ty/src/consteval/tests/intrinsics.rs b/crates/hir-ty/src/consteval/tests/intrinsics.rs
index 44a4ac27af..543328a57e 100644
--- a/crates/hir-ty/src/consteval/tests/intrinsics.rs
+++ b/crates/hir-ty/src/consteval/tests/intrinsics.rs
@@ -426,6 +426,7 @@ fn floating_point() {
true,
)),
);
+ #[allow(unknown_lints, clippy::unnecessary_min_or_max)]
check_number(
r#"
extern "rust-intrinsic" {
diff --git a/crates/ide-assists/src/tests/generated.rs b/crates/ide-assists/src/tests/generated.rs
index eec1087e2d..a2287b2977 100644
--- a/crates/ide-assists/src/tests/generated.rs
+++ b/crates/ide-assists/src/tests/generated.rs
@@ -1,4 +1,4 @@
-//! Generated by `sourcegen_assists_docs`, do not edit by hand.
+//! Generated by `cargo codegen assists-doc-tests`, do not edit by hand.
use super::check_doc_test;
diff --git a/crates/ide-db/src/generated/lints.rs b/crates/ide-db/src/generated/lints.rs
index c92d4e78ff..2e0235768c 100644
--- a/crates/ide-db/src/generated/lints.rs
+++ b/crates/ide-db/src/generated/lints.rs
@@ -1,4 +1,4 @@
-//! Generated by `sourcegen_lints`, do not edit by hand.
+//! Generated by `cargo codegen lint-definitions`, do not edit by hand.
#[derive(Clone)]
pub struct Lint {
@@ -51,6 +51,10 @@ pub const DEFAULT_LINTS: &[Lint] = &[
},
Lint { label: "box_pointers", description: r##"use of owned (Box type) heap memory"## },
Lint {
+ label: "boxed_slice_into_iter",
+ description: r##"detects calling `into_iter` on boxed slices in Rust 2015, 2018, and 2021"##,
+ },
+ Lint {
label: "break_with_label_and_loop",
description: r##"`break` expression with label and unlabeled loop as value expression"##,
},
@@ -79,6 +83,10 @@ pub const DEFAULT_LINTS: &[Lint] = &[
description: r##"detects visually confusable pairs between identifiers"##,
},
Lint {
+ label: "const_eval_mutable_ptr_in_final_value",
+ description: r##"detects a mutable pointer that has leaked into final value of a const expression"##,
+ },
+ Lint {
label: "const_evaluatable_unchecked",
description: r##"detects a generic constant is used in a type without a emitting a warning"##,
},
@@ -87,6 +95,10 @@ pub const DEFAULT_LINTS: &[Lint] = &[
description: r##"detects attempts to mutate a `const` item"##,
},
Lint { label: "dead_code", description: r##"detect unused, unexported items"## },
+ Lint {
+ label: "dependency_on_unit_never_type_fallback",
+ description: r##"never type fallback affecting unsafe function calls"##,
+ },
Lint { label: "deprecated", description: r##"detects use of deprecated items"## },
Lint {
label: "deprecated_cfg_attr_crate_type_name",
@@ -97,6 +109,10 @@ pub const DEFAULT_LINTS: &[Lint] = &[
description: r##"detects use of items that will be deprecated in a future version"##,
},
Lint {
+ label: "deprecated_safe",
+ description: r##"detects unsafe functions being used as safe functions"##,
+ },
+ Lint {
label: "deprecated_where_clause_location",
description: r##"deprecated where clause location"##,
},
@@ -172,7 +188,7 @@ pub const DEFAULT_LINTS: &[Lint] = &[
},
Lint {
label: "future_incompatible",
- description: r##"lint group for: deref-into-dyn-supertrait, ambiguous-associated-items, ambiguous-glob-imports, byte-slice-in-packed-struct-with-derive, cenum-impl-drop-cast, coherence-leak-check, conflicting-repr-hints, const-evaluatable-unchecked, deprecated-cfg-attr-crate-type-name, elided-lifetimes-in-associated-constant, forbidden-lint-groups, ill-formed-attribute-input, indirect-structural-match, invalid-doc-attributes, invalid-type-param-default, late-bound-lifetime-arguments, legacy-derive-helpers, macro-expanded-macro-exports-accessed-by-absolute-paths, missing-fragment-specifier, order-dependent-trait-objects, patterns-in-fns-without-body, pointer-structural-match, proc-macro-back-compat, proc-macro-derive-resolution-fallback, pub-use-of-private-extern-crate, repr-transparent-external-private-fields, semicolon-in-expressions-from-macros, soft-unstable, uninhabited-static, unstable-name-collisions, unstable-syntax-pre-expansion, unsupported-calling-conventions, where-clauses-object-safety, writes-through-immutable-pointer"##,
+ description: r##"lint group for: deref-into-dyn-supertrait, ambiguous-associated-items, ambiguous-glob-imports, byte-slice-in-packed-struct-with-derive, cenum-impl-drop-cast, coherence-leak-check, conflicting-repr-hints, const-eval-mutable-ptr-in-final-value, const-evaluatable-unchecked, dependency-on-unit-never-type-fallback, deprecated-cfg-attr-crate-type-name, elided-lifetimes-in-associated-constant, forbidden-lint-groups, ill-formed-attribute-input, invalid-type-param-default, late-bound-lifetime-arguments, legacy-derive-helpers, macro-expanded-macro-exports-accessed-by-absolute-paths, missing-fragment-specifier, never-type-fallback-flowing-into-unsafe, order-dependent-trait-objects, patterns-in-fns-without-body, proc-macro-derive-resolution-fallback, pub-use-of-private-extern-crate, repr-transparent-external-private-fields, self-constructor-from-outer-item, semicolon-in-expressions-from-macros, soft-unstable, uncovered-param-in-projection, uninhabited-static, unstable-name-collisions, unstable-syntax-pre-expansion, unsupported-calling-conventions, wasm-c-abi, writes-through-immutable-pointer"##,
},
Lint {
label: "fuzzy_provenance_casts",
@@ -187,6 +203,14 @@ pub const DEFAULT_LINTS: &[Lint] = &[
description: r##"ill-formed attribute inputs that were previously accepted and used in practice"##,
},
Lint {
+ label: "impl_trait_overcaptures",
+ description: r##"`impl Trait` will capture more lifetimes than possibly intended in edition 2024"##,
+ },
+ Lint {
+ label: "impl_trait_redundant_captures",
+ description: r##"redundant precise-capturing `use<...>` syntax on an `impl Trait`"##,
+ },
+ Lint {
label: "improper_ctypes",
description: r##"proper use of libc types in foreign modules"##,
},
@@ -200,10 +224,6 @@ pub const DEFAULT_LINTS: &[Lint] = &[
},
Lint { label: "incomplete_include", description: r##"trailing content in included file"## },
Lint {
- label: "indirect_structural_match",
- description: r##"constant used in pattern contains value of non-structural-match type in a field or a variant"##,
- },
- Lint {
label: "ineffective_unstable_trait_impl",
description: r##"detects `#[unstable]` on stable trait implementations for stable types"##,
},
@@ -257,6 +277,14 @@ pub const DEFAULT_LINTS: &[Lint] = &[
},
Lint {
label: "keyword_idents",
+ description: r##"lint group for: keyword-idents-2018, keyword-idents-2024"##,
+ },
+ Lint {
+ label: "keyword_idents_2018",
+ description: r##"detects edition keywords being used as an identifier"##,
+ },
+ Lint {
+ label: "keyword_idents_2024",
description: r##"detects edition keywords being used as an identifier"##,
},
Lint { label: "large_assignments", description: r##"detects large moves or copies"## },
@@ -322,6 +350,10 @@ pub const DEFAULT_LINTS: &[Lint] = &[
description: r##"detects missing fragment specifiers in unused `macro_rules!` patterns"##,
},
Lint {
+ label: "missing_unsafe_on_extern",
+ description: r##"detects missing unsafe keyword on extern declarations"##,
+ },
+ Lint {
label: "mixed_script_confusables",
description: r##"detects Unicode scripts whose mixed script confusables codepoints are solely used"##,
},
@@ -343,6 +375,10 @@ pub const DEFAULT_LINTS: &[Lint] = &[
},
Lint { label: "named_asm_labels", description: r##"named labels in inline assembly"## },
Lint {
+ label: "never_type_fallback_flowing_into_unsafe",
+ description: r##"never type fallback affecting unsafe function calls"##,
+ },
+ Lint {
label: "no_mangle_const_items",
description: r##"const items will not have their symbols exported"##,
},
@@ -353,6 +389,10 @@ pub const DEFAULT_LINTS: &[Lint] = &[
description: r##"types, variants, traits and type parameters should have camel case names"##,
},
Lint {
+ label: "non_contiguous_range_endpoints",
+ description: r##"detects off-by-one errors with exclusive range patterns"##,
+ },
+ Lint {
label: "non_exhaustive_omitted_patterns",
description: r##"detect when patterns of types marked `non_exhaustive` are missed"##,
},
@@ -400,10 +440,6 @@ pub const DEFAULT_LINTS: &[Lint] = &[
description: r##"patterns in functions without body were erroneously allowed"##,
},
Lint {
- label: "pointer_structural_match",
- description: r##"pointers are not structural-match"##,
- },
- Lint {
label: "private_bounds",
description: r##"private type in secondary interface of an item"##,
},
@@ -412,10 +448,6 @@ pub const DEFAULT_LINTS: &[Lint] = &[
description: r##"private type in primary interface of an item"##,
},
Lint {
- label: "proc_macro_back_compat",
- description: r##"detects usage of old versions of certain proc-macro crates"##,
- },
- Lint {
label: "proc_macro_derive_resolution_fallback",
description: r##"detects proc macro derives using inaccessible names from parent modules"##,
},
@@ -424,11 +456,23 @@ pub const DEFAULT_LINTS: &[Lint] = &[
description: r##"detect public re-exports of private extern crates"##,
},
Lint {
+ label: "redundant_lifetimes",
+ description: r##"detects lifetime parameters that are redundant because they are equal to some other named lifetime"##,
+ },
+ Lint {
label: "redundant_semicolons",
description: r##"detects unnecessary trailing semicolons"##,
},
Lint {
label: "refining_impl_trait",
+ description: r##"lint group for: refining-impl-trait-reachable, refining-impl-trait-internal"##,
+ },
+ Lint {
+ label: "refining_impl_trait_internal",
+ description: r##"impl trait in impl method signature does not match trait method signature"##,
+ },
+ Lint {
+ label: "refining_impl_trait_reachable",
description: r##"impl trait in impl method signature does not match trait method signature"##,
},
Lint {
@@ -441,7 +485,7 @@ pub const DEFAULT_LINTS: &[Lint] = &[
},
Lint {
label: "rust_2018_compatibility",
- description: r##"lint group for: keyword-idents, anonymous-parameters, absolute-paths-not-starting-with-crate, tyvar-behind-raw-pointer"##,
+ description: r##"lint group for: keyword-idents-2018, anonymous-parameters, absolute-paths-not-starting-with-crate, tyvar-behind-raw-pointer"##,
},
Lint {
label: "rust_2018_idioms",
@@ -469,7 +513,15 @@ pub const DEFAULT_LINTS: &[Lint] = &[
},
Lint {
label: "rust_2024_compatibility",
- description: r##"lint group for: static-mut-refs, unsafe-op-in-unsafe-fn"##,
+ description: r##"lint group for: keyword-idents-2024, deprecated-safe, missing-unsafe-on-extern, static-mut-refs, unsafe-attr-outside-unsafe, unsafe-op-in-unsafe-fn, boxed-slice-into-iter"##,
+ },
+ Lint {
+ label: "rust_2024_incompatible_pat",
+ description: r##"detects patterns whose meaning will change in Rust 2024"##,
+ },
+ Lint {
+ label: "self_constructor_from_outer_item",
+ description: r##"detect unsupported use of `Self` from outer item"##,
},
Lint {
label: "semicolon_in_expressions_from_macros",
@@ -548,6 +600,10 @@ pub const DEFAULT_LINTS: &[Lint] = &[
description: r##"functions that cannot return without calling themselves"##,
},
Lint {
+ label: "uncovered_param_in_projection",
+ description: r##"impl contains type parameters that are not covered"##,
+ },
+ Lint {
label: "undefined_naked_function_abi",
description: r##"undefined naked function ABI"##,
},
@@ -596,6 +652,10 @@ pub const DEFAULT_LINTS: &[Lint] = &[
description: r##"`pub` items not reachable from crate root"##,
},
Lint {
+ label: "unsafe_attr_outside_unsafe",
+ description: r##"detects unsafe attributes outside of unsafe"##,
+ },
+ Lint {
label: "unsafe_code",
description: r##"usage of `unsafe` code and other potentially unsound constructs"##,
},
@@ -715,8 +775,8 @@ pub const DEFAULT_LINTS: &[Lint] = &[
description: r##"lint group for: all lints that are set to issue warnings"##,
},
Lint {
- label: "where_clauses_object_safety",
- description: r##"checks the object safety of where clauses"##,
+ label: "wasm_c_abi",
+ description: r##"detects dependencies that are incompatible with the Wasm C ABI"##,
},
Lint {
label: "while_true",
@@ -732,7 +792,7 @@ pub const DEFAULT_LINT_GROUPS: &[LintGroup] = &[
LintGroup {
lint: Lint {
label: "future_incompatible",
- description: r##"lint group for: deref-into-dyn-supertrait, ambiguous-associated-items, ambiguous-glob-imports, byte-slice-in-packed-struct-with-derive, cenum-impl-drop-cast, coherence-leak-check, conflicting-repr-hints, const-evaluatable-unchecked, deprecated-cfg-attr-crate-type-name, elided-lifetimes-in-associated-constant, forbidden-lint-groups, ill-formed-attribute-input, indirect-structural-match, invalid-doc-attributes, invalid-type-param-default, late-bound-lifetime-arguments, legacy-derive-helpers, macro-expanded-macro-exports-accessed-by-absolute-paths, missing-fragment-specifier, order-dependent-trait-objects, patterns-in-fns-without-body, pointer-structural-match, proc-macro-back-compat, proc-macro-derive-resolution-fallback, pub-use-of-private-extern-crate, repr-transparent-external-private-fields, semicolon-in-expressions-from-macros, soft-unstable, uninhabited-static, unstable-name-collisions, unstable-syntax-pre-expansion, unsupported-calling-conventions, where-clauses-object-safety, writes-through-immutable-pointer"##,
+ description: r##"lint group for: deref-into-dyn-supertrait, ambiguous-associated-items, ambiguous-glob-imports, byte-slice-in-packed-struct-with-derive, cenum-impl-drop-cast, coherence-leak-check, conflicting-repr-hints, const-eval-mutable-ptr-in-final-value, const-evaluatable-unchecked, dependency-on-unit-never-type-fallback, deprecated-cfg-attr-crate-type-name, elided-lifetimes-in-associated-constant, forbidden-lint-groups, ill-formed-attribute-input, invalid-type-param-default, late-bound-lifetime-arguments, legacy-derive-helpers, macro-expanded-macro-exports-accessed-by-absolute-paths, missing-fragment-specifier, never-type-fallback-flowing-into-unsafe, order-dependent-trait-objects, patterns-in-fns-without-body, proc-macro-derive-resolution-fallback, pub-use-of-private-extern-crate, repr-transparent-external-private-fields, self-constructor-from-outer-item, semicolon-in-expressions-from-macros, soft-unstable, uncovered-param-in-projection, uninhabited-static, unstable-name-collisions, unstable-syntax-pre-expansion, unsupported-calling-conventions, wasm-c-abi, writes-through-immutable-pointer"##,
},
children: &[
"deref_into_dyn_supertrait",
@@ -742,37 +802,45 @@ pub const DEFAULT_LINT_GROUPS: &[LintGroup] = &[
"cenum_impl_drop_cast",
"coherence_leak_check",
"conflicting_repr_hints",
+ "const_eval_mutable_ptr_in_final_value",
"const_evaluatable_unchecked",
+ "dependency_on_unit_never_type_fallback",
"deprecated_cfg_attr_crate_type_name",
"elided_lifetimes_in_associated_constant",
"forbidden_lint_groups",
"ill_formed_attribute_input",
- "indirect_structural_match",
- "invalid_doc_attributes",
"invalid_type_param_default",
"late_bound_lifetime_arguments",
"legacy_derive_helpers",
"macro_expanded_macro_exports_accessed_by_absolute_paths",
"missing_fragment_specifier",
+ "never_type_fallback_flowing_into_unsafe",
"order_dependent_trait_objects",
"patterns_in_fns_without_body",
- "pointer_structural_match",
- "proc_macro_back_compat",
"proc_macro_derive_resolution_fallback",
"pub_use_of_private_extern_crate",
"repr_transparent_external_private_fields",
+ "self_constructor_from_outer_item",
"semicolon_in_expressions_from_macros",
"soft_unstable",
+ "uncovered_param_in_projection",
"uninhabited_static",
"unstable_name_collisions",
"unstable_syntax_pre_expansion",
"unsupported_calling_conventions",
- "where_clauses_object_safety",
+ "wasm_c_abi",
"writes_through_immutable_pointer",
],
},
LintGroup {
lint: Lint {
+ label: "keyword_idents",
+ description: r##"lint group for: keyword-idents-2018, keyword-idents-2024"##,
+ },
+ children: &["keyword_idents_2018", "keyword_idents_2024"],
+ },
+ LintGroup {
+ lint: Lint {
label: "let_underscore",
description: r##"lint group for: let-underscore-drop, let-underscore-lock"##,
},
@@ -787,11 +855,18 @@ pub const DEFAULT_LINT_GROUPS: &[LintGroup] = &[
},
LintGroup {
lint: Lint {
+ label: "refining_impl_trait",
+ description: r##"lint group for: refining-impl-trait-reachable, refining-impl-trait-internal"##,
+ },
+ children: &["refining_impl_trait_reachable", "refining_impl_trait_internal"],
+ },
+ LintGroup {
+ lint: Lint {
label: "rust_2018_compatibility",
- description: r##"lint group for: keyword-idents, anonymous-parameters, absolute-paths-not-starting-with-crate, tyvar-behind-raw-pointer"##,
+ description: r##"lint group for: keyword-idents-2018, anonymous-parameters, absolute-paths-not-starting-with-crate, tyvar-behind-raw-pointer"##,
},
children: &[
- "keyword_idents",
+ "keyword_idents_2018",
"anonymous_parameters",
"absolute_paths_not_starting_with_crate",
"tyvar_behind_raw_pointer",
@@ -829,9 +904,17 @@ pub const DEFAULT_LINT_GROUPS: &[LintGroup] = &[
LintGroup {
lint: Lint {
label: "rust_2024_compatibility",
- description: r##"lint group for: static-mut-refs, unsafe-op-in-unsafe-fn"##,
+ description: r##"lint group for: keyword-idents-2024, deprecated-safe, missing-unsafe-on-extern, static-mut-refs, unsafe-attr-outside-unsafe, unsafe-op-in-unsafe-fn, boxed-slice-into-iter"##,
},
- children: &["static_mut_refs", "unsafe_op_in_unsafe_fn"],
+ children: &[
+ "keyword_idents_2024",
+ "deprecated_safe",
+ "missing_unsafe_on_extern",
+ "static_mut_refs",
+ "unsafe_attr_outside_unsafe",
+ "unsafe_op_in_unsafe_fn",
+ "boxed_slice_into_iter",
+ ],
},
LintGroup {
lint: Lint {
@@ -1188,9 +1271,23 @@ This feature has no tracking issue, and is therefore likely internal to the comp
label: "abi_vectorcall",
description: r##"# `abi_vectorcall`
-This feature has no tracking issue, and is therefore likely internal to the compiler, not being intended for general use.
+The tracking issue for this feature is: [#124485]
+
+[#124485]: https://github.com/rust-lang/rust/issues/124485
------------------------
+
+Adds support for the Windows `"vectorcall"` ABI, the equivalent of `__vectorcall` in MSVC.
+
+```rust,ignore (only-windows-or-x86-or-x86-64)
+extern "vectorcall" {
+ fn add_f64s(x: f64, y: f64) -> f64;
+}
+
+fn main() {
+ println!("{}", add_f64s(2.0, 4.0));
+}
+```
"##,
},
Lint {
@@ -1205,12 +1302,12 @@ The tracking issue for this feature is: [#40180]
"##,
},
Lint {
- label: "absolute_path",
- description: r##"# `absolute_path`
+ label: "acceptfilter",
+ description: r##"# `acceptfilter`
-The tracking issue for this feature is: [#92750]
+The tracking issue for this feature is: [#121891]
-[#92750]: https://github.com/rust-lang/rust/issues/92750
+[#121891]: https://github.com/rust-lang/rust/issues/121891
------------------------
"##,
@@ -1235,6 +1332,34 @@ The tracking issue for this feature is: [#95174]
[#95174]: https://github.com/rust-lang/rust/issues/95174
------------------------
+
+Allows for using more complex types for const parameters, such as structs or enums.
+
+```rust
+#![feature(adt_const_params)]
+#![allow(incomplete_features)]
+
+use std::marker::ConstParamTy;
+
+#[derive(ConstParamTy, PartialEq, Eq)]
+enum Foo {
+ A,
+ B,
+ C,
+}
+
+#[derive(ConstParamTy, PartialEq, Eq)]
+struct Bar {
+ flag: bool,
+}
+
+fn is_foo_a_and_bar_true<const F: Foo, const B: Bar>() -> bool {
+ match (F, B.flag) {
+ (Foo::A, true) => true,
+ _ => false,
+ }
+}
+```
"##,
},
Lint {
@@ -1381,6 +1506,28 @@ The tracking issue for this feature is: [#91583]
"##,
},
Lint {
+ label: "array_ptr_get",
+ description: r##"# `array_ptr_get`
+
+The tracking issue for this feature is: [#119834]
+
+[#119834]: https://github.com/rust-lang/rust/issues/119834
+
+------------------------
+"##,
+ },
+ Lint {
+ label: "array_repeat",
+ description: r##"# `array_repeat`
+
+The tracking issue for this feature is: [#126695]
+
+[#126695]: https://github.com/rust-lang/rust/issues/126695
+
+------------------------
+"##,
+ },
+ Lint {
label: "array_try_from_fn",
description: r##"# `array_try_from_fn`
@@ -1484,6 +1631,7 @@ This feature tracks `asm!` and `global_asm!` support for the following architect
- M68k
- CSKY
- s390x
+- Arm64EC
## Register classes
@@ -1516,6 +1664,9 @@ This feature tracks `asm!` and `global_asm!` support for the following architect
| CSKY | `freg` | `f[0-31]` | `f` |
| s390x | `reg` | `r[0-10]`, `r[12-14]` | `r` |
| s390x | `freg` | `f[0-15]` | `f` |
+| Arm64EC | `reg` | `x[0-12]`, `x[15-22]`, `x[25-27]`, `x30` | `r` |
+| Arm64EC | `vreg` | `v[0-15]` | `w` |
+| Arm64EC | `vreg_low16` | `v[0-15]` | `x` |
> **Notes**:
> - NVPTX doesn't have a fixed register set, so named registers are not supported.
@@ -1551,6 +1702,8 @@ This feature tracks `asm!` and `global_asm!` support for the following architect
| CSKY | `freg` | None | `f32`, |
| s390x | `reg`, `reg_addr` | None | `i8`, `i16`, `i32`, `i64` |
| s390x | `freg` | None | `f32`, `f64` |
+| Arm64EC | `reg` | None | `i8`, `i16`, `i32`, `f32`, `i64`, `f64` |
+| Arm64EC | `vreg` | None | `i8`, `i16`, `i32`, `f32`, `i64`, `f64`, <br> `i8x8`, `i16x4`, `i32x2`, `i64x1`, `f32x2`, `f64x1`, <br> `i8x16`, `i16x8`, `i32x4`, `i64x2`, `f32x4`, `f64x2` |
## Register aliases
@@ -1583,6 +1736,12 @@ This feature tracks `asm!` and `global_asm!` support for the following architect
| CSKY | `r29` | `rtb` |
| CSKY | `r30` | `svbr` |
| CSKY | `r31` | `tls` |
+| Arm64EC | `x[0-30]` | `w[0-30]` |
+| Arm64EC | `x29` | `fp` |
+| Arm64EC | `x30` | `lr` |
+| Arm64EC | `sp` | `wsp` |
+| Arm64EC | `xzr` | `wzr` |
+| Arm64EC | `v[0-15]` | `b[0-15]`, `h[0-15]`, `s[0-15]`, `d[0-15]`, `q[0-15]` |
> **Notes**:
> - TI does not mandate a frame pointer for MSP430, but toolchains are allowed
@@ -1593,8 +1752,8 @@ This feature tracks `asm!` and `global_asm!` support for the following architect
| Architecture | Unsupported register | Reason |
| ------------ | --------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| All | `sp`, `r15` (s390x) | The stack pointer must be restored to its original value at the end of an asm code block. |
-| All | `fr` (Hexagon), `$fp` (MIPS), `Y` (AVR), `r4` (MSP430), `a6` (M68k), `r11` (s390x) | The frame pointer cannot be used as an input or output. |
-| All | `r19` (Hexagon) | This is used internally by LLVM as a "base pointer" for functions with complex stack frames. |
+| All | `fr` (Hexagon), `$fp` (MIPS), `Y` (AVR), `r4` (MSP430), `a6` (M68k), `r11` (s390x), `x29` (Arm64EC) | The frame pointer cannot be used as an input or output. |
+| All | `r19` (Hexagon), `x19` (Arm64EC) | This is used internally by LLVM as a "base pointer" for functions with complex stack frames. |
| MIPS | `$0` or `$zero` | This is a constant zero register which can't be modified. |
| MIPS | `$1` or `$at` | Reserved for assembler. |
| MIPS | `$26`/`$k0`, `$27`/`$k1` | OS-reserved registers. |
@@ -1610,6 +1769,9 @@ This feature tracks `asm!` and `global_asm!` support for the following architect
| CSKY | `r15` | This is the link register. |
| CSKY | `r[26-30]` | Reserved by its ABI. |
| CSKY | `r31` | This is the TLS register. |
+| Arm64EC | `xzr` | This is a constant zero register which can't be modified. |
+| Arm64EC | `x18` | This is an OS-reserved register. |
+| Arm64EC | `x13`, `x14`, `x23`, `x24`, `x28`, `v[16-31]` | These are AArch64 registers that are not supported for Arm64EC. |
## Template modifiers
@@ -1630,6 +1792,16 @@ This feature tracks `asm!` and `global_asm!` support for the following architect
| s390x | `freg` | None | `%f0` | None |
| CSKY | `reg` | None | `r0` | None |
| CSKY | `freg` | None | `f0` | None |
+| Arm64EC | `reg` | None | `x0` | `x` |
+| Arm64EC | `reg` | `w` | `w0` | `w` |
+| Arm64EC | `reg` | `x` | `x0` | `x` |
+| Arm64EC | `vreg` | None | `v0` | None |
+| Arm64EC | `vreg` | `v` | `v0` | None |
+| Arm64EC | `vreg` | `b` | `b0` | `b` |
+| Arm64EC | `vreg` | `h` | `h0` | `h` |
+| Arm64EC | `vreg` | `s` | `s0` | `s` |
+| Arm64EC | `vreg` | `d` | `d0` | `d` |
+| Arm64EC | `vreg` | `q` | `q0` | `q` |
# Flags covered by `preserves_flags`
@@ -1642,6 +1814,43 @@ These flags registers must be restored upon exiting the asm block if the `preser
- The condition code register `ccr`.
- s390x
- The condition code register `cc`.
+- Arm64EC
+ - Condition flags (`NZCV` register).
+ - Floating-point status (`FPSR` register).
+"##,
+ },
+ Lint {
+ label: "asm_goto",
+ description: r##"# `asm_goto`
+
+The tracking issue for this feature is: [#119364]
+
+[#119364]: https://github.com/rust-lang/rust/issues/119364
+
+------------------------
+
+This feature adds a `label <block>` operand type to `asm!`.
+
+Example:
+```rust,ignore (partial-example, x86-only)
+
+unsafe {
+ asm!(
+ "jmp {}",
+ label {
+ println!("Jumped from asm!");
+ }
+ );
+}
+```
+
+The block must have unit type or diverge.
+
+When `label <block>` is used together with `noreturn` option, it means that the
+assembly will not fallthrough. It's allowed to jump to a label within the
+assembly. In this case, the entire `asm!` expression will have an unit type as
+opposed to diverging, if not all label blocks diverge. The `asm!` expression
+still diverges if `noreturn` option is used and all label blocks diverge.
"##,
},
Lint {
@@ -1680,17 +1889,6 @@ The tracking issue for this feature is: [#92827]
"##,
},
Lint {
- label: "associated_type_bounds",
- description: r##"# `associated_type_bounds`
-
-The tracking issue for this feature is: [#52662]
-
-[#52662]: https://github.com/rust-lang/rust/issues/52662
-
-------------------------
-"##,
- },
- Lint {
label: "associated_type_defaults",
description: r##"# `associated_type_defaults`
@@ -1713,6 +1911,17 @@ The tracking issue for this feature is: [#62290]
"##,
},
Lint {
+ label: "async_drop",
+ description: r##"# `async_drop`
+
+The tracking issue for this feature is: [#126482]
+
+[#126482]: https://github.com/rust-lang/rust/issues/126482
+
+------------------------
+"##,
+ },
+ Lint {
label: "async_fn_track_caller",
description: r##"# `async_fn_track_caller`
@@ -1737,7 +1946,7 @@ for creating custom closure-like types that return futures.
[`AsyncFn*`]: ../../std/ops/trait.AsyncFn.html
The main difference to the `Fn*` family of traits is that `AsyncFn` can return a future
-that borrows from itself (`FnOnce::Output` has no lifetime parameters, while `AsyncFn::CallFuture` does).
+that borrows from itself (`FnOnce::Output` has no lifetime parameters, while `AsyncFnMut::CallRefFuture` does).
"##,
},
Lint {
@@ -1783,17 +1992,6 @@ The tracking issue for this feature is: [#79024]
"##,
},
Lint {
- label: "atomic_bool_fetch_not",
- description: r##"# `atomic_bool_fetch_not`
-
-The tracking issue for this feature is: [#98485]
-
-[#98485]: https://github.com/rust-lang/rust/issues/98485
-
-------------------------
-"##,
- },
- Lint {
label: "atomic_from_mut",
description: r##"# `atomic_from_mut`
@@ -1948,17 +2146,6 @@ The tracking issue for this feature is: [#85532]
"##,
},
Lint {
- label: "binary_heap_as_slice",
- description: r##"# `binary_heap_as_slice`
-
-The tracking issue for this feature is: [#83659]
-
-[#83659]: https://github.com/rust-lang/rust/issues/83659
-
-------------------------
-"##,
- },
- Lint {
label: "binary_heap_drain_sorted",
description: r##"# `binary_heap_drain_sorted`
@@ -2114,23 +2301,23 @@ The tracking issue for this feature is: [#111735]
"##,
},
Lint {
- label: "builtin_syntax",
- description: r##"# `builtin_syntax`
+ label: "build_hasher_default_const_new",
+ description: r##"# `build_hasher_default_const_new`
-The tracking issue for this feature is: [#110680]
+The tracking issue for this feature is: [#123197]
-[#110680]: https://github.com/rust-lang/rust/issues/110680
+[#123197]: https://github.com/rust-lang/rust/issues/123197
------------------------
"##,
},
Lint {
- label: "byte_slice_trim_ascii",
- description: r##"# `byte_slice_trim_ascii`
+ label: "builtin_syntax",
+ description: r##"# `builtin_syntax`
-The tracking issue for this feature is: [#94035]
+The tracking issue for this feature is: [#110680]
-[#94035]: https://github.com/rust-lang/rust/issues/94035
+[#110680]: https://github.com/rust-lang/rust/issues/110680
------------------------
"##,
@@ -2147,33 +2334,14 @@ The tracking issue for this feature is: [#88345]
"##,
},
Lint {
- label: "c_unwind",
- description: r##"# `c_unwind`
+ label: "c_str_module",
+ description: r##"# `c_str_module`
-The tracking issue for this feature is: [#74990]
+The tracking issue for this feature is: [#112134]
-[#74990]: https://github.com/rust-lang/rust/issues/74990
+[#112134]: https://github.com/rust-lang/rust/issues/112134
------------------------
-
-Introduces new ABI strings:
-- "C-unwind"
-- "cdecl-unwind"
-- "stdcall-unwind"
-- "fastcall-unwind"
-- "vectorcall-unwind"
-- "thiscall-unwind"
-- "aapcs-unwind"
-- "win64-unwind"
-- "sysv64-unwind"
-- "system-unwind"
-
-These enable unwinding from other languages (such as C++) into Rust frames and
-from Rust into other languages.
-
-See [RFC 2945] for more information.
-
-[RFC 2945]: https://github.com/rust-lang/rfcs/blob/master/text/2945-c-unwind-abi.md
"##,
},
Lint {
@@ -2425,6 +2593,17 @@ The tracking issue for this feature is: [#29594]
"##,
},
Lint {
+ label: "cfg_ub_checks",
+ description: r##"# `cfg_ub_checks`
+
+The tracking issue for this feature is: [#123499]
+
+[#123499]: https://github.com/rust-lang/rust/issues/123499
+
+------------------------
+"##,
+ },
+ Lint {
label: "cfg_version",
description: r##"# `cfg_version`
@@ -2524,6 +2703,17 @@ The tracking issue for this feature is: [#114298]
"##,
},
Lint {
+ label: "clone_to_uninit",
+ description: r##"# `clone_to_uninit`
+
+The tracking issue for this feature is: [#126799]
+
+[#126799]: https://github.com/rust-lang/rust/issues/126799
+
+------------------------
+"##,
+ },
+ Lint {
label: "closure_lifetime_binder",
description: r##"# `closure_lifetime_binder`
@@ -2658,17 +2848,6 @@ The tracking issue for this feature is: [#18598]
"##,
},
Lint {
- label: "collapse_debuginfo",
- description: r##"# `collapse_debuginfo`
-
-The tracking issue for this feature is: [#100758]
-
-[#100758]: https://github.com/rust-lang/rust/issues/100758
-
-------------------------
-"##,
- },
- Lint {
label: "compiler_builtins",
description: r##"# `compiler_builtins`
@@ -2836,8 +3015,8 @@ The tracking issue for this feature is: [#85532]
"##,
},
Lint {
- label: "const_binary_heap_constructor",
- description: r##"# `const_binary_heap_constructor`
+ label: "const_binary_heap_new_in",
+ description: r##"# `const_binary_heap_new_in`
The tracking issue for this feature is: [#112353]
@@ -2876,17 +3055,6 @@ This feature has no tracking issue, and is therefore likely internal to the comp
"##,
},
Lint {
- label: "const_caller_location",
- description: r##"# `const_caller_location`
-
-The tracking issue for this feature is: [#76156]
-
-[#76156]: https://github.com/rust-lang/rust/issues/76156
-
-------------------------
-"##,
- },
- Lint {
label: "const_cell_into_inner",
description: r##"# `const_cell_into_inner`
@@ -2920,17 +3088,6 @@ The tracking issue for this feature is: [#106003]
"##,
},
Lint {
- label: "const_cmp",
- description: r##"# `const_cmp`
-
-The tracking issue for this feature is: [#92391]
-
-[#92391]: https://github.com/rust-lang/rust/issues/92391
-
-------------------------
-"##,
- },
- Lint {
label: "const_collections_with_hasher",
description: r##"# `const_collections_with_hasher`
@@ -2967,7 +3124,9 @@ The tracking issue for this feature is: [#113219]
label: "const_eval_select",
description: r##"# `const_eval_select`
-This feature has no tracking issue, and is therefore likely internal to the compiler, not being intended for general use.
+The tracking issue for this feature is: [#124625]
+
+[#124625]: https://github.com/rust-lang/rust/issues/124625
------------------------
"##,
@@ -3077,17 +3236,6 @@ The tracking issue for this feature is: [#79597]
"##,
},
Lint {
- label: "const_hint_assert_unchecked",
- description: r##"# `const_hint_assert_unchecked`
-
-The tracking issue for this feature is: [#119131]
-
-[#119131]: https://github.com/rust-lang/rust/issues/119131
-
-------------------------
-"##,
- },
- Lint {
label: "const_index_range_slice_index",
description: r##"# `const_index_range_slice_index`
@@ -3097,10 +3245,12 @@ This feature has no tracking issue, and is therefore likely internal to the comp
"##,
},
Lint {
- label: "const_int_unchecked_arith",
- description: r##"# `const_int_unchecked_arith`
+ label: "const_int_from_str",
+ description: r##"# `const_int_from_str`
-This feature has no tracking issue, and is therefore likely internal to the compiler, not being intended for general use.
+The tracking issue for this feature is: [#59133]
+
+[#59133]: https://github.com/rust-lang/rust/issues/59133
------------------------
"##,
@@ -3155,17 +3305,6 @@ This feature has no tracking issue, and is therefore likely internal to the comp
"##,
},
Lint {
- label: "const_io_structs",
- description: r##"# `const_io_structs`
-
-The tracking issue for this feature is: [#78812]
-
-[#78812]: https://github.com/rust-lang/rust/issues/78812
-
-------------------------
-"##,
- },
- Lint {
label: "const_ip",
description: r##"# `const_ip`
@@ -3208,17 +3347,6 @@ This feature has no tracking issue, and is therefore likely internal to the comp
"##,
},
Lint {
- label: "const_location_fields",
- description: r##"# `const_location_fields`
-
-The tracking issue for this feature is: [#102911]
-
-[#102911]: https://github.com/rust-lang/rust/issues/102911
-
-------------------------
-"##,
- },
- Lint {
label: "const_maybe_uninit_array_assume_init",
description: r##"# `const_maybe_uninit_array_assume_init`
@@ -3305,17 +3433,6 @@ The tracking issue for this feature is: [#110840]
"##,
},
Lint {
- label: "const_ops",
- description: r##"# `const_ops`
-
-The tracking issue for this feature is: [#90080]
-
-[#90080]: https://github.com/rust-lang/rust/issues/90080
-
-------------------------
-"##,
- },
- Lint {
label: "const_option",
description: r##"# `const_option`
@@ -3536,6 +3653,17 @@ The tracking issue for this feature is: [#111774]
"##,
},
Lint {
+ label: "const_slice_flatten",
+ description: r##"# `const_slice_flatten`
+
+The tracking issue for this feature is: [#95629]
+
+[#95629]: https://github.com/rust-lang/rust/issues/95629
+
+------------------------
+"##,
+ },
+ Lint {
label: "const_slice_from_mut_ptr_range",
description: r##"# `const_slice_from_mut_ptr_range`
@@ -3589,17 +3717,6 @@ This feature has no tracking issue, and is therefore likely internal to the comp
"##,
},
Lint {
- label: "const_slice_ptr_len",
- description: r##"# `const_slice_ptr_len`
-
-The tracking issue for this feature is: [#71146]
-
-[#71146]: https://github.com/rust-lang/rust/issues/71146
-
-------------------------
-"##,
- },
- Lint {
label: "const_slice_split_at_mut",
description: r##"# `const_slice_split_at_mut`
@@ -3666,6 +3783,15 @@ The tracking issue for this feature is: [#83163]
"##,
},
Lint {
+ label: "const_three_way_compare",
+ description: r##"# `const_three_way_compare`
+
+This feature has no tracking issue, and is therefore likely internal to the compiler, not being intended for general use.
+
+------------------------
+"##,
+ },
+ Lint {
label: "const_trait_impl",
description: r##"# `const_trait_impl`
@@ -3710,6 +3836,24 @@ The tracking issue for this feature is: [#63084]
"##,
},
Lint {
+ label: "const_typed_swap",
+ description: r##"# `const_typed_swap`
+
+This feature has no tracking issue, and is therefore likely internal to the compiler, not being intended for general use.
+
+------------------------
+"##,
+ },
+ Lint {
+ label: "const_ub_checks",
+ description: r##"# `const_ub_checks`
+
+This feature has no tracking issue, and is therefore likely internal to the compiler, not being intended for general use.
+
+------------------------
+"##,
+ },
+ Lint {
label: "const_unicode_case_lookup",
description: r##"# `const_unicode_case_lookup`
@@ -3752,6 +3896,17 @@ This feature has no tracking issue, and is therefore likely internal to the comp
"##,
},
Lint {
+ label: "context_ext",
+ description: r##"# `context_ext`
+
+The tracking issue for this feature is: [#123392]
+
+[#123392]: https://github.com/rust-lang/rust/issues/123392
+
+------------------------
+"##,
+ },
+ Lint {
label: "control_flow_enum",
description: r##"# `control_flow_enum`
@@ -3794,6 +3949,24 @@ The tracking issue for this feature is: [#117693]
"##,
},
Lint {
+ label: "core_pattern_type",
+ description: r##"# `core_pattern_type`
+
+This feature has no tracking issue, and is therefore likely internal to the compiler, not being intended for general use.
+
+------------------------
+"##,
+ },
+ Lint {
+ label: "core_pattern_types",
+ description: r##"# `core_pattern_types`
+
+This feature has no tracking issue, and is therefore likely internal to the compiler, not being intended for general use.
+
+------------------------
+"##,
+ },
+ Lint {
label: "core_private_bignum",
description: r##"# `core_private_bignum`
@@ -3863,7 +4036,7 @@ tweaks to the overall design.
A syntactical example of a coroutine is:
```rust
-#![feature(coroutines, coroutine_trait)]
+#![feature(coroutines, coroutine_trait, stmt_expr_attributes)]
use std::ops::{Coroutine, CoroutineState};
use std::pin::Pin;
@@ -3885,7 +4058,8 @@ fn main() {
}
```
-Coroutines are closure-like literals which can contain a `yield` statement. The
+Coroutines are closure-like literals which are annotated with `#[coroutine]`
+and can contain a `yield` statement. The
`yield` statement takes an optional expression of a value to yield out of the
coroutine. All coroutine literals implement the `Coroutine` trait in the
`std::ops` module. The `Coroutine` trait has one main method, `resume`, which
@@ -3895,7 +4069,7 @@ An example of the control flow of coroutines is that the following example
prints all numbers in order:
```rust
-#![feature(coroutines, coroutine_trait)]
+#![feature(coroutines, coroutine_trait, stmt_expr_attributes)]
use std::ops::Coroutine;
use std::pin::Pin;
@@ -3915,9 +4089,9 @@ fn main() {
}
```
-At this time the main intended use case of coroutines is an implementation
-primitive for async/await syntax, but coroutines will likely be extended to
-ergonomic implementations of iterators and other primitives in the future.
+At this time the main use case of coroutines is an implementation
+primitive for `async`/`await` and `gen` syntax, but coroutines
+will likely be extended to other primitives in the future.
Feedback on the design and usage is always appreciated!
### The `Coroutine` trait
@@ -4000,7 +4174,7 @@ which point all state is saved off in the coroutine and a value is returned.
Let's take a look at an example to see what's going on here:
```rust
-#![feature(coroutines, coroutine_trait)]
+#![feature(coroutines, coroutine_trait, stmt_expr_attributes)]
use std::ops::Coroutine;
use std::pin::Pin;
@@ -4020,7 +4194,7 @@ fn main() {
This coroutine literal will compile down to something similar to:
```rust
-#![feature(arbitrary_self_types, coroutines, coroutine_trait)]
+#![feature(arbitrary_self_types, coroutine_trait)]
use std::ops::{Coroutine, CoroutineState};
use std::pin::Pin;
@@ -4140,12 +4314,12 @@ The tracking issue for this feature is: [#44839]
"##,
},
Lint {
- label: "cstr_count_bytes",
- description: r##"# `cstr_count_bytes`
+ label: "cstr_bytes",
+ description: r##"# `cstr_bytes`
-The tracking issue for this feature is: [#114441]
+The tracking issue for this feature is: [#112115]
-[#114441]: https://github.com/rust-lang/rust/issues/114441
+[#112115]: https://github.com/rust-lang/rust/issues/112115
------------------------
"##,
@@ -4162,17 +4336,6 @@ The tracking issue for this feature is: [#86369]
"##,
},
Lint {
- label: "custom_code_classes_in_docs",
- description: r##"# `custom_code_classes_in_docs`
-
-The tracking issue for this feature is: [#79483]
-
-[#79483]: https://github.com/rust-lang/rust/issues/79483
-
-------------------------
-"##,
- },
- Lint {
label: "custom_inner_attributes",
description: r##"# `custom_inner_attributes`
@@ -4282,15 +4445,6 @@ The tracking issue for this feature is: [#27336]
"##,
},
Lint {
- label: "delayed_debug_assertions",
- description: r##"# `delayed_debug_assertions`
-
-This feature has no tracking issue, and is therefore likely internal to the compiler, not being intended for general use.
-
-------------------------
-"##,
- },
- Lint {
label: "deprecated_safe",
description: r##"# `deprecated_safe`
@@ -4313,6 +4467,28 @@ The tracking issue for this feature is: [#94785]
"##,
},
Lint {
+ label: "deref_patterns",
+ description: r##"# `deref_patterns`
+
+The tracking issue for this feature is: [#87121]
+
+[#87121]: https://github.com/rust-lang/rust/issues/87121
+
+------------------------
+"##,
+ },
+ Lint {
+ label: "deref_pure_trait",
+ description: r##"# `deref_pure_trait`
+
+The tracking issue for this feature is: [#87121]
+
+[#87121]: https://github.com/rust-lang/rust/issues/87121
+
+------------------------
+"##,
+ },
+ Lint {
label: "derive_clone_copy",
description: r##"# `derive_clone_copy`
@@ -4340,91 +4516,14 @@ This feature is internal to the Rust compiler and is not intended for general us
"##,
},
Lint {
- label: "diagnostic_namespace",
- description: r##"# `diagnostic_namespace`
+ label: "derive_smart_pointer",
+ description: r##"# `derive_smart_pointer`
-The tracking issue for this feature is: [#111996]
+The tracking issue for this feature is: [#123430]
-[#111996]: https://github.com/rust-lang/rust/issues/111996
+[#123430]: https://github.com/rust-lang/rust/issues/123430
------------------------
-
-The `diagnostic_namespace` feature permits customization of compilation errors.
-
-## diagnostic::on_unimplemented
-
-With [#114452] support for `diagnostic::on_unimplemented` was added.
-
-When used on a trait declaration, the following options are available:
-
-* `message` to customize the primary error message
-* `note` to add a customized note message to an error message
-* `label` to customize the label part of the error message
-
-The attribute will hint to the compiler to use these in error messages:
-```rust
-// some library
-#![feature(diagnostic_namespace)]
-
-#[diagnostic::on_unimplemented(
- message = "cannot insert element",
- label = "cannot be put into a table",
- note = "see <link> for more information about the Table api"
-)]
-pub trait Element {
- // ...
-}
-```
-
-```rust,compile_fail,E0277
-# #![feature(diagnostic_namespace)]
-#
-# #[diagnostic::on_unimplemented(
-# message = "cannot insert element",
-# label = "cannot be put into a table",
-# note = "see <link> for more information about the Table api"
-# )]
-# pub trait Element {
-# // ...
-# }
-# struct Table;
-# impl Table {
-# fn insert<T: Element>(&self, element: T) {
-# // ..
-# }
-# }
-# fn main() {
-# let table = Table;
-# let element = ();
-// user code
-table.insert(element);
-# }
-```
-
-```text
-error[E0277]: cannot insert element
- --> src/main.rs:24:18
- |
-24 | table.insert(element);
- | ------ ^^^^^^^ cannot be put into a table
- | |
- | required by a bound introduced by this call
- |
- = help: the trait `Element` is not implemented for `<type>`
- = note: see <link> for more information about the Table api
-note: required by a bound in `Table::insert`
- --> src/main.rs:15:18
- |
-15 | fn insert<T: Element>(&self, element: T) {
- | ^^^^^^^ required by this bound in `Table::insert`
-
-For more information about this error, try `rustc --explain E0277`.
-```
-
-See [RFC 3368] for more information.
-
-[#114452]: https://github.com/rust-lang/rust/pull/114452
-[RFC 3368]: https://github.com/rust-lang/rfcs/blob/master/text/3368-diagnostic-attribute-namespace.md
"##,
},
Lint {
@@ -4457,17 +4556,6 @@ This feature has no tracking issue, and is therefore likely internal to the comp
"##,
},
Lint {
- label: "div_duration",
- description: r##"# `div_duration`
-
-The tracking issue for this feature is: [#63139]
-
-[#63139]: https://github.com/rust-lang/rust/issues/63139
-
-------------------------
-"##,
- },
- Lint {
label: "do_not_recommend",
description: r##"# `do_not_recommend`
@@ -4649,17 +4737,6 @@ The tracking issue for this feature is: [#34761]
"##,
},
Lint {
- label: "duration_abs_diff",
- description: r##"# `duration_abs_diff`
-
-The tracking issue for this feature is: [#117618]
-
-[#117618]: https://github.com/rust-lang/rust/issues/117618
-
-------------------------
-"##,
- },
- Lint {
label: "duration_constants",
description: r##"# `duration_constants`
@@ -4695,6 +4772,17 @@ The tracking issue for this feature is: [#72440]
"##,
},
Lint {
+ label: "duration_millis_float",
+ description: r##"# `duration_millis_float`
+
+The tracking issue for this feature is: [#122451]
+
+[#122451]: https://github.com/rust-lang/rust/issues/122451
+
+------------------------
+"##,
+ },
+ Lint {
label: "duration_units",
description: r##"# `duration_units`
@@ -4726,6 +4814,15 @@ This feature has no tracking issue, and is therefore likely internal to the comp
"##,
},
Lint {
+ label: "effect_types",
+ description: r##"# `effect_types`
+
+This feature has no tracking issue, and is therefore likely internal to the compiler, not being intended for general use.
+
+------------------------
+"##,
+ },
+ Lint {
label: "effects",
description: r##"# `effects`
@@ -4770,17 +4867,6 @@ The tracking issue for this feature is: [#99301]
"##,
},
Lint {
- label: "error_in_core",
- description: r##"# `error_in_core`
-
-The tracking issue for this feature is: [#103765]
-
-[#103765]: https://github.com/rust-lang/rust/issues/103765
-
-------------------------
-"##,
- },
- Lint {
label: "error_iter",
description: r##"# `error_iter`
@@ -4825,36 +4911,6 @@ The tracking issue for this feature is: [#35428]
"##,
},
Lint {
- label: "exclusive_range_pattern",
- description: r##"# `exclusive_range_pattern`
-
-The tracking issue for this feature is: [#37854].
-
-
-[#67264]: https://github.com/rust-lang/rust/issues/67264
-[#37854]: https://github.com/rust-lang/rust/issues/37854
------
-
-The `exclusive_range_pattern` feature allows non-inclusive range
-patterns (`0..10`) to be used in appropriate pattern matching
-contexts. It also can be combined with `#![feature(half_open_range_patterns]`
-to be able to use RangeTo patterns (`..10`).
-
-It also enabled RangeFrom patterns but that has since been
-stabilized.
-
-```rust
-#![feature(exclusive_range_pattern)]
- let x = 5;
- match x {
- 0..10 => println!("single digit"),
- 10 => println!("ten isn't part of the above range"),
- _ => println!("nor is everything else.")
- }
-```
-"##,
- },
- Lint {
label: "exclusive_wrapper",
description: r##"# `exclusive_wrapper`
@@ -4921,6 +4977,17 @@ The tracking issue for this feature is: [#95228]
"##,
},
Lint {
+ label: "expr_fragment_specifier_2024",
+ description: r##"# `expr_fragment_specifier_2024`
+
+The tracking issue for this feature is: [#123742]
+
+[#123742]: https://github.com/rust-lang/rust/issues/123742
+
+------------------------
+"##,
+ },
+ Lint {
label: "extend_one",
description: r##"# `extend_one`
@@ -4968,6 +5035,32 @@ The tracking issue for this feature is: [#43244]
"##,
},
Lint {
+ label: "f128",
+ description: r##"# `f128`
+
+The tracking issue for this feature is: [#116909]
+
+[#116909]: https://github.com/rust-lang/rust/issues/116909
+
+---
+
+Enable the `f128` type for IEEE 128-bit floating numbers (quad precision).
+"##,
+ },
+ Lint {
+ label: "f16",
+ description: r##"# `f16`
+
+The tracking issue for this feature is: [#116909]
+
+[#116909]: https://github.com/rust-lang/rust/issues/116909
+
+---
+
+Enable the `f16` type for IEEE 16-bit floating numbers (half precision).
+"##,
+ },
+ Lint {
label: "fd",
description: r##"# `fd`
@@ -5250,12 +5343,23 @@ This feature has no tracking issue, and is therefore likely internal to the comp
"##,
},
Lint {
- label: "fs_try_exists",
- description: r##"# `fs_try_exists`
+ label: "freeze",
+ description: r##"# `freeze`
+
+The tracking issue for this feature is: [#121675]
+
+[#121675]: https://github.com/rust-lang/rust/issues/121675
+
+------------------------
+"##,
+ },
+ Lint {
+ label: "freeze_impls",
+ description: r##"# `freeze_impls`
-The tracking issue for this feature is: [#83186]
+The tracking issue for this feature is: [#121675]
-[#83186]: https://github.com/rust-lang/rust/issues/83186
+[#121675]: https://github.com/rust-lang/rust/issues/121675
------------------------
"##,
@@ -5369,17 +5473,6 @@ The tracking issue for this feature is: [#113521]
"##,
},
Lint {
- label: "generic_nonzero",
- description: r##"# `generic_nonzero`
-
-The tracking issue for this feature is: [#120257]
-
-[#120257]: https://github.com/rust-lang/rust/issues/120257
-
-------------------------
-"##,
- },
- Lint {
label: "get_many_mut",
description: r##"# `get_many_mut`
@@ -5402,11 +5495,22 @@ The tracking issue for this feature is: [#63292]
"##,
},
Lint {
+ label: "global_registration",
+ description: r##"# `global_registration`
+
+The tracking issue for this feature is: [#125119]
+
+[#125119]: https://github.com/rust-lang/rust/issues/125119
+
+------------------------
+"##,
+ },
+ Lint {
label: "half_open_range_patterns_in_slices",
description: r##"# `half_open_range_patterns_in_slices`
The tracking issue for this feature is: [#67264]
-It is part of the `exclusive_range_pattern` feature,
+It is a future part of the `exclusive_range_pattern` feature,
tracked at [#37854].
[#67264]: https://github.com/rust-lang/rust/issues/67264
@@ -5417,7 +5521,6 @@ This feature allow using top-level half-open range patterns in slices.
```rust
#![feature(half_open_range_patterns_in_slices)]
-#![feature(exclusive_range_pattern)]
fn main() {
let xs = [13, 1, 5, 2, 3, 1, 21, 8];
@@ -5500,17 +5603,6 @@ The tracking issue for this feature is: [#44839]
"##,
},
Lint {
- label: "hint_assert_unchecked",
- description: r##"# `hint_assert_unchecked`
-
-The tracking issue for this feature is: [#119131]
-
-[#119131]: https://github.com/rust-lang/rust/issues/119131
-
-------------------------
-"##,
- },
- Lint {
label: "hint_must_use",
description: r##"# `hint_must_use`
@@ -5555,17 +5647,6 @@ The tracking issue for this feature is: [#99697]
"##,
},
Lint {
- label: "imported_main",
- description: r##"# `imported_main`
-
-The tracking issue for this feature is: [#28937]
-
-[#28937]: https://github.com/rust-lang/rust/issues/28937
-
-------------------------
-"##,
- },
- Lint {
label: "inherent_associated_types",
description: r##"# `inherent_associated_types`
@@ -5577,49 +5658,11 @@ The tracking issue for this feature is: [#8995]
"##,
},
Lint {
- label: "inline_const",
- description: r##"# `inline_const`
-
-The tracking issue for this feature is: [#76001]
-
-See also [`inline_const_pat`](inline-const-pat.md)
-
-------
-
-This feature allows you to use inline constant expressions. For example, you can
-turn this code:
-
-```rust
-# fn add_one(x: i32) -> i32 { x + 1 }
-const MY_COMPUTATION: i32 = 1 + 2 * 3 / 4;
-
-fn main() {
- let x = add_one(MY_COMPUTATION);
-}
-```
-
-into this code:
-
-```rust
-#![feature(inline_const)]
-
-# fn add_one(x: i32) -> i32 { x + 1 }
-fn main() {
- let x = add_one(const { 1 + 2 * 3 / 4 });
-}
-```
-
-[#76001]: https://github.com/rust-lang/rust/issues/76001
-"##,
- },
- Lint {
label: "inline_const_pat",
description: r##"# `inline_const_pat`
The tracking issue for this feature is: [#76001]
-See also [`inline_const`](inline-const.md)
-
------
This feature allows you to use inline constant expressions in pattern position:
@@ -5672,6 +5715,17 @@ The tracking issue for this feature is: [#99069]
"##,
},
Lint {
+ label: "integer_sign_cast",
+ description: r##"# `integer_sign_cast`
+
+The tracking issue for this feature is: [#125882]
+
+[#125882]: https://github.com/rust-lang/rust/issues/125882
+
+------------------------
+"##,
+ },
+ Lint {
label: "internal_impls_macro",
description: r##"# `internal_impls_macro`
@@ -5730,7 +5784,7 @@ All intrinsic fallback bodies are automatically made cross-crate inlineable (lik
by the codegen backend, but not the MIR inliner.
```rust
-#![feature(rustc_attrs, effects)]
+#![feature(rustc_attrs)]
#![allow(internal_features)]
#[rustc_intrinsic]
@@ -5740,7 +5794,7 @@ const unsafe fn const_deallocate(_ptr: *mut u8, _size: usize, _align: usize) {}
Since these are just regular functions, it is perfectly ok to create the intrinsic twice:
```rust
-#![feature(rustc_attrs, effects)]
+#![feature(rustc_attrs)]
#![allow(internal_features)]
#[rustc_intrinsic]
@@ -5764,12 +5818,23 @@ with any regular function.
Various intrinsics have native MIR operations that they correspond to. Instead of requiring
backends to implement both the intrinsic and the MIR operation, the `lower_intrinsics` pass
will convert the calls to the MIR operation. Backends do not need to know about these intrinsics
-at all.
+at all. These intrinsics only make sense without a body, and can either be declared as a "rust-intrinsic"
+or as a `#[rustc_intrinsic]`. The body is never used, as calls to the intrinsic do not exist
+anymore after MIR analyses.
## Intrinsics without fallback logic
These must be implemented by all backends.
+### `#[rustc_intrinsic]` declarations
+
+These are written like intrinsics with fallback bodies, but the body is irrelevant.
+Use `loop {}` for the body or call the intrinsic recursively and add
+`#[rustc_intrinsic_must_be_overridden]` to the function to ensure that backends don't
+invoke the body.
+
+### Legacy extern ABI based intrinsics
+
These are imported as if they were FFI functions, with the special
`rust-intrinsic` ABI. For example, if one was in a freestanding
context, but wished to be able to `transmute` between types, and
@@ -5793,17 +5858,6 @@ You can add `#[rustc_safe_intrinsic]` to the intrinsic to make it safe to call.
"##,
},
Lint {
- label: "io_error_downcast",
- description: r##"# `io_error_downcast`
-
-The tracking issue for this feature is: [#99262]
-
-[#99262]: https://github.com/rust-lang/rust/issues/99262
-
-------------------------
-"##,
- },
- Lint {
label: "io_error_more",
description: r##"# `io_error_more`
@@ -5846,23 +5900,23 @@ The tracking issue for this feature is: [#27709]
"##,
},
Lint {
- label: "ip_bits",
- description: r##"# `ip_bits`
+ label: "is_ascii_octdigit",
+ description: r##"# `is_ascii_octdigit`
-The tracking issue for this feature is: [#113744]
+The tracking issue for this feature is: [#101288]
-[#113744]: https://github.com/rust-lang/rust/issues/113744
+[#101288]: https://github.com/rust-lang/rust/issues/101288
------------------------
"##,
},
Lint {
- label: "is_ascii_octdigit",
- description: r##"# `is_ascii_octdigit`
+ label: "is_none_or",
+ description: r##"# `is_none_or`
-The tracking issue for this feature is: [#101288]
+The tracking issue for this feature is: [#126383]
-[#101288]: https://github.com/rust-lang/rust/issues/101288
+[#126383]: https://github.com/rust-lang/rust/issues/126383
------------------------
"##,
@@ -5936,6 +5990,17 @@ The tracking issue for this feature is: [#100450]
"##,
},
Lint {
+ label: "iter_chain",
+ description: r##"# `iter_chain`
+
+The tracking issue for this feature is: [#125964]
+
+[#125964]: https://github.com/rust-lang/rust/issues/125964
+
+------------------------
+"##,
+ },
+ Lint {
label: "iter_collect_into",
description: r##"# `iter_collect_into`
@@ -6057,6 +6122,17 @@ The tracking issue for this feature is: [#87053]
"##,
},
Lint {
+ label: "junction_point",
+ description: r##"# `junction_point`
+
+The tracking issue for this feature is: [#121709]
+
+[#121709]: https://github.com/rust-lang/rust/issues/121709
+
+------------------------
+"##,
+ },
+ Lint {
label: "lahfsahf_target_feature",
description: r##"# `lahfsahf_target_feature`
@@ -6209,23 +6285,12 @@ The tracking issue for this feature is: [#69835]
"##,
},
Lint {
- label: "lazy_cell",
- description: r##"# `lazy_cell`
-
-The tracking issue for this feature is: [#109736]
-
-[#109736]: https://github.com/rust-lang/rust/issues/109736
-
-------------------------
-"##,
- },
- Lint {
label: "lazy_cell_consume",
description: r##"# `lazy_cell_consume`
-The tracking issue for this feature is: [#109736]
+The tracking issue for this feature is: [#125623]
-[#109736]: https://github.com/rust-lang/rust/issues/109736
+[#125623]: https://github.com/rust-lang/rust/issues/125623
------------------------
"##,
@@ -6369,17 +6434,6 @@ The tracking issue for this feature is: [#114135]
"##,
},
Lint {
- label: "lint_reasons",
- description: r##"# `lint_reasons`
-
-The tracking issue for this feature is: [#54503]
-
-[#54503]: https://github.com/rust-lang/rust/issues/54503
-
-------------------------
-"##,
- },
- Lint {
label: "linux_pidfd",
description: r##"# `linux_pidfd`
@@ -6435,6 +6489,17 @@ The tracking issue for this feature is: [#83527]
"##,
},
Lint {
+ label: "macro_metavar_expr_concat",
+ description: r##"# `macro_metavar_expr_concat`
+
+The tracking issue for this feature is: [#124225]
+
+[#124225]: https://github.com/rust-lang/rust/issues/124225
+
+------------------------
+"##,
+ },
+ Lint {
label: "map_entry_replace",
description: r##"# `map_entry_replace`
@@ -6540,6 +6605,17 @@ The tracking issue for this feature is: [#93092]
"##,
},
Lint {
+ label: "maybe_uninit_fill",
+ description: r##"# `maybe_uninit_fill`
+
+The tracking issue for this feature is: [#117428]
+
+[#117428]: https://github.com/rust-lang/rust/issues/117428
+
+------------------------
+"##,
+ },
+ Lint {
label: "maybe_uninit_slice",
description: r##"# `maybe_uninit_slice`
@@ -6692,6 +6768,17 @@ The tracking issue for this feature is: [#83310]
"##,
},
Lint {
+ label: "mut_ref",
+ description: r##"# `mut_ref`
+
+The tracking issue for this feature is: [#123076]
+
+[#123076]: https://github.com/rust-lang/rust/issues/123076
+
+------------------------
+"##,
+ },
+ Lint {
label: "naked_functions",
description: r##"# `naked_functions`
@@ -6839,6 +6926,17 @@ The tracking issue for this feature is: [#65992]
"##,
},
Lint {
+ label: "new_range_api",
+ description: r##"# `new_range_api`
+
+The tracking issue for this feature is: [#125687]
+
+[#125687]: https://github.com/rust-lang/rust/issues/125687
+
+------------------------
+"##,
+ },
+ Lint {
label: "new_uninit",
description: r##"# `new_uninit`
@@ -6916,17 +7014,6 @@ The tracking issue for this feature is: [#108185]
"##,
},
Lint {
- label: "non_null_convenience",
- description: r##"# `non_null_convenience`
-
-The tracking issue for this feature is: [#117691]
-
-[#117691]: https://github.com/rust-lang/rust/issues/117691
-
-------------------------
-"##,
- },
- Lint {
label: "non_zero_count_ones",
description: r##"# `non_zero_count_ones`
@@ -7033,6 +7120,17 @@ The tracking issue for this feature is: [#120140]
"##,
},
Lint {
+ label: "offset_of_slice",
+ description: r##"# `offset_of_slice`
+
+The tracking issue for this feature is: [#126151]
+
+[#126151]: https://github.com/rust-lang/rust/issues/126151
+
+------------------------
+"##,
+ },
+ Lint {
label: "omit_gdb_pretty_printer_section",
description: r##"# `omit_gdb_pretty_printer_section`
@@ -7042,6 +7140,17 @@ This feature has no tracking issue, and is therefore likely internal to the comp
"##,
},
Lint {
+ label: "once_cell_get_mut",
+ description: r##"# `once_cell_get_mut`
+
+The tracking issue for this feature is: [#121641]
+
+[#121641]: https://github.com/rust-lang/rust/issues/121641
+
+------------------------
+"##,
+ },
+ Lint {
label: "once_cell_try",
description: r##"# `once_cell_try`
@@ -7097,17 +7206,6 @@ The tracking issue for this feature is: [#82901]
"##,
},
Lint {
- label: "option_take_if",
- description: r##"# `option_take_if`
-
-The tracking issue for this feature is: [#98934]
-
-[#98934]: https://github.com/rust-lang/rust/issues/98934
-
-------------------------
-"##,
- },
- Lint {
label: "option_zip",
description: r##"# `option_zip`
@@ -7141,6 +7239,17 @@ The tracking issue for this feature is: [#118485]
"##,
},
Lint {
+ label: "os_string_pathbuf_leak",
+ description: r##"# `os_string_pathbuf_leak`
+
+The tracking issue for this feature is: [#125965]
+
+[#125965]: https://github.com/rust-lang/rust/issues/125965
+
+------------------------
+"##,
+ },
+ Lint {
label: "panic_abort",
description: r##"# `panic_abort`
@@ -7185,21 +7294,21 @@ The tracking issue for this feature is: [#92988]
"##,
},
Lint {
- label: "panic_info_message",
- description: r##"# `panic_info_message`
-
-The tracking issue for this feature is: [#66745]
+ label: "panic_internals",
+ description: r##"# `panic_internals`
-[#66745]: https://github.com/rust-lang/rust/issues/66745
+This feature has no tracking issue, and is therefore likely internal to the compiler, not being intended for general use.
------------------------
"##,
},
Lint {
- label: "panic_internals",
- description: r##"# `panic_internals`
+ label: "panic_payload_as_str",
+ description: r##"# `panic_payload_as_str`
-This feature has no tracking issue, and is therefore likely internal to the compiler, not being intended for general use.
+The tracking issue for this feature is: [#125175]
+
+[#125175]: https://github.com/rust-lang/rust/issues/125175
------------------------
"##,
@@ -7238,6 +7347,28 @@ The tracking issue for this feature is: [#92649]
"##,
},
Lint {
+ label: "patchable_function_entry",
+ description: r##"# `patchable_function_entry`
+
+The tracking issue for this feature is: [#123115]
+
+[#123115]: https://github.com/rust-lang/rust/issues/123115
+
+------------------------
+"##,
+ },
+ Lint {
+ label: "path_add_extension",
+ description: r##"# `path_add_extension`
+
+The tracking issue for this feature is: [#127292]
+
+[#127292]: https://github.com/rust-lang/rust/issues/127292
+
+------------------------
+"##,
+ },
+ Lint {
label: "path_file_prefix",
description: r##"# `path_file_prefix`
@@ -7269,6 +7400,17 @@ This feature has no tracking issue, and is therefore likely internal to the comp
"##,
},
Lint {
+ label: "pattern_types",
+ description: r##"# `pattern_types`
+
+The tracking issue for this feature is: [#123646]
+
+[#123646]: https://github.com/rust-lang/rust/issues/123646
+
+------------------------
+"##,
+ },
+ Lint {
label: "peer_credentials_unix_socket",
description: r##"# `peer_credentials_unix_socket`
@@ -7291,8 +7433,8 @@ The tracking issue for this feature is: [#86918]
"##,
},
Lint {
- label: "pointer_is_aligned",
- description: r##"# `pointer_is_aligned`
+ label: "pointer_is_aligned_to",
+ description: r##"# `pointer_is_aligned_to`
The tracking issue for this feature is: [#96284]
@@ -7322,6 +7464,32 @@ The tracking issue for this feature is: [#86656]
"##,
},
Lint {
+ label: "postfix_match",
+ description: r##"# `postfix-match`
+
+`postfix-match` adds the feature for matching upon values postfix
+the expressions that generate the values.
+
+```rust,edition2021
+#![feature(postfix_match)]
+
+enum Foo {
+ Bar,
+ Baz
+}
+
+fn get_foo() -> Foo {
+ Foo::Bar
+}
+
+get_foo().match {
+ Foo::Bar => {},
+ Foo::Baz => panic!(),
+}
+```
+"##,
+ },
+ Lint {
label: "powerpc_target_feature",
description: r##"# `powerpc_target_feature`
@@ -7333,6 +7501,17 @@ The tracking issue for this feature is: [#44839]
"##,
},
Lint {
+ label: "precise_capturing",
+ description: r##"# `precise_capturing`
+
+The tracking issue for this feature is: [#123432]
+
+[#123432]: https://github.com/rust-lang/rust/issues/123432
+
+------------------------
+"##,
+ },
+ Lint {
label: "prelude_2024",
description: r##"# `prelude_2024`
@@ -7373,28 +7552,6 @@ This feature is internal to the Rust compiler and is not intended for general us
"##,
},
Lint {
- label: "proc_macro_byte_character",
- description: r##"# `proc_macro_byte_character`
-
-The tracking issue for this feature is: [#115268]
-
-[#115268]: https://github.com/rust-lang/rust/issues/115268
-
-------------------------
-"##,
- },
- Lint {
- label: "proc_macro_c_str_literals",
- description: r##"# `proc_macro_c_str_literals`
-
-The tracking issue for this feature is: [#119750]
-
-[#119750]: https://github.com/rust-lang/rust/issues/119750
-
-------------------------
-"##,
- },
- Lint {
label: "proc_macro_def_site",
description: r##"# `proc_macro_def_site`
@@ -7530,6 +7687,17 @@ The tracking issue for this feature is: [#102070]
"##,
},
Lint {
+ label: "ptr_as_ref_unchecked",
+ description: r##"# `ptr_as_ref_unchecked`
+
+The tracking issue for this feature is: [#122034]
+
+[#122034]: https://github.com/rust-lang/rust/issues/122034
+
+------------------------
+"##,
+ },
+ Lint {
label: "ptr_as_uninit",
description: r##"# `ptr_as_uninit`
@@ -7583,17 +7751,6 @@ The tracking issue for this feature is: [#95892]
"##,
},
Lint {
- label: "ptr_to_from_bits",
- description: r##"# `ptr_to_from_bits`
-
-The tracking issue for this feature is: [#91126]
-
-[#91126]: https://github.com/rust-lang/rust/issues/91126
-
-------------------------
-"##,
- },
- Lint {
label: "pub_crate_should_not_need_unstable_attr",
description: r##"# `pub_crate_should_not_need_unstable_attr`
@@ -7687,6 +7844,28 @@ The tracking issue for this feature is: [#121440]
"##,
},
Lint {
+ label: "ref_pat_eat_one_layer_2024",
+ description: r##"# `ref_pat_eat_one_layer_2024`
+
+The tracking issue for this feature is: [#123076]
+
+[#123076]: https://github.com/rust-lang/rust/issues/123076
+
+------------------------
+"##,
+ },
+ Lint {
+ label: "ref_pat_eat_one_layer_2024_structural",
+ description: r##"# `ref_pat_eat_one_layer_2024_structural`
+
+The tracking issue for this feature is: [#123076]
+
+[#123076]: https://github.com/rust-lang/rust/issues/123076
+
+------------------------
+"##,
+ },
+ Lint {
label: "register_tool",
description: r##"# `register_tool`
@@ -7740,6 +7919,24 @@ This feature has no tracking issue, and is therefore likely internal to the comp
"##,
},
Lint {
+ label: "result_ffi_guarantees",
+ description: r##"# `result_ffi_guarantees`
+
+The tracking issue for this feature is: [#110503]
+
+[#110503]: https://github.com/rust-lang/rust/issues/110503
+
+------------------------
+
+This feature adds the possibility of using `Result<T, E>` in FFI if T's niche
+value can be used to describe E or vise-versa.
+
+See [RFC 3391] for more information.
+
+[RFC 3391]: https://github.com/rust-lang/rfcs/blob/master/text/3391-result_ffi_guarantees.md
+"##,
+ },
+ Lint {
label: "result_flattening",
description: r##"# `result_flattening`
@@ -7883,6 +8080,15 @@ error: aborting due to 2 previous errors
"##,
},
Lint {
+ label: "rustc_encodable_decodable",
+ description: r##"# `rustc_encodable_decodable`
+
+This feature has no tracking issue, and is therefore likely internal to the compiler, not being intended for general use.
+
+------------------------
+"##,
+ },
+ Lint {
label: "rustc_private",
description: r##"# `rustc_private`
@@ -7925,17 +8131,6 @@ This feature has no tracking issue, and is therefore likely internal to the comp
"##,
},
Lint {
- label: "seek_seek_relative",
- description: r##"# `seek_seek_relative`
-
-The tracking issue for this feature is: [#117374]
-
-[#117374]: https://github.com/rust-lang/rust/issues/117374
-
-------------------------
-"##,
- },
- Lint {
label: "seek_stream_len",
description: r##"# `seek_stream_len`
@@ -7980,6 +8175,17 @@ The tracking issue for this feature is: [#56975]
"##,
},
Lint {
+ label: "shorter_tail_lifetimes",
+ description: r##"# `shorter_tail_lifetimes`
+
+The tracking issue for this feature is: [#123739]
+
+[#123739]: https://github.com/rust-lang/rust/issues/123739
+
+------------------------
+"##,
+ },
+ Lint {
label: "simd_ffi",
description: r##"# `simd_ffi`
@@ -8033,17 +8239,6 @@ The tracking issue for this feature is: [#27747]
"##,
},
Lint {
- label: "slice_flatten",
- description: r##"# `slice_flatten`
-
-The tracking issue for this feature is: [#95629]
-
-[#95629]: https://github.com/rust-lang/rust/issues/95629
-
-------------------------
-"##,
- },
- Lint {
label: "slice_from_ptr_range",
description: r##"# `slice_from_ptr_range`
@@ -8117,17 +8312,6 @@ The tracking issue for this feature is: [#74265]
"##,
},
Lint {
- label: "slice_ptr_len",
- description: r##"# `slice_ptr_len`
-
-The tracking issue for this feature is: [#71146]
-
-[#71146]: https://github.com/rust-lang/rust/issues/71146
-
-------------------------
-"##,
- },
- Lint {
label: "slice_range",
description: r##"# `slice_range`
@@ -8139,17 +8323,6 @@ The tracking issue for this feature is: [#76393]
"##,
},
Lint {
- label: "slice_split_at_unchecked",
- description: r##"# `slice_split_at_unchecked`
-
-The tracking issue for this feature is: [#76014]
-
-[#76014]: https://github.com/rust-lang/rust/issues/76014
-
-------------------------
-"##,
- },
- Lint {
label: "slice_split_once",
description: r##"# `slice_split_once`
@@ -8203,24 +8376,6 @@ The tracking issue for this feature is: [#93396]
"##,
},
Lint {
- label: "sort_internals",
- description: r##"# `sort_internals`
-
-This feature is internal to the Rust compiler and is not intended for general use.
-
-------------------------
-"##,
- },
- Lint {
- label: "spec_option_partial_eq",
- description: r##"# `spec_option_partial_eq`
-
-This feature has no tracking issue, and is therefore likely internal to the compiler, not being intended for general use.
-
-------------------------
-"##,
- },
- Lint {
label: "specialization",
description: r##"# `specialization`
@@ -8254,17 +8409,6 @@ The tracking issue for this feature is: [#96137]
"##,
},
Lint {
- label: "split_at_checked",
- description: r##"# `split_at_checked`
-
-The tracking issue for this feature is: [#119128]
-
-[#119128]: https://github.com/rust-lang/rust/issues/119128
-
-------------------------
-"##,
- },
- Lint {
label: "sse4a_target_feature",
description: r##"# `sse4a_target_feature`
@@ -8697,9 +8841,9 @@ The tracking issue for this feature is: [#96256]
label: "tcplistener_into_incoming",
description: r##"# `tcplistener_into_incoming`
-The tracking issue for this feature is: [#88339]
+The tracking issue for this feature is: [#88373]
-[#88339]: https://github.com/rust-lang/rust/issues/88339
+[#88373]: https://github.com/rust-lang/rust/issues/88373
------------------------
"##,
@@ -9323,6 +9467,17 @@ The tracking issue for this feature is: [#96374]
"##,
},
Lint {
+ label: "try_with_capacity",
+ description: r##"# `try_with_capacity`
+
+The tracking issue for this feature is: [#91913]
+
+[#91913]: https://github.com/rust-lang/rust/issues/91913
+
+------------------------
+"##,
+ },
+ Lint {
label: "tuple_trait",
description: r##"# `tuple_trait`
@@ -9391,12 +9546,10 @@ fn main () {
"##,
},
Lint {
- label: "type_privacy_lints",
- description: r##"# `type_privacy_lints`
-
-The tracking issue for this feature is: [#48054]
+ label: "ub_checks",
+ description: r##"# `ub_checks`
-[#48054]: https://github.com/rust-lang/rust/issues/48054
+This feature has no tracking issue, and is therefore likely internal to the compiler, not being intended for general use.
------------------------
"##,
@@ -9442,17 +9595,6 @@ fn main() {}
"##,
},
Lint {
- label: "unchecked_math",
- description: r##"# `unchecked_math`
-
-The tracking issue for this feature is: [#85122]
-
-[#85122]: https://github.com/rust-lang/rust/issues/85122
-
-------------------------
-"##,
- },
- Lint {
label: "unchecked_neg",
description: r##"# `unchecked_neg`
@@ -9517,72 +9659,6 @@ The tracking issue for this feature is: [#96467]
"##,
},
Lint {
- label: "unix_sigpipe",
- description: r##"# `unix_sigpipe`
-
-The tracking issue for this feature is: [#97889]
-
-[#97889]: https://github.com/rust-lang/rust/issues/97889
-
----
-
-The `#[unix_sigpipe = "..."]` attribute on `fn main()` can be used to specify how libstd shall setup `SIGPIPE` on Unix platforms before invoking `fn main()`. This attribute is ignored on non-Unix targets. There are three variants:
-* `#[unix_sigpipe = "inherit"]`
-* `#[unix_sigpipe = "sig_dfl"]`
-* `#[unix_sigpipe = "sig_ign"]`
-
-## `#[unix_sigpipe = "inherit"]`
-
-Leave `SIGPIPE` untouched before entering `fn main()`. Unless the parent process has changed the default `SIGPIPE` handler from `SIG_DFL` to something else, this will behave the same as `#[unix_sigpipe = "sig_dfl"]`.
-
-## `#[unix_sigpipe = "sig_dfl"]`
-
-Set the `SIGPIPE` handler to `SIG_DFL`. This will result in your program getting killed if it tries to write to a closed pipe. This is normally what you want if your program produces textual output.
-
-### Example
-
-```rust,no_run
-#![feature(unix_sigpipe)]
-#[unix_sigpipe = "sig_dfl"]
-fn main() { loop { println!("hello world"); } }
-```
-
-```bash
-% ./main | head -n 1
-hello world
-```
-
-## `#[unix_sigpipe = "sig_ign"]`
-
-Set the `SIGPIPE` handler to `SIG_IGN` before invoking `fn main()`. This will result in `ErrorKind::BrokenPipe` errors if you program tries to write to a closed pipe. This is normally what you want if you for example write socket servers, socket clients, or pipe peers.
-
-This is what libstd has done by default since 2014. (However, see the note on child processes below.)
-
-### Example
-
-```rust,no_run
-#![feature(unix_sigpipe)]
-#[unix_sigpipe = "sig_ign"]
-fn main() { loop { println!("hello world"); } }
-```
-
-```bash
-% ./main | head -n 1
-hello world
-thread 'main' panicked at 'failed printing to stdout: Broken pipe (os error 32)', library/std/src/io/stdio.rs:1016:9
-note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
-```
-
-### Note on child processes
-
-When spawning child processes, the legacy Rust behavior if `#[unix_sigpipe]` is not specified is to
-reset `SIGPIPE` to `SIG_DFL`.
-
-If `#[unix_sigpipe = "..."]` is specified, no matter what its value is, the signal disposition of
-`SIGPIPE` is no longer reset. This means that the child inherits the parent's `SIGPIPE` behavior.
-"##,
- },
- Lint {
label: "unix_socket_ancillary_data",
description: r##"# `unix_socket_ancillary_data`
@@ -9616,6 +9692,17 @@ The tracking issue for this feature is: [#49804]
"##,
},
Lint {
+ label: "unsafe_attributes",
+ description: r##"# `unsafe_attributes`
+
+The tracking issue for this feature is: [#123757]
+
+[#123757]: https://github.com/rust-lang/rust/issues/123757
+
+------------------------
+"##,
+ },
+ Lint {
label: "unsafe_cell_from_mut",
description: r##"# `unsafe_cell_from_mut`
@@ -9627,6 +9714,17 @@ The tracking issue for this feature is: [#111645]
"##,
},
Lint {
+ label: "unsafe_extern_blocks",
+ description: r##"# `unsafe_extern_blocks`
+
+The tracking issue for this feature is: [#123743]
+
+[#123743]: https://github.com/rust-lang/rust/issues/123743
+
+------------------------
+"##,
+ },
+ Lint {
label: "unsafe_pin_internals",
description: r##"# `unsafe_pin_internals`
@@ -9921,17 +10019,6 @@ The tracking issue for this feature is: [#94919]
"##,
},
Lint {
- label: "utf8_chunks",
- description: r##"# `utf8_chunks`
-
-The tracking issue for this feature is: [#99543]
-
-[#99543]: https://github.com/rust-lang/rust/issues/99543
-
-------------------------
-"##,
- },
- Lint {
label: "variant_count",
description: r##"# `variant_count`
@@ -9954,6 +10041,17 @@ The tracking issue for this feature is: [#65816]
"##,
},
Lint {
+ label: "vec_pop_if",
+ description: r##"# `vec_pop_if`
+
+The tracking issue for this feature is: [#122741]
+
+[#122741]: https://github.com/rust-lang/rust/issues/122741
+
+------------------------
+"##,
+ },
+ Lint {
label: "vec_push_within_capacity",
description: r##"# `vec_push_within_capacity`
@@ -10225,18 +10323,12 @@ checked."##,
description: r##"Checks for usage of the `#[allow]` attribute and suggests replacing it with
the `#[expect]` (See [RFC 2383](https://rust-lang.github.io/rfcs/2383-lint-reasons.html))
-The expect attribute is still unstable and requires the `lint_reasons`
-on nightly. It can be enabled by adding `#![feature(lint_reasons)]` to
-the crate root.
-
This lint only warns outer attributes (`#[allow]`), as inner attributes
(`#![allow]`) are usually used to enable or disable lints on a global scale."##,
},
Lint {
label: "clippy::allow_attributes_without_reason",
- description: r##"Checks for attributes that allow lints without a reason.
-
-(This requires the `lint_reasons` feature)"##,
+ description: r##"Checks for attributes that allow lints without a reason."##,
},
Lint {
label: "clippy::almost_complete_range",
@@ -10310,6 +10402,10 @@ patterns."##,
description: r##"Nothing. This lint has been deprecated."##,
},
Lint {
+ label: "clippy::assigning_clones",
+ description: r##"Checks for code like `foo = bar.clone();`"##,
+ },
+ Lint {
label: "clippy::async_yields_async",
description: r##"Checks for async blocks that yield values of types
that can themselves be awaited."##,
@@ -10402,8 +10498,8 @@ Check the [Box documentation](https://doc.rust-lang.org/std/boxed/index.html) fo
},
Lint {
label: "clippy::box_default",
- description: r##"checks for `Box::new(T::default())`, which is better written as
-`Box::<T>::default()`."##,
+ description: r##"checks for `Box::new(Default::default())`, which can be written as
+`Box::default()`."##,
},
Lint {
label: "clippy::boxed_local",
@@ -10420,6 +10516,11 @@ moved out of the blocks."##,
description: r##"Warns if a generic shadows a built-in type."##,
},
Lint {
+ label: "clippy::byte_char_slices",
+ description: r##"Checks for hard to read slices of byte characters, that could be more easily expressed as a
+byte string."##,
+ },
+ Lint {
label: "clippy::bytes_count_to_len",
description: r##"It checks for `str::bytes().count()` and suggests replacing it with
`str::len()`."##,
@@ -10508,6 +10609,10 @@ defined, this lint is `Allow` by default."##,
description: r##"Checks for a raw slice being cast to a slice pointer"##,
},
Lint {
+ label: "clippy::cfg_not_test",
+ description: r##"Checks for usage of `cfg` that excludes code from `test` builds. (i.e., `#{cfg(not(test))]`)"##,
+ },
+ Lint {
label: "clippy::char_lit_as_u8",
description: r##"Checks for expressions where a character literal is cast
to `u8` and suggests using a byte literal instead."##,
@@ -10596,6 +10701,10 @@ rewritten with `match` and `cmp`."##,
and suggests using `.is_empty()` where applicable."##,
},
Lint {
+ label: "clippy::const_is_empty",
+ description: r##"It identifies calls to `.is_empty()` on constant values."##,
+ },
+ Lint {
label: "clippy::copy_iterator",
description: r##"Checks for types that implement `Copy` as well as
`Iterator`."##,
@@ -10749,6 +10858,13 @@ types are defined in the clippy.toml file."##,
statements."##,
},
Lint {
+ label: "clippy::doc_lazy_continuation",
+ description: r##"In CommonMark Markdown, the language used to write doc comments, a
+paragraph nested within a list or block quote does not need any line
+after the first one to be indented or marked. The specification calls
+this a lazy paragraph continuation."##,
+ },
+ Lint {
label: "clippy::doc_link_with_quotes",
description: r##"Detects the syntax `['foo']` in documentation comments (notice quotes instead of backticks)
outside of code blocks"##,
@@ -10797,6 +10913,10 @@ marked as `#[must_use]`."##,
differing by an underscore."##,
},
Lint {
+ label: "clippy::duplicated_attributes",
+ description: r##"Checks for attributes that appear two or more times."##,
+ },
+ Lint {
label: "clippy::duration_subsec",
description: r##"Checks for calculation of subsecond microseconds or milliseconds
from other `Duration` methods."##,
@@ -10818,11 +10938,11 @@ but without a final `else` branch."##,
},
Lint {
label: "clippy::empty_enum",
- description: r##"Checks for `enum`s with no variants.
+ description: r##"Checks for `enum`s with no variants, which therefore are uninhabited types
+(cannot be instantiated).
-As of this writing, the `never_type` is still a
-nightly-only experimental API. Therefore, this lint is only triggered
-if the `never_type` is enabled."##,
+As of this writing, the `never_type` is still a nightly-only experimental API.
+Therefore, this lint is only triggered if `#![feature(never_type)]` is enabled."##,
},
Lint {
label: "clippy::empty_enum_variants_with_brackets",
@@ -10891,7 +11011,7 @@ than that supported by the underlying type."##,
},
Lint {
label: "clippy::exhaustive_structs",
- description: r##"Warns on any exported `structs`s that are not tagged `#[non_exhaustive]`"##,
+ description: r##"Warns on any exported `struct`s that are not tagged `#[non_exhaustive]`"##,
},
Lint {
label: "clippy::exit",
@@ -10966,6 +11086,11 @@ anywhere else."##,
with Default::default()."##,
},
Lint {
+ label: "clippy::field_scoped_visibility_modifiers",
+ description: r##"Checks for usage of scoped visibility modifiers, like `pub(crate)`, on fields. These
+make a field visible within a scope between public and private."##,
+ },
+ Lint {
label: "clippy::filetype_is_file",
description: r##"Checks for `FileType::is_file()`."##,
},
@@ -11298,6 +11423,11 @@ unless the annotated function is empty or simply panics."##,
},
Lint { label: "clippy::integer_division", description: r##"Checks for division of integers"## },
Lint {
+ label: "clippy::integer_division_remainder_used",
+ description: r##"Checks for the usage of division (`/`) and remainder (`%`) operations
+when performed on any integer types using the default `Div` and `Rem` trait implementations."##,
+ },
+ Lint {
label: "clippy::into_iter_on_ref",
description: r##"Checks for `into_iter` calls on references which should be replaced by `iter`
or `iter_mut`."##,
@@ -11354,12 +11484,12 @@ create a `Vec`."##,
Lint {
label: "clippy::iter_filter_is_ok",
description: r##"Checks for usage of `.filter(Result::is_ok)` that may be replaced with a `.flatten()` call.
-This lint will require additional changes to the follow-up calls as it appects the type."##,
+This lint will require additional changes to the follow-up calls as it affects the type."##,
},
Lint {
label: "clippy::iter_filter_is_some",
description: r##"Checks for usage of `.filter(Option::is_some)` that may be replaced with a `.flatten()` call.
-This lint will require additional changes to the follow-up calls as it appects the type."##,
+This lint will require additional changes to the follow-up calls as it affects the type."##,
},
Lint {
label: "clippy::iter_kv_map",
@@ -11377,8 +11507,8 @@ ignoring either the keys or values."##,
},
Lint {
label: "clippy::iter_nth",
- description: r##"Checks for usage of `.iter().nth()` (and the related
-`.iter_mut().nth()`) on standard library types with *O*(1) element access."##,
+ description: r##"Checks for usage of `.iter().nth()`/`.iter_mut().nth()` on standard library types that have
+equivalent `.get()`/`.get_mut()` methods."##,
},
Lint {
label: "clippy::iter_nth_zero",
@@ -11457,7 +11587,7 @@ are too large."##,
Lint {
label: "clippy::large_include_file",
description: r##"Checks for the inclusion of large files via `include_bytes!()`
-and `include_str!()`"##,
+or `include_str!()`."##,
},
Lint {
label: "clippy::large_stack_arrays",
@@ -11482,6 +11612,11 @@ because that might induce API breakage, if the parameter is declared as mutable,
or if the argument is a `self`."##,
},
Lint {
+ label: "clippy::legacy_numeric_constants",
+ description: r##"Checks for usage of `<integer>::max_value()`, `std::<integer>::MAX`,
+`std::<float>::EPSILON`, etc."##,
+ },
+ Lint {
label: "clippy::len_without_is_empty",
description: r##"Checks for items that implement `.len()` but not
`.is_empty()`."##,
@@ -11548,6 +11683,10 @@ is resolved."##,
cannot be represented as the underlying type without loss."##,
},
Lint {
+ label: "clippy::macro_metavars_in_unsafe",
+ description: r##"Looks for macros that expand metavariables in an unsafe block."##,
+ },
+ Lint {
label: "clippy::macro_use_imports",
description: r##"Checks for `#[macro_use] use...`."##,
},
@@ -11568,7 +11707,12 @@ cannot be represented as the underlying type without loss."##,
description: r##"Checks for usage of `std::mem::size_of::<T>() * 8` when
`T::BITS` is available."##,
},
- Lint { label: "clippy::manual_c_str_literals", description: r##""## },
+ Lint {
+ label: "clippy::manual_c_str_literals",
+ description: r##"Checks for the manual creation of C strings (a string with a `NUL` byte at the end), either
+through one of the `CStr` constructor functions, or more plainly by calling `.as_ptr()`
+on a (byte) string literal with a hardcoded `\\0` byte at the end."##,
+ },
Lint {
label: "clippy::manual_clamp",
description: r##"Identifies good opportunities for a clamp function from std or core, and suggests using it."##,
@@ -11603,6 +11747,10 @@ where only the `Some` or `Ok` variant of the iterator element is used."##,
[`BuildHasher::hash_one`]: https://doc.rust-lang.org/std/hash/trait.BuildHasher.html#method.hash_one"##,
},
Lint {
+ label: "clippy::manual_inspect",
+ description: r##"Checks for uses of `map` which return the original item."##,
+ },
+ Lint {
label: "clippy::manual_instant_elapsed",
description: r##"Lints subtraction between `Instant::now()` and another `Instant`."##,
},
@@ -11622,7 +11770,10 @@ ascii range"##,
description: r##"Checks for manual `is_infinite` reimplementations
(i.e., `x == <float>::INFINITY || x == <float>::NEG_INFINITY`)."##,
},
- Lint { label: "clippy::manual_is_variant_and", description: r##""## },
+ Lint {
+ label: "clippy::manual_is_variant_and",
+ description: r##"Checks for usage of `option.map(f).unwrap_or_default()` and `result.map(f).unwrap_or_default()` where f is a function or closure that returns the `bool` type."##,
+ },
Lint {
label: "clippy::manual_let_else",
description: r##"Warn of cases where `let...else` could be used"##,
@@ -11654,6 +11805,10 @@ slices that could be optimized by having a memcpy."##,
description: r##"Finds patterns that reimplement `Option::ok_or`."##,
},
Lint {
+ label: "clippy::manual_pattern_char_comparison",
+ description: r##"Checks for manual `char` comparison in string patterns"##,
+ },
+ Lint {
label: "clippy::manual_range_contains",
description: r##"Checks for expressions like `x >= 3 && x < 8` that could
be more readably expressed as `(3..8).contains(x)`."##,
@@ -11673,6 +11828,11 @@ of `x.rem_euclid(4)`."##,
description: r##"Checks for code to be replaced by `.retain()`."##,
},
Lint {
+ label: "clippy::manual_rotate",
+ description: r##"It detects manual bit rotations that could be rewritten using standard
+functions `rotate_left` or `rotate_right`."##,
+ },
+ Lint {
label: "clippy::manual_saturating_arithmetic",
description: r##"Checks for `.checked_add/sub(x).unwrap_or(MAX/MIN)`."##,
},
@@ -11714,6 +11874,11 @@ Note that the lint will not be emitted in const blocks, as the suggestion would
description: r##"Finds patterns that reimplement `Option::unwrap_or` or `Result::unwrap_or`."##,
},
Lint {
+ label: "clippy::manual_unwrap_or_default",
+ description: r##"Checks if a `match` or `if let` expression can be simplified using
+`.unwrap_or_default()`."##,
+ },
+ Lint {
label: "clippy::manual_while_let_some",
description: r##"Looks for loops that check for emptiness of a `Vec` in the condition and pop an element
in the body as a separate operation."##,
@@ -11818,10 +11983,7 @@ and take drastic actions like `panic!`."##,
},
Lint {
label: "clippy::maybe_misused_cfg",
- description: r##"Checks for `#[cfg(features = ...)]` and suggests to replace it with
-`#[cfg(feature = ...)]`.
-
-It also checks if `cfg(test)` was misspelled."##,
+ description: r##"Nothing. This lint has been deprecated."##,
},
Lint {
label: "clippy::mem_forget",
@@ -11845,7 +12007,7 @@ and `mem::replace(&mut _, mem::zeroed())`."##,
},
Lint {
label: "clippy::min_ident_chars",
- description: r##"Checks for idents which comprise of a single letter.
+ description: r##"Checks for identifiers which consist of a single character (or fewer than the configured threshold).
Note: This lint can be very noisy when enabled; it may be desirable to only enable it
temporarily."##,
@@ -11861,7 +12023,7 @@ used to clamp values, but switched so that the result is constant."##,
},
Lint {
label: "clippy::mismatched_target_os",
- description: r##"Checks for cfg attributes having operating systems used in target family position."##,
+ description: r##"Nothing. This lint has been deprecated."##,
},
Lint {
label: "clippy::mismatching_type_param_order",
@@ -11893,8 +12055,12 @@ is greater than the largest index used to index into the slice."##,
description: r##"Suggests the use of `const` in functions and methods where possible."##,
},
Lint {
+ label: "clippy::missing_const_for_thread_local",
+ description: r##"Suggests to use `const` in `thread_local!` macro if possible."##,
+ },
+ Lint {
label: "clippy::missing_docs_in_private_items",
- description: r##"Warns if there is missing doc for any private documentable item"##,
+ description: r##"Warns if there is missing documentation for any private documentable item."##,
},
Lint {
label: "clippy::missing_enforced_import_renames",
@@ -11932,12 +12098,11 @@ unsafe functions and warns if there is no `# Safety` section."##,
Lint {
label: "clippy::missing_trait_methods",
description: r##"Checks if a provided method is used implicitly by a trait
-implementation. A usage example would be a wrapper where every method
-should perform some operation before delegating to the inner type's
-implementation.
-
-This lint should typically be enabled on a specific trait `impl` item
-rather than globally."##,
+implementation."##,
+ },
+ Lint {
+ label: "clippy::missing_transmute_annotations",
+ description: r##"Checks if transmute calls have all generics specified."##,
},
Lint {
label: "clippy::mistyped_literal_suffixes",
@@ -11945,7 +12110,7 @@ rather than globally."##,
},
Lint {
label: "clippy::mixed_attributes_style",
- description: r##"Checks that an item has only one kind of attributes."##,
+ description: r##"Checks for items that have the same kind of attributes with mixed styles (inner/outer)."##,
},
Lint {
label: "clippy::mixed_case_hex_literals",
@@ -11960,7 +12125,7 @@ order of sub-expressions."##,
},
Lint {
label: "clippy::mod_module_files",
- description: r##"Checks that module layout uses only self named module files, bans `mod.rs` files."##,
+ description: r##"Checks that module layout uses only self named module files; bans `mod.rs` files."##,
},
Lint {
label: "clippy::module_inception",
@@ -12026,7 +12191,7 @@ reference with the output lifetime, this lint will not trigger."##,
},
Lint {
label: "clippy::mut_range_bound",
- description: r##"Checks for loops which have a range bound that is a mutable variable"##,
+ description: r##"Checks for loops with a range bound that is a mutable variable."##,
},
Lint {
label: "clippy::mutable_key_type",
@@ -12075,10 +12240,14 @@ value with `&ref`."##,
},
Lint {
label: "clippy::needless_borrows_for_generic_args",
- description: r##"Checks for borrow operations (`&`) that used as a generic argument to a
+ description: r##"Checks for borrow operations (`&`) that are used as a generic argument to a
function when the borrowed value could be used."##,
},
Lint {
+ label: "clippy::needless_character_iteration",
+ description: r##"Checks if an iterator is used to check if a string is ascii."##,
+ },
+ Lint {
label: "clippy::needless_collect",
description: r##"Checks for functions collecting an iterator when collect
is not needed."##,
@@ -12120,6 +12289,10 @@ relying on lifetime elision."##,
when function signatures are the same."##,
},
Lint {
+ label: "clippy::needless_maybe_sized",
+ description: r##"Lints `?Sized` bounds applied to type parameters that cannot be unsized"##,
+ },
+ Lint {
label: "clippy::needless_option_as_deref",
description: r##"Checks for no-op uses of `Option::{as_deref, as_deref_mut}`,
for example, `Option<&T>::as_deref()` returns the same type."##,
@@ -12138,7 +12311,7 @@ superfluous."##,
description: r##"Check if a `&mut` function argument is actually used mutably.
Be careful if the function is publicly reexported as it would break compatibility with
-users of this function."##,
+users of this function, when the users pass this function as an argument."##,
},
Lint {
label: "clippy::needless_pass_by_value",
@@ -12370,7 +12543,7 @@ can be eliminated."##,
Lint { label: "clippy::panic", description: r##"Checks for usage of `panic!`."## },
Lint {
label: "clippy::panic_in_result_fn",
- description: r##"Checks for usage of `panic!` or assertions in a function of type result."##,
+ description: r##"Checks for usage of `panic!` or assertions in a function whose return type is `Result`."##,
},
Lint {
label: "clippy::panicking_unwrap",
@@ -12378,7 +12551,7 @@ can be eliminated."##,
},
Lint {
label: "clippy::partial_pub_fields",
- description: r##"Checks whether partial fields of a struct are public.
+ description: r##"Checks whether some but not all fields of a `struct` are public.
Either make all fields of a type public, or make none of them public"##,
},
@@ -12686,6 +12859,11 @@ and suggests `std::ptr::from_ref` and `std::ptr::from_mut` instead."##,
description: r##"Nothing. This lint has been deprecated."##,
},
Lint {
+ label: "clippy::renamed_function_params",
+ description: r##"Lints when the name of function parameters from trait impl is
+different than its default implementation."##,
+ },
+ Lint {
label: "clippy::repeat_once",
description: r##"Checks for usage of `.repeat(1)` and suggest the following method for each types.
- `.to_string()` for `str`
@@ -12766,8 +12944,8 @@ one from a trait, another not from trait."##,
},
Lint {
label: "clippy::seek_from_current",
- description: r##"Checks an argument of `seek` method of `Seek` trait
-and if it start seek from `SeekFrom::Current(0)`, suggests `stream_position` instead."##,
+ description: r##"Checks if the `seek` method of the `Seek` trait is called with `SeekFrom::Current(0)`,
+and if it is, suggests using `stream_position` instead."##,
},
Lint {
label: "clippy::seek_to_start_instead_of_rewind",
@@ -12811,6 +12989,11 @@ see the `unseparated_literal_suffix` lint."##,
description: r##"Checks for misuses of the serde API."##,
},
Lint {
+ label: "clippy::set_contains_or_insert",
+ description: r##"Checks for usage of `contains` to see if a value is not
+present on `HashSet` followed by a `insert`."##,
+ },
+ Lint {
label: "clippy::shadow_reuse",
description: r##"Checks for bindings that shadow other bindings already in
scope, while reusing the original value."##,
@@ -13101,10 +13284,6 @@ either `ignore`, `no_run` or `compile_fail`."##,
(marked with `#[cfg(test)]`)."##,
},
Lint {
- label: "clippy::thread_local_initializer_can_be_made_const",
- description: r##"Suggests to use `const` in `thread_local!` macro if possible."##,
- },
- Lint {
label: "clippy::to_digit_is_some",
description: r##"Checks for `.to_digit(..).is_some()` on `char`s."##,
},
@@ -13163,7 +13342,7 @@ syntax specifications for trait bounds are used simultaneously."##,
},
Lint {
label: "clippy::transmute_int_to_non_zero",
- description: r##"Checks for transmutes from integers to `NonZero*` types, and suggests their `new_unchecked`
+ description: r##"Checks for transmutes from `T` to `NonZero<T>`, and suggests the `new_unchecked`
method instead."##,
},
Lint {
@@ -13223,7 +13402,7 @@ declarations above a certain complexity threshold."##,
},
Lint {
label: "clippy::type_id_on_box",
- description: r##"Looks for calls to `<Box<dyn Any> as Any>::type_id`."##,
+ description: r##"Looks for calls to `.type_id()` on a `Box<dyn _>`."##,
},
Lint {
label: "clippy::type_repetition_in_bounds",
@@ -13235,8 +13414,8 @@ declarations above a certain complexity threshold."##,
},
Lint {
label: "clippy::unconditional_recursion",
- description: r##"Checks that there isn't an infinite recursion in `PartialEq` trait
-implementation."##,
+ description: r##"Checks that there isn't an infinite recursion in trait
+implementations."##,
},
Lint {
label: "clippy::undocumented_unsafe_blocks",
@@ -13381,6 +13560,12 @@ simpler code:
is being constructed."##,
},
Lint {
+ label: "clippy::unnecessary_min_or_max",
+ description: r##"Checks for unnecessary calls to `min()` or `max()` in the following cases
+- Either both side is constant
+- One side is clearly larger than the other, like i32::MIN and an i32 variable"##,
+ },
+ Lint {
label: "clippy::unnecessary_mut_passed",
description: r##"Detects passing a mutable reference to a function that only
requires an immutable reference."##,
@@ -13587,11 +13772,21 @@ lint attributes.
This lint permits lint attributes for lints emitted on the items themself.
For `use` items these lints are:
+* ambiguous_glob_reexports
+* dead_code
* deprecated
+* hidden_glob_reexports
* unreachable_pub
-* unused_imports
+* unused
+* unused_braces
+* unused_import_braces
+* clippy::disallowed_types
* clippy::enum_glob_use
* clippy::macro_use_imports
+* clippy::module_name_repetitions
+* clippy::redundant_pub_crate
+* clippy::single_component_path_imports
+* clippy::unsafe_removed_from_name
* clippy::wildcard_imports
For `extern crate` items these lints are:
@@ -13656,6 +13851,10 @@ to `trailing_zeros`"##,
description: r##"Checks for usage of `waker.clone().wake()`"##,
},
Lint {
+ label: "clippy::while_float",
+ description: r##"Checks for while loops comparing floating point values."##,
+ },
+ Lint {
label: "clippy::while_immutable_condition",
description: r##"Checks whether variables used within while loop condition
can be (and are) mutated in the body."##,
@@ -13747,6 +13946,11 @@ architecture."##,
description: r##"Catch casts from `0` to some pointer type"##,
},
Lint {
+ label: "clippy::zero_repeat_side_effects",
+ description: r##"Checks for array or vec initializations which call a function or method,
+but which have a repeat count of zero."##,
+ },
+ Lint {
label: "clippy::zero_sized_map_values",
description: r##"Checks for maps with zero-sized value types anywhere in the code."##,
},
@@ -13773,7 +13977,7 @@ pub const CLIPPY_LINT_GROUPS: &[LintGroup] = &[
LintGroup {
lint: Lint {
label: "clippy::complexity",
- description: r##"lint group for: clippy::bind_instead_of_map, clippy::bool_comparison, clippy::borrow_deref_ref, clippy::borrowed_box, clippy::bytes_count_to_len, clippy::char_lit_as_u8, clippy::clone_on_copy, clippy::crosspointer_transmute, clippy::default_constructed_unit_structs, clippy::deprecated_cfg_attr, clippy::deref_addrof, clippy::derivable_impls, clippy::diverging_sub_expression, clippy::double_comparisons, clippy::double_parens, clippy::duration_subsec, clippy::excessive_nesting, clippy::explicit_auto_deref, clippy::explicit_counter_loop, clippy::explicit_write, clippy::extra_unused_lifetimes, clippy::extra_unused_type_parameters, clippy::filter_map_identity, clippy::filter_next, clippy::flat_map_identity, clippy::get_last_with_len, clippy::identity_op, clippy::implied_bounds_in_impls, clippy::inspect_for_each, clippy::int_plus_one, clippy::iter_count, clippy::iter_kv_map, clippy::let_with_type_underscore, clippy::manual_filter, clippy::manual_filter_map, clippy::manual_find, clippy::manual_find_map, clippy::manual_flatten, clippy::manual_hash_one, clippy::manual_main_separator_str, clippy::manual_range_patterns, clippy::manual_rem_euclid, clippy::manual_slice_size_calculation, clippy::manual_split_once, clippy::manual_strip, clippy::manual_swap, clippy::manual_unwrap_or, clippy::map_flatten, clippy::map_identity, clippy::match_as_ref, clippy::match_single_binding, clippy::needless_arbitrary_self_type, clippy::needless_bool, clippy::needless_bool_assign, clippy::needless_borrowed_reference, clippy::needless_if, clippy::needless_lifetimes, clippy::needless_match, clippy::needless_option_as_deref, clippy::needless_option_take, clippy::needless_question_mark, clippy::needless_splitn, clippy::needless_update, clippy::neg_cmp_op_on_partial_ord, clippy::no_effect, clippy::nonminimal_bool, clippy::only_used_in_recursion, clippy::option_as_ref_deref, clippy::option_filter_map, clippy::option_map_unit_fn, clippy::or_then_unwrap, clippy::overflow_check_conditional, clippy::partialeq_ne_impl, clippy::precedence, clippy::ptr_offset_with_cast, clippy::range_zip_with_len, clippy::redundant_as_str, clippy::redundant_async_block, clippy::redundant_at_rest_pattern, clippy::redundant_closure_call, clippy::redundant_guards, clippy::redundant_slicing, clippy::repeat_once, clippy::reserve_after_initialization, clippy::result_filter_map, clippy::result_map_unit_fn, clippy::search_is_some, clippy::seek_from_current, clippy::seek_to_start_instead_of_rewind, clippy::short_circuit_statement, clippy::single_element_loop, clippy::skip_while_next, clippy::string_from_utf8_as_bytes, clippy::strlen_on_c_strings, clippy::temporary_assignment, clippy::too_many_arguments, clippy::transmute_bytes_to_str, clippy::transmute_float_to_int, clippy::transmute_int_to_bool, clippy::transmute_int_to_char, clippy::transmute_int_to_float, clippy::transmute_int_to_non_zero, clippy::transmute_num_to_bytes, clippy::transmute_ptr_to_ref, clippy::transmutes_expressible_as_ptr_casts, clippy::type_complexity, clippy::unit_arg, clippy::unnecessary_cast, clippy::unnecessary_filter_map, clippy::unnecessary_find_map, clippy::unnecessary_literal_unwrap, clippy::unnecessary_map_on_constructor, clippy::unnecessary_operation, clippy::unnecessary_sort_by, clippy::unnecessary_unwrap, clippy::unneeded_wildcard_pattern, clippy::unused_format_specs, clippy::useless_asref, clippy::useless_conversion, clippy::useless_format, clippy::useless_transmute, clippy::vec_box, clippy::while_let_loop, clippy::wildcard_in_or_patterns, clippy::zero_divided_by_zero, clippy::zero_prefixed_literal"##,
+ description: r##"lint group for: clippy::bind_instead_of_map, clippy::bool_comparison, clippy::borrow_deref_ref, clippy::borrowed_box, clippy::bytes_count_to_len, clippy::char_lit_as_u8, clippy::clone_on_copy, clippy::crosspointer_transmute, clippy::default_constructed_unit_structs, clippy::deprecated_cfg_attr, clippy::deref_addrof, clippy::derivable_impls, clippy::diverging_sub_expression, clippy::double_comparisons, clippy::double_parens, clippy::duration_subsec, clippy::excessive_nesting, clippy::explicit_auto_deref, clippy::explicit_counter_loop, clippy::explicit_write, clippy::extra_unused_lifetimes, clippy::extra_unused_type_parameters, clippy::filter_map_identity, clippy::filter_next, clippy::flat_map_identity, clippy::get_last_with_len, clippy::identity_op, clippy::implied_bounds_in_impls, clippy::inspect_for_each, clippy::int_plus_one, clippy::iter_count, clippy::iter_kv_map, clippy::let_with_type_underscore, clippy::manual_clamp, clippy::manual_filter, clippy::manual_filter_map, clippy::manual_find, clippy::manual_find_map, clippy::manual_flatten, clippy::manual_hash_one, clippy::manual_inspect, clippy::manual_main_separator_str, clippy::manual_range_patterns, clippy::manual_rem_euclid, clippy::manual_slice_size_calculation, clippy::manual_split_once, clippy::manual_strip, clippy::manual_swap, clippy::manual_unwrap_or, clippy::map_flatten, clippy::map_identity, clippy::match_as_ref, clippy::match_single_binding, clippy::needless_arbitrary_self_type, clippy::needless_bool, clippy::needless_bool_assign, clippy::needless_borrowed_reference, clippy::needless_if, clippy::needless_lifetimes, clippy::needless_match, clippy::needless_option_as_deref, clippy::needless_option_take, clippy::needless_question_mark, clippy::needless_splitn, clippy::needless_update, clippy::neg_cmp_op_on_partial_ord, clippy::no_effect, clippy::nonminimal_bool, clippy::only_used_in_recursion, clippy::option_as_ref_deref, clippy::option_filter_map, clippy::option_map_unit_fn, clippy::or_then_unwrap, clippy::overflow_check_conditional, clippy::partialeq_ne_impl, clippy::precedence, clippy::ptr_offset_with_cast, clippy::range_zip_with_len, clippy::redundant_as_str, clippy::redundant_async_block, clippy::redundant_at_rest_pattern, clippy::redundant_closure_call, clippy::redundant_guards, clippy::redundant_slicing, clippy::repeat_once, clippy::reserve_after_initialization, clippy::result_filter_map, clippy::result_map_unit_fn, clippy::search_is_some, clippy::seek_from_current, clippy::seek_to_start_instead_of_rewind, clippy::short_circuit_statement, clippy::single_element_loop, clippy::skip_while_next, clippy::string_from_utf8_as_bytes, clippy::strlen_on_c_strings, clippy::temporary_assignment, clippy::too_many_arguments, clippy::transmute_bytes_to_str, clippy::transmute_float_to_int, clippy::transmute_int_to_bool, clippy::transmute_int_to_char, clippy::transmute_int_to_float, clippy::transmute_int_to_non_zero, clippy::transmute_num_to_bytes, clippy::transmute_ptr_to_ref, clippy::transmutes_expressible_as_ptr_casts, clippy::type_complexity, clippy::unit_arg, clippy::unnecessary_cast, clippy::unnecessary_filter_map, clippy::unnecessary_find_map, clippy::unnecessary_literal_unwrap, clippy::unnecessary_map_on_constructor, clippy::unnecessary_min_or_max, clippy::unnecessary_operation, clippy::unnecessary_sort_by, clippy::unnecessary_unwrap, clippy::unneeded_wildcard_pattern, clippy::unused_format_specs, clippy::useless_asref, clippy::useless_conversion, clippy::useless_format, clippy::useless_transmute, clippy::vec_box, clippy::while_let_loop, clippy::wildcard_in_or_patterns, clippy::zero_divided_by_zero, clippy::zero_prefixed_literal"##,
},
children: &[
"clippy::bind_instead_of_map",
@@ -13809,12 +14013,14 @@ pub const CLIPPY_LINT_GROUPS: &[LintGroup] = &[
"clippy::iter_count",
"clippy::iter_kv_map",
"clippy::let_with_type_underscore",
+ "clippy::manual_clamp",
"clippy::manual_filter",
"clippy::manual_filter_map",
"clippy::manual_find",
"clippy::manual_find_map",
"clippy::manual_flatten",
"clippy::manual_hash_one",
+ "clippy::manual_inspect",
"clippy::manual_main_separator_str",
"clippy::manual_range_patterns",
"clippy::manual_rem_euclid",
@@ -13888,6 +14094,7 @@ pub const CLIPPY_LINT_GROUPS: &[LintGroup] = &[
"clippy::unnecessary_find_map",
"clippy::unnecessary_literal_unwrap",
"clippy::unnecessary_map_on_constructor",
+ "clippy::unnecessary_min_or_max",
"clippy::unnecessary_operation",
"clippy::unnecessary_sort_by",
"clippy::unnecessary_unwrap",
@@ -13907,7 +14114,7 @@ pub const CLIPPY_LINT_GROUPS: &[LintGroup] = &[
LintGroup {
lint: Lint {
label: "clippy::correctness",
- description: r##"lint group for: clippy::absurd_extreme_comparisons, clippy::almost_swapped, clippy::approx_constant, clippy::async_yields_async, clippy::bad_bit_mask, clippy::cast_slice_different_sizes, clippy::deprecated_semver, clippy::derive_ord_xor_partial_ord, clippy::derived_hash_with_manual_eq, clippy::eager_transmute, clippy::enum_clike_unportable_variant, clippy::eq_op, clippy::erasing_op, clippy::fn_address_comparisons, clippy::if_let_mutex, clippy::ifs_same_cond, clippy::impl_hash_borrow_with_str_and_bytes, clippy::impossible_comparisons, clippy::ineffective_bit_mask, clippy::infinite_iter, clippy::inherent_to_string_shadow_display, clippy::inline_fn_without_body, clippy::invalid_null_ptr_usage, clippy::invalid_regex, clippy::invisible_characters, clippy::iter_next_loop, clippy::iter_skip_zero, clippy::iterator_step_by_zero, clippy::let_underscore_lock, clippy::lint_groups_priority, clippy::match_str_case_mismatch, clippy::mem_replace_with_uninit, clippy::min_max, clippy::mismatched_target_os, clippy::mistyped_literal_suffixes, clippy::modulo_one, clippy::mut_from_ref, clippy::never_loop, clippy::non_octal_unix_permissions, clippy::nonsensical_open_options, clippy::not_unsafe_ptr_arg_deref, clippy::option_env_unwrap, clippy::out_of_bounds_indexing, clippy::overly_complex_bool_expr, clippy::panicking_unwrap, clippy::possible_missing_comma, clippy::read_line_without_trim, clippy::recursive_format_impl, clippy::redundant_comparisons, clippy::redundant_locals, clippy::reversed_empty_ranges, clippy::self_assignment, clippy::serde_api_misuse, clippy::size_of_in_element_count, clippy::suspicious_splitn, clippy::transmute_null_to_fn, clippy::transmuting_null, clippy::uninit_assumed_init, clippy::uninit_vec, clippy::unit_cmp, clippy::unit_hash, clippy::unit_return_expecting_ord, clippy::unsound_collection_transmute, clippy::unused_io_amount, clippy::useless_attribute, clippy::vec_resize_to_zero, clippy::while_immutable_condition, clippy::wrong_transmute, clippy::zst_offset"##,
+ description: r##"lint group for: clippy::absurd_extreme_comparisons, clippy::almost_swapped, clippy::approx_constant, clippy::async_yields_async, clippy::bad_bit_mask, clippy::cast_slice_different_sizes, clippy::deprecated_semver, clippy::derive_ord_xor_partial_ord, clippy::derived_hash_with_manual_eq, clippy::eager_transmute, clippy::enum_clike_unportable_variant, clippy::eq_op, clippy::erasing_op, clippy::fn_address_comparisons, clippy::if_let_mutex, clippy::ifs_same_cond, clippy::impl_hash_borrow_with_str_and_bytes, clippy::impossible_comparisons, clippy::ineffective_bit_mask, clippy::infinite_iter, clippy::inherent_to_string_shadow_display, clippy::inline_fn_without_body, clippy::invalid_null_ptr_usage, clippy::invalid_regex, clippy::invisible_characters, clippy::iter_next_loop, clippy::iter_skip_zero, clippy::iterator_step_by_zero, clippy::let_underscore_lock, clippy::lint_groups_priority, clippy::match_str_case_mismatch, clippy::mem_replace_with_uninit, clippy::min_max, clippy::mistyped_literal_suffixes, clippy::modulo_one, clippy::mut_from_ref, clippy::never_loop, clippy::non_octal_unix_permissions, clippy::nonsensical_open_options, clippy::not_unsafe_ptr_arg_deref, clippy::option_env_unwrap, clippy::out_of_bounds_indexing, clippy::overly_complex_bool_expr, clippy::panicking_unwrap, clippy::possible_missing_comma, clippy::read_line_without_trim, clippy::recursive_format_impl, clippy::redundant_comparisons, clippy::redundant_locals, clippy::reversed_empty_ranges, clippy::self_assignment, clippy::serde_api_misuse, clippy::size_of_in_element_count, clippy::suspicious_splitn, clippy::transmute_null_to_fn, clippy::transmuting_null, clippy::uninit_assumed_init, clippy::uninit_vec, clippy::unit_cmp, clippy::unit_hash, clippy::unit_return_expecting_ord, clippy::unsound_collection_transmute, clippy::unused_io_amount, clippy::useless_attribute, clippy::vec_resize_to_zero, clippy::while_immutable_condition, clippy::wrong_transmute, clippy::zst_offset"##,
},
children: &[
"clippy::absurd_extreme_comparisons",
@@ -13943,7 +14150,6 @@ pub const CLIPPY_LINT_GROUPS: &[LintGroup] = &[
"clippy::match_str_case_mismatch",
"clippy::mem_replace_with_uninit",
"clippy::min_max",
- "clippy::mismatched_target_os",
"clippy::mistyped_literal_suffixes",
"clippy::modulo_one",
"clippy::mut_from_ref",
@@ -13984,7 +14190,7 @@ pub const CLIPPY_LINT_GROUPS: &[LintGroup] = &[
LintGroup {
lint: Lint {
label: "clippy::deprecated",
- description: r##"lint group for: clippy::assign_ops, clippy::extend_from_slice, clippy::filter_map, clippy::find_map, clippy::if_let_redundant_pattern_matching, clippy::misaligned_transmute, clippy::pub_enum_variant_names, clippy::range_step_by_zero, clippy::regex_macro, clippy::replace_consts, clippy::should_assert_eq, clippy::unsafe_vector_initialization, clippy::unstable_as_mut_slice, clippy::unstable_as_slice, clippy::unused_collect, clippy::wrong_pub_self_convention"##,
+ description: r##"lint group for: clippy::assign_ops, clippy::extend_from_slice, clippy::filter_map, clippy::find_map, clippy::if_let_redundant_pattern_matching, clippy::maybe_misused_cfg, clippy::misaligned_transmute, clippy::mismatched_target_os, clippy::pub_enum_variant_names, clippy::range_step_by_zero, clippy::regex_macro, clippy::replace_consts, clippy::should_assert_eq, clippy::unsafe_vector_initialization, clippy::unstable_as_mut_slice, clippy::unstable_as_slice, clippy::unused_collect, clippy::wrong_pub_self_convention"##,
},
children: &[
"clippy::assign_ops",
@@ -13992,7 +14198,9 @@ pub const CLIPPY_LINT_GROUPS: &[LintGroup] = &[
"clippy::filter_map",
"clippy::find_map",
"clippy::if_let_redundant_pattern_matching",
+ "clippy::maybe_misused_cfg",
"clippy::misaligned_transmute",
+ "clippy::mismatched_target_os",
"clippy::pub_enum_variant_names",
"clippy::range_step_by_zero",
"clippy::regex_macro",
@@ -14008,7 +14216,7 @@ pub const CLIPPY_LINT_GROUPS: &[LintGroup] = &[
LintGroup {
lint: Lint {
label: "clippy::nursery",
- description: r##"lint group for: clippy::as_ptr_cast_mut, clippy::branches_sharing_code, clippy::clear_with_drain, clippy::cognitive_complexity, clippy::collection_is_never_read, clippy::debug_assert_with_mut_call, clippy::derive_partial_eq_without_eq, clippy::empty_line_after_doc_comments, clippy::empty_line_after_outer_attr, clippy::equatable_if_let, clippy::fallible_impl_from, clippy::future_not_send, clippy::imprecise_flops, clippy::iter_on_empty_collections, clippy::iter_on_single_items, clippy::iter_with_drain, clippy::large_stack_frames, clippy::manual_clamp, clippy::missing_const_for_fn, clippy::mutex_integer, clippy::needless_collect, clippy::needless_pass_by_ref_mut, clippy::non_send_fields_in_send_ty, clippy::nonstandard_macro_braces, clippy::option_if_let_else, clippy::or_fun_call, clippy::path_buf_push_overwrite, clippy::read_zero_byte_vec, clippy::readonly_write_lock, clippy::redundant_clone, clippy::redundant_pub_crate, clippy::significant_drop_in_scrutinee, clippy::significant_drop_tightening, clippy::string_lit_as_bytes, clippy::suboptimal_flops, clippy::suspicious_operation_groupings, clippy::trailing_empty_array, clippy::trait_duplication_in_bounds, clippy::transmute_undefined_repr, clippy::trivial_regex, clippy::tuple_array_conversions, clippy::type_repetition_in_bounds, clippy::uninhabited_references, clippy::unnecessary_struct_initialization, clippy::unused_peekable, clippy::unused_rounding, clippy::use_self, clippy::useless_let_if_seq"##,
+ description: r##"lint group for: clippy::as_ptr_cast_mut, clippy::branches_sharing_code, clippy::clear_with_drain, clippy::cognitive_complexity, clippy::collection_is_never_read, clippy::debug_assert_with_mut_call, clippy::derive_partial_eq_without_eq, clippy::empty_line_after_doc_comments, clippy::empty_line_after_outer_attr, clippy::equatable_if_let, clippy::fallible_impl_from, clippy::future_not_send, clippy::imprecise_flops, clippy::iter_on_empty_collections, clippy::iter_on_single_items, clippy::iter_with_drain, clippy::large_stack_frames, clippy::missing_const_for_fn, clippy::mutex_integer, clippy::needless_collect, clippy::needless_pass_by_ref_mut, clippy::non_send_fields_in_send_ty, clippy::nonstandard_macro_braces, clippy::option_if_let_else, clippy::or_fun_call, clippy::path_buf_push_overwrite, clippy::read_zero_byte_vec, clippy::redundant_clone, clippy::redundant_pub_crate, clippy::set_contains_or_insert, clippy::significant_drop_in_scrutinee, clippy::significant_drop_tightening, clippy::string_lit_as_bytes, clippy::suboptimal_flops, clippy::suspicious_operation_groupings, clippy::trailing_empty_array, clippy::trait_duplication_in_bounds, clippy::transmute_undefined_repr, clippy::trivial_regex, clippy::tuple_array_conversions, clippy::type_repetition_in_bounds, clippy::uninhabited_references, clippy::unnecessary_struct_initialization, clippy::unused_peekable, clippy::unused_rounding, clippy::use_self, clippy::useless_let_if_seq, clippy::while_float"##,
},
children: &[
"clippy::as_ptr_cast_mut",
@@ -14028,7 +14236,6 @@ pub const CLIPPY_LINT_GROUPS: &[LintGroup] = &[
"clippy::iter_on_single_items",
"clippy::iter_with_drain",
"clippy::large_stack_frames",
- "clippy::manual_clamp",
"clippy::missing_const_for_fn",
"clippy::mutex_integer",
"clippy::needless_collect",
@@ -14039,9 +14246,9 @@ pub const CLIPPY_LINT_GROUPS: &[LintGroup] = &[
"clippy::or_fun_call",
"clippy::path_buf_push_overwrite",
"clippy::read_zero_byte_vec",
- "clippy::readonly_write_lock",
"clippy::redundant_clone",
"clippy::redundant_pub_crate",
+ "clippy::set_contains_or_insert",
"clippy::significant_drop_in_scrutinee",
"clippy::significant_drop_tightening",
"clippy::string_lit_as_bytes",
@@ -14059,14 +14266,16 @@ pub const CLIPPY_LINT_GROUPS: &[LintGroup] = &[
"clippy::unused_rounding",
"clippy::use_self",
"clippy::useless_let_if_seq",
+ "clippy::while_float",
],
},
LintGroup {
lint: Lint {
label: "clippy::pedantic",
- description: r##"lint group for: clippy::bool_to_int_with_if, clippy::borrow_as_ptr, clippy::case_sensitive_file_extension_comparisons, clippy::cast_lossless, clippy::cast_possible_truncation, clippy::cast_possible_wrap, clippy::cast_precision_loss, clippy::cast_ptr_alignment, clippy::cast_sign_loss, clippy::checked_conversions, clippy::cloned_instead_of_copied, clippy::copy_iterator, clippy::default_trait_access, clippy::doc_link_with_quotes, clippy::doc_markdown, clippy::empty_enum, clippy::enum_glob_use, clippy::expl_impl_clone_on_copy, clippy::explicit_deref_methods, clippy::explicit_into_iter_loop, clippy::explicit_iter_loop, clippy::filter_map_next, clippy::flat_map_option, clippy::float_cmp, clippy::fn_params_excessive_bools, clippy::from_iter_instead_of_collect, clippy::if_not_else, clippy::ignored_unit_patterns, clippy::implicit_clone, clippy::implicit_hasher, clippy::inconsistent_struct_constructor, clippy::index_refutable_slice, clippy::inefficient_to_string, clippy::inline_always, clippy::into_iter_without_iter, clippy::invalid_upcast_comparisons, clippy::items_after_statements, clippy::iter_filter_is_ok, clippy::iter_filter_is_some, clippy::iter_not_returning_iterator, clippy::iter_without_into_iter, clippy::large_digit_groups, clippy::large_futures, clippy::large_stack_arrays, clippy::large_types_passed_by_value, clippy::linkedlist, clippy::macro_use_imports, clippy::manual_assert, clippy::manual_c_str_literals, clippy::manual_instant_elapsed, clippy::manual_is_variant_and, clippy::manual_let_else, clippy::manual_ok_or, clippy::manual_string_new, clippy::many_single_char_names, clippy::map_unwrap_or, clippy::match_bool, clippy::match_on_vec_items, clippy::match_same_arms, clippy::match_wild_err_arm, clippy::match_wildcard_for_single_variants, clippy::maybe_infinite_iter, clippy::mismatching_type_param_order, clippy::missing_errors_doc, clippy::missing_fields_in_debug, clippy::missing_panics_doc, clippy::module_name_repetitions, clippy::must_use_candidate, clippy::mut_mut, clippy::naive_bytecount, clippy::needless_bitwise_bool, clippy::needless_continue, clippy::needless_for_each, clippy::needless_pass_by_value, clippy::needless_raw_string_hashes, clippy::no_effect_underscore_binding, clippy::no_mangle_with_rust_abi, clippy::option_as_ref_cloned, clippy::option_option, clippy::ptr_as_ptr, clippy::ptr_cast_constness, clippy::pub_underscore_fields, clippy::range_minus_one, clippy::range_plus_one, clippy::redundant_closure_for_method_calls, clippy::redundant_else, clippy::ref_as_ptr, clippy::ref_binding_to_reference, clippy::ref_option_ref, clippy::return_self_not_must_use, clippy::same_functions_in_if_condition, clippy::semicolon_if_nothing_returned, clippy::should_panic_without_expect, clippy::similar_names, clippy::single_match_else, clippy::stable_sort_primitive, clippy::str_split_at_newline, clippy::string_add_assign, clippy::struct_excessive_bools, clippy::struct_field_names, clippy::too_many_lines, clippy::transmute_ptr_to_ptr, clippy::trivially_copy_pass_by_ref, clippy::unchecked_duration_subtraction, clippy::unicode_not_nfc, clippy::uninlined_format_args, clippy::unnecessary_box_returns, clippy::unnecessary_join, clippy::unnecessary_wraps, clippy::unnested_or_patterns, clippy::unreadable_literal, clippy::unsafe_derive_deserialize, clippy::unused_async, clippy::unused_self, clippy::used_underscore_binding, clippy::verbose_bit_mask, clippy::wildcard_imports, clippy::zero_sized_map_values"##,
+ description: r##"lint group for: clippy::assigning_clones, clippy::bool_to_int_with_if, clippy::borrow_as_ptr, clippy::case_sensitive_file_extension_comparisons, clippy::cast_lossless, clippy::cast_possible_truncation, clippy::cast_possible_wrap, clippy::cast_precision_loss, clippy::cast_ptr_alignment, clippy::cast_sign_loss, clippy::checked_conversions, clippy::cloned_instead_of_copied, clippy::copy_iterator, clippy::default_trait_access, clippy::doc_link_with_quotes, clippy::doc_markdown, clippy::empty_enum, clippy::enum_glob_use, clippy::expl_impl_clone_on_copy, clippy::explicit_deref_methods, clippy::explicit_into_iter_loop, clippy::explicit_iter_loop, clippy::filter_map_next, clippy::flat_map_option, clippy::float_cmp, clippy::fn_params_excessive_bools, clippy::from_iter_instead_of_collect, clippy::if_not_else, clippy::ignored_unit_patterns, clippy::implicit_clone, clippy::implicit_hasher, clippy::inconsistent_struct_constructor, clippy::index_refutable_slice, clippy::inefficient_to_string, clippy::inline_always, clippy::into_iter_without_iter, clippy::invalid_upcast_comparisons, clippy::items_after_statements, clippy::iter_filter_is_ok, clippy::iter_filter_is_some, clippy::iter_not_returning_iterator, clippy::iter_without_into_iter, clippy::large_digit_groups, clippy::large_futures, clippy::large_stack_arrays, clippy::large_types_passed_by_value, clippy::linkedlist, clippy::macro_use_imports, clippy::manual_assert, clippy::manual_c_str_literals, clippy::manual_instant_elapsed, clippy::manual_is_variant_and, clippy::manual_let_else, clippy::manual_ok_or, clippy::manual_string_new, clippy::many_single_char_names, clippy::map_unwrap_or, clippy::match_bool, clippy::match_on_vec_items, clippy::match_same_arms, clippy::match_wild_err_arm, clippy::match_wildcard_for_single_variants, clippy::maybe_infinite_iter, clippy::mismatching_type_param_order, clippy::missing_errors_doc, clippy::missing_fields_in_debug, clippy::missing_panics_doc, clippy::module_name_repetitions, clippy::must_use_candidate, clippy::mut_mut, clippy::naive_bytecount, clippy::needless_bitwise_bool, clippy::needless_continue, clippy::needless_for_each, clippy::needless_pass_by_value, clippy::needless_raw_string_hashes, clippy::no_effect_underscore_binding, clippy::no_mangle_with_rust_abi, clippy::option_as_ref_cloned, clippy::option_option, clippy::ptr_as_ptr, clippy::ptr_cast_constness, clippy::pub_underscore_fields, clippy::range_minus_one, clippy::range_plus_one, clippy::redundant_closure_for_method_calls, clippy::redundant_else, clippy::ref_as_ptr, clippy::ref_binding_to_reference, clippy::ref_option_ref, clippy::return_self_not_must_use, clippy::same_functions_in_if_condition, clippy::semicolon_if_nothing_returned, clippy::should_panic_without_expect, clippy::similar_names, clippy::single_char_pattern, clippy::single_match_else, clippy::stable_sort_primitive, clippy::str_split_at_newline, clippy::string_add_assign, clippy::struct_excessive_bools, clippy::struct_field_names, clippy::too_many_lines, clippy::transmute_ptr_to_ptr, clippy::trivially_copy_pass_by_ref, clippy::unchecked_duration_subtraction, clippy::unicode_not_nfc, clippy::uninlined_format_args, clippy::unnecessary_box_returns, clippy::unnecessary_join, clippy::unnecessary_wraps, clippy::unnested_or_patterns, clippy::unreadable_literal, clippy::unsafe_derive_deserialize, clippy::unused_async, clippy::unused_self, clippy::used_underscore_binding, clippy::verbose_bit_mask, clippy::wildcard_imports, clippy::zero_sized_map_values"##,
},
children: &[
+ "clippy::assigning_clones",
"clippy::bool_to_int_with_if",
"clippy::borrow_as_ptr",
"clippy::case_sensitive_file_extension_comparisons",
@@ -14161,6 +14370,7 @@ pub const CLIPPY_LINT_GROUPS: &[LintGroup] = &[
"clippy::semicolon_if_nothing_returned",
"clippy::should_panic_without_expect",
"clippy::similar_names",
+ "clippy::single_char_pattern",
"clippy::single_match_else",
"clippy::stable_sort_primitive",
"clippy::str_split_at_newline",
@@ -14190,11 +14400,10 @@ pub const CLIPPY_LINT_GROUPS: &[LintGroup] = &[
LintGroup {
lint: Lint {
label: "clippy::perf",
- description: r##"lint group for: clippy::box_collection, clippy::box_default, clippy::boxed_local, clippy::cmp_owned, clippy::collapsible_str_replace, clippy::drain_collect, clippy::expect_fun_call, clippy::extend_with_drain, clippy::format_collect, clippy::format_in_format_args, clippy::iter_nth, clippy::iter_overeager_cloned, clippy::large_const_arrays, clippy::large_enum_variant, clippy::manual_memcpy, clippy::manual_retain, clippy::manual_str_repeat, clippy::manual_try_fold, clippy::map_entry, clippy::missing_spin_loop, clippy::redundant_allocation, clippy::result_large_err, clippy::single_char_pattern, clippy::slow_vector_initialization, clippy::thread_local_initializer_can_be_made_const, clippy::to_string_in_format_args, clippy::unnecessary_to_owned, clippy::useless_vec, clippy::vec_init_then_push, clippy::waker_clone_wake"##,
+ description: r##"lint group for: clippy::box_collection, clippy::boxed_local, clippy::cmp_owned, clippy::collapsible_str_replace, clippy::drain_collect, clippy::expect_fun_call, clippy::extend_with_drain, clippy::format_collect, clippy::format_in_format_args, clippy::iter_overeager_cloned, clippy::large_const_arrays, clippy::large_enum_variant, clippy::manual_memcpy, clippy::manual_retain, clippy::manual_str_repeat, clippy::manual_try_fold, clippy::map_entry, clippy::missing_const_for_thread_local, clippy::missing_spin_loop, clippy::readonly_write_lock, clippy::redundant_allocation, clippy::result_large_err, clippy::slow_vector_initialization, clippy::to_string_in_format_args, clippy::unnecessary_to_owned, clippy::useless_vec, clippy::vec_init_then_push, clippy::waker_clone_wake"##,
},
children: &[
"clippy::box_collection",
- "clippy::box_default",
"clippy::boxed_local",
"clippy::cmp_owned",
"clippy::collapsible_str_replace",
@@ -14203,7 +14412,6 @@ pub const CLIPPY_LINT_GROUPS: &[LintGroup] = &[
"clippy::extend_with_drain",
"clippy::format_collect",
"clippy::format_in_format_args",
- "clippy::iter_nth",
"clippy::iter_overeager_cloned",
"clippy::large_const_arrays",
"clippy::large_enum_variant",
@@ -14212,12 +14420,12 @@ pub const CLIPPY_LINT_GROUPS: &[LintGroup] = &[
"clippy::manual_str_repeat",
"clippy::manual_try_fold",
"clippy::map_entry",
+ "clippy::missing_const_for_thread_local",
"clippy::missing_spin_loop",
+ "clippy::readonly_write_lock",
"clippy::redundant_allocation",
"clippy::result_large_err",
- "clippy::single_char_pattern",
"clippy::slow_vector_initialization",
- "clippy::thread_local_initializer_can_be_made_const",
"clippy::to_string_in_format_args",
"clippy::unnecessary_to_owned",
"clippy::useless_vec",
@@ -14228,7 +14436,7 @@ pub const CLIPPY_LINT_GROUPS: &[LintGroup] = &[
LintGroup {
lint: Lint {
label: "clippy::restriction",
- description: r##"lint group for: clippy::absolute_paths, clippy::alloc_instead_of_core, clippy::allow_attributes, clippy::allow_attributes_without_reason, clippy::arithmetic_side_effects, clippy::as_conversions, clippy::as_underscore, clippy::assertions_on_result_states, clippy::big_endian_bytes, clippy::clone_on_ref_ptr, clippy::create_dir, clippy::dbg_macro, clippy::decimal_literal_representation, clippy::default_numeric_fallback, clippy::default_union_representation, clippy::deref_by_slicing, clippy::disallowed_script_idents, clippy::else_if_without_else, clippy::empty_drop, clippy::empty_enum_variants_with_brackets, clippy::empty_structs_with_brackets, clippy::error_impl_error, clippy::exhaustive_enums, clippy::exhaustive_structs, clippy::exit, clippy::expect_used, clippy::filetype_is_file, clippy::float_arithmetic, clippy::float_cmp_const, clippy::fn_to_numeric_cast_any, clippy::format_push_string, clippy::get_unwrap, clippy::host_endian_bytes, clippy::if_then_some_else_none, clippy::impl_trait_in_params, clippy::implicit_return, clippy::indexing_slicing, clippy::infinite_loop, clippy::inline_asm_x86_att_syntax, clippy::inline_asm_x86_intel_syntax, clippy::integer_division, clippy::iter_over_hash_type, clippy::large_include_file, clippy::let_underscore_must_use, clippy::let_underscore_untyped, clippy::little_endian_bytes, clippy::lossy_float_literal, clippy::map_err_ignore, clippy::mem_forget, clippy::min_ident_chars, clippy::missing_assert_message, clippy::missing_asserts_for_indexing, clippy::missing_docs_in_private_items, clippy::missing_inline_in_public_items, clippy::missing_trait_methods, clippy::mixed_read_write_in_expression, clippy::mod_module_files, clippy::modulo_arithmetic, clippy::multiple_inherent_impl, clippy::multiple_unsafe_ops_per_block, clippy::mutex_atomic, clippy::needless_raw_strings, clippy::non_ascii_literal, clippy::panic, clippy::panic_in_result_fn, clippy::partial_pub_fields, clippy::pattern_type_mismatch, clippy::print_stderr, clippy::print_stdout, clippy::pub_use, clippy::pub_with_shorthand, clippy::pub_without_shorthand, clippy::question_mark_used, clippy::rc_buffer, clippy::rc_mutex, clippy::redundant_type_annotations, clippy::ref_patterns, clippy::rest_pat_in_fully_bound_structs, clippy::same_name_method, clippy::self_named_module_files, clippy::semicolon_inside_block, clippy::semicolon_outside_block, clippy::separated_literal_suffix, clippy::shadow_reuse, clippy::shadow_same, clippy::shadow_unrelated, clippy::single_call_fn, clippy::single_char_lifetime_names, clippy::std_instead_of_alloc, clippy::std_instead_of_core, clippy::str_to_string, clippy::string_add, clippy::string_lit_chars_any, clippy::string_slice, clippy::string_to_string, clippy::suspicious_xor_used_as_pow, clippy::tests_outside_test_module, clippy::todo, clippy::try_err, clippy::undocumented_unsafe_blocks, clippy::unimplemented, clippy::unnecessary_safety_comment, clippy::unnecessary_safety_doc, clippy::unnecessary_self_imports, clippy::unneeded_field_pattern, clippy::unreachable, clippy::unseparated_literal_suffix, clippy::unwrap_in_result, clippy::unwrap_used, clippy::use_debug, clippy::verbose_file_reads, clippy::wildcard_enum_match_arm"##,
+ description: r##"lint group for: clippy::absolute_paths, clippy::alloc_instead_of_core, clippy::allow_attributes, clippy::allow_attributes_without_reason, clippy::arithmetic_side_effects, clippy::as_conversions, clippy::as_underscore, clippy::assertions_on_result_states, clippy::big_endian_bytes, clippy::cfg_not_test, clippy::clone_on_ref_ptr, clippy::create_dir, clippy::dbg_macro, clippy::decimal_literal_representation, clippy::default_numeric_fallback, clippy::default_union_representation, clippy::deref_by_slicing, clippy::disallowed_script_idents, clippy::else_if_without_else, clippy::empty_drop, clippy::empty_enum_variants_with_brackets, clippy::empty_structs_with_brackets, clippy::error_impl_error, clippy::exhaustive_enums, clippy::exhaustive_structs, clippy::exit, clippy::expect_used, clippy::field_scoped_visibility_modifiers, clippy::filetype_is_file, clippy::float_arithmetic, clippy::float_cmp_const, clippy::fn_to_numeric_cast_any, clippy::format_push_string, clippy::get_unwrap, clippy::host_endian_bytes, clippy::if_then_some_else_none, clippy::impl_trait_in_params, clippy::implicit_return, clippy::indexing_slicing, clippy::infinite_loop, clippy::inline_asm_x86_att_syntax, clippy::inline_asm_x86_intel_syntax, clippy::integer_division, clippy::integer_division_remainder_used, clippy::iter_over_hash_type, clippy::large_include_file, clippy::let_underscore_must_use, clippy::let_underscore_untyped, clippy::little_endian_bytes, clippy::lossy_float_literal, clippy::map_err_ignore, clippy::mem_forget, clippy::min_ident_chars, clippy::missing_assert_message, clippy::missing_asserts_for_indexing, clippy::missing_docs_in_private_items, clippy::missing_inline_in_public_items, clippy::missing_trait_methods, clippy::mixed_read_write_in_expression, clippy::mod_module_files, clippy::modulo_arithmetic, clippy::multiple_inherent_impl, clippy::multiple_unsafe_ops_per_block, clippy::mutex_atomic, clippy::needless_raw_strings, clippy::non_ascii_literal, clippy::panic, clippy::panic_in_result_fn, clippy::partial_pub_fields, clippy::pattern_type_mismatch, clippy::print_stderr, clippy::print_stdout, clippy::pub_use, clippy::pub_with_shorthand, clippy::pub_without_shorthand, clippy::question_mark_used, clippy::rc_buffer, clippy::rc_mutex, clippy::redundant_type_annotations, clippy::ref_patterns, clippy::renamed_function_params, clippy::rest_pat_in_fully_bound_structs, clippy::same_name_method, clippy::self_named_module_files, clippy::semicolon_inside_block, clippy::semicolon_outside_block, clippy::separated_literal_suffix, clippy::shadow_reuse, clippy::shadow_same, clippy::shadow_unrelated, clippy::single_call_fn, clippy::single_char_lifetime_names, clippy::std_instead_of_alloc, clippy::std_instead_of_core, clippy::str_to_string, clippy::string_add, clippy::string_lit_chars_any, clippy::string_slice, clippy::string_to_string, clippy::suspicious_xor_used_as_pow, clippy::tests_outside_test_module, clippy::todo, clippy::try_err, clippy::undocumented_unsafe_blocks, clippy::unimplemented, clippy::unnecessary_safety_comment, clippy::unnecessary_safety_doc, clippy::unnecessary_self_imports, clippy::unneeded_field_pattern, clippy::unreachable, clippy::unseparated_literal_suffix, clippy::unwrap_in_result, clippy::unwrap_used, clippy::use_debug, clippy::verbose_file_reads, clippy::wildcard_enum_match_arm"##,
},
children: &[
"clippy::absolute_paths",
@@ -14240,6 +14448,7 @@ pub const CLIPPY_LINT_GROUPS: &[LintGroup] = &[
"clippy::as_underscore",
"clippy::assertions_on_result_states",
"clippy::big_endian_bytes",
+ "clippy::cfg_not_test",
"clippy::clone_on_ref_ptr",
"clippy::create_dir",
"clippy::dbg_macro",
@@ -14257,6 +14466,7 @@ pub const CLIPPY_LINT_GROUPS: &[LintGroup] = &[
"clippy::exhaustive_structs",
"clippy::exit",
"clippy::expect_used",
+ "clippy::field_scoped_visibility_modifiers",
"clippy::filetype_is_file",
"clippy::float_arithmetic",
"clippy::float_cmp_const",
@@ -14272,6 +14482,7 @@ pub const CLIPPY_LINT_GROUPS: &[LintGroup] = &[
"clippy::inline_asm_x86_att_syntax",
"clippy::inline_asm_x86_intel_syntax",
"clippy::integer_division",
+ "clippy::integer_division_remainder_used",
"clippy::iter_over_hash_type",
"clippy::large_include_file",
"clippy::let_underscore_must_use",
@@ -14308,6 +14519,7 @@ pub const CLIPPY_LINT_GROUPS: &[LintGroup] = &[
"clippy::rc_mutex",
"clippy::redundant_type_annotations",
"clippy::ref_patterns",
+ "clippy::renamed_function_params",
"clippy::rest_pat_in_fully_bound_structs",
"clippy::same_name_method",
"clippy::self_named_module_files",
@@ -14348,7 +14560,7 @@ pub const CLIPPY_LINT_GROUPS: &[LintGroup] = &[
LintGroup {
lint: Lint {
label: "clippy::style",
- description: r##"lint group for: clippy::assertions_on_constants, clippy::assign_op_pattern, clippy::blocks_in_conditions, clippy::bool_assert_comparison, clippy::borrow_interior_mutable_const, clippy::builtin_type_shadow, clippy::bytes_nth, clippy::chars_last_cmp, clippy::chars_next_cmp, clippy::cmp_null, clippy::collapsible_else_if, clippy::collapsible_if, clippy::collapsible_match, clippy::comparison_chain, clippy::comparison_to_empty, clippy::declare_interior_mutable_const, clippy::default_instead_of_iter_empty, clippy::disallowed_macros, clippy::disallowed_methods, clippy::disallowed_names, clippy::disallowed_types, clippy::double_must_use, clippy::double_neg, clippy::duplicate_underscore_argument, clippy::enum_variant_names, clippy::err_expect, clippy::excessive_precision, clippy::field_reassign_with_default, clippy::filter_map_bool_then, clippy::fn_to_numeric_cast, clippy::fn_to_numeric_cast_with_truncation, clippy::for_kv_map, clippy::from_over_into, clippy::from_str_radix_10, clippy::get_first, clippy::if_same_then_else, clippy::implicit_saturating_add, clippy::implicit_saturating_sub, clippy::inconsistent_digit_grouping, clippy::infallible_destructuring_match, clippy::inherent_to_string, clippy::init_numbered_fields, clippy::into_iter_on_ref, clippy::is_digit_ascii_radix, clippy::items_after_test_module, clippy::iter_cloned_collect, clippy::iter_next_slice, clippy::iter_nth_zero, clippy::iter_skip_next, clippy::just_underscores_and_digits, clippy::len_without_is_empty, clippy::len_zero, clippy::let_and_return, clippy::let_unit_value, clippy::main_recursion, clippy::manual_async_fn, clippy::manual_bits, clippy::manual_is_ascii_check, clippy::manual_is_finite, clippy::manual_is_infinite, clippy::manual_map, clippy::manual_next_back, clippy::manual_non_exhaustive, clippy::manual_range_contains, clippy::manual_saturating_arithmetic, clippy::manual_while_let_some, clippy::map_clone, clippy::map_collect_result_unit, clippy::match_like_matches_macro, clippy::match_overlapping_arm, clippy::match_ref_pats, clippy::match_result_ok, clippy::mem_replace_option_with_none, clippy::mem_replace_with_default, clippy::missing_enforced_import_renames, clippy::missing_safety_doc, clippy::mixed_case_hex_literals, clippy::module_inception, clippy::must_use_unit, clippy::mut_mutex_lock, clippy::needless_borrow, clippy::needless_borrows_for_generic_args, clippy::needless_doctest_main, clippy::needless_else, clippy::needless_late_init, clippy::needless_parens_on_range_literals, clippy::needless_pub_self, clippy::needless_range_loop, clippy::needless_return, clippy::needless_return_with_question_mark, clippy::neg_multiply, clippy::new_ret_no_self, clippy::new_without_default, clippy::non_minimal_cfg, clippy::obfuscated_if_else, clippy::ok_expect, clippy::op_ref, clippy::option_map_or_err_ok, clippy::option_map_or_none, clippy::partialeq_to_none, clippy::print_literal, clippy::print_with_newline, clippy::println_empty_string, clippy::ptr_arg, clippy::ptr_eq, clippy::question_mark, clippy::redundant_closure, clippy::redundant_field_names, clippy::redundant_pattern, clippy::redundant_pattern_matching, clippy::redundant_static_lifetimes, clippy::result_map_or_into_option, clippy::result_unit_err, clippy::same_item_push, clippy::self_named_constructors, clippy::should_implement_trait, clippy::single_char_add_str, clippy::single_component_path_imports, clippy::single_match, clippy::string_extend_chars, clippy::tabs_in_doc_comments, clippy::to_digit_is_some, clippy::to_string_trait_impl, clippy::toplevel_ref_arg, clippy::trim_split_whitespace, clippy::unnecessary_fallible_conversions, clippy::unnecessary_fold, clippy::unnecessary_lazy_evaluations, clippy::unnecessary_mut_passed, clippy::unnecessary_owned_empty_strings, clippy::unsafe_removed_from_name, clippy::unused_enumerate_index, clippy::unused_unit, clippy::unusual_byte_groupings, clippy::unwrap_or_default, clippy::upper_case_acronyms, clippy::while_let_on_iterator, clippy::write_literal, clippy::write_with_newline, clippy::writeln_empty_string, clippy::wrong_self_convention, clippy::zero_ptr"##,
+ description: r##"lint group for: clippy::assertions_on_constants, clippy::assign_op_pattern, clippy::blocks_in_conditions, clippy::bool_assert_comparison, clippy::borrow_interior_mutable_const, clippy::box_default, clippy::builtin_type_shadow, clippy::byte_char_slices, clippy::bytes_nth, clippy::chars_last_cmp, clippy::chars_next_cmp, clippy::cmp_null, clippy::collapsible_else_if, clippy::collapsible_if, clippy::collapsible_match, clippy::comparison_chain, clippy::comparison_to_empty, clippy::declare_interior_mutable_const, clippy::default_instead_of_iter_empty, clippy::disallowed_macros, clippy::disallowed_methods, clippy::disallowed_names, clippy::disallowed_types, clippy::doc_lazy_continuation, clippy::double_must_use, clippy::double_neg, clippy::duplicate_underscore_argument, clippy::enum_variant_names, clippy::err_expect, clippy::excessive_precision, clippy::field_reassign_with_default, clippy::filter_map_bool_then, clippy::fn_to_numeric_cast, clippy::fn_to_numeric_cast_with_truncation, clippy::for_kv_map, clippy::from_over_into, clippy::from_str_radix_10, clippy::get_first, clippy::if_same_then_else, clippy::implicit_saturating_add, clippy::implicit_saturating_sub, clippy::inconsistent_digit_grouping, clippy::infallible_destructuring_match, clippy::inherent_to_string, clippy::init_numbered_fields, clippy::into_iter_on_ref, clippy::is_digit_ascii_radix, clippy::items_after_test_module, clippy::iter_cloned_collect, clippy::iter_next_slice, clippy::iter_nth, clippy::iter_nth_zero, clippy::iter_skip_next, clippy::just_underscores_and_digits, clippy::legacy_numeric_constants, clippy::len_without_is_empty, clippy::len_zero, clippy::let_and_return, clippy::let_unit_value, clippy::main_recursion, clippy::manual_async_fn, clippy::manual_bits, clippy::manual_is_ascii_check, clippy::manual_is_finite, clippy::manual_is_infinite, clippy::manual_map, clippy::manual_next_back, clippy::manual_non_exhaustive, clippy::manual_pattern_char_comparison, clippy::manual_range_contains, clippy::manual_rotate, clippy::manual_saturating_arithmetic, clippy::manual_while_let_some, clippy::map_clone, clippy::map_collect_result_unit, clippy::match_like_matches_macro, clippy::match_overlapping_arm, clippy::match_ref_pats, clippy::match_result_ok, clippy::mem_replace_option_with_none, clippy::mem_replace_with_default, clippy::missing_enforced_import_renames, clippy::missing_safety_doc, clippy::mixed_attributes_style, clippy::mixed_case_hex_literals, clippy::module_inception, clippy::must_use_unit, clippy::mut_mutex_lock, clippy::needless_borrow, clippy::needless_borrows_for_generic_args, clippy::needless_doctest_main, clippy::needless_else, clippy::needless_late_init, clippy::needless_parens_on_range_literals, clippy::needless_pub_self, clippy::needless_range_loop, clippy::needless_return, clippy::needless_return_with_question_mark, clippy::neg_multiply, clippy::new_ret_no_self, clippy::new_without_default, clippy::non_minimal_cfg, clippy::obfuscated_if_else, clippy::ok_expect, clippy::op_ref, clippy::option_map_or_err_ok, clippy::option_map_or_none, clippy::partialeq_to_none, clippy::print_literal, clippy::print_with_newline, clippy::println_empty_string, clippy::ptr_arg, clippy::ptr_eq, clippy::question_mark, clippy::redundant_closure, clippy::redundant_field_names, clippy::redundant_pattern, clippy::redundant_pattern_matching, clippy::redundant_static_lifetimes, clippy::result_map_or_into_option, clippy::result_unit_err, clippy::same_item_push, clippy::self_named_constructors, clippy::should_implement_trait, clippy::single_char_add_str, clippy::single_component_path_imports, clippy::single_match, clippy::string_extend_chars, clippy::tabs_in_doc_comments, clippy::to_digit_is_some, clippy::to_string_trait_impl, clippy::toplevel_ref_arg, clippy::trim_split_whitespace, clippy::unnecessary_fallible_conversions, clippy::unnecessary_fold, clippy::unnecessary_lazy_evaluations, clippy::unnecessary_mut_passed, clippy::unnecessary_owned_empty_strings, clippy::unsafe_removed_from_name, clippy::unused_enumerate_index, clippy::unused_unit, clippy::unusual_byte_groupings, clippy::unwrap_or_default, clippy::upper_case_acronyms, clippy::while_let_on_iterator, clippy::write_literal, clippy::write_with_newline, clippy::writeln_empty_string, clippy::wrong_self_convention, clippy::zero_ptr"##,
},
children: &[
"clippy::assertions_on_constants",
@@ -14356,7 +14568,9 @@ pub const CLIPPY_LINT_GROUPS: &[LintGroup] = &[
"clippy::blocks_in_conditions",
"clippy::bool_assert_comparison",
"clippy::borrow_interior_mutable_const",
+ "clippy::box_default",
"clippy::builtin_type_shadow",
+ "clippy::byte_char_slices",
"clippy::bytes_nth",
"clippy::chars_last_cmp",
"clippy::chars_next_cmp",
@@ -14372,6 +14586,7 @@ pub const CLIPPY_LINT_GROUPS: &[LintGroup] = &[
"clippy::disallowed_methods",
"clippy::disallowed_names",
"clippy::disallowed_types",
+ "clippy::doc_lazy_continuation",
"clippy::double_must_use",
"clippy::double_neg",
"clippy::duplicate_underscore_argument",
@@ -14398,9 +14613,11 @@ pub const CLIPPY_LINT_GROUPS: &[LintGroup] = &[
"clippy::items_after_test_module",
"clippy::iter_cloned_collect",
"clippy::iter_next_slice",
+ "clippy::iter_nth",
"clippy::iter_nth_zero",
"clippy::iter_skip_next",
"clippy::just_underscores_and_digits",
+ "clippy::legacy_numeric_constants",
"clippy::len_without_is_empty",
"clippy::len_zero",
"clippy::let_and_return",
@@ -14414,7 +14631,9 @@ pub const CLIPPY_LINT_GROUPS: &[LintGroup] = &[
"clippy::manual_map",
"clippy::manual_next_back",
"clippy::manual_non_exhaustive",
+ "clippy::manual_pattern_char_comparison",
"clippy::manual_range_contains",
+ "clippy::manual_rotate",
"clippy::manual_saturating_arithmetic",
"clippy::manual_while_let_some",
"clippy::map_clone",
@@ -14427,6 +14646,7 @@ pub const CLIPPY_LINT_GROUPS: &[LintGroup] = &[
"clippy::mem_replace_with_default",
"clippy::missing_enforced_import_renames",
"clippy::missing_safety_doc",
+ "clippy::mixed_attributes_style",
"clippy::mixed_case_hex_literals",
"clippy::module_inception",
"clippy::must_use_unit",
@@ -14498,7 +14718,7 @@ pub const CLIPPY_LINT_GROUPS: &[LintGroup] = &[
LintGroup {
lint: Lint {
label: "clippy::suspicious",
- description: r##"lint group for: clippy::almost_complete_range, clippy::arc_with_non_send_sync, clippy::await_holding_invalid_type, clippy::await_holding_lock, clippy::await_holding_refcell_ref, clippy::blanket_clippy_restriction_lints, clippy::cast_abs_to_unsigned, clippy::cast_enum_constructor, clippy::cast_enum_truncation, clippy::cast_nan_to_int, clippy::cast_slice_from_raw_parts, clippy::crate_in_macro_def, clippy::deprecated_clippy_cfg_attr, clippy::drop_non_drop, clippy::duplicate_mod, clippy::empty_docs, clippy::empty_loop, clippy::float_equality_without_abs, clippy::forget_non_drop, clippy::four_forward_slashes, clippy::from_raw_with_void_ptr, clippy::incompatible_msrv, clippy::ineffective_open_options, clippy::iter_out_of_bounds, clippy::join_absolute_paths, clippy::let_underscore_future, clippy::lines_filter_map_ok, clippy::maybe_misused_cfg, clippy::misnamed_getters, clippy::misrefactored_assign_op, clippy::mixed_attributes_style, clippy::multi_assignments, clippy::multiple_bound_locations, clippy::mut_range_bound, clippy::mutable_key_type, clippy::no_effect_replace, clippy::non_canonical_clone_impl, clippy::non_canonical_partial_ord_impl, clippy::octal_escapes, clippy::path_ends_with_ext, clippy::permissions_set_readonly_false, clippy::print_in_format_impl, clippy::rc_clone_in_vec_init, clippy::repeat_vec_with_capacity, clippy::single_range_in_vec_init, clippy::size_of_ref, clippy::suspicious_arithmetic_impl, clippy::suspicious_assignment_formatting, clippy::suspicious_command_arg_space, clippy::suspicious_doc_comments, clippy::suspicious_else_formatting, clippy::suspicious_map, clippy::suspicious_op_assign_impl, clippy::suspicious_open_options, clippy::suspicious_to_owned, clippy::suspicious_unary_op_formatting, clippy::swap_ptr_to_ref, clippy::test_attr_in_doctest, clippy::type_id_on_box, clippy::unconditional_recursion, clippy::unnecessary_clippy_cfg, clippy::unnecessary_get_then_check, clippy::unnecessary_result_map_or_else"##,
+ description: r##"lint group for: clippy::almost_complete_range, clippy::arc_with_non_send_sync, clippy::await_holding_invalid_type, clippy::await_holding_lock, clippy::await_holding_refcell_ref, clippy::blanket_clippy_restriction_lints, clippy::cast_abs_to_unsigned, clippy::cast_enum_constructor, clippy::cast_enum_truncation, clippy::cast_nan_to_int, clippy::cast_slice_from_raw_parts, clippy::const_is_empty, clippy::crate_in_macro_def, clippy::deprecated_clippy_cfg_attr, clippy::drop_non_drop, clippy::duplicate_mod, clippy::duplicated_attributes, clippy::empty_docs, clippy::empty_loop, clippy::float_equality_without_abs, clippy::forget_non_drop, clippy::four_forward_slashes, clippy::from_raw_with_void_ptr, clippy::incompatible_msrv, clippy::ineffective_open_options, clippy::iter_out_of_bounds, clippy::join_absolute_paths, clippy::let_underscore_future, clippy::lines_filter_map_ok, clippy::macro_metavars_in_unsafe, clippy::manual_unwrap_or_default, clippy::misnamed_getters, clippy::misrefactored_assign_op, clippy::missing_transmute_annotations, clippy::multi_assignments, clippy::multiple_bound_locations, clippy::mut_range_bound, clippy::mutable_key_type, clippy::needless_character_iteration, clippy::needless_maybe_sized, clippy::no_effect_replace, clippy::non_canonical_clone_impl, clippy::non_canonical_partial_ord_impl, clippy::octal_escapes, clippy::path_ends_with_ext, clippy::permissions_set_readonly_false, clippy::print_in_format_impl, clippy::rc_clone_in_vec_init, clippy::repeat_vec_with_capacity, clippy::single_range_in_vec_init, clippy::size_of_ref, clippy::suspicious_arithmetic_impl, clippy::suspicious_assignment_formatting, clippy::suspicious_command_arg_space, clippy::suspicious_doc_comments, clippy::suspicious_else_formatting, clippy::suspicious_map, clippy::suspicious_op_assign_impl, clippy::suspicious_open_options, clippy::suspicious_to_owned, clippy::suspicious_unary_op_formatting, clippy::swap_ptr_to_ref, clippy::test_attr_in_doctest, clippy::type_id_on_box, clippy::unconditional_recursion, clippy::unnecessary_clippy_cfg, clippy::unnecessary_get_then_check, clippy::unnecessary_result_map_or_else, clippy::zero_repeat_side_effects"##,
},
children: &[
"clippy::almost_complete_range",
@@ -14512,10 +14732,12 @@ pub const CLIPPY_LINT_GROUPS: &[LintGroup] = &[
"clippy::cast_enum_truncation",
"clippy::cast_nan_to_int",
"clippy::cast_slice_from_raw_parts",
+ "clippy::const_is_empty",
"clippy::crate_in_macro_def",
"clippy::deprecated_clippy_cfg_attr",
"clippy::drop_non_drop",
"clippy::duplicate_mod",
+ "clippy::duplicated_attributes",
"clippy::empty_docs",
"clippy::empty_loop",
"clippy::float_equality_without_abs",
@@ -14528,14 +14750,17 @@ pub const CLIPPY_LINT_GROUPS: &[LintGroup] = &[
"clippy::join_absolute_paths",
"clippy::let_underscore_future",
"clippy::lines_filter_map_ok",
- "clippy::maybe_misused_cfg",
+ "clippy::macro_metavars_in_unsafe",
+ "clippy::manual_unwrap_or_default",
"clippy::misnamed_getters",
"clippy::misrefactored_assign_op",
- "clippy::mixed_attributes_style",
+ "clippy::missing_transmute_annotations",
"clippy::multi_assignments",
"clippy::multiple_bound_locations",
"clippy::mut_range_bound",
"clippy::mutable_key_type",
+ "clippy::needless_character_iteration",
+ "clippy::needless_maybe_sized",
"clippy::no_effect_replace",
"clippy::non_canonical_clone_impl",
"clippy::non_canonical_partial_ord_impl",
@@ -14564,6 +14789,7 @@ pub const CLIPPY_LINT_GROUPS: &[LintGroup] = &[
"clippy::unnecessary_clippy_cfg",
"clippy::unnecessary_get_then_check",
"clippy::unnecessary_result_map_or_else",
+ "clippy::zero_repeat_side_effects",
],
},
];
diff --git a/crates/ide/src/hover/tests.rs b/crates/ide/src/hover/tests.rs
index 20d07bf991..8479374647 100644
--- a/crates/ide/src/hover/tests.rs
+++ b/crates/ide/src/hover/tests.rs
@@ -6138,7 +6138,7 @@ fn hover_feature() {
by the codegen backend, but not the MIR inliner.
```rust
- #![feature(rustc_attrs, effects)]
+ #![feature(rustc_attrs)]
#![allow(internal_features)]
#[rustc_intrinsic]
@@ -6148,7 +6148,7 @@ fn hover_feature() {
Since these are just regular functions, it is perfectly ok to create the intrinsic twice:
```rust
- #![feature(rustc_attrs, effects)]
+ #![feature(rustc_attrs)]
#![allow(internal_features)]
#[rustc_intrinsic]
@@ -6172,12 +6172,23 @@ fn hover_feature() {
Various intrinsics have native MIR operations that they correspond to. Instead of requiring
backends to implement both the intrinsic and the MIR operation, the `lower_intrinsics` pass
will convert the calls to the MIR operation. Backends do not need to know about these intrinsics
- at all.
+ at all. These intrinsics only make sense without a body, and can either be declared as a "rust-intrinsic"
+ or as a `#[rustc_intrinsic]`. The body is never used, as calls to the intrinsic do not exist
+ anymore after MIR analyses.
## Intrinsics without fallback logic
These must be implemented by all backends.
+ ### `#[rustc_intrinsic]` declarations
+
+ These are written like intrinsics with fallback bodies, but the body is irrelevant.
+ Use `loop {}` for the body or call the intrinsic recursively and add
+ `#[rustc_intrinsic_must_be_overridden]` to the function to ensure that backends don't
+ invoke the body.
+
+ ### Legacy extern ABI based intrinsics
+
These are imported as if they were FFI functions, with the special
`rust-intrinsic` ABI. For example, if one was in a freestanding
context, but wished to be able to `transmute` between types, and
diff --git a/crates/ide/src/status.rs b/crates/ide/src/status.rs
index 8e7767c8e5..b998c0bfc6 100644
--- a/crates/ide/src/status.rs
+++ b/crates/ide/src/status.rs
@@ -20,7 +20,6 @@ use ide_db::{
};
use itertools::Itertools;
use profile::{memory_usage, Bytes};
-use std::env;
use stdx::format_to;
use syntax::{ast, Parse, SyntaxNode};
use triomphe::Arc;
@@ -44,9 +43,6 @@ pub(crate) fn status(db: &RootDatabase, file_id: Option<FileId>) -> String {
format_to!(buf, "{}\n", collect_query(LibrarySymbolsQuery.in_db(db)));
format_to!(buf, "{}\n", collect_query(ModuleSymbolsQuery.in_db(db)));
format_to!(buf, "{} in total\n", memory_usage());
- if env::var("RA_COUNT").is_ok() {
- format_to!(buf, "\nCounts:\n{}", profile::countme::get_all());
- }
format_to!(buf, "\nDebug info:\n");
format_to!(buf, "{}\n", collect_query(AttrsQuery.in_db(db)));
diff --git a/crates/parser/Cargo.toml b/crates/parser/Cargo.toml
index 1f84e3f3af..54b57c201b 100644
--- a/crates/parser/Cargo.toml
+++ b/crates/parser/Cargo.toml
@@ -21,7 +21,6 @@ tracing = { workspace = true, optional = true }
expect-test = "1.4.0"
stdx.workspace = true
-sourcegen.workspace = true
[features]
default = ["tracing"]
diff --git a/crates/parser/src/syntax_kind/generated.rs b/crates/parser/src/syntax_kind/generated.rs
index ef83420c52..ad3398453b 100644
--- a/crates/parser/src/syntax_kind/generated.rs
+++ b/crates/parser/src/syntax_kind/generated.rs
@@ -1,4 +1,4 @@
-//! Generated by `sourcegen_ast`, do not edit by hand.
+//! Generated by `cargo codegen grammar`, do not edit by hand.
#![allow(bad_style, missing_docs, unreachable_pub)]
#[doc = r" The kind of syntax node, e.g. `IDENT`, `USE_KW`, or `STRUCT`."]
diff --git a/crates/parser/src/tests.rs b/crates/parser/src/tests.rs
index 0e04096526..a38689791c 100644
--- a/crates/parser/src/tests.rs
+++ b/crates/parser/src/tests.rs
@@ -1,5 +1,4 @@
mod prefix_entries;
-mod sourcegen_inline_tests;
mod top_entries;
use std::{
diff --git a/crates/profile/Cargo.toml b/crates/profile/Cargo.toml
index 11a8e7af56..5989dc6c96 100644
--- a/crates/profile/Cargo.toml
+++ b/crates/profile/Cargo.toml
@@ -12,12 +12,8 @@ rust-version.workspace = true
doctest = false
[dependencies]
-once_cell = "1.17.0"
-tracing.workspace = true
cfg-if = "1.0.0"
-la-arena.workspace = true
libc.workspace = true
-countme = { version = "3.0.1", features = ["enable"] }
jemalloc-ctl = { version = "0.5.0", package = "tikv-jemalloc-ctl", optional = true }
[target.'cfg(target_os = "linux")'.dependencies]
diff --git a/crates/profile/src/lib.rs b/crates/profile/src/lib.rs
index c1ae0d43d0..205341f162 100644
--- a/crates/profile/src/lib.rs
+++ b/crates/profile/src/lib.rs
@@ -12,13 +12,6 @@ pub use crate::{
stop_watch::{StopWatch, StopWatchSpan},
};
-pub use countme;
-/// Include `_c: Count<Self>` field in important structs to count them.
-///
-/// To view the counts, run with `RA_COUNT=1`. The overhead of disabled count is
-/// almost zero.
-pub use countme::Count;
-
thread_local!(static IN_SCOPE: RefCell<bool> = const { RefCell::new(false) });
/// A wrapper around google_cpu_profiler.
diff --git a/crates/profile/src/stop_watch.rs b/crates/profile/src/stop_watch.rs
index 990b59cad4..0a803959ee 100644
--- a/crates/profile/src/stop_watch.rs
+++ b/crates/profile/src/stop_watch.rs
@@ -29,11 +29,10 @@ impl StopWatch {
// When debugging rust-analyzer using rr, the perf-related syscalls cause it to abort.
// We allow disabling perf by setting the env var `RA_DISABLE_PERF`.
- use once_cell::sync::Lazy;
- static PERF_ENABLED: Lazy<bool> =
- Lazy::new(|| std::env::var_os("RA_DISABLE_PERF").is_none());
+ use std::sync::OnceLock;
+ static PERF_ENABLED: OnceLock<bool> = OnceLock::new();
- if *PERF_ENABLED {
+ if *PERF_ENABLED.get_or_init(|| std::env::var_os("RA_DISABLE_PERF").is_none()) {
let mut counter = perf_event::Builder::new()
.build()
.map_err(|err| eprintln!("Failed to create perf counter: {err}"))
diff --git a/crates/rust-analyzer/Cargo.toml b/crates/rust-analyzer/Cargo.toml
index c207c42b6d..93fb55ede8 100644
--- a/crates/rust-analyzer/Cargo.toml
+++ b/crates/rust-analyzer/Cargo.toml
@@ -81,7 +81,6 @@ xshell.workspace = true
test-utils.workspace = true
test-fixture.workspace = true
-sourcegen.workspace = true
mbe.workspace = true
[features]
diff --git a/crates/rust-analyzer/src/cli/analysis_stats.rs b/crates/rust-analyzer/src/cli/analysis_stats.rs
index a934e14ddb..c9c19806be 100644
--- a/crates/rust-analyzer/src/cli/analysis_stats.rs
+++ b/crates/rust-analyzer/src/cli/analysis_stats.rs
@@ -250,10 +250,6 @@ impl flags::AnalysisStats {
}
report_metric("total memory", total_span.memory.allocated.megabytes() as u64, "MB");
- if env::var("RA_COUNT").is_ok() {
- eprintln!("{}", profile::countme::get_all());
- }
-
if self.source_stats {
let mut total_file_size = Bytes::default();
for e in ide_db::base_db::ParseQuery.in_db(db).entries::<Vec<_>>() {
diff --git a/crates/rust-analyzer/tests/slow-tests/main.rs b/crates/rust-analyzer/tests/slow-tests/main.rs
index c6236d8b4f..56f416a0b6 100644
--- a/crates/rust-analyzer/tests/slow-tests/main.rs
+++ b/crates/rust-analyzer/tests/slow-tests/main.rs
@@ -11,11 +11,8 @@
#![allow(clippy::disallowed_types)]
mod ratoml;
-#[cfg(not(feature = "in-rust-tree"))]
-mod sourcegen;
mod support;
mod testdir;
-mod tidy;
use std::{collections::HashMap, path::PathBuf, time::Instant};
diff --git a/crates/sourcegen/Cargo.toml b/crates/sourcegen/Cargo.toml
deleted file mode 100644
index d5ea4c39aa..0000000000
--- a/crates/sourcegen/Cargo.toml
+++ /dev/null
@@ -1,19 +0,0 @@
-[package]
-name = "sourcegen"
-version = "0.0.0"
-description = "TBD"
-publish = false
-
-authors.workspace = true
-edition.workspace = true
-license.workspace = true
-rust-version.workspace = true
-
-[lib]
-doctest = false
-
-[dependencies]
-xshell.workspace = true
-
-[lints]
-workspace = true \ No newline at end of file
diff --git a/crates/sourcegen/src/lib.rs b/crates/sourcegen/src/lib.rs
deleted file mode 100644
index 307c214c61..0000000000
--- a/crates/sourcegen/src/lib.rs
+++ /dev/null
@@ -1,201 +0,0 @@
-//! rust-analyzer relies heavily on source code generation.
-//!
-//! Things like feature documentation or assist tests are implemented by
-//! processing rust-analyzer's own source code and generating the appropriate
-//! output. See `sourcegen_` tests in various crates.
-//!
-//! This crate contains utilities to make this kind of source-gen easy.
-
-use std::{
- fmt, fs, mem,
- path::{Path, PathBuf},
-};
-
-use xshell::{cmd, Shell};
-
-pub fn list_rust_files(dir: &Path) -> Vec<PathBuf> {
- let mut res = list_files(dir);
- res.retain(|it| {
- it.file_name().unwrap_or_default().to_str().unwrap_or_default().ends_with(".rs")
- });
- res
-}
-
-pub fn list_files(dir: &Path) -> Vec<PathBuf> {
- let mut res = Vec::new();
- let mut work = vec![dir.to_path_buf()];
- while let Some(dir) = work.pop() {
- for entry in dir.read_dir().unwrap() {
- let entry = entry.unwrap();
- let file_type = entry.file_type().unwrap();
- let path = entry.path();
- let is_hidden =
- path.file_name().unwrap_or_default().to_str().unwrap_or_default().starts_with('.');
- if !is_hidden {
- if file_type.is_dir() {
- work.push(path);
- } else if file_type.is_file() {
- res.push(path);
- }
- }
- }
- }
- res
-}
-
-#[derive(Clone)]
-pub struct CommentBlock {
- pub id: String,
- pub line: usize,
- pub contents: Vec<String>,
- is_doc: bool,
-}
-
-impl CommentBlock {
- pub fn extract(tag: &str, text: &str) -> Vec<CommentBlock> {
- assert!(tag.starts_with(char::is_uppercase));
-
- let tag = format!("{tag}:");
- let mut blocks = CommentBlock::extract_untagged(text);
- blocks.retain_mut(|block| {
- let first = block.contents.remove(0);
- let Some(id) = first.strip_prefix(&tag) else {
- return false;
- };
-
- if block.is_doc {
- panic!("Use plain (non-doc) comments with tags like {tag}:\n {first}");
- }
-
- id.trim().clone_into(&mut block.id);
- true
- });
- blocks
- }
-
- pub fn extract_untagged(text: &str) -> Vec<CommentBlock> {
- let mut res = Vec::new();
-
- let lines = text.lines().map(str::trim_start);
-
- let dummy_block =
- CommentBlock { id: String::new(), line: 0, contents: Vec::new(), is_doc: false };
- let mut block = dummy_block.clone();
- for (line_num, line) in lines.enumerate() {
- match line.strip_prefix("//") {
- Some(mut contents) => {
- if let Some('/' | '!') = contents.chars().next() {
- contents = &contents[1..];
- block.is_doc = true;
- }
- if let Some(' ') = contents.chars().next() {
- contents = &contents[1..];
- }
- block.contents.push(contents.to_owned());
- }
- None => {
- if !block.contents.is_empty() {
- let block = mem::replace(&mut block, dummy_block.clone());
- res.push(block);
- }
- block.line = line_num + 2;
- }
- }
- }
- if !block.contents.is_empty() {
- res.push(block);
- }
- res
- }
-}
-
-#[derive(Debug)]
-pub struct Location {
- pub file: PathBuf,
- pub line: usize,
-}
-
-impl fmt::Display for Location {
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- let path = self.file.strip_prefix(project_root()).unwrap().display().to_string();
- let path = path.replace('\\', "/");
- let name = self.file.file_name().unwrap();
- write!(
- f,
- "https://github.com/rust-lang/rust-analyzer/blob/master/{}#L{}[{}]",
- path,
- self.line,
- name.to_str().unwrap()
- )
- }
-}
-
-fn ensure_rustfmt(sh: &Shell) {
- let version = cmd!(sh, "rustup run stable rustfmt --version").read().unwrap_or_default();
- if !version.contains("stable") {
- panic!(
- "Failed to run rustfmt from toolchain 'stable'. \
- Please run `rustup component add rustfmt --toolchain stable` to install it.",
- );
- }
-}
-
-pub fn reformat(text: String) -> String {
- let sh = Shell::new().unwrap();
- ensure_rustfmt(&sh);
- let rustfmt_toml = project_root().join("rustfmt.toml");
- let mut stdout = cmd!(
- sh,
- "rustup run stable rustfmt --config-path {rustfmt_toml} --config fn_single_line=true"
- )
- .stdin(text)
- .read()
- .unwrap();
- if !stdout.ends_with('\n') {
- stdout.push('\n');
- }
- stdout
-}
-
-pub fn add_preamble(generator: &'static str, mut text: String) -> String {
- let preamble = format!("//! Generated by `{generator}`, do not edit by hand.\n\n");
- text.insert_str(0, &preamble);
- text
-}
-
-/// Checks that the `file` has the specified `contents`. If that is not the
-/// case, updates the file and then fails the test.
-#[allow(clippy::print_stderr)]
-pub fn ensure_file_contents(file: &Path, contents: &str) {
- if let Ok(old_contents) = fs::read_to_string(file) {
- if normalize_newlines(&old_contents) == normalize_newlines(contents) {
- // File is already up to date.
- return;
- }
- }
-
- let display_path = file.strip_prefix(project_root()).unwrap_or(file);
- eprintln!(
- "\n\x1b[31;1merror\x1b[0m: {} was not up-to-date, updating\n",
- display_path.display()
- );
- if std::env::var("CI").is_ok() {
- eprintln!(" NOTE: run `cargo test` locally and commit the updated files\n");
- }
- if let Some(parent) = file.parent() {
- let _ = fs::create_dir_all(parent);
- }
- fs::write(file, contents).unwrap();
- panic!("some file was not up to date and has been updated, simply re-run the tests");
-}
-
-fn normalize_newlines(s: &str) -> String {
- s.replace("\r\n", "\n")
-}
-
-pub fn project_root() -> PathBuf {
- let dir = env!("CARGO_MANIFEST_DIR");
- let res = PathBuf::from(dir).parent().unwrap().parent().unwrap().to_owned();
- assert!(res.join("triagebot.toml").exists());
- res
-}
diff --git a/crates/syntax/src/ast/generated/nodes.rs b/crates/syntax/src/ast/generated/nodes.rs
index bae529a2c8..ce189acd68 100644
--- a/crates/syntax/src/ast/generated/nodes.rs
+++ b/crates/syntax/src/ast/generated/nodes.rs
@@ -1,4 +1,4 @@
-//! Generated by `sourcegen_ast`, do not edit by hand.
+//! Generated by `cargo codegen grammar`, do not edit by hand.
#![allow(non_snake_case)]
use crate::{
diff --git a/crates/syntax/src/ast/generated/tokens.rs b/crates/syntax/src/ast/generated/tokens.rs
index 651a8ebbf7..85d20c2bd8 100644
--- a/crates/syntax/src/ast/generated/tokens.rs
+++ b/crates/syntax/src/ast/generated/tokens.rs
@@ -1,4 +1,4 @@
-//! Generated by `sourcegen_ast`, do not edit by hand.
+//! Generated by `cargo codegen grammar`, do not edit by hand.
use crate::{
ast::AstToken,
diff --git a/docs/dev/architecture.md b/docs/dev/architecture.md
index 4303a800a0..f4e7263868 100644
--- a/docs/dev/architecture.md
+++ b/docs/dev/architecture.md
@@ -368,7 +368,7 @@ In particular, we generate:
* Documentation tests for assists
-See the `sourcegen` crate for details.
+See the `xtask\src\codegen\assists_doc_tests.rs` module for details.
**Architecture Invariant:** we avoid bootstrapping.
For codegen we need to parse Rust code.
diff --git a/xtask/src/codegen.rs b/xtask/src/codegen.rs
index b23d700263..acaa65129d 100644
--- a/xtask/src/codegen.rs
+++ b/xtask/src/codegen.rs
@@ -5,12 +5,17 @@ use std::{
use xshell::{cmd, Shell};
-use crate::{flags, project_root};
+use crate::{
+ flags::{self, CodegenType},
+ project_root,
+};
pub(crate) mod assists_doc_tests;
pub(crate) mod diagnostics_docs;
+pub(crate) mod feature_docs;
mod grammar;
mod lints;
+mod parser_inline_tests;
impl flags::Codegen {
pub(crate) fn run(self, _sh: &Shell) -> anyhow::Result<()> {
@@ -18,6 +23,8 @@ impl flags::Codegen {
flags::CodegenType::All => {
diagnostics_docs::generate(self.check);
assists_doc_tests::generate(self.check);
+ parser_inline_tests::generate(self.check);
+ // diagnostics_docs::generate(self.check) doesn't generate any tests
// lints::generate(self.check) Updating clones the rust repo, so don't run it unless
// explicitly asked for
}
@@ -25,41 +32,13 @@ impl flags::Codegen {
flags::CodegenType::AssistsDocTests => assists_doc_tests::generate(self.check),
flags::CodegenType::DiagnosticsDocs => diagnostics_docs::generate(self.check),
flags::CodegenType::LintDefinitions => lints::generate(self.check),
+ flags::CodegenType::ParserTests => parser_inline_tests::generate(self.check),
+ flags::CodegenType::FeatureDocs => feature_docs::generate(self.check),
}
Ok(())
}
}
-fn list_rust_files(dir: &Path) -> Vec<PathBuf> {
- let mut res = list_files(dir);
- res.retain(|it| {
- it.file_name().unwrap_or_default().to_str().unwrap_or_default().ends_with(".rs")
- });
- res
-}
-
-fn list_files(dir: &Path) -> Vec<PathBuf> {
- let mut res = Vec::new();
- let mut work = vec![dir.to_path_buf()];
- while let Some(dir) = work.pop() {
- for entry in dir.read_dir().unwrap() {
- let entry = entry.unwrap();
- let file_type = entry.file_type().unwrap();
- let path = entry.path();
- let is_hidden =
- path.file_name().unwrap_or_default().to_str().unwrap_or_default().starts_with('.');
- if !is_hidden {
- if file_type.is_dir() {
- work.push(path);
- } else if file_type.is_file() {
- res.push(path);
- }
- }
- }
- }
- res
-}
-
#[derive(Clone)]
pub(crate) struct CommentBlock {
pub(crate) id: String,
@@ -174,8 +153,8 @@ fn reformat(text: String) -> String {
stdout
}
-fn add_preamble(generator: &'static str, mut text: String) -> String {
- let preamble = format!("//! Generated by `{generator}`, do not edit by hand.\n\n");
+fn add_preamble(cg: CodegenType, mut text: String) -> String {
+ let preamble = format!("//! Generated by `cargo codegen {cg}`, do not edit by hand.\n\n");
text.insert_str(0, &preamble);
text
}
@@ -183,7 +162,7 @@ fn add_preamble(generator: &'static str, mut text: String) -> String {
/// Checks that the `file` has the specified `contents`. If that is not the
/// case, updates the file and then fails the test.
#[allow(clippy::print_stderr)]
-fn ensure_file_contents(file: &Path, contents: &str, check: bool) {
+fn ensure_file_contents(cg: CodegenType, file: &Path, contents: &str, check: bool) {
if let Ok(old_contents) = fs::read_to_string(file) {
if normalize_newlines(&old_contents) == normalize_newlines(contents) {
// File is already up to date.
@@ -197,9 +176,11 @@ fn ensure_file_contents(file: &Path, contents: &str, check: bool) {
"{} was not up-to-date{}",
file.display(),
if std::env::var("CI").is_ok() {
- "\n NOTE: run `cargo codegen` locally and commit the updated files\n"
+ format!(
+ "\n NOTE: run `cargo codegen {cg}` locally and commit the updated files\n"
+ )
} else {
- ""
+ "".to_owned()
}
);
} else {
diff --git a/xtask/src/codegen/assists_doc_tests.rs b/xtask/src/codegen/assists_doc_tests.rs
index b2d89dde76..d06c9d65df 100644
--- a/xtask/src/codegen/assists_doc_tests.rs
+++ b/xtask/src/codegen/assists_doc_tests.rs
@@ -5,10 +5,9 @@ use std::{fmt, fs, path::Path};
use stdx::format_to_acc;
use crate::{
- codegen::{
- add_preamble, ensure_file_contents, list_rust_files, reformat, CommentBlock, Location,
- },
+ codegen::{add_preamble, ensure_file_contents, reformat, CommentBlock, Location},
project_root,
+ util::list_rust_files,
};
pub(crate) fn generate(check: bool) {
@@ -45,8 +44,9 @@ r#####"
buf.push_str(&test)
}
}
- let buf = add_preamble("sourcegen_assists_docs", reformat(buf));
+ let buf = add_preamble(crate::flags::CodegenType::AssistsDocTests, reformat(buf));
ensure_file_contents(
+ crate::flags::CodegenType::AssistsDocTests,
&project_root().join("crates/ide-assists/src/tests/generated.rs"),
&buf,
check,
@@ -59,7 +59,7 @@ r#####"
// a release.
let contents = add_preamble(
- "sourcegen_assists_docs",
+ crate::flags::CodegenType::AssistsDocTests,
assists.into_iter().map(|it| it.to_string()).collect::<Vec<_>>().join("\n\n"),
);
let dst = project_root().join("docs/user/generated_assists.adoc");
@@ -195,3 +195,8 @@ fn reveal_hash_comments(text: &str) -> String {
})
.fold(String::new(), |mut acc, it| format_to_acc!(acc, "{it}\n"))
}
+
+#[test]
+fn test() {
+ generate(true);
+}
diff --git a/xtask/src/codegen/diagnostics_docs.rs b/xtask/src/codegen/diagnostics_docs.rs
index dcc9c76a50..4cb8f3f259 100644
--- a/xtask/src/codegen/diagnostics_docs.rs
+++ b/xtask/src/codegen/diagnostics_docs.rs
@@ -3,8 +3,9 @@
use std::{fmt, fs, io, path::PathBuf};
use crate::{
- codegen::{add_preamble, list_rust_files, CommentBlock, Location},
+ codegen::{add_preamble, CommentBlock, Location},
project_root,
+ util::list_rust_files,
};
pub(crate) fn generate(check: bool) {
@@ -12,7 +13,7 @@ pub(crate) fn generate(check: bool) {
if !check {
let contents =
diagnostics.into_iter().map(|it| it.to_string()).collect::<Vec<_>>().join("\n\n");
- let contents = add_preamble("sourcegen_diagnostic_docs", contents);
+ let contents = add_preamble(crate::flags::CodegenType::DiagnosticsDocs, contents);
let dst = project_root().join("docs/user/generated_diagnostic.adoc");
fs::write(dst, contents).unwrap();
}
diff --git a/crates/rust-analyzer/tests/slow-tests/sourcegen.rs b/xtask/src/codegen/feature_docs.rs
index 2eafb0da69..c6451d888b 100644
--- a/crates/rust-analyzer/tests/slow-tests/sourcegen.rs
+++ b/xtask/src/codegen/feature_docs.rs
@@ -2,8 +2,13 @@
use std::{fmt, fs, io, path::PathBuf};
-#[test]
-fn sourcegen_feature_docs() {
+use crate::{
+ codegen::{CommentBlock, Location},
+ project_root,
+ util::list_rust_files,
+};
+
+pub(crate) fn generate(_check: bool) {
let features = Feature::collect().unwrap();
let contents = features.into_iter().map(|it| it.to_string()).collect::<Vec<_>>().join("\n\n");
let contents = format!(
@@ -13,23 +18,23 @@ fn sourcegen_feature_docs() {
",
contents.trim()
);
- let dst = sourcegen::project_root().join("docs/user/generated_features.adoc");
+ let dst = project_root().join("docs/user/generated_features.adoc");
fs::write(dst, contents).unwrap();
}
#[derive(Debug)]
struct Feature {
id: String,
- location: sourcegen::Location,
+ location: Location,
doc: String,
}
impl Feature {
fn collect() -> io::Result<Vec<Feature>> {
- let crates_dir = sourcegen::project_root().join("crates");
+ let crates_dir = project_root().join("crates");
let mut res = Vec::new();
- for path in sourcegen::list_rust_files(&crates_dir) {
+ for path in list_rust_files(&crates_dir) {
collect_file(&mut res, path)?;
}
res.sort_by(|lhs, rhs| lhs.id.cmp(&rhs.id));
@@ -37,7 +42,7 @@ impl Feature {
fn collect_file(acc: &mut Vec<Feature>, path: PathBuf) -> io::Result<()> {
let text = std::fs::read_to_string(&path)?;
- let comment_blocks = sourcegen::CommentBlock::extract("Feature", &text);
+ let comment_blocks = CommentBlock::extract("Feature", &text);
for block in comment_blocks {
let id = block.id;
@@ -45,7 +50,7 @@ impl Feature {
panic!("invalid feature name: {id:?}:\n {msg}")
}
let doc = block.contents.join("\n");
- let location = sourcegen::Location { file: path.clone(), line: block.line };
+ let location = Location { file: path.clone(), line: block.line };
acc.push(Feature { id, location, doc })
}
diff --git a/xtask/src/codegen/grammar.rs b/xtask/src/codegen/grammar.rs
index 0fc97ad654..2d492f79f1 100644
--- a/xtask/src/codegen/grammar.rs
+++ b/xtask/src/codegen/grammar.rs
@@ -27,7 +27,12 @@ use self::ast_src::{AstEnumSrc, AstNodeSrc, AstSrc, Cardinality, Field, KindsSrc
pub(crate) fn generate(check: bool) {
let syntax_kinds = generate_syntax_kinds(KINDS_SRC);
let syntax_kinds_file = project_root().join("crates/parser/src/syntax_kind/generated.rs");
- ensure_file_contents(syntax_kinds_file.as_path(), &syntax_kinds, check);
+ ensure_file_contents(
+ crate::flags::CodegenType::Grammar,
+ syntax_kinds_file.as_path(),
+ &syntax_kinds,
+ check,
+ );
let grammar = fs::read_to_string(project_root().join("crates/syntax/rust.ungram"))
.unwrap()
@@ -37,11 +42,21 @@ pub(crate) fn generate(check: bool) {
let ast_tokens = generate_tokens(&ast);
let ast_tokens_file = project_root().join("crates/syntax/src/ast/generated/tokens.rs");
- ensure_file_contents(ast_tokens_file.as_path(), &ast_tokens, check);
+ ensure_file_contents(
+ crate::flags::CodegenType::Grammar,
+ ast_tokens_file.as_path(),
+ &ast_tokens,
+ check,
+ );
let ast_nodes = generate_nodes(KINDS_SRC, &ast);
let ast_nodes_file = project_root().join("crates/syntax/src/ast/generated/nodes.rs");
- ensure_file_contents(ast_nodes_file.as_path(), &ast_nodes, check);
+ ensure_file_contents(
+ crate::flags::CodegenType::Grammar,
+ ast_nodes_file.as_path(),
+ &ast_nodes,
+ check,
+ );
}
fn generate_tokens(grammar: &AstSrc) -> String {
@@ -69,7 +84,7 @@ fn generate_tokens(grammar: &AstSrc) -> String {
});
add_preamble(
- "sourcegen_ast",
+ crate::flags::CodegenType::Grammar,
reformat(
quote! {
use crate::{SyntaxKind::{self, *}, SyntaxToken, ast::AstToken};
@@ -328,7 +343,7 @@ fn generate_nodes(kinds: KindsSrc<'_>, grammar: &AstSrc) -> String {
}
}
- let res = add_preamble("sourcegen_ast", reformat(res));
+ let res = add_preamble(crate::flags::CodegenType::Grammar, reformat(res));
res.replace("#[derive", "\n#[derive")
}
@@ -458,7 +473,7 @@ fn generate_syntax_kinds(grammar: KindsSrc<'_>) -> String {
}
};
- add_preamble("sourcegen_ast", reformat(ast.to_string()))
+ add_preamble(crate::flags::CodegenType::Grammar, reformat(ast.to_string()))
}
fn to_upper_snake_case(s: &str) -> String {
@@ -875,3 +890,8 @@ impl AstNodeSrc {
});
}
}
+
+#[test]
+fn test() {
+ generate(true);
+}
diff --git a/xtask/src/codegen/lints.rs b/xtask/src/codegen/lints.rs
index 6975f9328e..f097b5817b 100644
--- a/xtask/src/codegen/lints.rs
+++ b/xtask/src/codegen/lints.rs
@@ -6,8 +6,9 @@ use stdx::format_to;
use xshell::{cmd, Shell};
use crate::{
- codegen::{add_preamble, ensure_file_contents, list_files, reformat},
+ codegen::{add_preamble, ensure_file_contents, reformat},
project_root,
+ util::list_files,
};
const DESTINATION: &str = "crates/ide-db/src/generated/lints.rs";
@@ -28,7 +29,7 @@ pub(crate) fn generate(check: bool) {
cmd!(
sh,
"git -C {rust_repo} submodule update --init --recursive --depth=1 --
- compiler library src/tools"
+ compiler library src/tools src/doc/book"
)
.run()
.unwrap();
@@ -73,10 +74,15 @@ pub struct LintGroup {
.unwrap();
generate_descriptor_clippy(&mut contents, &lints_json);
- let contents = add_preamble("sourcegen_lints", reformat(contents));
+ let contents = add_preamble(crate::flags::CodegenType::LintDefinitions, reformat(contents));
let destination = project_root().join(DESTINATION);
- ensure_file_contents(destination.as_path(), &contents, check);
+ ensure_file_contents(
+ crate::flags::CodegenType::LintDefinitions,
+ destination.as_path(),
+ &contents,
+ check,
+ );
}
/// Parses the output of `rustdoc -Whelp` and prints `Lint` and `LintGroup` constants into `buf`.
diff --git a/crates/parser/src/tests/sourcegen_inline_tests.rs b/xtask/src/codegen/parser_inline_tests.rs
index 5a71bfd82b..5983b06e1b 100644
--- a/crates/parser/src/tests/sourcegen_inline_tests.rs
+++ b/xtask/src/codegen/parser_inline_tests.rs
@@ -8,16 +8,21 @@ use std::{
path::{Path, PathBuf},
};
-#[test]
-fn sourcegen_parser_tests() {
- let grammar_dir = sourcegen::project_root().join(Path::new("crates/parser/src/grammar"));
+use crate::{
+ codegen::{ensure_file_contents, CommentBlock},
+ project_root,
+ util::list_rust_files,
+};
+
+pub(crate) fn generate(check: bool) {
+ let grammar_dir = project_root().join(Path::new("crates/parser/src/grammar"));
let tests = tests_from_dir(&grammar_dir);
- install_tests(&tests.ok, "crates/parser/test_data/parser/inline/ok");
- install_tests(&tests.err, "crates/parser/test_data/parser/inline/err");
+ install_tests(&tests.ok, "crates/parser/test_data/parser/inline/ok", check);
+ install_tests(&tests.err, "crates/parser/test_data/parser/inline/err", check);
- fn install_tests(tests: &HashMap<String, Test>, into: &str) {
- let tests_dir = sourcegen::project_root().join(into);
+ fn install_tests(tests: &HashMap<String, Test>, into: &str, check: bool) {
+ let tests_dir = project_root().join(into);
if !tests_dir.is_dir() {
fs::create_dir_all(&tests_dir).unwrap();
}
@@ -37,7 +42,7 @@ fn sourcegen_parser_tests() {
tests_dir.join(file_name)
}
};
- sourcegen::ensure_file_contents(&path, &test.text);
+ ensure_file_contents(crate::flags::CodegenType::ParserTests, &path, &test.text, check);
}
}
}
@@ -57,7 +62,7 @@ struct Tests {
fn collect_tests(s: &str) -> Vec<Test> {
let mut res = Vec::new();
- for comment_block in sourcegen::CommentBlock::extract_untagged(s) {
+ for comment_block in CommentBlock::extract_untagged(s) {
let first_line = &comment_block.contents[0];
let (name, ok) = if let Some(name) = first_line.strip_prefix("test ") {
(name.to_owned(), true)
@@ -80,7 +85,7 @@ fn collect_tests(s: &str) -> Vec<Test> {
fn tests_from_dir(dir: &Path) -> Tests {
let mut res = Tests::default();
- for entry in sourcegen::list_rust_files(dir) {
+ for entry in list_rust_files(dir) {
process_file(&mut res, entry.as_path());
}
let grammar_rs = dir.parent().unwrap().join("grammar.rs");
@@ -122,3 +127,8 @@ fn existing_tests(dir: &Path, ok: bool) -> HashMap<String, (PathBuf, Test)> {
}
res
}
+
+#[test]
+fn test() {
+ generate(true);
+}
diff --git a/xtask/src/flags.rs b/xtask/src/flags.rs
index dd7bfd0bda..cf4a22d476 100644
--- a/xtask/src/flags.rs
+++ b/xtask/src/flags.rs
@@ -1,6 +1,6 @@
#![allow(unreachable_pub)]
-use std::str::FromStr;
+use std::{fmt, str::FromStr};
use crate::install::{ClientOpt, ServerOpt};
@@ -73,6 +73,8 @@ xflags::xflags! {
optional codegen_type: CodegenType
optional --check
}
+
+ cmd tidy {}
}
}
@@ -96,9 +98,13 @@ pub enum XtaskCmd {
Metrics(Metrics),
Bb(Bb),
Codegen(Codegen),
+ Tidy(Tidy),
}
#[derive(Debug)]
+pub struct Tidy {}
+
+#[derive(Debug)]
pub struct Install {
pub client: bool,
pub code_bin: Option<String>,
@@ -185,6 +191,22 @@ pub enum CodegenType {
AssistsDocTests,
DiagnosticsDocs,
LintDefinitions,
+ ParserTests,
+ FeatureDocs,
+}
+
+impl fmt::Display for CodegenType {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match self {
+ Self::All => write!(f, "all"),
+ Self::Grammar => write!(f, "grammar"),
+ Self::AssistsDocTests => write!(f, "assists-doc-tests"),
+ Self::DiagnosticsDocs => write!(f, "diagnostics-docs"),
+ Self::LintDefinitions => write!(f, "lint-definitions"),
+ Self::ParserTests => write!(f, "parser-tests"),
+ Self::FeatureDocs => write!(f, "feature-docs"),
+ }
+ }
}
impl FromStr for CodegenType {
@@ -195,7 +217,9 @@ impl FromStr for CodegenType {
"grammar" => Ok(Self::Grammar),
"assists-doc-tests" => Ok(Self::AssistsDocTests),
"diagnostics-docs" => Ok(Self::DiagnosticsDocs),
- "lints-definitions" => Ok(Self::LintDefinitions),
+ "lint-definitions" => Ok(Self::LintDefinitions),
+ "parser-tests" => Ok(Self::ParserTests),
+ "feature-docs" => Ok(Self::FeatureDocs),
_ => Err("Invalid option".to_owned()),
}
}
diff --git a/xtask/src/main.rs b/xtask/src/main.rs
index e070576303..5c312da1dd 100644
--- a/xtask/src/main.rs
+++ b/xtask/src/main.rs
@@ -19,6 +19,8 @@ mod install;
mod metrics;
mod publish;
mod release;
+mod tidy;
+mod util;
use anyhow::bail;
use std::{env, path::PathBuf};
@@ -51,6 +53,7 @@ fn main() -> anyhow::Result<()> {
)?;
Ok(())
}
+ flags::XtaskCmd::Tidy(cmd) => cmd.run(sh),
}
}
diff --git a/xtask/src/release.rs b/xtask/src/release.rs
index b936876b52..3eda2bc027 100644
--- a/xtask/src/release.rs
+++ b/xtask/src/release.rs
@@ -32,6 +32,7 @@ impl flags::Release {
// Generates bits of manual.adoc.
codegen::diagnostics_docs::generate(false);
codegen::assists_doc_tests::generate(false);
+ codegen::feature_docs::generate(false);
let website_root = project_root().join("../rust-analyzer.github.io");
{
diff --git a/crates/rust-analyzer/tests/slow-tests/tidy.rs b/xtask/src/tidy.rs
index 8cd5cbf1c7..e85f518286 100644
--- a/crates/rust-analyzer/tests/slow-tests/tidy.rs
+++ b/xtask/src/tidy.rs
@@ -6,23 +6,29 @@ use std::{
use xshell::Shell;
-#[cfg(not(feature = "in-rust-tree"))]
use xshell::cmd;
-#[test]
-fn check_lsp_extensions_docs() {
- let sh = &Shell::new().unwrap();
+use crate::{flags::Tidy, project_root, util::list_files};
+
+impl Tidy {
+ pub(crate) fn run(&self, sh: &Shell) -> anyhow::Result<()> {
+ check_lsp_extensions_docs(sh);
+ files_are_tidy(sh);
+ check_licenses(sh);
+ Ok(())
+ }
+}
+fn check_lsp_extensions_docs(sh: &Shell) {
let expected_hash = {
- let lsp_ext_rs = sh
- .read_file(sourcegen::project_root().join("crates/rust-analyzer/src/lsp/ext.rs"))
- .unwrap();
+ let lsp_ext_rs =
+ sh.read_file(project_root().join("crates/rust-analyzer/src/lsp/ext.rs")).unwrap();
stable_hash(lsp_ext_rs.as_str())
};
let actual_hash = {
let lsp_extensions_md =
- sh.read_file(sourcegen::project_root().join("docs/dev/lsp-extensions.md")).unwrap();
+ sh.read_file(project_root().join("docs/dev/lsp-extensions.md")).unwrap();
let text = lsp_extensions_md
.lines()
.find_map(|line| line.strip_prefix("lsp/ext.rs hash:"))
@@ -45,11 +51,8 @@ Please adjust docs/dev/lsp-extensions.md.
}
}
-#[test]
-fn files_are_tidy() {
- let sh = &Shell::new().unwrap();
-
- let files = sourcegen::list_files(&sourcegen::project_root().join("crates"));
+fn files_are_tidy(sh: &Shell) {
+ let files = list_files(&project_root().join("crates"));
let mut tidy_docs = TidyDocs::default();
let mut tidy_marks = TidyMarks::default();
@@ -121,11 +124,7 @@ fn check_cargo_toml(path: &Path, text: String) {
}
}
-#[cfg(not(feature = "in-rust-tree"))]
-#[test]
-fn check_licenses() {
- let sh = &Shell::new().unwrap();
-
+fn check_licenses(sh: &Shell) {
let expected = "
(MIT OR Apache-2.0) AND Unicode-DFS-2016
0BSD OR MIT OR Apache-2.0
@@ -277,7 +276,7 @@ impl TidyDocs {
}
fn is_exclude_dir(p: &Path, dirs_to_exclude: &[&str]) -> bool {
- p.strip_prefix(sourcegen::project_root())
+ p.strip_prefix(project_root())
.unwrap()
.components()
.rev()
@@ -339,3 +338,8 @@ fn find_marks(set: &mut HashSet<String>, text: &str, mark: &str) {
}
}
}
+
+#[test]
+fn test() {
+ Tidy {}.run(&Shell::new().unwrap()).unwrap();
+}
diff --git a/xtask/src/util.rs b/xtask/src/util.rs
new file mode 100644
index 0000000000..39f52938c8
--- /dev/null
+++ b/xtask/src/util.rs
@@ -0,0 +1,31 @@
+use std::path::{Path, PathBuf};
+
+pub(crate) fn list_rust_files(dir: &Path) -> Vec<PathBuf> {
+ let mut res = list_files(dir);
+ res.retain(|it| {
+ it.file_name().unwrap_or_default().to_str().unwrap_or_default().ends_with(".rs")
+ });
+ res
+}
+
+pub(crate) fn list_files(dir: &Path) -> Vec<PathBuf> {
+ let mut res = Vec::new();
+ let mut work = vec![dir.to_path_buf()];
+ while let Some(dir) = work.pop() {
+ for entry in dir.read_dir().unwrap() {
+ let entry = entry.unwrap();
+ let file_type = entry.file_type().unwrap();
+ let path = entry.path();
+ let is_hidden =
+ path.file_name().unwrap_or_default().to_str().unwrap_or_default().starts_with('.');
+ if !is_hidden {
+ if file_type.is_dir() {
+ work.push(path);
+ } else if file_type.is_file() {
+ res.push(path);
+ }
+ }
+ }
+ }
+ res
+}