]> git.proxmox.com Git - rustc.git/blob - src/tools/rust-analyzer/crates/ide-db/src/generated/lints.rs
New upstream version 1.68.2+dfsg1
[rustc.git] / src / tools / rust-analyzer / crates / ide-db / src / generated / lints.rs
1 //! Generated by `sourcegen_lints`, do not edit by hand.
2
3 #[derive(Clone)]
4 pub struct Lint {
5 pub label: &'static str,
6 pub description: &'static str,
7 }
8 pub struct LintGroup {
9 pub lint: Lint,
10 pub children: &'static [&'static str],
11 }
12 pub const DEFAULT_LINTS: &[Lint] = &[
13 Lint {
14 label: "absolute_paths_not_starting_with_crate",
15 description: r##"fully qualified paths that start with a module name instead of `crate`, `self`, or an extern crate name"##,
16 },
17 Lint { label: "ambiguous_associated_items", description: r##"ambiguous associated items"## },
18 Lint { label: "anonymous_parameters", description: r##"detects anonymous parameters"## },
19 Lint { label: "arithmetic_overflow", description: r##"arithmetic operation overflows"## },
20 Lint {
21 label: "array_into_iter",
22 description: r##"detects calling `into_iter` on arrays in Rust 2015 and 2018"##,
23 },
24 Lint {
25 label: "asm_sub_register",
26 description: r##"using only a subset of a register for inline asm inputs"##,
27 },
28 Lint { label: "bad_asm_style", description: r##"incorrect use of inline assembly"## },
29 Lint {
30 label: "bare_trait_objects",
31 description: r##"suggest using `dyn Trait` for trait objects"##,
32 },
33 Lint {
34 label: "bindings_with_variant_name",
35 description: r##"detects pattern bindings with the same name as one of the matched variants"##,
36 },
37 Lint { label: "box_pointers", description: r##"use of owned (Box type) heap memory"## },
38 Lint {
39 label: "break_with_label_and_loop",
40 description: r##"`break` expression with label and unlabeled loop as value expression"##,
41 },
42 Lint {
43 label: "cenum_impl_drop_cast",
44 description: r##"a C-like enum implementing Drop is cast"##,
45 },
46 Lint {
47 label: "clashing_extern_declarations",
48 description: r##"detects when an extern fn has been declared with the same name but different types"##,
49 },
50 Lint {
51 label: "coherence_leak_check",
52 description: r##"distinct impls distinguished only by the leak-check code"##,
53 },
54 Lint {
55 label: "conflicting_repr_hints",
56 description: r##"conflicts between `#[repr(..)]` hints that were previously accepted and used in practice"##,
57 },
58 Lint {
59 label: "confusable_idents",
60 description: r##"detects visually confusable pairs between identifiers"##,
61 },
62 Lint {
63 label: "const_err",
64 description: r##"constant evaluation encountered erroneous expression"##,
65 },
66 Lint {
67 label: "const_evaluatable_unchecked",
68 description: r##"detects a generic constant is used in a type without a emitting a warning"##,
69 },
70 Lint {
71 label: "const_item_mutation",
72 description: r##"detects attempts to mutate a `const` item"##,
73 },
74 Lint { label: "dead_code", description: r##"detect unused, unexported items"## },
75 Lint { label: "deprecated", description: r##"detects use of deprecated items"## },
76 Lint {
77 label: "deprecated_in_future",
78 description: r##"detects use of items that will be deprecated in a future version"##,
79 },
80 Lint {
81 label: "deref_into_dyn_supertrait",
82 description: r##"`Deref` implementation usage with a supertrait trait object for output might be shadowed in the future"##,
83 },
84 Lint {
85 label: "deref_nullptr",
86 description: r##"detects when an null pointer is dereferenced"##,
87 },
88 Lint {
89 label: "drop_bounds",
90 description: r##"bounds of the form `T: Drop` are most likely incorrect"##,
91 },
92 Lint {
93 label: "dyn_drop",
94 description: r##"trait objects of the form `dyn Drop` are useless"##,
95 },
96 Lint {
97 label: "elided_lifetimes_in_paths",
98 description: r##"hidden lifetime parameters in types are deprecated"##,
99 },
100 Lint {
101 label: "ellipsis_inclusive_range_patterns",
102 description: r##"`...` range patterns are deprecated"##,
103 },
104 Lint {
105 label: "enum_intrinsics_non_enums",
106 description: r##"detects calls to `core::mem::discriminant` and `core::mem::variant_count` with non-enum types"##,
107 },
108 Lint {
109 label: "explicit_outlives_requirements",
110 description: r##"outlives requirements can be inferred"##,
111 },
112 Lint {
113 label: "exported_private_dependencies",
114 description: r##"public interface leaks type from a private dependency"##,
115 },
116 Lint { label: "forbidden_lint_groups", description: r##"applying forbid to lint-groups"## },
117 Lint {
118 label: "function_item_references",
119 description: r##"suggest casting to a function pointer when attempting to take references to function items"##,
120 },
121 Lint {
122 label: "future_incompatible",
123 description: r##"lint group for: forbidden-lint-groups, illegal-floating-point-literal-pattern, private-in-public, pub-use-of-private-extern-crate, invalid-type-param-default, const-err, unaligned-references, patterns-in-fns-without-body, missing-fragment-specifier, late-bound-lifetime-arguments, order-dependent-trait-objects, coherence-leak-check, unstable-name-collisions, where-clauses-object-safety, proc-macro-derive-resolution-fallback, macro-expanded-macro-exports-accessed-by-absolute-paths, ill-formed-attribute-input, conflicting-repr-hints, ambiguous-associated-items, mutable-borrow-reservation-conflict, indirect-structural-match, pointer-structural-match, nontrivial-structural-match, soft-unstable, cenum-impl-drop-cast, const-evaluatable-unchecked, uninhabited-static, unsupported-naked-functions, invalid-doc-attributes, semicolon-in-expressions-from-macros, legacy-derive-helpers, proc-macro-back-compat, unsupported-calling-conventions, deref-into-dyn-supertrait"##,
124 },
125 Lint {
126 label: "ill_formed_attribute_input",
127 description: r##"ill-formed attribute inputs that were previously accepted and used in practice"##,
128 },
129 Lint {
130 label: "illegal_floating_point_literal_pattern",
131 description: r##"floating-point literals cannot be used in patterns"##,
132 },
133 Lint {
134 label: "improper_ctypes",
135 description: r##"proper use of libc types in foreign modules"##,
136 },
137 Lint {
138 label: "improper_ctypes_definitions",
139 description: r##"proper use of libc types in foreign item definitions"##,
140 },
141 Lint {
142 label: "incomplete_features",
143 description: r##"incomplete features that may function improperly in some or all cases"##,
144 },
145 Lint { label: "incomplete_include", description: r##"trailing content in included file"## },
146 Lint {
147 label: "indirect_structural_match",
148 description: r##"constant used in pattern contains value of non-structural-match type in a field or a variant"##,
149 },
150 Lint {
151 label: "ineffective_unstable_trait_impl",
152 description: r##"detects `#[unstable]` on stable trait implementations for stable types"##,
153 },
154 Lint {
155 label: "inline_no_sanitize",
156 description: r##"detects incompatible use of `#[inline(always)]` and `#[no_sanitize(...)]`"##,
157 },
158 Lint {
159 label: "invalid_atomic_ordering",
160 description: r##"usage of invalid atomic ordering in atomic operations and memory fences"##,
161 },
162 Lint {
163 label: "invalid_doc_attributes",
164 description: r##"detects invalid `#[doc(...)]` attributes"##,
165 },
166 Lint {
167 label: "invalid_type_param_default",
168 description: r##"type parameter default erroneously allowed in invalid location"##,
169 },
170 Lint {
171 label: "invalid_value",
172 description: r##"an invalid value is being created (such as a null reference)"##,
173 },
174 Lint {
175 label: "irrefutable_let_patterns",
176 description: r##"detects irrefutable patterns in `if let` and `while let` statements"##,
177 },
178 Lint {
179 label: "keyword_idents",
180 description: r##"detects edition keywords being used as an identifier"##,
181 },
182 Lint { label: "large_assignments", description: r##"detects large moves or copies"## },
183 Lint {
184 label: "late_bound_lifetime_arguments",
185 description: r##"detects generic lifetime arguments in path segments with late bound lifetime parameters"##,
186 },
187 Lint {
188 label: "legacy_derive_helpers",
189 description: r##"detects derive helper attributes that are used before they are introduced"##,
190 },
191 Lint {
192 label: "macro_expanded_macro_exports_accessed_by_absolute_paths",
193 description: r##"macro-expanded `macro_export` macros from the current crate cannot be referred to by absolute paths"##,
194 },
195 Lint {
196 label: "macro_use_extern_crate",
197 description: r##"the `#[macro_use]` attribute is now deprecated in favor of using macros via the module system"##,
198 },
199 Lint {
200 label: "meta_variable_misuse",
201 description: r##"possible meta-variable misuse at macro definition"##,
202 },
203 Lint { label: "missing_abi", description: r##"No declared ABI for extern declaration"## },
204 Lint {
205 label: "missing_copy_implementations",
206 description: r##"detects potentially-forgotten implementations of `Copy`"##,
207 },
208 Lint {
209 label: "missing_debug_implementations",
210 description: r##"detects missing implementations of Debug"##,
211 },
212 Lint {
213 label: "missing_docs",
214 description: r##"detects missing documentation for public members"##,
215 },
216 Lint {
217 label: "missing_fragment_specifier",
218 description: r##"detects missing fragment specifiers in unused `macro_rules!` patterns"##,
219 },
220 Lint {
221 label: "mixed_script_confusables",
222 description: r##"detects Unicode scripts whose mixed script confusables codepoints are solely used"##,
223 },
224 Lint {
225 label: "must_not_suspend",
226 description: r##"use of a `#[must_not_suspend]` value across a yield point"##,
227 },
228 Lint {
229 label: "mutable_borrow_reservation_conflict",
230 description: r##"reservation of a two-phased borrow conflicts with other shared borrows"##,
231 },
232 Lint {
233 label: "mutable_transmutes",
234 description: r##"mutating transmuted &mut T from &T may cause undefined behavior"##,
235 },
236 Lint { label: "named_asm_labels", description: r##"named labels in inline assembly"## },
237 Lint {
238 label: "no_mangle_const_items",
239 description: r##"const items will not have their symbols exported"##,
240 },
241 Lint { label: "no_mangle_generic_items", description: r##"generic items must be mangled"## },
242 Lint { label: "non_ascii_idents", description: r##"detects non-ASCII identifiers"## },
243 Lint {
244 label: "non_camel_case_types",
245 description: r##"types, variants, traits and type parameters should have camel case names"##,
246 },
247 Lint {
248 label: "non_exhaustive_omitted_patterns",
249 description: r##"detect when patterns of types marked `non_exhaustive` are missed"##,
250 },
251 Lint {
252 label: "non_fmt_panics",
253 description: r##"detect single-argument panic!() invocations in which the argument is not a format string"##,
254 },
255 Lint {
256 label: "non_shorthand_field_patterns",
257 description: r##"using `Struct { x: x }` instead of `Struct { x }` in a pattern"##,
258 },
259 Lint {
260 label: "non_snake_case",
261 description: r##"variables, methods, functions, lifetime parameters and modules should have snake case names"##,
262 },
263 Lint {
264 label: "non_upper_case_globals",
265 description: r##"static constants should have uppercase identifiers"##,
266 },
267 Lint {
268 label: "nonstandard_style",
269 description: r##"lint group for: non-camel-case-types, non-snake-case, non-upper-case-globals"##,
270 },
271 Lint {
272 label: "nontrivial_structural_match",
273 description: r##"constant used in pattern of non-structural-match type and the constant's initializer expression contains values of non-structural-match types"##,
274 },
275 Lint {
276 label: "noop_method_call",
277 description: r##"detects the use of well-known noop methods"##,
278 },
279 Lint {
280 label: "order_dependent_trait_objects",
281 description: r##"trait-object types were treated as different depending on marker-trait order"##,
282 },
283 Lint { label: "overflowing_literals", description: r##"literal out of range for its type"## },
284 Lint {
285 label: "overlapping_range_endpoints",
286 description: r##"detects range patterns with overlapping endpoints"##,
287 },
288 Lint { label: "path_statements", description: r##"path statements with no effect"## },
289 Lint {
290 label: "patterns_in_fns_without_body",
291 description: r##"patterns in functions without body were erroneously allowed"##,
292 },
293 Lint {
294 label: "pointer_structural_match",
295 description: r##"pointers are not structural-match"##,
296 },
297 Lint {
298 label: "private_in_public",
299 description: r##"detect private items in public interfaces not caught by the old implementation"##,
300 },
301 Lint {
302 label: "proc_macro_back_compat",
303 description: r##"detects usage of old versions of certain proc-macro crates"##,
304 },
305 Lint {
306 label: "proc_macro_derive_resolution_fallback",
307 description: r##"detects proc macro derives using inaccessible names from parent modules"##,
308 },
309 Lint {
310 label: "pub_use_of_private_extern_crate",
311 description: r##"detect public re-exports of private extern crates"##,
312 },
313 Lint {
314 label: "redundant_semicolons",
315 description: r##"detects unnecessary trailing semicolons"##,
316 },
317 Lint {
318 label: "renamed_and_removed_lints",
319 description: r##"lints that have been renamed or removed"##,
320 },
321 Lint {
322 label: "rust_2018_compatibility",
323 description: r##"lint group for: keyword-idents, anonymous-parameters, tyvar-behind-raw-pointer, absolute-paths-not-starting-with-crate"##,
324 },
325 Lint {
326 label: "rust_2018_idioms",
327 description: r##"lint group for: bare-trait-objects, unused-extern-crates, ellipsis-inclusive-range-patterns, elided-lifetimes-in-paths, explicit-outlives-requirements"##,
328 },
329 Lint {
330 label: "rust_2021_compatibility",
331 description: r##"lint group for: ellipsis-inclusive-range-patterns, bare-trait-objects, rust-2021-incompatible-closure-captures, rust-2021-incompatible-or-patterns, rust-2021-prelude-collisions, rust-2021-prefixes-incompatible-syntax, array-into-iter, non-fmt-panics"##,
332 },
333 Lint {
334 label: "rust_2021_incompatible_closure_captures",
335 description: r##"detects closures affected by Rust 2021 changes"##,
336 },
337 Lint {
338 label: "rust_2021_incompatible_or_patterns",
339 description: r##"detects usage of old versions of or-patterns"##,
340 },
341 Lint {
342 label: "rust_2021_prefixes_incompatible_syntax",
343 description: r##"identifiers that will be parsed as a prefix in Rust 2021"##,
344 },
345 Lint {
346 label: "rust_2021_prelude_collisions",
347 description: r##"detects the usage of trait methods which are ambiguous with traits added to the prelude in future editions"##,
348 },
349 Lint {
350 label: "semicolon_in_expressions_from_macros",
351 description: r##"trailing semicolon in macro body used as expression"##,
352 },
353 Lint {
354 label: "single_use_lifetimes",
355 description: r##"detects lifetime parameters that are only used once"##,
356 },
357 Lint {
358 label: "soft_unstable",
359 description: r##"a feature gate that doesn't break dependent crates"##,
360 },
361 Lint {
362 label: "stable_features",
363 description: r##"stable features found in `#[feature]` directive"##,
364 },
365 Lint {
366 label: "temporary_cstring_as_ptr",
367 description: r##"detects getting the inner pointer of a temporary `CString`"##,
368 },
369 Lint {
370 label: "text_direction_codepoint_in_comment",
371 description: r##"invisible directionality-changing codepoints in comment"##,
372 },
373 Lint {
374 label: "text_direction_codepoint_in_literal",
375 description: r##"detect special Unicode codepoints that affect the visual representation of text on screen, changing the direction in which text flows"##,
376 },
377 Lint {
378 label: "trivial_bounds",
379 description: r##"these bounds don't depend on an type parameters"##,
380 },
381 Lint {
382 label: "trivial_casts",
383 description: r##"detects trivial casts which could be removed"##,
384 },
385 Lint {
386 label: "trivial_numeric_casts",
387 description: r##"detects trivial casts of numeric types which could be removed"##,
388 },
389 Lint {
390 label: "type_alias_bounds",
391 description: r##"bounds in type aliases are not enforced"##,
392 },
393 Lint {
394 label: "tyvar_behind_raw_pointer",
395 description: r##"raw pointer to an inference variable"##,
396 },
397 Lint {
398 label: "unaligned_references",
399 description: r##"detects unaligned references to fields of packed structs"##,
400 },
401 Lint {
402 label: "uncommon_codepoints",
403 description: r##"detects uncommon Unicode codepoints in identifiers"##,
404 },
405 Lint {
406 label: "unconditional_panic",
407 description: r##"operation will cause a panic at runtime"##,
408 },
409 Lint {
410 label: "unconditional_recursion",
411 description: r##"functions that cannot return without calling themselves"##,
412 },
413 Lint { label: "uninhabited_static", description: r##"uninhabited static"## },
414 Lint {
415 label: "unknown_crate_types",
416 description: r##"unknown crate type found in `#[crate_type]` directive"##,
417 },
418 Lint { label: "unknown_lints", description: r##"unrecognized lint attribute"## },
419 Lint {
420 label: "unnameable_test_items",
421 description: r##"detects an item that cannot be named being marked as `#[test_case]`"##,
422 },
423 Lint { label: "unreachable_code", description: r##"detects unreachable code paths"## },
424 Lint { label: "unreachable_patterns", description: r##"detects unreachable patterns"## },
425 Lint {
426 label: "unreachable_pub",
427 description: r##"`pub` items not reachable from crate root"##,
428 },
429 Lint { label: "unsafe_code", description: r##"usage of `unsafe` code"## },
430 Lint {
431 label: "unsafe_op_in_unsafe_fn",
432 description: r##"unsafe operations in unsafe functions without an explicit unsafe block are deprecated"##,
433 },
434 Lint {
435 label: "unstable_features",
436 description: r##"enabling unstable features (deprecated. do not use)"##,
437 },
438 Lint {
439 label: "unstable_name_collisions",
440 description: r##"detects name collision with an existing but unstable method"##,
441 },
442 Lint {
443 label: "unsupported_calling_conventions",
444 description: r##"use of unsupported calling convention"##,
445 },
446 Lint {
447 label: "unsupported_naked_functions",
448 description: r##"unsupported naked function definitions"##,
449 },
450 Lint {
451 label: "unused",
452 description: r##"lint group for: unused-imports, unused-variables, unused-assignments, dead-code, unused-mut, unreachable-code, unreachable-patterns, unused-must-use, unused-unsafe, path-statements, unused-attributes, unused-macros, unused-allocation, unused-doc-comments, unused-extern-crates, unused-features, unused-labels, unused-parens, unused-braces, redundant-semicolons"##,
453 },
454 Lint {
455 label: "unused_allocation",
456 description: r##"detects unnecessary allocations that can be eliminated"##,
457 },
458 Lint {
459 label: "unused_assignments",
460 description: r##"detect assignments that will never be read"##,
461 },
462 Lint {
463 label: "unused_attributes",
464 description: r##"detects attributes that were not used by the compiler"##,
465 },
466 Lint { label: "unused_braces", description: r##"unnecessary braces around an expression"## },
467 Lint {
468 label: "unused_comparisons",
469 description: r##"comparisons made useless by limits of the types involved"##,
470 },
471 Lint {
472 label: "unused_crate_dependencies",
473 description: r##"crate dependencies that are never used"##,
474 },
475 Lint {
476 label: "unused_doc_comments",
477 description: r##"detects doc comments that aren't used by rustdoc"##,
478 },
479 Lint { label: "unused_extern_crates", description: r##"extern crates that are never used"## },
480 Lint {
481 label: "unused_features",
482 description: r##"unused features found in crate-level `#[feature]` directives"##,
483 },
484 Lint {
485 label: "unused_import_braces",
486 description: r##"unnecessary braces around an imported item"##,
487 },
488 Lint { label: "unused_imports", description: r##"imports that are never used"## },
489 Lint { label: "unused_labels", description: r##"detects labels that are never used"## },
490 Lint {
491 label: "unused_lifetimes",
492 description: r##"detects lifetime parameters that are never used"##,
493 },
494 Lint { label: "unused_macros", description: r##"detects macros that were not used"## },
495 Lint {
496 label: "unused_must_use",
497 description: r##"unused result of a type flagged as `#[must_use]`"##,
498 },
499 Lint {
500 label: "unused_mut",
501 description: r##"detect mut variables which don't need to be mutable"##,
502 },
503 Lint {
504 label: "unused_parens",
505 description: r##"`if`, `match`, `while` and `return` do not need parentheses"##,
506 },
507 Lint {
508 label: "unused_qualifications",
509 description: r##"detects unnecessarily qualified names"##,
510 },
511 Lint {
512 label: "unused_results",
513 description: r##"unused result of an expression in a statement"##,
514 },
515 Lint { label: "unused_unsafe", description: r##"unnecessary use of an `unsafe` block"## },
516 Lint {
517 label: "unused_variables",
518 description: r##"detect variables which are not used in any way"##,
519 },
520 Lint {
521 label: "useless_deprecated",
522 description: r##"detects deprecation attributes with no effect"##,
523 },
524 Lint {
525 label: "variant_size_differences",
526 description: r##"detects enums with widely varying variant sizes"##,
527 },
528 Lint {
529 label: "warnings",
530 description: r##"mass-change the level for lints which produce warnings"##,
531 },
532 Lint {
533 label: "warnings",
534 description: r##"lint group for: all lints that are set to issue warnings"##,
535 },
536 Lint {
537 label: "where_clauses_object_safety",
538 description: r##"checks the object safety of where clauses"##,
539 },
540 Lint {
541 label: "while_true",
542 description: r##"suggest using `loop { }` instead of `while true { }`"##,
543 },
544 ];
545 pub const DEFAULT_LINT_GROUPS: &[LintGroup] = &[
546 LintGroup {
547 lint: Lint {
548 label: "future_incompatible",
549 description: r##"lint group for: forbidden-lint-groups, illegal-floating-point-literal-pattern, private-in-public, pub-use-of-private-extern-crate, invalid-type-param-default, const-err, unaligned-references, patterns-in-fns-without-body, missing-fragment-specifier, late-bound-lifetime-arguments, order-dependent-trait-objects, coherence-leak-check, unstable-name-collisions, where-clauses-object-safety, proc-macro-derive-resolution-fallback, macro-expanded-macro-exports-accessed-by-absolute-paths, ill-formed-attribute-input, conflicting-repr-hints, ambiguous-associated-items, mutable-borrow-reservation-conflict, indirect-structural-match, pointer-structural-match, nontrivial-structural-match, soft-unstable, cenum-impl-drop-cast, const-evaluatable-unchecked, uninhabited-static, unsupported-naked-functions, invalid-doc-attributes, semicolon-in-expressions-from-macros, legacy-derive-helpers, proc-macro-back-compat, unsupported-calling-conventions, deref-into-dyn-supertrait"##,
550 },
551 children: &[
552 "forbidden_lint_groups",
553 "illegal_floating_point_literal_pattern",
554 "private_in_public",
555 "pub_use_of_private_extern_crate",
556 "invalid_type_param_default",
557 "const_err",
558 "unaligned_references",
559 "patterns_in_fns_without_body",
560 "missing_fragment_specifier",
561 "late_bound_lifetime_arguments",
562 "order_dependent_trait_objects",
563 "coherence_leak_check",
564 "unstable_name_collisions",
565 "where_clauses_object_safety",
566 "proc_macro_derive_resolution_fallback",
567 "macro_expanded_macro_exports_accessed_by_absolute_paths",
568 "ill_formed_attribute_input",
569 "conflicting_repr_hints",
570 "ambiguous_associated_items",
571 "mutable_borrow_reservation_conflict",
572 "indirect_structural_match",
573 "pointer_structural_match",
574 "nontrivial_structural_match",
575 "soft_unstable",
576 "cenum_impl_drop_cast",
577 "const_evaluatable_unchecked",
578 "uninhabited_static",
579 "unsupported_naked_functions",
580 "invalid_doc_attributes",
581 "semicolon_in_expressions_from_macros",
582 "legacy_derive_helpers",
583 "proc_macro_back_compat",
584 "unsupported_calling_conventions",
585 "deref_into_dyn_supertrait",
586 ],
587 },
588 LintGroup {
589 lint: Lint {
590 label: "nonstandard_style",
591 description: r##"lint group for: non-camel-case-types, non-snake-case, non-upper-case-globals"##,
592 },
593 children: &["non_camel_case_types", "non_snake_case", "non_upper_case_globals"],
594 },
595 LintGroup {
596 lint: Lint {
597 label: "rust_2018_compatibility",
598 description: r##"lint group for: keyword-idents, anonymous-parameters, tyvar-behind-raw-pointer, absolute-paths-not-starting-with-crate"##,
599 },
600 children: &[
601 "keyword_idents",
602 "anonymous_parameters",
603 "tyvar_behind_raw_pointer",
604 "absolute_paths_not_starting_with_crate",
605 ],
606 },
607 LintGroup {
608 lint: Lint {
609 label: "rust_2018_idioms",
610 description: r##"lint group for: bare-trait-objects, unused-extern-crates, ellipsis-inclusive-range-patterns, elided-lifetimes-in-paths, explicit-outlives-requirements"##,
611 },
612 children: &[
613 "bare_trait_objects",
614 "unused_extern_crates",
615 "ellipsis_inclusive_range_patterns",
616 "elided_lifetimes_in_paths",
617 "explicit_outlives_requirements",
618 ],
619 },
620 LintGroup {
621 lint: Lint {
622 label: "rust_2021_compatibility",
623 description: r##"lint group for: ellipsis-inclusive-range-patterns, bare-trait-objects, rust-2021-incompatible-closure-captures, rust-2021-incompatible-or-patterns, rust-2021-prelude-collisions, rust-2021-prefixes-incompatible-syntax, array-into-iter, non-fmt-panics"##,
624 },
625 children: &[
626 "ellipsis_inclusive_range_patterns",
627 "bare_trait_objects",
628 "rust_2021_incompatible_closure_captures",
629 "rust_2021_incompatible_or_patterns",
630 "rust_2021_prelude_collisions",
631 "rust_2021_prefixes_incompatible_syntax",
632 "array_into_iter",
633 "non_fmt_panics",
634 ],
635 },
636 LintGroup {
637 lint: Lint {
638 label: "unused",
639 description: r##"lint group for: unused-imports, unused-variables, unused-assignments, dead-code, unused-mut, unreachable-code, unreachable-patterns, unused-must-use, unused-unsafe, path-statements, unused-attributes, unused-macros, unused-allocation, unused-doc-comments, unused-extern-crates, unused-features, unused-labels, unused-parens, unused-braces, redundant-semicolons"##,
640 },
641 children: &[
642 "unused_imports",
643 "unused_variables",
644 "unused_assignments",
645 "dead_code",
646 "unused_mut",
647 "unreachable_code",
648 "unreachable_patterns",
649 "unused_must_use",
650 "unused_unsafe",
651 "path_statements",
652 "unused_attributes",
653 "unused_macros",
654 "unused_allocation",
655 "unused_doc_comments",
656 "unused_extern_crates",
657 "unused_features",
658 "unused_labels",
659 "unused_parens",
660 "unused_braces",
661 "redundant_semicolons",
662 ],
663 },
664 LintGroup {
665 lint: Lint {
666 label: "warnings",
667 description: r##"lint group for: all lints that are set to issue warnings"##,
668 },
669 children: &[],
670 },
671 ];
672
673 pub const RUSTDOC_LINTS: &[Lint] = &[
674 Lint {
675 label: "rustdoc::all",
676 description: r##"lint group for: rustdoc::broken-intra-doc-links, rustdoc::private-intra-doc-links, rustdoc::missing-doc-code-examples, rustdoc::private-doc-tests, rustdoc::invalid-codeblock-attributes, rustdoc::invalid-rust-codeblocks, rustdoc::invalid-html-tags, rustdoc::bare-urls, rustdoc::missing-crate-level-docs"##,
677 },
678 Lint { label: "rustdoc::bare_urls", description: r##"detects URLs that are not hyperlinks"## },
679 Lint {
680 label: "rustdoc::broken_intra_doc_links",
681 description: r##"failures in resolving intra-doc link targets"##,
682 },
683 Lint {
684 label: "rustdoc::invalid_codeblock_attributes",
685 description: r##"codeblock attribute looks a lot like a known one"##,
686 },
687 Lint {
688 label: "rustdoc::invalid_html_tags",
689 description: r##"detects invalid HTML tags in doc comments"##,
690 },
691 Lint {
692 label: "rustdoc::invalid_rust_codeblocks",
693 description: r##"codeblock could not be parsed as valid Rust or is empty"##,
694 },
695 Lint {
696 label: "rustdoc::missing_crate_level_docs",
697 description: r##"detects crates with no crate-level documentation"##,
698 },
699 Lint {
700 label: "rustdoc::missing_doc_code_examples",
701 description: r##"detects publicly-exported items without code samples in their documentation"##,
702 },
703 Lint {
704 label: "rustdoc::private_doc_tests",
705 description: r##"detects code samples in docs of private items not documented by rustdoc"##,
706 },
707 Lint {
708 label: "rustdoc::private_intra_doc_links",
709 description: r##"linking from a public item to a private one"##,
710 },
711 ];
712 pub const RUSTDOC_LINT_GROUPS: &[LintGroup] = &[LintGroup {
713 lint: Lint {
714 label: "rustdoc::all",
715 description: r##"lint group for: rustdoc::broken-intra-doc-links, rustdoc::private-intra-doc-links, rustdoc::missing-doc-code-examples, rustdoc::private-doc-tests, rustdoc::invalid-codeblock-attributes, rustdoc::invalid-rust-codeblocks, rustdoc::invalid-html-tags, rustdoc::bare-urls, rustdoc::missing-crate-level-docs"##,
716 },
717 children: &[
718 "rustdoc::broken_intra_doc_links",
719 "rustdoc::private_intra_doc_links",
720 "rustdoc::missing_doc_code_examples",
721 "rustdoc::private_doc_tests",
722 "rustdoc::invalid_codeblock_attributes",
723 "rustdoc::invalid_rust_codeblocks",
724 "rustdoc::invalid_html_tags",
725 "rustdoc::bare_urls",
726 "rustdoc::missing_crate_level_docs",
727 ],
728 }];
729
730 pub const FEATURES: &[Lint] = &[
731 Lint {
732 label: "abi_c_cmse_nonsecure_call",
733 description: r##"# `abi_c_cmse_nonsecure_call`
734
735 The tracking issue for this feature is: [#81391]
736
737 [#81391]: https://github.com/rust-lang/rust/issues/81391
738
739 ------------------------
740
741 The [TrustZone-M
742 feature](https://developer.arm.com/documentation/100690/latest/) is available
743 for targets with the Armv8-M architecture profile (`thumbv8m` in their target
744 name).
745 LLVM, the Rust compiler and the linker are providing
746 [support](https://developer.arm.com/documentation/ecm0359818/latest/) for the
747 TrustZone-M feature.
748
749 One of the things provided, with this unstable feature, is the
750 `C-cmse-nonsecure-call` function ABI. This ABI is used on function pointers to
751 non-secure code to mark a non-secure function call (see [section
752 5.5](https://developer.arm.com/documentation/ecm0359818/latest/) for details).
753
754 With this ABI, the compiler will do the following to perform the call:
755 * save registers needed after the call to Secure memory
756 * clear all registers that might contain confidential information
757 * clear the Least Significant Bit of the function address
758 * branches using the BLXNS instruction
759
760 To avoid using the non-secure stack, the compiler will constrain the number and
761 type of parameters/return value.
762
763 The `extern "C-cmse-nonsecure-call"` ABI is otherwise equivalent to the
764 `extern "C"` ABI.
765
766 <!-- NOTE(ignore) this example is specific to thumbv8m targets -->
767
768 ``` rust,ignore
769 #![no_std]
770 #![feature(abi_c_cmse_nonsecure_call)]
771
772 #[no_mangle]
773 pub fn call_nonsecure_function(addr: usize) -> u32 {
774 let non_secure_function =
775 unsafe { core::mem::transmute::<usize, extern "C-cmse-nonsecure-call" fn() -> u32>(addr) };
776 non_secure_function()
777 }
778 ```
779
780 ``` text
781 $ rustc --emit asm --crate-type lib --target thumbv8m.main-none-eabi function.rs
782
783 call_nonsecure_function:
784 .fnstart
785 .save {r7, lr}
786 push {r7, lr}
787 .setfp r7, sp
788 mov r7, sp
789 .pad #16
790 sub sp, #16
791 str r0, [sp, #12]
792 ldr r0, [sp, #12]
793 str r0, [sp, #8]
794 b .LBB0_1
795 .LBB0_1:
796 ldr r0, [sp, #8]
797 push.w {r4, r5, r6, r7, r8, r9, r10, r11}
798 bic r0, r0, #1
799 mov r1, r0
800 mov r2, r0
801 mov r3, r0
802 mov r4, r0
803 mov r5, r0
804 mov r6, r0
805 mov r7, r0
806 mov r8, r0
807 mov r9, r0
808 mov r10, r0
809 mov r11, r0
810 mov r12, r0
811 msr apsr_nzcvq, r0
812 blxns r0
813 pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
814 str r0, [sp, #4]
815 b .LBB0_2
816 .LBB0_2:
817 ldr r0, [sp, #4]
818 add sp, #16
819 pop {r7, pc}
820 ```
821 "##,
822 },
823 Lint {
824 label: "abi_msp430_interrupt",
825 description: r##"# `abi_msp430_interrupt`
826
827 The tracking issue for this feature is: [#38487]
828
829 [#38487]: https://github.com/rust-lang/rust/issues/38487
830
831 ------------------------
832
833 In the MSP430 architecture, interrupt handlers have a special calling
834 convention. You can use the `"msp430-interrupt"` ABI to make the compiler apply
835 the right calling convention to the interrupt handlers you define.
836
837 <!-- NOTE(ignore) this example is specific to the msp430 target -->
838
839 ``` rust,ignore
840 #![feature(abi_msp430_interrupt)]
841 #![no_std]
842
843 // Place the interrupt handler at the appropriate memory address
844 // (Alternatively, you can use `#[used]` and remove `pub` and `#[no_mangle]`)
845 #[link_section = "__interrupt_vector_10"]
846 #[no_mangle]
847 pub static TIM0_VECTOR: extern "msp430-interrupt" fn() = tim0;
848
849 // The interrupt handler
850 extern "msp430-interrupt" fn tim0() {
851 // ..
852 }
853 ```
854
855 ``` text
856 $ msp430-elf-objdump -CD ./target/msp430/release/app
857 Disassembly of section __interrupt_vector_10:
858
859 0000fff2 <TIM0_VECTOR>:
860 fff2: 00 c0 interrupt service routine at 0xc000
861
862 Disassembly of section .text:
863
864 0000c000 <int::tim0>:
865 c000: 00 13 reti
866 ```
867 "##,
868 },
869 Lint {
870 label: "abi_ptx",
871 description: r##"# `abi_ptx`
872
873 The tracking issue for this feature is: [#38788]
874
875 [#38788]: https://github.com/rust-lang/rust/issues/38788
876
877 ------------------------
878
879 When emitting PTX code, all vanilla Rust functions (`fn`) get translated to
880 "device" functions. These functions are *not* callable from the host via the
881 CUDA API so a crate with only device functions is not too useful!
882
883 OTOH, "global" functions *can* be called by the host; you can think of them
884 as the real public API of your crate. To produce a global function use the
885 `"ptx-kernel"` ABI.
886
887 <!-- NOTE(ignore) this example is specific to the nvptx targets -->
888
889 ``` rust,ignore
890 #![feature(abi_ptx)]
891 #![no_std]
892
893 pub unsafe extern "ptx-kernel" fn global_function() {
894 device_function();
895 }
896
897 pub fn device_function() {
898 // ..
899 }
900 ```
901
902 ``` text
903 $ xargo rustc --target nvptx64-nvidia-cuda --release -- --emit=asm
904
905 $ cat $(find -name '*.s')
906 //
907 // Generated by LLVM NVPTX Back-End
908 //
909
910 .version 3.2
911 .target sm_20
912 .address_size 64
913
914 // .globl _ZN6kernel15global_function17h46111ebe6516b382E
915
916 .visible .entry _ZN6kernel15global_function17h46111ebe6516b382E()
917 {
918
919
920 ret;
921 }
922
923 // .globl _ZN6kernel15device_function17hd6a0e4993bbf3f78E
924 .visible .func _ZN6kernel15device_function17hd6a0e4993bbf3f78E()
925 {
926
927
928 ret;
929 }
930 ```
931 "##,
932 },
933 Lint {
934 label: "abi_thiscall",
935 description: r##"# `abi_thiscall`
936
937 The tracking issue for this feature is: [#42202]
938
939 [#42202]: https://github.com/rust-lang/rust/issues/42202
940
941 ------------------------
942
943 The MSVC ABI on x86 Windows uses the `thiscall` calling convention for C++
944 instance methods by default; it is identical to the usual (C) calling
945 convention on x86 Windows except that the first parameter of the method,
946 the `this` pointer, is passed in the ECX register.
947 "##,
948 },
949 Lint {
950 label: "allocator_api",
951 description: r##"# `allocator_api`
952
953 The tracking issue for this feature is [#32838]
954
955 [#32838]: https://github.com/rust-lang/rust/issues/32838
956
957 ------------------------
958
959 Sometimes you want the memory for one collection to use a different
960 allocator than the memory for another collection. In this case,
961 replacing the global allocator is not a workable option. Instead,
962 you need to pass in an instance of an `AllocRef` to each collection
963 for which you want a custom allocator.
964
965 TBD
966 "##,
967 },
968 Lint {
969 label: "allocator_internals",
970 description: r##"# `allocator_internals`
971
972 This feature does not have a tracking issue, it is an unstable implementation
973 detail of the `global_allocator` feature not intended for use outside the
974 compiler.
975
976 ------------------------
977 "##,
978 },
979 Lint {
980 label: "arbitrary_enum_discriminant",
981 description: r##"# `arbitrary_enum_discriminant`
982
983 The tracking issue for this feature is: [#60553]
984
985 [#60553]: https://github.com/rust-lang/rust/issues/60553
986
987 ------------------------
988
989 The `arbitrary_enum_discriminant` feature permits tuple-like and
990 struct-like enum variants with `#[repr(<int-type>)]` to have explicit discriminants.
991
992 ## Examples
993
994 ```rust
995 #![feature(arbitrary_enum_discriminant)]
996
997 #[allow(dead_code)]
998 #[repr(u8)]
999 enum Enum {
1000 Unit = 3,
1001 Tuple(u16) = 2,
1002 Struct {
1003 a: u8,
1004 b: u16,
1005 } = 1,
1006 }
1007
1008 impl Enum {
1009 fn tag(&self) -> u8 {
1010 unsafe { *(self as *const Self as *const u8) }
1011 }
1012 }
1013
1014 assert_eq!(3, Enum::Unit.tag());
1015 assert_eq!(2, Enum::Tuple(5).tag());
1016 assert_eq!(1, Enum::Struct{a: 7, b: 11}.tag());
1017 ```
1018 "##,
1019 },
1020 Lint {
1021 label: "asm_const",
1022 description: r##"# `asm_const`
1023
1024 The tracking issue for this feature is: [#72016]
1025
1026 [#72016]: https://github.com/rust-lang/rust/issues/72016
1027
1028 ------------------------
1029
1030 This feature adds a `const <expr>` operand type to `asm!` and `global_asm!`.
1031 - `<expr>` must be an integer constant expression.
1032 - The value of the expression is formatted as a string and substituted directly into the asm template string.
1033 "##,
1034 },
1035 Lint {
1036 label: "asm_experimental_arch",
1037 description: r##"# `asm_experimental_arch`
1038
1039 The tracking issue for this feature is: [#72016]
1040
1041 [#72016]: https://github.com/rust-lang/rust/issues/72016
1042
1043 ------------------------
1044
1045 This feature tracks `asm!` and `global_asm!` support for the following architectures:
1046 - NVPTX
1047 - PowerPC
1048 - Hexagon
1049 - MIPS32r2 and MIPS64r2
1050 - wasm32
1051 - BPF
1052 - SPIR-V
1053 - AVR
1054
1055 ## Register classes
1056
1057 | Architecture | Register class | Registers | LLVM constraint code |
1058 | ------------ | -------------- | ---------------------------------- | -------------------- |
1059 | MIPS | `reg` | `$[2-25]` | `r` |
1060 | MIPS | `freg` | `$f[0-31]` | `f` |
1061 | NVPTX | `reg16` | None\* | `h` |
1062 | NVPTX | `reg32` | None\* | `r` |
1063 | NVPTX | `reg64` | None\* | `l` |
1064 | Hexagon | `reg` | `r[0-28]` | `r` |
1065 | PowerPC | `reg` | `r[0-31]` | `r` |
1066 | PowerPC | `reg_nonzero` | `r[1-31]` | `b` |
1067 | PowerPC | `freg` | `f[0-31]` | `f` |
1068 | PowerPC | `cr` | `cr[0-7]`, `cr` | Only clobbers |
1069 | PowerPC | `xer` | `xer` | Only clobbers |
1070 | wasm32 | `local` | None\* | `r` |
1071 | BPF | `reg` | `r[0-10]` | `r` |
1072 | BPF | `wreg` | `w[0-10]` | `w` |
1073 | AVR | `reg` | `r[2-25]`, `XH`, `XL`, `ZH`, `ZL` | `r` |
1074 | AVR | `reg_upper` | `r[16-25]`, `XH`, `XL`, `ZH`, `ZL` | `d` |
1075 | AVR | `reg_pair` | `r3r2` .. `r25r24`, `X`, `Z` | `r` |
1076 | AVR | `reg_iw` | `r25r24`, `X`, `Z` | `w` |
1077 | AVR | `reg_ptr` | `X`, `Z` | `e` |
1078
1079 > **Notes**:
1080 > - NVPTX doesn't have a fixed register set, so named registers are not supported.
1081 >
1082 > - WebAssembly doesn't have registers, so named registers are not supported.
1083
1084 # Register class supported types
1085
1086 | Architecture | Register class | Target feature | Allowed types |
1087 | ------------ | ------------------------------- | -------------- | --------------------------------------- |
1088 | MIPS32 | `reg` | None | `i8`, `i16`, `i32`, `f32` |
1089 | MIPS32 | `freg` | None | `f32`, `f64` |
1090 | MIPS64 | `reg` | None | `i8`, `i16`, `i32`, `i64`, `f32`, `f64` |
1091 | MIPS64 | `freg` | None | `f32`, `f64` |
1092 | NVPTX | `reg16` | None | `i8`, `i16` |
1093 | NVPTX | `reg32` | None | `i8`, `i16`, `i32`, `f32` |
1094 | NVPTX | `reg64` | None | `i8`, `i16`, `i32`, `f32`, `i64`, `f64` |
1095 | Hexagon | `reg` | None | `i8`, `i16`, `i32`, `f32` |
1096 | PowerPC | `reg` | None | `i8`, `i16`, `i32` |
1097 | PowerPC | `reg_nonzero` | None | `i8`, `i16`, `i32` |
1098 | PowerPC | `freg` | None | `f32`, `f64` |
1099 | PowerPC | `cr` | N/A | Only clobbers |
1100 | PowerPC | `xer` | N/A | Only clobbers |
1101 | wasm32 | `local` | None | `i8` `i16` `i32` `i64` `f32` `f64` |
1102 | BPF | `reg` | None | `i8` `i16` `i32` `i64` |
1103 | BPF | `wreg` | `alu32` | `i8` `i16` `i32` |
1104 | AVR | `reg`, `reg_upper` | None | `i8` |
1105 | AVR | `reg_pair`, `reg_iw`, `reg_ptr` | None | `i16` |
1106
1107 ## Register aliases
1108
1109 | Architecture | Base register | Aliases |
1110 | ------------ | ------------- | --------- |
1111 | Hexagon | `r29` | `sp` |
1112 | Hexagon | `r30` | `fr` |
1113 | Hexagon | `r31` | `lr` |
1114 | BPF | `r[0-10]` | `w[0-10]` |
1115 | AVR | `XH` | `r27` |
1116 | AVR | `XL` | `r26` |
1117 | AVR | `ZH` | `r31` |
1118 | AVR | `ZL` | `r30` |
1119
1120 ## Unsupported registers
1121
1122 | Architecture | Unsupported register | Reason |
1123 | ------------ | --------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1124 | All | `sp` | The stack pointer must be restored to its original value at the end of an asm code block. |
1125 | All | `fr` (Hexagon), `$fp` (MIPS), `Y` (AVR) | The frame pointer cannot be used as an input or output. |
1126 | All | `r19` (Hexagon) | This is used internally by LLVM as a "base pointer" for functions with complex stack frames. |
1127 | MIPS | `$0` or `$zero` | This is a constant zero register which can't be modified. |
1128 | MIPS | `$1` or `$at` | Reserved for assembler. |
1129 | MIPS | `$26`/`$k0`, `$27`/`$k1` | OS-reserved registers. |
1130 | MIPS | `$28`/`$gp` | Global pointer cannot be used as inputs or outputs. |
1131 | MIPS | `$ra` | Return address cannot be used as inputs or outputs. |
1132 | Hexagon | `lr` | This is the link register which cannot be used as an input or output. |
1133 | AVR | `r0`, `r1`, `r1r0` | Due to an issue in LLVM, the `r0` and `r1` registers cannot be used as inputs or outputs. If modified, they must be restored to their original values before the end of the block. |
1134
1135 ## Template modifiers
1136
1137 | Architecture | Register class | Modifier | Example output | LLVM modifier |
1138 | ------------ | -------------- | -------- | -------------- | ------------- |
1139 | MIPS | `reg` | None | `$2` | None |
1140 | MIPS | `freg` | None | `$f0` | None |
1141 | NVPTX | `reg16` | None | `rs0` | None |
1142 | NVPTX | `reg32` | None | `r0` | None |
1143 | NVPTX | `reg64` | None | `rd0` | None |
1144 | Hexagon | `reg` | None | `r0` | None |
1145 | PowerPC | `reg` | None | `0` | None |
1146 | PowerPC | `reg_nonzero` | None | `3` | `b` |
1147 | PowerPC | `freg` | None | `0` | None |
1148
1149 # Flags covered by `preserves_flags`
1150
1151 These flags registers must be restored upon exiting the asm block if the `preserves_flags` option is set:
1152 - AVR
1153 - The status register `SREG`.
1154 "##,
1155 },
1156 Lint {
1157 label: "asm_sym",
1158 description: r##"# `asm_sym`
1159
1160 The tracking issue for this feature is: [#72016]
1161
1162 [#72016]: https://github.com/rust-lang/rust/issues/72016
1163
1164 ------------------------
1165
1166 This feature adds a `sym <path>` operand type to `asm!` and `global_asm!`.
1167 - `<path>` must refer to a `fn` or `static`.
1168 - A mangled symbol name referring to the item is substituted into the asm template string.
1169 - The substituted string does not include any modifiers (e.g. GOT, PLT, relocations, etc).
1170 - `<path>` is allowed to point to a `#[thread_local]` static, in which case the asm code can combine the symbol with relocations (e.g. `@plt`, `@TPOFF`) to read from thread-local data.
1171 "##,
1172 },
1173 Lint {
1174 label: "asm_unwind",
1175 description: r##"# `asm_unwind`
1176
1177 The tracking issue for this feature is: [#72016]
1178
1179 [#72016]: https://github.com/rust-lang/rust/issues/72016
1180
1181 ------------------------
1182
1183 This feature adds a `may_unwind` option to `asm!` which allows an `asm` block to unwind stack and be part of the stack unwinding process. This option is only supported by the LLVM backend right now.
1184 "##,
1185 },
1186 Lint {
1187 label: "auto_traits",
1188 description: r##"# `auto_traits`
1189
1190 The tracking issue for this feature is [#13231]
1191
1192 [#13231]: https://github.com/rust-lang/rust/issues/13231
1193
1194 ----
1195
1196 The `auto_traits` feature gate allows you to define auto traits.
1197
1198 Auto traits, like [`Send`] or [`Sync`] in the standard library, are marker traits
1199 that are automatically implemented for every type, unless the type, or a type it contains,
1200 has explicitly opted out via a negative impl. (Negative impls are separately controlled
1201 by the `negative_impls` feature.)
1202
1203 [`Send`]: https://doc.rust-lang.org/std/marker/trait.Send.html
1204 [`Sync`]: https://doc.rust-lang.org/std/marker/trait.Sync.html
1205
1206 ```rust,ignore (partial-example)
1207 impl !Trait for Type {}
1208 ```
1209
1210 Example:
1211
1212 ```rust
1213 #![feature(negative_impls)]
1214 #![feature(auto_traits)]
1215
1216 auto trait Valid {}
1217
1218 struct True;
1219 struct False;
1220
1221 impl !Valid for False {}
1222
1223 struct MaybeValid<T>(T);
1224
1225 fn must_be_valid<T: Valid>(_t: T) { }
1226
1227 fn main() {
1228 // works
1229 must_be_valid( MaybeValid(True) );
1230
1231 // compiler error - trait bound not satisfied
1232 // must_be_valid( MaybeValid(False) );
1233 }
1234 ```
1235
1236 ## Automatic trait implementations
1237
1238 When a type is declared as an `auto trait`, we will automatically
1239 create impls for every struct/enum/union, unless an explicit impl is
1240 provided. These automatic impls contain a where clause for each field
1241 of the form `T: AutoTrait`, where `T` is the type of the field and
1242 `AutoTrait` is the auto trait in question. As an example, consider the
1243 struct `List` and the auto trait `Send`:
1244
1245 ```rust
1246 struct List<T> {
1247 data: T,
1248 next: Option<Box<List<T>>>,
1249 }
1250 ```
1251
1252 Presuming that there is no explicit impl of `Send` for `List`, the
1253 compiler will supply an automatic impl of the form:
1254
1255 ```rust
1256 struct List<T> {
1257 data: T,
1258 next: Option<Box<List<T>>>,
1259 }
1260
1261 unsafe impl<T> Send for List<T>
1262 where
1263 T: Send, // from the field `data`
1264 Option<Box<List<T>>>: Send, // from the field `next`
1265 { }
1266 ```
1267
1268 Explicit impls may be either positive or negative. They take the form:
1269
1270 ```rust,ignore (partial-example)
1271 impl<...> AutoTrait for StructName<..> { }
1272 impl<...> !AutoTrait for StructName<..> { }
1273 ```
1274
1275 ## Coinduction: Auto traits permit cyclic matching
1276
1277 Unlike ordinary trait matching, auto traits are **coinductive**. This
1278 means, in short, that cycles which occur in trait matching are
1279 considered ok. As an example, consider the recursive struct `List`
1280 introduced in the previous section. In attempting to determine whether
1281 `List: Send`, we would wind up in a cycle: to apply the impl, we must
1282 show that `Option<Box<List>>: Send`, which will in turn require
1283 `Box<List>: Send` and then finally `List: Send` again. Under ordinary
1284 trait matching, this cycle would be an error, but for an auto trait it
1285 is considered a successful match.
1286
1287 ## Items
1288
1289 Auto traits cannot have any trait items, such as methods or associated types. This ensures that we can generate default implementations.
1290
1291 ## Supertraits
1292
1293 Auto traits cannot have supertraits. This is for soundness reasons, as the interaction of coinduction with implied bounds is difficult to reconcile.
1294 "##,
1295 },
1296 Lint {
1297 label: "box_patterns",
1298 description: r##"# `box_patterns`
1299
1300 The tracking issue for this feature is: [#29641]
1301
1302 [#29641]: https://github.com/rust-lang/rust/issues/29641
1303
1304 See also [`box_syntax`](box-syntax.md)
1305
1306 ------------------------
1307
1308 Box patterns let you match on `Box<T>`s:
1309
1310
1311 ```rust
1312 #![feature(box_patterns)]
1313
1314 fn main() {
1315 let b = Some(Box::new(5));
1316 match b {
1317 Some(box n) if n < 0 => {
1318 println!("Box contains negative number {}", n);
1319 },
1320 Some(box n) if n >= 0 => {
1321 println!("Box contains non-negative number {}", n);
1322 },
1323 None => {
1324 println!("No box");
1325 },
1326 _ => unreachable!()
1327 }
1328 }
1329 ```
1330 "##,
1331 },
1332 Lint {
1333 label: "box_syntax",
1334 description: r##"# `box_syntax`
1335
1336 The tracking issue for this feature is: [#49733]
1337
1338 [#49733]: https://github.com/rust-lang/rust/issues/49733
1339
1340 See also [`box_patterns`](box-patterns.md)
1341
1342 ------------------------
1343
1344 Currently the only stable way to create a `Box` is via the `Box::new` method.
1345 Also it is not possible in stable Rust to destructure a `Box` in a match
1346 pattern. The unstable `box` keyword can be used to create a `Box`. An example
1347 usage would be:
1348
1349 ```rust
1350 #![feature(box_syntax)]
1351
1352 fn main() {
1353 let b = box 5;
1354 }
1355 ```
1356 "##,
1357 },
1358 Lint {
1359 label: "c_unwind",
1360 description: r##"# `c_unwind`
1361
1362 The tracking issue for this feature is: [#74990]
1363
1364 [#74990]: https://github.com/rust-lang/rust/issues/74990
1365
1366 ------------------------
1367
1368 Introduces four new ABI strings: "C-unwind", "stdcall-unwind",
1369 "thiscall-unwind", and "system-unwind". These enable unwinding from other
1370 languages (such as C++) into Rust frames and from Rust into other languages.
1371
1372 See [RFC 2945] for more information.
1373
1374 [RFC 2945]: https://github.com/rust-lang/rfcs/blob/master/text/2945-c-unwind-abi.md
1375 "##,
1376 },
1377 Lint {
1378 label: "c_variadic",
1379 description: r##"# `c_variadic`
1380
1381 The tracking issue for this feature is: [#44930]
1382
1383 [#44930]: https://github.com/rust-lang/rust/issues/44930
1384
1385 ------------------------
1386
1387 The `c_variadic` language feature enables C-variadic functions to be
1388 defined in Rust. The may be called both from within Rust and via FFI.
1389
1390 ## Examples
1391
1392 ```rust
1393 #![feature(c_variadic)]
1394
1395 pub unsafe extern "C" fn add(n: usize, mut args: ...) -> usize {
1396 let mut sum = 0;
1397 for _ in 0..n {
1398 sum += args.arg::<usize>();
1399 }
1400 sum
1401 }
1402 ```
1403 "##,
1404 },
1405 Lint {
1406 label: "c_variadic",
1407 description: r##"# `c_variadic`
1408
1409 The tracking issue for this feature is: [#44930]
1410
1411 [#44930]: https://github.com/rust-lang/rust/issues/44930
1412
1413 ------------------------
1414
1415 The `c_variadic` library feature exposes the `VaList` structure,
1416 Rust's analogue of C's `va_list` type.
1417
1418 ## Examples
1419
1420 ```rust
1421 #![feature(c_variadic)]
1422
1423 use std::ffi::VaList;
1424
1425 pub unsafe extern "C" fn vadd(n: usize, mut args: VaList) -> usize {
1426 let mut sum = 0;
1427 for _ in 0..n {
1428 sum += args.arg::<usize>();
1429 }
1430 sum
1431 }
1432 ```
1433 "##,
1434 },
1435 Lint {
1436 label: "c_void_variant",
1437 description: r##"# `c_void_variant`
1438
1439 This feature is internal to the Rust compiler and is not intended for general use.
1440
1441 ------------------------
1442 "##,
1443 },
1444 Lint {
1445 label: "cfg_panic",
1446 description: r##"# `cfg_panic`
1447
1448 The tracking issue for this feature is: [#77443]
1449
1450 [#77443]: https://github.com/rust-lang/rust/issues/77443
1451
1452 ------------------------
1453
1454 The `cfg_panic` feature makes it possible to execute different code
1455 depending on the panic strategy.
1456
1457 Possible values at the moment are `"unwind"` or `"abort"`, although
1458 it is possible that new panic strategies may be added to Rust in the
1459 future.
1460
1461 ## Examples
1462
1463 ```rust
1464 #![feature(cfg_panic)]
1465
1466 #[cfg(panic = "unwind")]
1467 fn a() {
1468 // ...
1469 }
1470
1471 #[cfg(not(panic = "unwind"))]
1472 fn a() {
1473 // ...
1474 }
1475
1476 fn b() {
1477 if cfg!(panic = "abort") {
1478 // ...
1479 } else {
1480 // ...
1481 }
1482 }
1483 ```
1484 "##,
1485 },
1486 Lint {
1487 label: "cfg_sanitize",
1488 description: r##"# `cfg_sanitize`
1489
1490 The tracking issue for this feature is: [#39699]
1491
1492 [#39699]: https://github.com/rust-lang/rust/issues/39699
1493
1494 ------------------------
1495
1496 The `cfg_sanitize` feature makes it possible to execute different code
1497 depending on whether a particular sanitizer is enabled or not.
1498
1499 ## Examples
1500
1501 ```rust
1502 #![feature(cfg_sanitize)]
1503
1504 #[cfg(sanitize = "thread")]
1505 fn a() {
1506 // ...
1507 }
1508
1509 #[cfg(not(sanitize = "thread"))]
1510 fn a() {
1511 // ...
1512 }
1513
1514 fn b() {
1515 if cfg!(sanitize = "leak") {
1516 // ...
1517 } else {
1518 // ...
1519 }
1520 }
1521 ```
1522 "##,
1523 },
1524 Lint {
1525 label: "cfg_version",
1526 description: r##"# `cfg_version`
1527
1528 The tracking issue for this feature is: [#64796]
1529
1530 [#64796]: https://github.com/rust-lang/rust/issues/64796
1531
1532 ------------------------
1533
1534 The `cfg_version` feature makes it possible to execute different code
1535 depending on the compiler version. It will return true if the compiler
1536 version is greater than or equal to the specified version.
1537
1538 ## Examples
1539
1540 ```rust
1541 #![feature(cfg_version)]
1542
1543 #[cfg(version("1.42"))] // 1.42 and above
1544 fn a() {
1545 // ...
1546 }
1547
1548 #[cfg(not(version("1.42")))] // 1.41 and below
1549 fn a() {
1550 // ...
1551 }
1552
1553 fn b() {
1554 if cfg!(version("1.42")) {
1555 // ...
1556 } else {
1557 // ...
1558 }
1559 }
1560 ```
1561 "##,
1562 },
1563 Lint {
1564 label: "char_error_internals",
1565 description: r##"# `char_error_internals`
1566
1567 This feature is internal to the Rust compiler and is not intended for general use.
1568
1569 ------------------------
1570 "##,
1571 },
1572 Lint {
1573 label: "closure_track_caller",
1574 description: r##"# `closure_track_caller`
1575
1576 The tracking issue for this feature is: [#87417]
1577
1578 [#87417]: https://github.com/rust-lang/rust/issues/87417
1579
1580 ------------------------
1581
1582 Allows using the `#[track_caller]` attribute on closures and generators.
1583 Calls made to the closure or generator will have caller information
1584 available through `std::panic::Location::caller()`, just like using
1585 `#[track_caller]` on a function.
1586 "##,
1587 },
1588 Lint {
1589 label: "cmse_nonsecure_entry",
1590 description: r##"# `cmse_nonsecure_entry`
1591
1592 The tracking issue for this feature is: [#75835]
1593
1594 [#75835]: https://github.com/rust-lang/rust/issues/75835
1595
1596 ------------------------
1597
1598 The [TrustZone-M
1599 feature](https://developer.arm.com/documentation/100690/latest/) is available
1600 for targets with the Armv8-M architecture profile (`thumbv8m` in their target
1601 name).
1602 LLVM, the Rust compiler and the linker are providing
1603 [support](https://developer.arm.com/documentation/ecm0359818/latest/) for the
1604 TrustZone-M feature.
1605
1606 One of the things provided, with this unstable feature, is the
1607 `cmse_nonsecure_entry` attribute. This attribute marks a Secure function as an
1608 entry function (see [section
1609 5.4](https://developer.arm.com/documentation/ecm0359818/latest/) for details).
1610 With this attribute, the compiler will do the following:
1611 * add a special symbol on the function which is the `__acle_se_` prefix and the
1612 standard function name
1613 * constrain the number of parameters to avoid using the Non-Secure stack
1614 * before returning from the function, clear registers that might contain Secure
1615 information
1616 * use the `BXNS` instruction to return
1617
1618 Because the stack can not be used to pass parameters, there will be compilation
1619 errors if:
1620 * the total size of all parameters is too big (for example more than four 32
1621 bits integers)
1622 * the entry function is not using a C ABI
1623
1624 The special symbol `__acle_se_` will be used by the linker to generate a secure
1625 gateway veneer.
1626
1627 <!-- NOTE(ignore) this example is specific to thumbv8m targets -->
1628
1629 ``` rust,ignore
1630 #![feature(cmse_nonsecure_entry)]
1631
1632 #[no_mangle]
1633 #[cmse_nonsecure_entry]
1634 pub extern "C" fn entry_function(input: u32) -> u32 {
1635 input + 6
1636 }
1637 ```
1638
1639 ``` text
1640 $ rustc --emit obj --crate-type lib --target thumbv8m.main-none-eabi function.rs
1641 $ arm-none-eabi-objdump -D function.o
1642
1643 00000000 <entry_function>:
1644 0: b580 push {r7, lr}
1645 2: 466f mov r7, sp
1646 4: b082 sub sp, #8
1647 6: 9001 str r0, [sp, #4]
1648 8: 1d81 adds r1, r0, #6
1649 a: 460a mov r2, r1
1650 c: 4281 cmp r1, r0
1651 e: 9200 str r2, [sp, #0]
1652 10: d30b bcc.n 2a <entry_function+0x2a>
1653 12: e7ff b.n 14 <entry_function+0x14>
1654 14: 9800 ldr r0, [sp, #0]
1655 16: b002 add sp, #8
1656 18: e8bd 4080 ldmia.w sp!, {r7, lr}
1657 1c: 4671 mov r1, lr
1658 1e: 4672 mov r2, lr
1659 20: 4673 mov r3, lr
1660 22: 46f4 mov ip, lr
1661 24: f38e 8800 msr CPSR_f, lr
1662 28: 4774 bxns lr
1663 2a: f240 0000 movw r0, #0
1664 2e: f2c0 0000 movt r0, #0
1665 32: f240 0200 movw r2, #0
1666 36: f2c0 0200 movt r2, #0
1667 3a: 211c movs r1, #28
1668 3c: f7ff fffe bl 0 <_ZN4core9panicking5panic17h5c028258ca2fb3f5E>
1669 40: defe udf #254 ; 0xfe
1670 ```
1671 "##,
1672 },
1673 Lint {
1674 label: "compiler_builtins",
1675 description: r##"# `compiler_builtins`
1676
1677 This feature is internal to the Rust compiler and is not intended for general use.
1678
1679 ------------------------
1680 "##,
1681 },
1682 Lint {
1683 label: "concat_idents",
1684 description: r##"# `concat_idents`
1685
1686 The tracking issue for this feature is: [#29599]
1687
1688 [#29599]: https://github.com/rust-lang/rust/issues/29599
1689
1690 ------------------------
1691
1692 The `concat_idents` feature adds a macro for concatenating multiple identifiers
1693 into one identifier.
1694
1695 ## Examples
1696
1697 ```rust
1698 #![feature(concat_idents)]
1699
1700 fn main() {
1701 fn foobar() -> u32 { 23 }
1702 let f = concat_idents!(foo, bar);
1703 assert_eq!(f(), 23);
1704 }
1705 ```
1706 "##,
1707 },
1708 Lint {
1709 label: "const_eval_limit",
1710 description: r##"# `const_eval_limit`
1711
1712 The tracking issue for this feature is: [#67217]
1713
1714 [#67217]: https://github.com/rust-lang/rust/issues/67217
1715
1716 The `const_eval_limit` allows someone to limit the evaluation steps the CTFE undertakes to evaluate a `const fn`.
1717 "##,
1718 },
1719 Lint {
1720 label: "core_intrinsics",
1721 description: r##"# `core_intrinsics`
1722
1723 This feature is internal to the Rust compiler and is not intended for general use.
1724
1725 ------------------------
1726 "##,
1727 },
1728 Lint {
1729 label: "core_panic",
1730 description: r##"# `core_panic`
1731
1732 This feature is internal to the Rust compiler and is not intended for general use.
1733
1734 ------------------------
1735 "##,
1736 },
1737 Lint {
1738 label: "core_private_bignum",
1739 description: r##"# `core_private_bignum`
1740
1741 This feature is internal to the Rust compiler and is not intended for general use.
1742
1743 ------------------------
1744 "##,
1745 },
1746 Lint {
1747 label: "core_private_diy_float",
1748 description: r##"# `core_private_diy_float`
1749
1750 This feature is internal to the Rust compiler and is not intended for general use.
1751
1752 ------------------------
1753 "##,
1754 },
1755 Lint {
1756 label: "crate_visibility_modifier",
1757 description: r##"# `crate_visibility_modifier`
1758
1759 The tracking issue for this feature is: [#53120]
1760
1761 [#53120]: https://github.com/rust-lang/rust/issues/53120
1762
1763 -----
1764
1765 The `crate_visibility_modifier` feature allows the `crate` keyword to be used
1766 as a visibility modifier synonymous to `pub(crate)`, indicating that a type
1767 (function, _&c._) is to be visible to the entire enclosing crate, but not to
1768 other crates.
1769
1770 ```rust
1771 #![feature(crate_visibility_modifier)]
1772
1773 crate struct Foo {
1774 bar: usize,
1775 }
1776 ```
1777 "##,
1778 },
1779 Lint {
1780 label: "custom_test_frameworks",
1781 description: r##"# `custom_test_frameworks`
1782
1783 The tracking issue for this feature is: [#50297]
1784
1785 [#50297]: https://github.com/rust-lang/rust/issues/50297
1786
1787 ------------------------
1788
1789 The `custom_test_frameworks` feature allows the use of `#[test_case]` and `#![test_runner]`.
1790 Any function, const, or static can be annotated with `#[test_case]` causing it to be aggregated (like `#[test]`)
1791 and be passed to the test runner determined by the `#![test_runner]` crate attribute.
1792
1793 ```rust
1794 #![feature(custom_test_frameworks)]
1795 #![test_runner(my_runner)]
1796
1797 fn my_runner(tests: &[&i32]) {
1798 for t in tests {
1799 if **t == 0 {
1800 println!("PASSED");
1801 } else {
1802 println!("FAILED");
1803 }
1804 }
1805 }
1806
1807 #[test_case]
1808 const WILL_PASS: i32 = 0;
1809
1810 #[test_case]
1811 const WILL_FAIL: i32 = 4;
1812 ```
1813 "##,
1814 },
1815 Lint {
1816 label: "dec2flt",
1817 description: r##"# `dec2flt`
1818
1819 This feature is internal to the Rust compiler and is not intended for general use.
1820
1821 ------------------------
1822 "##,
1823 },
1824 Lint {
1825 label: "default_free_fn",
1826 description: r##"# `default_free_fn`
1827
1828 The tracking issue for this feature is: [#73014]
1829
1830 [#73014]: https://github.com/rust-lang/rust/issues/73014
1831
1832 ------------------------
1833
1834 Adds a free `default()` function to the `std::default` module. This function
1835 just forwards to [`Default::default()`], but may remove repetition of the word
1836 "default" from the call site.
1837
1838 [`Default::default()`]: https://doc.rust-lang.org/nightly/std/default/trait.Default.html#tymethod.default
1839
1840 Here is an example:
1841
1842 ```rust
1843 #![feature(default_free_fn)]
1844 use std::default::default;
1845
1846 #[derive(Default)]
1847 struct AppConfig {
1848 foo: FooConfig,
1849 bar: BarConfig,
1850 }
1851
1852 #[derive(Default)]
1853 struct FooConfig {
1854 foo: i32,
1855 }
1856
1857 #[derive(Default)]
1858 struct BarConfig {
1859 bar: f32,
1860 baz: u8,
1861 }
1862
1863 fn main() {
1864 let options = AppConfig {
1865 foo: default(),
1866 bar: BarConfig {
1867 bar: 10.1,
1868 ..default()
1869 },
1870 };
1871 }
1872 ```
1873 "##,
1874 },
1875 Lint {
1876 label: "derive_clone_copy",
1877 description: r##"# `derive_clone_copy`
1878
1879 This feature is internal to the Rust compiler and is not intended for general use.
1880
1881 ------------------------
1882 "##,
1883 },
1884 Lint {
1885 label: "derive_eq",
1886 description: r##"# `derive_eq`
1887
1888 This feature is internal to the Rust compiler and is not intended for general use.
1889
1890 ------------------------
1891 "##,
1892 },
1893 Lint {
1894 label: "doc_cfg",
1895 description: r##"# `doc_cfg`
1896
1897 The tracking issue for this feature is: [#43781]
1898
1899 ------
1900
1901 The `doc_cfg` feature allows an API be documented as only available in some specific platforms.
1902 This attribute has two effects:
1903
1904 1. In the annotated item's documentation, there will be a message saying "This is supported on
1905 (platform) only".
1906
1907 2. The item's doc-tests will only run on the specific platform.
1908
1909 In addition to allowing the use of the `#[doc(cfg)]` attribute, this feature enables the use of a
1910 special conditional compilation flag, `#[cfg(doc)]`, set whenever building documentation on your
1911 crate.
1912
1913 This feature was introduced as part of PR [#43348] to allow the platform-specific parts of the
1914 standard library be documented.
1915
1916 ```rust
1917 #![feature(doc_cfg)]
1918
1919 #[cfg(any(windows, doc))]
1920 #[doc(cfg(windows))]
1921 /// The application's icon in the notification area (a.k.a. system tray).
1922 ///
1923 /// # Examples
1924 ///
1925 /// ```no_run
1926 /// extern crate my_awesome_ui_library;
1927 /// use my_awesome_ui_library::current_app;
1928 /// use my_awesome_ui_library::windows::notification;
1929 ///
1930 /// let icon = current_app().get::<notification::Icon>();
1931 /// icon.show();
1932 /// icon.show_message("Hello");
1933 /// ```
1934 pub struct Icon {
1935 // ...
1936 }
1937 ```
1938
1939 [#43781]: https://github.com/rust-lang/rust/issues/43781
1940 [#43348]: https://github.com/rust-lang/rust/issues/43348
1941 "##,
1942 },
1943 Lint {
1944 label: "doc_masked",
1945 description: r##"# `doc_masked`
1946
1947 The tracking issue for this feature is: [#44027]
1948
1949 -----
1950
1951 The `doc_masked` feature allows a crate to exclude types from a given crate from appearing in lists
1952 of trait implementations. The specifics of the feature are as follows:
1953
1954 1. When rustdoc encounters an `extern crate` statement annotated with a `#[doc(masked)]` attribute,
1955 it marks the crate as being masked.
1956
1957 2. When listing traits a given type implements, rustdoc ensures that traits from masked crates are
1958 not emitted into the documentation.
1959
1960 3. When listing types that implement a given trait, rustdoc ensures that types from masked crates
1961 are not emitted into the documentation.
1962
1963 This feature was introduced in PR [#44026] to ensure that compiler-internal and
1964 implementation-specific types and traits were not included in the standard library's documentation.
1965 Such types would introduce broken links into the documentation.
1966
1967 [#44026]: https://github.com/rust-lang/rust/pull/44026
1968 [#44027]: https://github.com/rust-lang/rust/pull/44027
1969 "##,
1970 },
1971 Lint {
1972 label: "doc_notable_trait",
1973 description: r##"# `doc_notable_trait`
1974
1975 The tracking issue for this feature is: [#45040]
1976
1977 The `doc_notable_trait` feature allows the use of the `#[doc(notable_trait)]`
1978 attribute, which will display the trait in a "Notable traits" dialog for
1979 functions returning types that implement the trait. For example, this attribute
1980 is applied to the `Iterator`, `Future`, `io::Read`, and `io::Write` traits in
1981 the standard library.
1982
1983 You can do this on your own traits like so:
1984
1985 ```
1986 #![feature(doc_notable_trait)]
1987
1988 #[doc(notable_trait)]
1989 pub trait MyTrait {}
1990
1991 pub struct MyStruct;
1992 impl MyTrait for MyStruct {}
1993
1994 /// The docs for this function will have a button that displays a dialog about
1995 /// `MyStruct` implementing `MyTrait`.
1996 pub fn my_fn() -> MyStruct { MyStruct }
1997 ```
1998
1999 This feature was originally implemented in PR [#45039].
2000
2001 See also its documentation in [the rustdoc book][rustdoc-book-notable_trait].
2002
2003 [#45040]: https://github.com/rust-lang/rust/issues/45040
2004 [#45039]: https://github.com/rust-lang/rust/pull/45039
2005 [rustdoc-book-notable_trait]: ../../rustdoc/unstable-features.html#adding-your-trait-to-the-notable-traits-dialog
2006 "##,
2007 },
2008 Lint {
2009 label: "exclusive_range_pattern",
2010 description: r##"# `exclusive_range_pattern`
2011
2012 The tracking issue for this feature is: [#37854].
2013
2014
2015 [#67264]: https://github.com/rust-lang/rust/issues/67264
2016 [#37854]: https://github.com/rust-lang/rust/issues/37854
2017 -----
2018
2019 The `exclusive_range_pattern` feature allows non-inclusive range
2020 patterns (`0..10`) to be used in appropriate pattern matching
2021 contexts. It also can be combined with `#![feature(half_open_range_patterns]`
2022 to be able to use RangeTo patterns (`..10`).
2023
2024 It also enabled RangeFrom patterns but that has since been
2025 stabilized.
2026
2027 ```rust
2028 #![feature(exclusive_range_pattern)]
2029 let x = 5;
2030 match x {
2031 0..10 => println!("single digit"),
2032 10 => println!("ten isn't part of the above range"),
2033 _ => println!("nor is everything else.")
2034 }
2035 ```
2036 "##,
2037 },
2038 Lint {
2039 label: "explicit_generic_args_with_impl_trait",
2040 description: r##"# `explicit_generic_args_with_impl_trait`
2041
2042 The tracking issue for this feature is: [#83701]
2043
2044 [#83701]: https://github.com/rust-lang/rust/issues/83701
2045
2046 ------------------------
2047
2048 The `explicit_generic_args_with_impl_trait` feature gate lets you specify generic arguments even
2049 when `impl Trait` is used in argument position.
2050
2051 A simple example is:
2052
2053 ```rust
2054 #![feature(explicit_generic_args_with_impl_trait)]
2055
2056 fn foo<T: ?Sized>(_f: impl AsRef<T>) {}
2057
2058 fn main() {
2059 foo::<str>("".to_string());
2060 }
2061 ```
2062
2063 This is currently rejected:
2064
2065 ```text
2066 error[E0632]: cannot provide explicit generic arguments when `impl Trait` is used in argument position
2067 --> src/main.rs:6:11
2068 |
2069 6 | foo::<str>("".to_string());
2070 | ^^^ explicit generic argument not allowed
2071
2072 ```
2073
2074 However it would compile if `explicit_generic_args_with_impl_trait` is enabled.
2075
2076 Note that the synthetic type parameters from `impl Trait` are still implicit and you
2077 cannot explicitly specify these:
2078
2079 ```rust,compile_fail
2080 #![feature(explicit_generic_args_with_impl_trait)]
2081
2082 fn foo<T: ?Sized>(_f: impl AsRef<T>) {}
2083 fn bar<T: ?Sized, F: AsRef<T>>(_f: F) {}
2084
2085 fn main() {
2086 bar::<str, _>("".to_string()); // Okay
2087 bar::<str, String>("".to_string()); // Okay
2088
2089 foo::<str>("".to_string()); // Okay
2090 foo::<str, String>("".to_string()); // Error, you cannot specify `impl Trait` explicitly
2091 }
2092 ```
2093 "##,
2094 },
2095 Lint {
2096 label: "fd",
2097 description: r##"# `fd`
2098
2099 This feature is internal to the Rust compiler and is not intended for general use.
2100
2101 ------------------------
2102 "##,
2103 },
2104 Lint {
2105 label: "fd_read",
2106 description: r##"# `fd_read`
2107
2108 This feature is internal to the Rust compiler and is not intended for general use.
2109
2110 ------------------------
2111 "##,
2112 },
2113 Lint {
2114 label: "ffi_const",
2115 description: r##"# `ffi_const`
2116
2117 The tracking issue for this feature is: [#58328]
2118
2119 ------
2120
2121 The `#[ffi_const]` attribute applies clang's `const` attribute to foreign
2122 functions declarations.
2123
2124 That is, `#[ffi_const]` functions shall have no effects except for its return
2125 value, which can only depend on the values of the function parameters, and is
2126 not affected by changes to the observable state of the program.
2127
2128 Applying the `#[ffi_const]` attribute to a function that violates these
2129 requirements is undefined behaviour.
2130
2131 This attribute enables Rust to perform common optimizations, like sub-expression
2132 elimination, and it can avoid emitting some calls in repeated invocations of the
2133 function with the same argument values regardless of other operations being
2134 performed in between these functions calls (as opposed to `#[ffi_pure]`
2135 functions).
2136
2137 ## Pitfalls
2138
2139 A `#[ffi_const]` function can only read global memory that would not affect
2140 its return value for the whole execution of the program (e.g. immutable global
2141 memory). `#[ffi_const]` functions are referentially-transparent and therefore
2142 more strict than `#[ffi_pure]` functions.
2143
2144 A common pitfall involves applying the `#[ffi_const]` attribute to a
2145 function that reads memory through pointer arguments which do not necessarily
2146 point to immutable global memory.
2147
2148 A `#[ffi_const]` function that returns unit has no effect on the abstract
2149 machine's state, and a `#[ffi_const]` function cannot be `#[ffi_pure]`.
2150
2151 A `#[ffi_const]` function must not diverge, neither via a side effect (e.g. a
2152 call to `abort`) nor by infinite loops.
2153
2154 When translating C headers to Rust FFI, it is worth verifying for which targets
2155 the `const` attribute is enabled in those headers, and using the appropriate
2156 `cfg` macros in the Rust side to match those definitions. While the semantics of
2157 `const` are implemented identically by many C and C++ compilers, e.g., clang,
2158 [GCC], [ARM C/C++ compiler], [IBM ILE C/C++], etc. they are not necessarily
2159 implemented in this way on all of them. It is therefore also worth verifying
2160 that the semantics of the C toolchain used to compile the binary being linked
2161 against are compatible with those of the `#[ffi_const]`.
2162
2163 [#58328]: https://github.com/rust-lang/rust/issues/58328
2164 [ARM C/C++ compiler]: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0491c/Cacgigch.html
2165 [GCC]: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-const-function-attribute
2166 [IBM ILE C/C++]: https://www.ibm.com/support/knowledgecenter/fr/ssw_ibm_i_71/rzarg/fn_attrib_const.htm
2167 "##,
2168 },
2169 Lint {
2170 label: "ffi_pure",
2171 description: r##"# `ffi_pure`
2172
2173 The tracking issue for this feature is: [#58329]
2174
2175 ------
2176
2177 The `#[ffi_pure]` attribute applies clang's `pure` attribute to foreign
2178 functions declarations.
2179
2180 That is, `#[ffi_pure]` functions shall have no effects except for its return
2181 value, which shall not change across two consecutive function calls with
2182 the same parameters.
2183
2184 Applying the `#[ffi_pure]` attribute to a function that violates these
2185 requirements is undefined behavior.
2186
2187 This attribute enables Rust to perform common optimizations, like sub-expression
2188 elimination and loop optimizations. Some common examples of pure functions are
2189 `strlen` or `memcmp`.
2190
2191 These optimizations are only applicable when the compiler can prove that no
2192 program state observable by the `#[ffi_pure]` function has changed between calls
2193 of the function, which could alter the result. See also the `#[ffi_const]`
2194 attribute, which provides stronger guarantees regarding the allowable behavior
2195 of a function, enabling further optimization.
2196
2197 ## Pitfalls
2198
2199 A `#[ffi_pure]` function can read global memory through the function
2200 parameters (e.g. pointers), globals, etc. `#[ffi_pure]` functions are not
2201 referentially-transparent, and are therefore more relaxed than `#[ffi_const]`
2202 functions.
2203
2204 However, accessing global memory through volatile or atomic reads can violate the
2205 requirement that two consecutive function calls shall return the same value.
2206
2207 A `pure` function that returns unit has no effect on the abstract machine's
2208 state.
2209
2210 A `#[ffi_pure]` function must not diverge, neither via a side effect (e.g. a
2211 call to `abort`) nor by infinite loops.
2212
2213 When translating C headers to Rust FFI, it is worth verifying for which targets
2214 the `pure` attribute is enabled in those headers, and using the appropriate
2215 `cfg` macros in the Rust side to match those definitions. While the semantics of
2216 `pure` are implemented identically by many C and C++ compilers, e.g., clang,
2217 [GCC], [ARM C/C++ compiler], [IBM ILE C/C++], etc. they are not necessarily
2218 implemented in this way on all of them. It is therefore also worth verifying
2219 that the semantics of the C toolchain used to compile the binary being linked
2220 against are compatible with those of the `#[ffi_pure]`.
2221
2222
2223 [#58329]: https://github.com/rust-lang/rust/issues/58329
2224 [ARM C/C++ compiler]: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0491c/Cacigdac.html
2225 [GCC]: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-pure-function-attribute
2226 [IBM ILE C/C++]: https://www.ibm.com/support/knowledgecenter/fr/ssw_ibm_i_71/rzarg/fn_attrib_pure.htm
2227 "##,
2228 },
2229 Lint {
2230 label: "flt2dec",
2231 description: r##"# `flt2dec`
2232
2233 This feature is internal to the Rust compiler and is not intended for general use.
2234
2235 ------------------------
2236 "##,
2237 },
2238 Lint {
2239 label: "fmt_internals",
2240 description: r##"# `fmt_internals`
2241
2242 This feature is internal to the Rust compiler and is not intended for general use.
2243
2244 ------------------------
2245 "##,
2246 },
2247 Lint {
2248 label: "fn_traits",
2249 description: r##"# `fn_traits`
2250
2251 The tracking issue for this feature is [#29625]
2252
2253 See Also: [`unboxed_closures`](../language-features/unboxed-closures.md)
2254
2255 [#29625]: https://github.com/rust-lang/rust/issues/29625
2256
2257 ----
2258
2259 The `fn_traits` feature allows for implementation of the [`Fn*`] traits
2260 for creating custom closure-like types.
2261
2262 [`Fn*`]: https://doc.rust-lang.org/std/ops/trait.Fn.html
2263
2264 ```rust
2265 #![feature(unboxed_closures)]
2266 #![feature(fn_traits)]
2267
2268 struct Adder {
2269 a: u32
2270 }
2271
2272 impl FnOnce<(u32, )> for Adder {
2273 type Output = u32;
2274 extern "rust-call" fn call_once(self, b: (u32, )) -> Self::Output {
2275 self.a + b.0
2276 }
2277 }
2278
2279 fn main() {
2280 let adder = Adder { a: 3 };
2281 assert_eq!(adder(2), 5);
2282 }
2283 ```
2284 "##,
2285 },
2286 Lint {
2287 label: "generators",
2288 description: r##"# `generators`
2289
2290 The tracking issue for this feature is: [#43122]
2291
2292 [#43122]: https://github.com/rust-lang/rust/issues/43122
2293
2294 ------------------------
2295
2296 The `generators` feature gate in Rust allows you to define generator or
2297 coroutine literals. A generator is a "resumable function" that syntactically
2298 resembles a closure but compiles to much different semantics in the compiler
2299 itself. The primary feature of a generator is that it can be suspended during
2300 execution to be resumed at a later date. Generators use the `yield` keyword to
2301 "return", and then the caller can `resume` a generator to resume execution just
2302 after the `yield` keyword.
2303
2304 Generators are an extra-unstable feature in the compiler right now. Added in
2305 [RFC 2033] they're mostly intended right now as a information/constraint
2306 gathering phase. The intent is that experimentation can happen on the nightly
2307 compiler before actual stabilization. A further RFC will be required to
2308 stabilize generators/coroutines and will likely contain at least a few small
2309 tweaks to the overall design.
2310
2311 [RFC 2033]: https://github.com/rust-lang/rfcs/pull/2033
2312
2313 A syntactical example of a generator is:
2314
2315 ```rust
2316 #![feature(generators, generator_trait)]
2317
2318 use std::ops::{Generator, GeneratorState};
2319 use std::pin::Pin;
2320
2321 fn main() {
2322 let mut generator = || {
2323 yield 1;
2324 return "foo"
2325 };
2326
2327 match Pin::new(&mut generator).resume(()) {
2328 GeneratorState::Yielded(1) => {}
2329 _ => panic!("unexpected value from resume"),
2330 }
2331 match Pin::new(&mut generator).resume(()) {
2332 GeneratorState::Complete("foo") => {}
2333 _ => panic!("unexpected value from resume"),
2334 }
2335 }
2336 ```
2337
2338 Generators are closure-like literals which can contain a `yield` statement. The
2339 `yield` statement takes an optional expression of a value to yield out of the
2340 generator. All generator literals implement the `Generator` trait in the
2341 `std::ops` module. The `Generator` trait has one main method, `resume`, which
2342 resumes execution of the generator at the previous suspension point.
2343
2344 An example of the control flow of generators is that the following example
2345 prints all numbers in order:
2346
2347 ```rust
2348 #![feature(generators, generator_trait)]
2349
2350 use std::ops::Generator;
2351 use std::pin::Pin;
2352
2353 fn main() {
2354 let mut generator = || {
2355 println!("2");
2356 yield;
2357 println!("4");
2358 };
2359
2360 println!("1");
2361 Pin::new(&mut generator).resume(());
2362 println!("3");
2363 Pin::new(&mut generator).resume(());
2364 println!("5");
2365 }
2366 ```
2367
2368 At this time the main intended use case of generators is an implementation
2369 primitive for async/await syntax, but generators will likely be extended to
2370 ergonomic implementations of iterators and other primitives in the future.
2371 Feedback on the design and usage is always appreciated!
2372
2373 ### The `Generator` trait
2374
2375 The `Generator` trait in `std::ops` currently looks like:
2376
2377 ```rust
2378 # #![feature(arbitrary_self_types, generator_trait)]
2379 # use std::ops::GeneratorState;
2380 # use std::pin::Pin;
2381
2382 pub trait Generator<R = ()> {
2383 type Yield;
2384 type Return;
2385 fn resume(self: Pin<&mut Self>, resume: R) -> GeneratorState<Self::Yield, Self::Return>;
2386 }
2387 ```
2388
2389 The `Generator::Yield` type is the type of values that can be yielded with the
2390 `yield` statement. The `Generator::Return` type is the returned type of the
2391 generator. This is typically the last expression in a generator's definition or
2392 any value passed to `return` in a generator. The `resume` function is the entry
2393 point for executing the `Generator` itself.
2394
2395 The return value of `resume`, `GeneratorState`, looks like:
2396
2397 ```rust
2398 pub enum GeneratorState<Y, R> {
2399 Yielded(Y),
2400 Complete(R),
2401 }
2402 ```
2403
2404 The `Yielded` variant indicates that the generator can later be resumed. This
2405 corresponds to a `yield` point in a generator. The `Complete` variant indicates
2406 that the generator is complete and cannot be resumed again. Calling `resume`
2407 after a generator has returned `Complete` will likely result in a panic of the
2408 program.
2409
2410 ### Closure-like semantics
2411
2412 The closure-like syntax for generators alludes to the fact that they also have
2413 closure-like semantics. Namely:
2414
2415 * When created, a generator executes no code. A closure literal does not
2416 actually execute any of the closure's code on construction, and similarly a
2417 generator literal does not execute any code inside the generator when
2418 constructed.
2419
2420 * Generators can capture outer variables by reference or by move, and this can
2421 be tweaked with the `move` keyword at the beginning of the closure. Like
2422 closures all generators will have an implicit environment which is inferred by
2423 the compiler. Outer variables can be moved into a generator for use as the
2424 generator progresses.
2425
2426 * Generator literals produce a value with a unique type which implements the
2427 `std::ops::Generator` trait. This allows actual execution of the generator
2428 through the `Generator::resume` method as well as also naming it in return
2429 types and such.
2430
2431 * Traits like `Send` and `Sync` are automatically implemented for a `Generator`
2432 depending on the captured variables of the environment. Unlike closures,
2433 generators also depend on variables live across suspension points. This means
2434 that although the ambient environment may be `Send` or `Sync`, the generator
2435 itself may not be due to internal variables live across `yield` points being
2436 not-`Send` or not-`Sync`. Note that generators do
2437 not implement traits like `Copy` or `Clone` automatically.
2438
2439 * Whenever a generator is dropped it will drop all captured environment
2440 variables.
2441
2442 ### Generators as state machines
2443
2444 In the compiler, generators are currently compiled as state machines. Each
2445 `yield` expression will correspond to a different state that stores all live
2446 variables over that suspension point. Resumption of a generator will dispatch on
2447 the current state and then execute internally until a `yield` is reached, at
2448 which point all state is saved off in the generator and a value is returned.
2449
2450 Let's take a look at an example to see what's going on here:
2451
2452 ```rust
2453 #![feature(generators, generator_trait)]
2454
2455 use std::ops::Generator;
2456 use std::pin::Pin;
2457
2458 fn main() {
2459 let ret = "foo";
2460 let mut generator = move || {
2461 yield 1;
2462 return ret
2463 };
2464
2465 Pin::new(&mut generator).resume(());
2466 Pin::new(&mut generator).resume(());
2467 }
2468 ```
2469
2470 This generator literal will compile down to something similar to:
2471
2472 ```rust
2473 #![feature(arbitrary_self_types, generators, generator_trait)]
2474
2475 use std::ops::{Generator, GeneratorState};
2476 use std::pin::Pin;
2477
2478 fn main() {
2479 let ret = "foo";
2480 let mut generator = {
2481 enum __Generator {
2482 Start(&'static str),
2483 Yield1(&'static str),
2484 Done,
2485 }
2486
2487 impl Generator for __Generator {
2488 type Yield = i32;
2489 type Return = &'static str;
2490
2491 fn resume(mut self: Pin<&mut Self>, resume: ()) -> GeneratorState<i32, &'static str> {
2492 use std::mem;
2493 match mem::replace(&mut *self, __Generator::Done) {
2494 __Generator::Start(s) => {
2495 *self = __Generator::Yield1(s);
2496 GeneratorState::Yielded(1)
2497 }
2498
2499 __Generator::Yield1(s) => {
2500 *self = __Generator::Done;
2501 GeneratorState::Complete(s)
2502 }
2503
2504 __Generator::Done => {
2505 panic!("generator resumed after completion")
2506 }
2507 }
2508 }
2509 }
2510
2511 __Generator::Start(ret)
2512 };
2513
2514 Pin::new(&mut generator).resume(());
2515 Pin::new(&mut generator).resume(());
2516 }
2517 ```
2518
2519 Notably here we can see that the compiler is generating a fresh type,
2520 `__Generator` in this case. This type has a number of states (represented here
2521 as an `enum`) corresponding to each of the conceptual states of the generator.
2522 At the beginning we're closing over our outer variable `foo` and then that
2523 variable is also live over the `yield` point, so it's stored in both states.
2524
2525 When the generator starts it'll immediately yield 1, but it saves off its state
2526 just before it does so indicating that it has reached the yield point. Upon
2527 resuming again we'll execute the `return ret` which returns the `Complete`
2528 state.
2529
2530 Here we can also note that the `Done` state, if resumed, panics immediately as
2531 it's invalid to resume a completed generator. It's also worth noting that this
2532 is just a rough desugaring, not a normative specification for what the compiler
2533 does.
2534 "##,
2535 },
2536 Lint {
2537 label: "half_open_range_patterns",
2538 description: r##"# `half_open_range_patterns`
2539
2540 The tracking issue for this feature is: [#67264]
2541 It is part of the `#![exclusive_range_pattern]` feature,
2542 tracked at [#37854].
2543
2544 [#67264]: https://github.com/rust-lang/rust/issues/67264
2545 [#37854]: https://github.com/rust-lang/rust/issues/37854
2546 -----
2547
2548 The `half_open_range_patterns` feature allows RangeTo patterns
2549 (`..10`) to be used in appropriate pattern matching contexts.
2550 This requires also enabling the `exclusive_range_pattern` feature.
2551
2552 It also enabled RangeFrom patterns but that has since been
2553 stabilized.
2554
2555 ```rust
2556 #![feature(half_open_range_patterns)]
2557 #![feature(exclusive_range_pattern)]
2558 let x = 5;
2559 match x {
2560 ..0 => println!("negative!"), // "RangeTo" pattern. Unstable.
2561 0 => println!("zero!"),
2562 1.. => println!("positive!"), // "RangeFrom" pattern. Stable.
2563 }
2564 ```
2565 "##,
2566 },
2567 Lint {
2568 label: "infer_static_outlives_requirements",
2569 description: r##"# `infer_static_outlives_requirements`
2570
2571 The tracking issue for this feature is: [#54185]
2572
2573 [#54185]: https://github.com/rust-lang/rust/issues/54185
2574
2575 ------------------------
2576 The `infer_static_outlives_requirements` feature indicates that certain
2577 `'static` outlives requirements can be inferred by the compiler rather than
2578 stating them explicitly.
2579
2580 Note: It is an accompanying feature to `infer_outlives_requirements`,
2581 which must be enabled to infer outlives requirements.
2582
2583 For example, currently generic struct definitions that contain
2584 references, require where-clauses of the form T: 'static. By using
2585 this feature the outlives predicates will be inferred, although
2586 they may still be written explicitly.
2587
2588 ```rust,ignore (pseudo-Rust)
2589 struct Foo<U> where U: 'static { // <-- currently required
2590 bar: Bar<U>
2591 }
2592 struct Bar<T: 'static> {
2593 x: T,
2594 }
2595 ```
2596
2597
2598 ## Examples:
2599
2600 ```rust,ignore (pseudo-Rust)
2601 #![feature(infer_outlives_requirements)]
2602 #![feature(infer_static_outlives_requirements)]
2603
2604 #[rustc_outlives]
2605 // Implicitly infer U: 'static
2606 struct Foo<U> {
2607 bar: Bar<U>
2608 }
2609 struct Bar<T: 'static> {
2610 x: T,
2611 }
2612 ```
2613 "##,
2614 },
2615 Lint {
2616 label: "inline_const",
2617 description: r##"# `inline_const`
2618
2619 The tracking issue for this feature is: [#76001]
2620
2621 See also [`inline_const_pat`](inline-const-pat.md)
2622
2623 ------
2624
2625 This feature allows you to use inline constant expressions. For example, you can
2626 turn this code:
2627
2628 ```rust
2629 # fn add_one(x: i32) -> i32 { x + 1 }
2630 const MY_COMPUTATION: i32 = 1 + 2 * 3 / 4;
2631
2632 fn main() {
2633 let x = add_one(MY_COMPUTATION);
2634 }
2635 ```
2636
2637 into this code:
2638
2639 ```rust
2640 #![feature(inline_const)]
2641
2642 # fn add_one(x: i32) -> i32 { x + 1 }
2643 fn main() {
2644 let x = add_one(const { 1 + 2 * 3 / 4 });
2645 }
2646 ```
2647
2648 [#76001]: https://github.com/rust-lang/rust/issues/76001
2649 "##,
2650 },
2651 Lint {
2652 label: "inline_const_pat",
2653 description: r##"# `inline_const_pat`
2654
2655 The tracking issue for this feature is: [#76001]
2656
2657 See also [`inline_const`](inline-const.md)
2658
2659 ------
2660
2661 This feature allows you to use inline constant expressions in pattern position:
2662
2663 ```rust
2664 #![feature(inline_const_pat)]
2665
2666 const fn one() -> i32 { 1 }
2667
2668 let some_int = 3;
2669 match some_int {
2670 const { 1 + 2 } => println!("Matched 1 + 2"),
2671 const { one() } => println!("Matched const fn returning 1"),
2672 _ => println!("Didn't match anything :("),
2673 }
2674 ```
2675
2676 [#76001]: https://github.com/rust-lang/rust/issues/76001
2677 "##,
2678 },
2679 Lint {
2680 label: "int_error_internals",
2681 description: r##"# `int_error_internals`
2682
2683 This feature is internal to the Rust compiler and is not intended for general use.
2684
2685 ------------------------
2686 "##,
2687 },
2688 Lint {
2689 label: "internal_output_capture",
2690 description: r##"# `internal_output_capture`
2691
2692 This feature is internal to the Rust compiler and is not intended for general use.
2693
2694 ------------------------
2695 "##,
2696 },
2697 Lint {
2698 label: "intra_doc_pointers",
2699 description: r##"# `intra-doc-pointers`
2700
2701 The tracking issue for this feature is: [#80896]
2702
2703 [#80896]: https://github.com/rust-lang/rust/issues/80896
2704
2705 ------------------------
2706
2707 Rustdoc does not currently allow disambiguating between `*const` and `*mut`, and
2708 raw pointers in intra-doc links are unstable until it does.
2709
2710 ```rust
2711 #![feature(intra_doc_pointers)]
2712 //! [pointer::add]
2713 ```
2714 "##,
2715 },
2716 Lint {
2717 label: "intrinsics",
2718 description: r##"# `intrinsics`
2719
2720 The tracking issue for this feature is: None.
2721
2722 Intrinsics are never intended to be stable directly, but intrinsics are often
2723 exported in some sort of stable manner. Prefer using the stable interfaces to
2724 the intrinsic directly when you can.
2725
2726 ------------------------
2727
2728
2729 These are imported as if they were FFI functions, with the special
2730 `rust-intrinsic` ABI. For example, if one was in a freestanding
2731 context, but wished to be able to `transmute` between types, and
2732 perform efficient pointer arithmetic, one would import those functions
2733 via a declaration like
2734
2735 ```rust
2736 #![feature(intrinsics)]
2737 # fn main() {}
2738
2739 extern "rust-intrinsic" {
2740 fn transmute<T, U>(x: T) -> U;
2741
2742 fn offset<T>(dst: *const T, offset: isize) -> *const T;
2743 }
2744 ```
2745
2746 As with any other FFI functions, these are always `unsafe` to call.
2747 "##,
2748 },
2749 Lint {
2750 label: "is_sorted",
2751 description: r##"# `is_sorted`
2752
2753 The tracking issue for this feature is: [#53485]
2754
2755 [#53485]: https://github.com/rust-lang/rust/issues/53485
2756
2757 ------------------------
2758
2759 Add the methods `is_sorted`, `is_sorted_by` and `is_sorted_by_key` to `[T]`;
2760 add the methods `is_sorted`, `is_sorted_by` and `is_sorted_by_key` to
2761 `Iterator`.
2762 "##,
2763 },
2764 Lint {
2765 label: "lang_items",
2766 description: r##"# `lang_items`
2767
2768 The tracking issue for this feature is: None.
2769
2770 ------------------------
2771
2772 The `rustc` compiler has certain pluggable operations, that is,
2773 functionality that isn't hard-coded into the language, but is
2774 implemented in libraries, with a special marker to tell the compiler
2775 it exists. The marker is the attribute `#[lang = "..."]` and there are
2776 various different values of `...`, i.e. various different 'lang
2777 items'.
2778
2779 For example, `Box` pointers require two lang items, one for allocation
2780 and one for deallocation. A freestanding program that uses the `Box`
2781 sugar for dynamic allocations via `malloc` and `free`:
2782
2783 ```rust,ignore (libc-is-finicky)
2784 #![feature(lang_items, box_syntax, start, libc, core_intrinsics, rustc_private)]
2785 #![no_std]
2786 use core::intrinsics;
2787 use core::panic::PanicInfo;
2788
2789 extern crate libc;
2790
2791 #[lang = "owned_box"]
2792 pub struct Box<T>(*mut T);
2793
2794 #[lang = "exchange_malloc"]
2795 unsafe fn allocate(size: usize, _align: usize) -> *mut u8 {
2796 let p = libc::malloc(size as libc::size_t) as *mut u8;
2797
2798 // Check if `malloc` failed:
2799 if p as usize == 0 {
2800 intrinsics::abort();
2801 }
2802
2803 p
2804 }
2805
2806 #[lang = "box_free"]
2807 unsafe fn box_free<T: ?Sized>(ptr: *mut T) {
2808 libc::free(ptr as *mut libc::c_void)
2809 }
2810
2811 #[start]
2812 fn main(_argc: isize, _argv: *const *const u8) -> isize {
2813 let _x = box 1;
2814
2815 0
2816 }
2817
2818 #[lang = "eh_personality"] extern fn rust_eh_personality() {}
2819 #[lang = "panic_impl"] extern fn rust_begin_panic(info: &PanicInfo) -> ! { unsafe { intrinsics::abort() } }
2820 #[no_mangle] pub extern fn rust_eh_register_frames () {}
2821 #[no_mangle] pub extern fn rust_eh_unregister_frames () {}
2822 ```
2823
2824 Note the use of `abort`: the `exchange_malloc` lang item is assumed to
2825 return a valid pointer, and so needs to do the check internally.
2826
2827 Other features provided by lang items include:
2828
2829 - overloadable operators via traits: the traits corresponding to the
2830 `==`, `<`, dereferencing (`*`) and `+` (etc.) operators are all
2831 marked with lang items; those specific four are `eq`, `ord`,
2832 `deref`, and `add` respectively.
2833 - stack unwinding and general failure; the `eh_personality`,
2834 `panic` and `panic_bounds_check` lang items.
2835 - the traits in `std::marker` used to indicate types of
2836 various kinds; lang items `send`, `sync` and `copy`.
2837 - the marker types and variance indicators found in
2838 `std::marker`; lang items `covariant_type`,
2839 `contravariant_lifetime`, etc.
2840
2841 Lang items are loaded lazily by the compiler; e.g. if one never uses
2842 `Box` then there is no need to define functions for `exchange_malloc`
2843 and `box_free`. `rustc` will emit an error when an item is needed
2844 but not found in the current crate or any that it depends on.
2845
2846 Most lang items are defined by `libcore`, but if you're trying to build
2847 an executable without the standard library, you'll run into the need
2848 for lang items. The rest of this page focuses on this use-case, even though
2849 lang items are a bit broader than that.
2850
2851 ### Using libc
2852
2853 In order to build a `#[no_std]` executable we will need libc as a dependency.
2854 We can specify this using our `Cargo.toml` file:
2855
2856 ```toml
2857 [dependencies]
2858 libc = { version = "0.2.14", default-features = false }
2859 ```
2860
2861 Note that the default features have been disabled. This is a critical step -
2862 **the default features of libc include the standard library and so must be
2863 disabled.**
2864
2865 ### Writing an executable without stdlib
2866
2867 Controlling the entry point is possible in two ways: the `#[start]` attribute,
2868 or overriding the default shim for the C `main` function with your own.
2869
2870 The function marked `#[start]` is passed the command line parameters
2871 in the same format as C:
2872
2873 ```rust,ignore (libc-is-finicky)
2874 #![feature(lang_items, core_intrinsics, rustc_private)]
2875 #![feature(start)]
2876 #![no_std]
2877 use core::intrinsics;
2878 use core::panic::PanicInfo;
2879
2880 // Pull in the system libc library for what crt0.o likely requires.
2881 extern crate libc;
2882
2883 // Entry point for this program.
2884 #[start]
2885 fn start(_argc: isize, _argv: *const *const u8) -> isize {
2886 0
2887 }
2888
2889 // These functions are used by the compiler, but not
2890 // for a bare-bones hello world. These are normally
2891 // provided by libstd.
2892 #[lang = "eh_personality"]
2893 #[no_mangle]
2894 pub extern fn rust_eh_personality() {
2895 }
2896
2897 #[lang = "panic_impl"]
2898 #[no_mangle]
2899 pub extern fn rust_begin_panic(info: &PanicInfo) -> ! {
2900 unsafe { intrinsics::abort() }
2901 }
2902 ```
2903
2904 To override the compiler-inserted `main` shim, one has to disable it
2905 with `#![no_main]` and then create the appropriate symbol with the
2906 correct ABI and the correct name, which requires overriding the
2907 compiler's name mangling too:
2908
2909 ```rust,ignore (libc-is-finicky)
2910 #![feature(lang_items, core_intrinsics, rustc_private)]
2911 #![feature(start)]
2912 #![no_std]
2913 #![no_main]
2914 use core::intrinsics;
2915 use core::panic::PanicInfo;
2916
2917 // Pull in the system libc library for what crt0.o likely requires.
2918 extern crate libc;
2919
2920 // Entry point for this program.
2921 #[no_mangle] // ensure that this symbol is called `main` in the output
2922 pub extern fn main(_argc: i32, _argv: *const *const u8) -> i32 {
2923 0
2924 }
2925
2926 // These functions are used by the compiler, but not
2927 // for a bare-bones hello world. These are normally
2928 // provided by libstd.
2929 #[lang = "eh_personality"]
2930 #[no_mangle]
2931 pub extern fn rust_eh_personality() {
2932 }
2933
2934 #[lang = "panic_impl"]
2935 #[no_mangle]
2936 pub extern fn rust_begin_panic(info: &PanicInfo) -> ! {
2937 unsafe { intrinsics::abort() }
2938 }
2939 ```
2940
2941 In many cases, you may need to manually link to the `compiler_builtins` crate
2942 when building a `no_std` binary. You may observe this via linker error messages
2943 such as "```undefined reference to `__rust_probestack'```".
2944
2945 ## More about the language items
2946
2947 The compiler currently makes a few assumptions about symbols which are
2948 available in the executable to call. Normally these functions are provided by
2949 the standard library, but without it you must define your own. These symbols
2950 are called "language items", and they each have an internal name, and then a
2951 signature that an implementation must conform to.
2952
2953 The first of these functions, `rust_eh_personality`, is used by the failure
2954 mechanisms of the compiler. This is often mapped to GCC's personality function
2955 (see the [libstd implementation][unwind] for more information), but crates
2956 which do not trigger a panic can be assured that this function is never
2957 called. The language item's name is `eh_personality`.
2958
2959 [unwind]: https://github.com/rust-lang/rust/blob/master/library/panic_unwind/src/gcc.rs
2960
2961 The second function, `rust_begin_panic`, is also used by the failure mechanisms of the
2962 compiler. When a panic happens, this controls the message that's displayed on
2963 the screen. While the language item's name is `panic_impl`, the symbol name is
2964 `rust_begin_panic`.
2965
2966 Finally, a `eh_catch_typeinfo` static is needed for certain targets which
2967 implement Rust panics on top of C++ exceptions.
2968
2969 ## List of all language items
2970
2971 This is a list of all language items in Rust along with where they are located in
2972 the source code.
2973
2974 - Primitives
2975 - `i8`: `libcore/num/mod.rs`
2976 - `i16`: `libcore/num/mod.rs`
2977 - `i32`: `libcore/num/mod.rs`
2978 - `i64`: `libcore/num/mod.rs`
2979 - `i128`: `libcore/num/mod.rs`
2980 - `isize`: `libcore/num/mod.rs`
2981 - `u8`: `libcore/num/mod.rs`
2982 - `u16`: `libcore/num/mod.rs`
2983 - `u32`: `libcore/num/mod.rs`
2984 - `u64`: `libcore/num/mod.rs`
2985 - `u128`: `libcore/num/mod.rs`
2986 - `usize`: `libcore/num/mod.rs`
2987 - `f32`: `libstd/f32.rs`
2988 - `f64`: `libstd/f64.rs`
2989 - `char`: `libcore/char.rs`
2990 - `slice`: `liballoc/slice.rs`
2991 - `str`: `liballoc/str.rs`
2992 - `const_ptr`: `libcore/ptr.rs`
2993 - `mut_ptr`: `libcore/ptr.rs`
2994 - `unsafe_cell`: `libcore/cell.rs`
2995 - Runtime
2996 - `start`: `libstd/rt.rs`
2997 - `eh_personality`: `libpanic_unwind/emcc.rs` (EMCC)
2998 - `eh_personality`: `libpanic_unwind/gcc.rs` (GNU)
2999 - `eh_personality`: `libpanic_unwind/seh.rs` (SEH)
3000 - `eh_catch_typeinfo`: `libpanic_unwind/emcc.rs` (EMCC)
3001 - `panic`: `libcore/panicking.rs`
3002 - `panic_bounds_check`: `libcore/panicking.rs`
3003 - `panic_impl`: `libcore/panicking.rs`
3004 - `panic_impl`: `libstd/panicking.rs`
3005 - Allocations
3006 - `owned_box`: `liballoc/boxed.rs`
3007 - `exchange_malloc`: `liballoc/heap.rs`
3008 - `box_free`: `liballoc/heap.rs`
3009 - Operands
3010 - `not`: `libcore/ops/bit.rs`
3011 - `bitand`: `libcore/ops/bit.rs`
3012 - `bitor`: `libcore/ops/bit.rs`
3013 - `bitxor`: `libcore/ops/bit.rs`
3014 - `shl`: `libcore/ops/bit.rs`
3015 - `shr`: `libcore/ops/bit.rs`
3016 - `bitand_assign`: `libcore/ops/bit.rs`
3017 - `bitor_assign`: `libcore/ops/bit.rs`
3018 - `bitxor_assign`: `libcore/ops/bit.rs`
3019 - `shl_assign`: `libcore/ops/bit.rs`
3020 - `shr_assign`: `libcore/ops/bit.rs`
3021 - `deref`: `libcore/ops/deref.rs`
3022 - `deref_mut`: `libcore/ops/deref.rs`
3023 - `index`: `libcore/ops/index.rs`
3024 - `index_mut`: `libcore/ops/index.rs`
3025 - `add`: `libcore/ops/arith.rs`
3026 - `sub`: `libcore/ops/arith.rs`
3027 - `mul`: `libcore/ops/arith.rs`
3028 - `div`: `libcore/ops/arith.rs`
3029 - `rem`: `libcore/ops/arith.rs`
3030 - `neg`: `libcore/ops/arith.rs`
3031 - `add_assign`: `libcore/ops/arith.rs`
3032 - `sub_assign`: `libcore/ops/arith.rs`
3033 - `mul_assign`: `libcore/ops/arith.rs`
3034 - `div_assign`: `libcore/ops/arith.rs`
3035 - `rem_assign`: `libcore/ops/arith.rs`
3036 - `eq`: `libcore/cmp.rs`
3037 - `ord`: `libcore/cmp.rs`
3038 - Functions
3039 - `fn`: `libcore/ops/function.rs`
3040 - `fn_mut`: `libcore/ops/function.rs`
3041 - `fn_once`: `libcore/ops/function.rs`
3042 - `generator_state`: `libcore/ops/generator.rs`
3043 - `generator`: `libcore/ops/generator.rs`
3044 - Other
3045 - `coerce_unsized`: `libcore/ops/unsize.rs`
3046 - `drop`: `libcore/ops/drop.rs`
3047 - `drop_in_place`: `libcore/ptr.rs`
3048 - `clone`: `libcore/clone.rs`
3049 - `copy`: `libcore/marker.rs`
3050 - `send`: `libcore/marker.rs`
3051 - `sized`: `libcore/marker.rs`
3052 - `unsize`: `libcore/marker.rs`
3053 - `sync`: `libcore/marker.rs`
3054 - `phantom_data`: `libcore/marker.rs`
3055 - `discriminant_kind`: `libcore/marker.rs`
3056 - `freeze`: `libcore/marker.rs`
3057 - `debug_trait`: `libcore/fmt/mod.rs`
3058 - `non_zero`: `libcore/nonzero.rs`
3059 - `arc`: `liballoc/sync.rs`
3060 - `rc`: `liballoc/rc.rs`
3061 "##,
3062 },
3063 Lint {
3064 label: "libstd_sys_internals",
3065 description: r##"# `libstd_sys_internals`
3066
3067 This feature is internal to the Rust compiler and is not intended for general use.
3068
3069 ------------------------
3070 "##,
3071 },
3072 Lint {
3073 label: "libstd_thread_internals",
3074 description: r##"# `libstd_thread_internals`
3075
3076 This feature is internal to the Rust compiler and is not intended for general use.
3077
3078 ------------------------
3079 "##,
3080 },
3081 Lint {
3082 label: "link_cfg",
3083 description: r##"# `link_cfg`
3084
3085 This feature is internal to the Rust compiler and is not intended for general use.
3086
3087 ------------------------
3088 "##,
3089 },
3090 Lint {
3091 label: "llvm_asm",
3092 description: r##"# `llvm_asm`
3093
3094 The tracking issue for this feature is: [#70173]
3095
3096 [#70173]: https://github.com/rust-lang/rust/issues/70173
3097
3098 ------------------------
3099
3100 For extremely low-level manipulations and performance reasons, one
3101 might wish to control the CPU directly. Rust supports using inline
3102 assembly to do this via the `llvm_asm!` macro.
3103
3104 ```rust,ignore (pseudo-code)
3105 llvm_asm!(assembly template
3106 : output operands
3107 : input operands
3108 : clobbers
3109 : options
3110 );
3111 ```
3112
3113 Any use of `llvm_asm` is feature gated (requires `#![feature(llvm_asm)]` on the
3114 crate to allow) and of course requires an `unsafe` block.
3115
3116 > **Note**: the examples here are given in x86/x86-64 assembly, but
3117 > all platforms are supported.
3118
3119 ## Assembly template
3120
3121 The `assembly template` is the only required parameter and must be a
3122 literal string (i.e. `""`)
3123
3124 ```rust
3125 #![feature(llvm_asm)]
3126
3127 #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
3128 fn foo() {
3129 unsafe {
3130 llvm_asm!("NOP");
3131 }
3132 }
3133
3134 // Other platforms:
3135 #[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))]
3136 fn foo() { /* ... */ }
3137
3138 fn main() {
3139 // ...
3140 foo();
3141 // ...
3142 }
3143 ```
3144
3145 (The `feature(llvm_asm)` and `#[cfg]`s are omitted from now on.)
3146
3147 Output operands, input operands, clobbers and options are all optional
3148 but you must add the right number of `:` if you skip them:
3149
3150 ```rust
3151 # #![feature(llvm_asm)]
3152 # #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
3153 # fn main() { unsafe {
3154 llvm_asm!("xor %eax, %eax"
3155 :
3156 :
3157 : "eax"
3158 );
3159 # } }
3160 # #[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))]
3161 # fn main() {}
3162 ```
3163
3164 Whitespace also doesn't matter:
3165
3166 ```rust
3167 # #![feature(llvm_asm)]
3168 # #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
3169 # fn main() { unsafe {
3170 llvm_asm!("xor %eax, %eax" ::: "eax");
3171 # } }
3172 # #[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))]
3173 # fn main() {}
3174 ```
3175
3176 ## Operands
3177
3178 Input and output operands follow the same format: `:
3179 "constraints1"(expr1), "constraints2"(expr2), ..."`. Output operand
3180 expressions must be mutable place, or not yet assigned:
3181
3182 ```rust
3183 # #![feature(llvm_asm)]
3184 # #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
3185 fn add(a: i32, b: i32) -> i32 {
3186 let c: i32;
3187 unsafe {
3188 llvm_asm!("add $2, $0"
3189 : "=r"(c)
3190 : "0"(a), "r"(b)
3191 );
3192 }
3193 c
3194 }
3195 # #[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))]
3196 # fn add(a: i32, b: i32) -> i32 { a + b }
3197
3198 fn main() {
3199 assert_eq!(add(3, 14159), 14162)
3200 }
3201 ```
3202
3203 If you would like to use real operands in this position, however,
3204 you are required to put curly braces `{}` around the register that
3205 you want, and you are required to put the specific size of the
3206 operand. This is useful for very low level programming, where
3207 which register you use is important:
3208
3209 ```rust
3210 # #![feature(llvm_asm)]
3211 # #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
3212 # unsafe fn read_byte_in(port: u16) -> u8 {
3213 let result: u8;
3214 llvm_asm!("in %dx, %al" : "={al}"(result) : "{dx}"(port));
3215 result
3216 # }
3217 ```
3218
3219 ## Clobbers
3220
3221 Some instructions modify registers which might otherwise have held
3222 different values so we use the clobbers list to indicate to the
3223 compiler not to assume any values loaded into those registers will
3224 stay valid.
3225
3226 ```rust
3227 # #![feature(llvm_asm)]
3228 # #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
3229 # fn main() { unsafe {
3230 // Put the value 0x200 in eax:
3231 llvm_asm!("mov $$0x200, %eax" : /* no outputs */ : /* no inputs */ : "eax");
3232 # } }
3233 # #[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))]
3234 # fn main() {}
3235 ```
3236
3237 Input and output registers need not be listed since that information
3238 is already communicated by the given constraints. Otherwise, any other
3239 registers used either implicitly or explicitly should be listed.
3240
3241 If the assembly changes the condition code register `cc` should be
3242 specified as one of the clobbers. Similarly, if the assembly modifies
3243 memory, `memory` should also be specified.
3244
3245 ## Options
3246
3247 The last section, `options` is specific to Rust. The format is comma
3248 separated literal strings (i.e. `:"foo", "bar", "baz"`). It's used to
3249 specify some extra info about the inline assembly:
3250
3251 Current valid options are:
3252
3253 1. `volatile` - specifying this is analogous to
3254 `__asm__ __volatile__ (...)` in gcc/clang.
3255 2. `alignstack` - certain instructions expect the stack to be
3256 aligned a certain way (i.e. SSE) and specifying this indicates to
3257 the compiler to insert its usual stack alignment code
3258 3. `intel` - use intel syntax instead of the default AT&T.
3259
3260 ```rust
3261 # #![feature(llvm_asm)]
3262 # #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
3263 # fn main() {
3264 let result: i32;
3265 unsafe {
3266 llvm_asm!("mov eax, 2" : "={eax}"(result) : : : "intel")
3267 }
3268 println!("eax is currently {}", result);
3269 # }
3270 # #[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))]
3271 # fn main() {}
3272 ```
3273
3274 ## More Information
3275
3276 The current implementation of the `llvm_asm!` macro is a direct binding to [LLVM's
3277 inline assembler expressions][llvm-docs], so be sure to check out [their
3278 documentation as well][llvm-docs] for more information about clobbers,
3279 constraints, etc.
3280
3281 [llvm-docs]: http://llvm.org/docs/LangRef.html#inline-assembler-expressions
3282 "##,
3283 },
3284 Lint {
3285 label: "marker_trait_attr",
3286 description: r##"# `marker_trait_attr`
3287
3288 The tracking issue for this feature is: [#29864]
3289
3290 [#29864]: https://github.com/rust-lang/rust/issues/29864
3291
3292 ------------------------
3293
3294 Normally, Rust keeps you from adding trait implementations that could
3295 overlap with each other, as it would be ambiguous which to use. This
3296 feature, however, carves out an exception to that rule: a trait can
3297 opt-in to having overlapping implementations, at the cost that those
3298 implementations are not allowed to override anything (and thus the
3299 trait itself cannot have any associated items, as they're pointless
3300 when they'd need to do the same thing for every type anyway).
3301
3302 ```rust
3303 #![feature(marker_trait_attr)]
3304
3305 #[marker] trait CheapToClone: Clone {}
3306
3307 impl<T: Copy> CheapToClone for T {}
3308
3309 // These could potentially overlap with the blanket implementation above,
3310 // so are only allowed because CheapToClone is a marker trait.
3311 impl<T: CheapToClone, U: CheapToClone> CheapToClone for (T, U) {}
3312 impl<T: CheapToClone> CheapToClone for std::ops::Range<T> {}
3313
3314 fn cheap_clone<T: CheapToClone>(t: T) -> T {
3315 t.clone()
3316 }
3317 ```
3318
3319 This is expected to replace the unstable `overlapping_marker_traits`
3320 feature, which applied to all empty traits (without needing an opt-in).
3321 "##,
3322 },
3323 Lint {
3324 label: "more_qualified_paths",
3325 description: r##"# `more_qualified_paths`
3326
3327 The `more_qualified_paths` feature can be used in order to enable the
3328 use of qualified paths in patterns.
3329
3330 ## Example
3331
3332 ```rust
3333 #![feature(more_qualified_paths)]
3334
3335 fn main() {
3336 // destructure through a qualified path
3337 let <Foo as A>::Assoc { br } = StructStruct { br: 2 };
3338 }
3339
3340 struct StructStruct {
3341 br: i8,
3342 }
3343
3344 struct Foo;
3345
3346 trait A {
3347 type Assoc;
3348 }
3349
3350 impl A for Foo {
3351 type Assoc = StructStruct;
3352 }
3353 ```
3354 "##,
3355 },
3356 Lint {
3357 label: "native_link_modifiers",
3358 description: r##"# `native_link_modifiers`
3359
3360 The tracking issue for this feature is: [#81490]
3361
3362 [#81490]: https://github.com/rust-lang/rust/issues/81490
3363
3364 ------------------------
3365
3366 The `native_link_modifiers` feature allows you to use the `modifiers` syntax with the `#[link(..)]` attribute.
3367
3368 Modifiers are specified as a comma-delimited string with each modifier prefixed with either a `+` or `-` to indicate that the modifier is enabled or disabled, respectively. The last boolean value specified for a given modifier wins.
3369 "##,
3370 },
3371 Lint {
3372 label: "native_link_modifiers_as_needed",
3373 description: r##"# `native_link_modifiers_as_needed`
3374
3375 The tracking issue for this feature is: [#81490]
3376
3377 [#81490]: https://github.com/rust-lang/rust/issues/81490
3378
3379 ------------------------
3380
3381 The `native_link_modifiers_as_needed` feature allows you to use the `as-needed` modifier.
3382
3383 `as-needed` is only compatible with the `dynamic` and `framework` linking kinds. Using any other kind will result in a compiler error.
3384
3385 `+as-needed` means that the library will be actually linked only if it satisfies some undefined symbols at the point at which it is specified on the command line, making it similar to static libraries in this regard.
3386
3387 This modifier translates to `--as-needed` for ld-like linkers, and to `-dead_strip_dylibs` / `-needed_library` / `-needed_framework` for ld64.
3388 The modifier does nothing for linkers that don't support it (e.g. `link.exe`).
3389
3390 The default for this modifier is unclear, some targets currently specify it as `+as-needed`, some do not. We may want to try making `+as-needed` a default for all targets.
3391 "##,
3392 },
3393 Lint {
3394 label: "native_link_modifiers_bundle",
3395 description: r##"# `native_link_modifiers_bundle`
3396
3397 The tracking issue for this feature is: [#81490]
3398
3399 [#81490]: https://github.com/rust-lang/rust/issues/81490
3400
3401 ------------------------
3402
3403 The `native_link_modifiers_bundle` feature allows you to use the `bundle` modifier.
3404
3405 Only compatible with the `static` linking kind. Using any other kind will result in a compiler error.
3406
3407 `+bundle` means objects from the static library are bundled into the produced crate (a rlib, for example) and are used from this crate later during linking of the final binary.
3408
3409 `-bundle` means the static library is included into the produced rlib "by name" and object files from it are included only during linking of the final binary, the file search by that name is also performed during final linking.
3410
3411 This modifier is supposed to supersede the `static-nobundle` linking kind defined by [RFC 1717](https://github.com/rust-lang/rfcs/pull/1717).
3412
3413 The default for this modifier is currently `+bundle`, but it could be changed later on some future edition boundary.
3414 "##,
3415 },
3416 Lint {
3417 label: "native_link_modifiers_verbatim",
3418 description: r##"# `native_link_modifiers_verbatim`
3419
3420 The tracking issue for this feature is: [#81490]
3421
3422 [#81490]: https://github.com/rust-lang/rust/issues/81490
3423
3424 ------------------------
3425
3426 The `native_link_modifiers_verbatim` feature allows you to use the `verbatim` modifier.
3427
3428 `+verbatim` means that rustc itself won't add any target-specified library prefixes or suffixes (like `lib` or `.a`) to the library name, and will try its best to ask for the same thing from the linker.
3429
3430 For `ld`-like linkers rustc will use the `-l:filename` syntax (note the colon) when passing the library, so the linker won't add any prefixes or suffixes as well.
3431 See [`-l namespec`](https://sourceware.org/binutils/docs/ld/Options.html) in ld documentation for more details.
3432 For linkers not supporting any verbatim modifiers (e.g. `link.exe` or `ld64`) the library name will be passed as is.
3433
3434 The default for this modifier is `-verbatim`.
3435
3436 This RFC changes the behavior of `raw-dylib` linking kind specified by [RFC 2627](https://github.com/rust-lang/rfcs/pull/2627). The `.dll` suffix (or other target-specified suffixes for other targets) is now added automatically.
3437 If your DLL doesn't have the `.dll` suffix, it can be specified with `+verbatim`.
3438 "##,
3439 },
3440 Lint {
3441 label: "native_link_modifiers_whole_archive",
3442 description: r##"# `native_link_modifiers_whole_archive`
3443
3444 The tracking issue for this feature is: [#81490]
3445
3446 [#81490]: https://github.com/rust-lang/rust/issues/81490
3447
3448 ------------------------
3449
3450 The `native_link_modifiers_whole_archive` feature allows you to use the `whole-archive` modifier.
3451
3452 Only compatible with the `static` linking kind. Using any other kind will result in a compiler error.
3453
3454 `+whole-archive` means that the static library is linked as a whole archive without throwing any object files away.
3455
3456 This modifier translates to `--whole-archive` for `ld`-like linkers, to `/WHOLEARCHIVE` for `link.exe`, and to `-force_load` for `ld64`.
3457 The modifier does nothing for linkers that don't support it.
3458
3459 The default for this modifier is `-whole-archive`.
3460 "##,
3461 },
3462 Lint {
3463 label: "negative_impls",
3464 description: r##"# `negative_impls`
3465
3466 The tracking issue for this feature is [#68318].
3467
3468 [#68318]: https://github.com/rust-lang/rust/issues/68318
3469
3470 ----
3471
3472 With the feature gate `negative_impls`, you can write negative impls as well as positive ones:
3473
3474 ```rust
3475 #![feature(negative_impls)]
3476 trait DerefMut { }
3477 impl<T: ?Sized> !DerefMut for &T { }
3478 ```
3479
3480 Negative impls indicate a semver guarantee that the given trait will not be implemented for the given types. Negative impls play an additional purpose for auto traits, described below.
3481
3482 Negative impls have the following characteristics:
3483
3484 * They do not have any items.
3485 * They must obey the orphan rules as if they were a positive impl.
3486 * They cannot "overlap" with any positive impls.
3487
3488 ## Semver interaction
3489
3490 It is a breaking change to remove a negative impl. Negative impls are a commitment not to implement the given trait for the named types.
3491
3492 ## Orphan and overlap rules
3493
3494 Negative impls must obey the same orphan rules as a positive impl. This implies you cannot add a negative impl for types defined in upstream crates and so forth.
3495
3496 Similarly, negative impls cannot overlap with positive impls, again using the same "overlap" check that we ordinarily use to determine if two impls overlap. (Note that positive impls typically cannot overlap with one another either, except as permitted by specialization.)
3497
3498 ## Interaction with auto traits
3499
3500 Declaring a negative impl `impl !SomeAutoTrait for SomeType` for an
3501 auto-trait serves two purposes:
3502
3503 * as with any trait, it declares that `SomeType` will never implement `SomeAutoTrait`;
3504 * it disables the automatic `SomeType: SomeAutoTrait` impl that would otherwise have been generated.
3505
3506 Note that, at present, there is no way to indicate that a given type
3507 does not implement an auto trait *but that it may do so in the
3508 future*. For ordinary types, this is done by simply not declaring any
3509 impl at all, but that is not an option for auto traits. A workaround
3510 is that one could embed a marker type as one of the fields, where the
3511 marker type is `!AutoTrait`.
3512
3513 ## Immediate uses
3514
3515 Negative impls are used to declare that `&T: !DerefMut` and `&mut T: !Clone`, as required to fix the soundness of `Pin` described in [#66544](https://github.com/rust-lang/rust/issues/66544).
3516
3517 This serves two purposes:
3518
3519 * For proving the correctness of unsafe code, we can use that impl as evidence that no `DerefMut` or `Clone` impl exists.
3520 * It prevents downstream crates from creating such impls.
3521 "##,
3522 },
3523 Lint {
3524 label: "no_coverage",
3525 description: r##"# `no_coverage`
3526
3527 The tracking issue for this feature is: [#84605]
3528
3529 [#84605]: https://github.com/rust-lang/rust/issues/84605
3530
3531 ---
3532
3533 The `no_coverage` attribute can be used to selectively disable coverage
3534 instrumentation in an annotated function. This might be useful to:
3535
3536 - Avoid instrumentation overhead in a performance critical function
3537 - Avoid generating coverage for a function that is not meant to be executed,
3538 but still target 100% coverage for the rest of the program.
3539
3540 ## Example
3541
3542 ```rust
3543 #![feature(no_coverage)]
3544
3545 // `foo()` will get coverage instrumentation (by default)
3546 fn foo() {
3547 // ...
3548 }
3549
3550 #[no_coverage]
3551 fn bar() {
3552 // ...
3553 }
3554 ```
3555 "##,
3556 },
3557 Lint {
3558 label: "no_sanitize",
3559 description: r##"# `no_sanitize`
3560
3561 The tracking issue for this feature is: [#39699]
3562
3563 [#39699]: https://github.com/rust-lang/rust/issues/39699
3564
3565 ------------------------
3566
3567 The `no_sanitize` attribute can be used to selectively disable sanitizer
3568 instrumentation in an annotated function. This might be useful to: avoid
3569 instrumentation overhead in a performance critical function, or avoid
3570 instrumenting code that contains constructs unsupported by given sanitizer.
3571
3572 The precise effect of this annotation depends on particular sanitizer in use.
3573 For example, with `no_sanitize(thread)`, the thread sanitizer will no longer
3574 instrument non-atomic store / load operations, but it will instrument atomic
3575 operations to avoid reporting false positives and provide meaning full stack
3576 traces.
3577
3578 ## Examples
3579
3580 ``` rust
3581 #![feature(no_sanitize)]
3582
3583 #[no_sanitize(address)]
3584 fn foo() {
3585 // ...
3586 }
3587 ```
3588 "##,
3589 },
3590 Lint {
3591 label: "plugin",
3592 description: r##"# `plugin`
3593
3594 The tracking issue for this feature is: [#29597]
3595
3596 [#29597]: https://github.com/rust-lang/rust/issues/29597
3597
3598
3599 This feature is part of "compiler plugins." It will often be used with the
3600 `rustc_private` feature.
3601
3602 ------------------------
3603
3604 `rustc` can load compiler plugins, which are user-provided libraries that
3605 extend the compiler's behavior with new lint checks, etc.
3606
3607 A plugin is a dynamic library crate with a designated *registrar* function that
3608 registers extensions with `rustc`. Other crates can load these extensions using
3609 the crate attribute `#![plugin(...)]`. See the
3610 `rustc_driver::plugin` documentation for more about the
3611 mechanics of defining and loading a plugin.
3612
3613 In the vast majority of cases, a plugin should *only* be used through
3614 `#![plugin]` and not through an `extern crate` item. Linking a plugin would
3615 pull in all of librustc_ast and librustc as dependencies of your crate. This is
3616 generally unwanted unless you are building another plugin.
3617
3618 The usual practice is to put compiler plugins in their own crate, separate from
3619 any `macro_rules!` macros or ordinary Rust code meant to be used by consumers
3620 of a library.
3621
3622 # Lint plugins
3623
3624 Plugins can extend [Rust's lint
3625 infrastructure](../../reference/attributes/diagnostics.md#lint-check-attributes) with
3626 additional checks for code style, safety, etc. Now let's write a plugin
3627 [`lint-plugin-test.rs`](https://github.com/rust-lang/rust/blob/master/tests/ui-fulldeps/auxiliary/lint-plugin-test.rs)
3628 that warns about any item named `lintme`.
3629
3630 ```rust,ignore (requires-stage-2)
3631 #![feature(box_syntax, rustc_private)]
3632
3633 extern crate rustc_ast;
3634
3635 // Load rustc as a plugin to get macros
3636 extern crate rustc_driver;
3637 #[macro_use]
3638 extern crate rustc_lint;
3639 #[macro_use]
3640 extern crate rustc_session;
3641
3642 use rustc_driver::plugin::Registry;
3643 use rustc_lint::{EarlyContext, EarlyLintPass, LintArray, LintContext, LintPass};
3644 use rustc_ast::ast;
3645 declare_lint!(TEST_LINT, Warn, "Warn about items named 'lintme'");
3646
3647 declare_lint_pass!(Pass => [TEST_LINT]);
3648
3649 impl EarlyLintPass for Pass {
3650 fn check_item(&mut self, cx: &EarlyContext, it: &ast::Item) {
3651 if it.ident.name.as_str() == "lintme" {
3652 cx.lint(TEST_LINT, |lint| {
3653 lint.build("item is named 'lintme'").set_span(it.span).emit()
3654 });
3655 }
3656 }
3657 }
3658
3659 #[no_mangle]
3660 fn __rustc_plugin_registrar(reg: &mut Registry) {
3661 reg.lint_store.register_lints(&[&TEST_LINT]);
3662 reg.lint_store.register_early_pass(|| box Pass);
3663 }
3664 ```
3665
3666 Then code like
3667
3668 ```rust,ignore (requires-plugin)
3669 #![feature(plugin)]
3670 #![plugin(lint_plugin_test)]
3671
3672 fn lintme() { }
3673 ```
3674
3675 will produce a compiler warning:
3676
3677 ```txt
3678 foo.rs:4:1: 4:16 warning: item is named 'lintme', #[warn(test_lint)] on by default
3679 foo.rs:4 fn lintme() { }
3680 ^~~~~~~~~~~~~~~
3681 ```
3682
3683 The components of a lint plugin are:
3684
3685 * one or more `declare_lint!` invocations, which define static `Lint` structs;
3686
3687 * a struct holding any state needed by the lint pass (here, none);
3688
3689 * a `LintPass`
3690 implementation defining how to check each syntax element. A single
3691 `LintPass` may call `span_lint` for several different `Lint`s, but should
3692 register them all through the `get_lints` method.
3693
3694 Lint passes are syntax traversals, but they run at a late stage of compilation
3695 where type information is available. `rustc`'s [built-in
3696 lints](https://github.com/rust-lang/rust/blob/master/src/librustc_session/lint/builtin.rs)
3697 mostly use the same infrastructure as lint plugins, and provide examples of how
3698 to access type information.
3699
3700 Lints defined by plugins are controlled by the usual [attributes and compiler
3701 flags](../../reference/attributes/diagnostics.md#lint-check-attributes), e.g.
3702 `#[allow(test_lint)]` or `-A test-lint`. These identifiers are derived from the
3703 first argument to `declare_lint!`, with appropriate case and punctuation
3704 conversion.
3705
3706 You can run `rustc -W help foo.rs` to see a list of lints known to `rustc`,
3707 including those provided by plugins loaded by `foo.rs`.
3708 "##,
3709 },
3710 Lint {
3711 label: "print_internals",
3712 description: r##"# `print_internals`
3713
3714 This feature is internal to the Rust compiler and is not intended for general use.
3715
3716 ------------------------
3717 "##,
3718 },
3719 Lint {
3720 label: "profiler_runtime",
3721 description: r##"# `profiler_runtime`
3722
3723 The tracking issue for this feature is: [#42524](https://github.com/rust-lang/rust/issues/42524).
3724
3725 ------------------------
3726 "##,
3727 },
3728 Lint {
3729 label: "profiler_runtime_lib",
3730 description: r##"# `profiler_runtime_lib`
3731
3732 This feature is internal to the Rust compiler and is not intended for general use.
3733
3734 ------------------------
3735 "##,
3736 },
3737 Lint {
3738 label: "raw_dylib",
3739 description: r##"# `raw_dylib`
3740
3741 The tracking issue for this feature is: [#58713]
3742
3743 [#58713]: https://github.com/rust-lang/rust/issues/58713
3744
3745 ------------------------
3746
3747 The `raw_dylib` feature allows you to link against the implementations of functions in an `extern`
3748 block without, on Windows, linking against an import library.
3749
3750 ```rust,ignore (partial-example)
3751 #![feature(raw_dylib)]
3752
3753 #[link(name="library", kind="raw-dylib")]
3754 extern {
3755 fn extern_function(x: i32);
3756 }
3757
3758 fn main() {
3759 unsafe {
3760 extern_function(14);
3761 }
3762 }
3763 ```
3764
3765 ## Limitations
3766
3767 Currently, this feature is only supported on `-windows-msvc` targets. Non-Windows platforms don't have import
3768 libraries, and an incompatibility between LLVM and the BFD linker means that it is not currently supported on
3769 `-windows-gnu` targets.
3770
3771 On the `i686-pc-windows-msvc` target, this feature supports only the `cdecl`, `stdcall`, `system`, and `fastcall`
3772 calling conventions.
3773 "##,
3774 },
3775 Lint {
3776 label: "repr128",
3777 description: r##"# `repr128`
3778
3779 The tracking issue for this feature is: [#56071]
3780
3781 [#56071]: https://github.com/rust-lang/rust/issues/56071
3782
3783 ------------------------
3784
3785 The `repr128` feature adds support for `#[repr(u128)]` on `enum`s.
3786
3787 ```rust
3788 #![feature(repr128)]
3789
3790 #[repr(u128)]
3791 enum Foo {
3792 Bar(u64),
3793 }
3794 ```
3795 "##,
3796 },
3797 Lint {
3798 label: "rt",
3799 description: r##"# `rt`
3800
3801 This feature is internal to the Rust compiler and is not intended for general use.
3802
3803 ------------------------
3804 "##,
3805 },
3806 Lint {
3807 label: "rustc_attrs",
3808 description: r##"# `rustc_attrs`
3809
3810 This feature has no tracking issue, and is therefore internal to
3811 the compiler, not being intended for general use.
3812
3813 Note: `rustc_attrs` enables many rustc-internal attributes and this page
3814 only discuss a few of them.
3815
3816 ------------------------
3817
3818 The `rustc_attrs` feature allows debugging rustc type layouts by using
3819 `#[rustc_layout(...)]` to debug layout at compile time (it even works
3820 with `cargo check`) as an alternative to `rustc -Z print-type-sizes`
3821 that is way more verbose.
3822
3823 Options provided by `#[rustc_layout(...)]` are `debug`, `size`, `align`,
3824 `abi`. Note that it only works on sized types without generics.
3825
3826 ## Examples
3827
3828 ```rust,compile_fail
3829 #![feature(rustc_attrs)]
3830
3831 #[rustc_layout(abi, size)]
3832 pub enum X {
3833 Y(u8, u8, u8),
3834 Z(isize),
3835 }
3836 ```
3837
3838 When that is compiled, the compiler will error with something like
3839
3840 ```text
3841 error: abi: Aggregate { sized: true }
3842 --> src/lib.rs:4:1
3843 |
3844 4 | / pub enum T {
3845 5 | | Y(u8, u8, u8),
3846 6 | | Z(isize),
3847 7 | | }
3848 | |_^
3849
3850 error: size: Size { raw: 16 }
3851 --> src/lib.rs:4:1
3852 |
3853 4 | / pub enum T {
3854 5 | | Y(u8, u8, u8),
3855 6 | | Z(isize),
3856 7 | | }
3857 | |_^
3858
3859 error: aborting due to 2 previous errors
3860 ```
3861 "##,
3862 },
3863 Lint {
3864 label: "sort_internals",
3865 description: r##"# `sort_internals`
3866
3867 This feature is internal to the Rust compiler and is not intended for general use.
3868
3869 ------------------------
3870 "##,
3871 },
3872 Lint {
3873 label: "str_internals",
3874 description: r##"# `str_internals`
3875
3876 This feature is internal to the Rust compiler and is not intended for general use.
3877
3878 ------------------------
3879 "##,
3880 },
3881 Lint {
3882 label: "test",
3883 description: r##"# `test`
3884
3885 The tracking issue for this feature is: None.
3886
3887 ------------------------
3888
3889 The internals of the `test` crate are unstable, behind the `test` flag. The
3890 most widely used part of the `test` crate are benchmark tests, which can test
3891 the performance of your code. Let's make our `src/lib.rs` look like this
3892 (comments elided):
3893
3894 ```rust,no_run
3895 #![feature(test)]
3896
3897 extern crate test;
3898
3899 pub fn add_two(a: i32) -> i32 {
3900 a + 2
3901 }
3902
3903 #[cfg(test)]
3904 mod tests {
3905 use super::*;
3906 use test::Bencher;
3907
3908 #[test]
3909 fn it_works() {
3910 assert_eq!(4, add_two(2));
3911 }
3912
3913 #[bench]
3914 fn bench_add_two(b: &mut Bencher) {
3915 b.iter(|| add_two(2));
3916 }
3917 }
3918 ```
3919
3920 Note the `test` feature gate, which enables this unstable feature.
3921
3922 We've imported the `test` crate, which contains our benchmarking support.
3923 We have a new function as well, with the `bench` attribute. Unlike regular
3924 tests, which take no arguments, benchmark tests take a `&mut Bencher`. This
3925 `Bencher` provides an `iter` method, which takes a closure. This closure
3926 contains the code we'd like to benchmark.
3927
3928 We can run benchmark tests with `cargo bench`:
3929
3930 ```bash
3931 $ cargo bench
3932 Compiling adder v0.0.1 (file:///home/steve/tmp/adder)
3933 Running target/release/adder-91b3e234d4ed382a
3934
3935 running 2 tests
3936 test tests::it_works ... ignored
3937 test tests::bench_add_two ... bench: 1 ns/iter (+/- 0)
3938
3939 test result: ok. 0 passed; 0 failed; 1 ignored; 1 measured
3940 ```
3941
3942 Our non-benchmark test was ignored. You may have noticed that `cargo bench`
3943 takes a bit longer than `cargo test`. This is because Rust runs our benchmark
3944 a number of times, and then takes the average. Because we're doing so little
3945 work in this example, we have a `1 ns/iter (+/- 0)`, but this would show
3946 the variance if there was one.
3947
3948 Advice on writing benchmarks:
3949
3950
3951 * Move setup code outside the `iter` loop; only put the part you want to measure inside
3952 * Make the code do "the same thing" on each iteration; do not accumulate or change state
3953 * Make the outer function idempotent too; the benchmark runner is likely to run
3954 it many times
3955 * Make the inner `iter` loop short and fast so benchmark runs are fast and the
3956 calibrator can adjust the run-length at fine resolution
3957 * Make the code in the `iter` loop do something simple, to assist in pinpointing
3958 performance improvements (or regressions)
3959
3960 ## Gotcha: optimizations
3961
3962 There's another tricky part to writing benchmarks: benchmarks compiled with
3963 optimizations activated can be dramatically changed by the optimizer so that
3964 the benchmark is no longer benchmarking what one expects. For example, the
3965 compiler might recognize that some calculation has no external effects and
3966 remove it entirely.
3967
3968 ```rust,no_run
3969 #![feature(test)]
3970
3971 extern crate test;
3972 use test::Bencher;
3973
3974 #[bench]
3975 fn bench_xor_1000_ints(b: &mut Bencher) {
3976 b.iter(|| {
3977 (0..1000).fold(0, |old, new| old ^ new);
3978 });
3979 }
3980 ```
3981
3982 gives the following results
3983
3984 ```text
3985 running 1 test
3986 test bench_xor_1000_ints ... bench: 0 ns/iter (+/- 0)
3987
3988 test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured
3989 ```
3990
3991 The benchmarking runner offers two ways to avoid this. Either, the closure that
3992 the `iter` method receives can return an arbitrary value which forces the
3993 optimizer to consider the result used and ensures it cannot remove the
3994 computation entirely. This could be done for the example above by adjusting the
3995 `b.iter` call to
3996
3997 ```rust
3998 # struct X;
3999 # impl X { fn iter<T, F>(&self, _: F) where F: FnMut() -> T {} } let b = X;
4000 b.iter(|| {
4001 // Note lack of `;` (could also use an explicit `return`).
4002 (0..1000).fold(0, |old, new| old ^ new)
4003 });
4004 ```
4005
4006 Or, the other option is to call the generic `test::black_box` function, which
4007 is an opaque "black box" to the optimizer and so forces it to consider any
4008 argument as used.
4009
4010 ```rust
4011 #![feature(test)]
4012
4013 extern crate test;
4014
4015 # fn main() {
4016 # struct X;
4017 # impl X { fn iter<T, F>(&self, _: F) where F: FnMut() -> T {} } let b = X;
4018 b.iter(|| {
4019 let n = test::black_box(1000);
4020
4021 (0..n).fold(0, |a, b| a ^ b)
4022 })
4023 # }
4024 ```
4025
4026 Neither of these read or modify the value, and are very cheap for small values.
4027 Larger values can be passed indirectly to reduce overhead (e.g.
4028 `black_box(&huge_struct)`).
4029
4030 Performing either of the above changes gives the following benchmarking results
4031
4032 ```text
4033 running 1 test
4034 test bench_xor_1000_ints ... bench: 131 ns/iter (+/- 3)
4035
4036 test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured
4037 ```
4038
4039 However, the optimizer can still modify a testcase in an undesirable manner
4040 even when using either of the above.
4041 "##,
4042 },
4043 Lint {
4044 label: "thread_local_internals",
4045 description: r##"# `thread_local_internals`
4046
4047 This feature is internal to the Rust compiler and is not intended for general use.
4048
4049 ------------------------
4050 "##,
4051 },
4052 Lint {
4053 label: "trace_macros",
4054 description: r##"# `trace_macros`
4055
4056 The tracking issue for this feature is [#29598].
4057
4058 [#29598]: https://github.com/rust-lang/rust/issues/29598
4059
4060 ------------------------
4061
4062 With `trace_macros` you can trace the expansion of macros in your code.
4063
4064 ## Examples
4065
4066 ```rust
4067 #![feature(trace_macros)]
4068
4069 fn main() {
4070 trace_macros!(true);
4071 println!("Hello, Rust!");
4072 trace_macros!(false);
4073 }
4074 ```
4075
4076 The `cargo build` output:
4077
4078 ```txt
4079 note: trace_macro
4080 --> src/main.rs:5:5
4081 |
4082 5 | println!("Hello, Rust!");
4083 | ^^^^^^^^^^^^^^^^^^^^^^^^^
4084 |
4085 = note: expanding `println! { "Hello, Rust!" }`
4086 = note: to `print ! ( concat ! ( "Hello, Rust!" , "\n" ) )`
4087 = note: expanding `print! { concat ! ( "Hello, Rust!" , "\n" ) }`
4088 = note: to `$crate :: io :: _print ( format_args ! ( concat ! ( "Hello, Rust!" , "\n" ) )
4089 )`
4090
4091 Finished dev [unoptimized + debuginfo] target(s) in 0.60 secs
4092 ```
4093 "##,
4094 },
4095 Lint {
4096 label: "trait_alias",
4097 description: r##"# `trait_alias`
4098
4099 The tracking issue for this feature is: [#41517]
4100
4101 [#41517]: https://github.com/rust-lang/rust/issues/41517
4102
4103 ------------------------
4104
4105 The `trait_alias` feature adds support for trait aliases. These allow aliases
4106 to be created for one or more traits (currently just a single regular trait plus
4107 any number of auto-traits), and used wherever traits would normally be used as
4108 either bounds or trait objects.
4109
4110 ```rust
4111 #![feature(trait_alias)]
4112
4113 trait Foo = std::fmt::Debug + Send;
4114 trait Bar = Foo + Sync;
4115
4116 // Use trait alias as bound on type parameter.
4117 fn foo<T: Foo>(v: &T) {
4118 println!("{:?}", v);
4119 }
4120
4121 pub fn main() {
4122 foo(&1);
4123
4124 // Use trait alias for trait objects.
4125 let a: &Bar = &123;
4126 println!("{:?}", a);
4127 let b = Box::new(456) as Box<dyn Foo>;
4128 println!("{:?}", b);
4129 }
4130 ```
4131 "##,
4132 },
4133 Lint {
4134 label: "trait_upcasting",
4135 description: r##"# `trait_upcasting`
4136
4137 The tracking issue for this feature is: [#65991]
4138
4139 [#65991]: https://github.com/rust-lang/rust/issues/65991
4140
4141 ------------------------
4142
4143 The `trait_upcasting` feature adds support for trait upcasting coercion. This allows a
4144 trait object of type `dyn Bar` to be cast to a trait object of type `dyn Foo`
4145 so long as `Bar: Foo`.
4146
4147 ```rust,edition2018
4148 #![feature(trait_upcasting)]
4149 #![allow(incomplete_features)]
4150
4151 trait Foo {}
4152
4153 trait Bar: Foo {}
4154
4155 impl Foo for i32 {}
4156
4157 impl<T: Foo + ?Sized> Bar for T {}
4158
4159 let bar: &dyn Bar = &123;
4160 let foo: &dyn Foo = bar;
4161 ```
4162 "##,
4163 },
4164 Lint {
4165 label: "transparent_unions",
4166 description: r##"# `transparent_unions`
4167
4168 The tracking issue for this feature is [#60405]
4169
4170 [#60405]: https://github.com/rust-lang/rust/issues/60405
4171
4172 ----
4173
4174 The `transparent_unions` feature allows you mark `union`s as
4175 `#[repr(transparent)]`. A `union` may be `#[repr(transparent)]` in exactly the
4176 same conditions in which a `struct` may be `#[repr(transparent)]` (generally,
4177 this means the `union` must have exactly one non-zero-sized field). Some
4178 concrete illustrations follow.
4179
4180 ```rust
4181 #![feature(transparent_unions)]
4182
4183 // This union has the same representation as `f32`.
4184 #[repr(transparent)]
4185 union SingleFieldUnion {
4186 field: f32,
4187 }
4188
4189 // This union has the same representation as `usize`.
4190 #[repr(transparent)]
4191 union MultiFieldUnion {
4192 field: usize,
4193 nothing: (),
4194 }
4195 ```
4196
4197 For consistency with transparent `struct`s, `union`s must have exactly one
4198 non-zero-sized field. If all fields are zero-sized, the `union` must not be
4199 `#[repr(transparent)]`:
4200
4201 ```rust
4202 #![feature(transparent_unions)]
4203
4204 // This (non-transparent) union is already valid in stable Rust:
4205 pub union GoodUnion {
4206 pub nothing: (),
4207 }
4208
4209 // Error: transparent union needs exactly one non-zero-sized field, but has 0
4210 // #[repr(transparent)]
4211 // pub union BadUnion {
4212 // pub nothing: (),
4213 // }
4214 ```
4215
4216 The one exception is if the `union` is generic over `T` and has a field of type
4217 `T`, it may be `#[repr(transparent)]` even if `T` is a zero-sized type:
4218
4219 ```rust
4220 #![feature(transparent_unions)]
4221
4222 // This union has the same representation as `T`.
4223 #[repr(transparent)]
4224 pub union GenericUnion<T: Copy> { // Unions with non-`Copy` fields are unstable.
4225 pub field: T,
4226 pub nothing: (),
4227 }
4228
4229 // This is okay even though `()` is a zero-sized type.
4230 pub const THIS_IS_OKAY: GenericUnion<()> = GenericUnion { field: () };
4231 ```
4232
4233 Like transarent `struct`s, a transparent `union` of type `U` has the same
4234 layout, size, and ABI as its single non-ZST field. If it is generic over a type
4235 `T`, and all its fields are ZSTs except for exactly one field of type `T`, then
4236 it has the same layout and ABI as `T` (even if `T` is a ZST when monomorphized).
4237
4238 Like transparent `struct`s, transparent `union`s are FFI-safe if and only if
4239 their underlying representation type is also FFI-safe.
4240
4241 A `union` may not be eligible for the same nonnull-style optimizations that a
4242 `struct` or `enum` (with the same fields) are eligible for. Adding
4243 `#[repr(transparent)]` to `union` does not change this. To give a more concrete
4244 example, it is unspecified whether `size_of::<T>()` is equal to
4245 `size_of::<Option<T>>()`, where `T` is a `union` (regardless of whether or not
4246 it is transparent). The Rust compiler is free to perform this optimization if
4247 possible, but is not required to, and different compiler versions may differ in
4248 their application of these optimizations.
4249 "##,
4250 },
4251 Lint {
4252 label: "try_blocks",
4253 description: r##"# `try_blocks`
4254
4255 The tracking issue for this feature is: [#31436]
4256
4257 [#31436]: https://github.com/rust-lang/rust/issues/31436
4258
4259 ------------------------
4260
4261 The `try_blocks` feature adds support for `try` blocks. A `try`
4262 block creates a new scope one can use the `?` operator in.
4263
4264 ```rust,edition2018
4265 #![feature(try_blocks)]
4266
4267 use std::num::ParseIntError;
4268
4269 let result: Result<i32, ParseIntError> = try {
4270 "1".parse::<i32>()?
4271 + "2".parse::<i32>()?
4272 + "3".parse::<i32>()?
4273 };
4274 assert_eq!(result, Ok(6));
4275
4276 let result: Result<i32, ParseIntError> = try {
4277 "1".parse::<i32>()?
4278 + "foo".parse::<i32>()?
4279 + "3".parse::<i32>()?
4280 };
4281 assert!(result.is_err());
4282 ```
4283 "##,
4284 },
4285 Lint {
4286 label: "type_changing_struct_update",
4287 description: r##"# `type_changing_struct_update`
4288
4289 The tracking issue for this feature is: [#86555]
4290
4291 [#86555]: https://github.com/rust-lang/rust/issues/86555
4292
4293 ------------------------
4294
4295 This implements [RFC2528]. When turned on, you can create instances of the same struct
4296 that have different generic type or lifetime parameters.
4297
4298 [RFC2528]: https://github.com/rust-lang/rfcs/blob/master/text/2528-type-changing-struct-update-syntax.md
4299
4300 ```rust
4301 #![allow(unused_variables, dead_code)]
4302 #![feature(type_changing_struct_update)]
4303
4304 fn main () {
4305 struct Foo<T, U> {
4306 field1: T,
4307 field2: U,
4308 }
4309
4310 let base: Foo<String, i32> = Foo {
4311 field1: String::from("hello"),
4312 field2: 1234,
4313 };
4314 let updated: Foo<f64, i32> = Foo {
4315 field1: 3.14,
4316 ..base
4317 };
4318 }
4319 ```
4320 "##,
4321 },
4322 Lint {
4323 label: "unboxed_closures",
4324 description: r##"# `unboxed_closures`
4325
4326 The tracking issue for this feature is [#29625]
4327
4328 See Also: [`fn_traits`](../library-features/fn-traits.md)
4329
4330 [#29625]: https://github.com/rust-lang/rust/issues/29625
4331
4332 ----
4333
4334 The `unboxed_closures` feature allows you to write functions using the `"rust-call"` ABI,
4335 required for implementing the [`Fn*`] family of traits. `"rust-call"` functions must have
4336 exactly one (non self) argument, a tuple representing the argument list.
4337
4338 [`Fn*`]: https://doc.rust-lang.org/std/ops/trait.Fn.html
4339
4340 ```rust
4341 #![feature(unboxed_closures)]
4342
4343 extern "rust-call" fn add_args(args: (u32, u32)) -> u32 {
4344 args.0 + args.1
4345 }
4346
4347 fn main() {}
4348 ```
4349 "##,
4350 },
4351 Lint {
4352 label: "unsized_locals",
4353 description: r##"# `unsized_locals`
4354
4355 The tracking issue for this feature is: [#48055]
4356
4357 [#48055]: https://github.com/rust-lang/rust/issues/48055
4358
4359 ------------------------
4360
4361 This implements [RFC1909]. When turned on, you can have unsized arguments and locals:
4362
4363 [RFC1909]: https://github.com/rust-lang/rfcs/blob/master/text/1909-unsized-rvalues.md
4364
4365 ```rust
4366 #![allow(incomplete_features)]
4367 #![feature(unsized_locals, unsized_fn_params)]
4368
4369 use std::any::Any;
4370
4371 fn main() {
4372 let x: Box<dyn Any> = Box::new(42);
4373 let x: dyn Any = *x;
4374 // ^ unsized local variable
4375 // ^^ unsized temporary
4376 foo(x);
4377 }
4378
4379 fn foo(_: dyn Any) {}
4380 // ^^^^^^ unsized argument
4381 ```
4382
4383 The RFC still forbids the following unsized expressions:
4384
4385 ```rust,compile_fail
4386 #![feature(unsized_locals)]
4387
4388 use std::any::Any;
4389
4390 struct MyStruct<T: ?Sized> {
4391 content: T,
4392 }
4393
4394 struct MyTupleStruct<T: ?Sized>(T);
4395
4396 fn answer() -> Box<dyn Any> {
4397 Box::new(42)
4398 }
4399
4400 fn main() {
4401 // You CANNOT have unsized statics.
4402 static X: dyn Any = *answer(); // ERROR
4403 const Y: dyn Any = *answer(); // ERROR
4404
4405 // You CANNOT have struct initialized unsized.
4406 MyStruct { content: *answer() }; // ERROR
4407 MyTupleStruct(*answer()); // ERROR
4408 (42, *answer()); // ERROR
4409
4410 // You CANNOT have unsized return types.
4411 fn my_function() -> dyn Any { *answer() } // ERROR
4412
4413 // You CAN have unsized local variables...
4414 let mut x: dyn Any = *answer(); // OK
4415 // ...but you CANNOT reassign to them.
4416 x = *answer(); // ERROR
4417
4418 // You CANNOT even initialize them separately.
4419 let y: dyn Any; // OK
4420 y = *answer(); // ERROR
4421
4422 // Not mentioned in the RFC, but by-move captured variables are also Sized.
4423 let x: dyn Any = *answer();
4424 (move || { // ERROR
4425 let y = x;
4426 })();
4427
4428 // You CAN create a closure with unsized arguments,
4429 // but you CANNOT call it.
4430 // This is an implementation detail and may be changed in the future.
4431 let f = |x: dyn Any| {};
4432 f(*answer()); // ERROR
4433 }
4434 ```
4435
4436 ## By-value trait objects
4437
4438 With this feature, you can have by-value `self` arguments without `Self: Sized` bounds.
4439
4440 ```rust
4441 #![feature(unsized_fn_params)]
4442
4443 trait Foo {
4444 fn foo(self) {}
4445 }
4446
4447 impl<T: ?Sized> Foo for T {}
4448
4449 fn main() {
4450 let slice: Box<[i32]> = Box::new([1, 2, 3]);
4451 <[i32] as Foo>::foo(*slice);
4452 }
4453 ```
4454
4455 And `Foo` will also be object-safe.
4456
4457 ```rust
4458 #![feature(unsized_fn_params)]
4459
4460 trait Foo {
4461 fn foo(self) {}
4462 }
4463
4464 impl<T: ?Sized> Foo for T {}
4465
4466 fn main () {
4467 let slice: Box<dyn Foo> = Box::new([1, 2, 3]);
4468 // doesn't compile yet
4469 <dyn Foo as Foo>::foo(*slice);
4470 }
4471 ```
4472
4473 One of the objectives of this feature is to allow `Box<dyn FnOnce>`.
4474
4475 ## Variable length arrays
4476
4477 The RFC also describes an extension to the array literal syntax: `[e; dyn n]`. In the syntax, `n` isn't necessarily a constant expression. The array is dynamically allocated on the stack and has the type of `[T]`, instead of `[T; n]`.
4478
4479 ```rust,ignore (not-yet-implemented)
4480 #![feature(unsized_locals)]
4481
4482 fn mergesort<T: Ord>(a: &mut [T]) {
4483 let mut tmp = [T; dyn a.len()];
4484 // ...
4485 }
4486
4487 fn main() {
4488 let mut a = [3, 1, 5, 6];
4489 mergesort(&mut a);
4490 assert_eq!(a, [1, 3, 5, 6]);
4491 }
4492 ```
4493
4494 VLAs are not implemented yet. The syntax isn't final, either. We may need an alternative syntax for Rust 2015 because, in Rust 2015, expressions like `[e; dyn(1)]` would be ambiguous. One possible alternative proposed in the RFC is `[e; n]`: if `n` captures one or more local variables, then it is considered as `[e; dyn n]`.
4495
4496 ## Advisory on stack usage
4497
4498 It's advised not to casually use the `#![feature(unsized_locals)]` feature. Typical use-cases are:
4499
4500 - When you need a by-value trait objects.
4501 - When you really need a fast allocation of small temporary arrays.
4502
4503 Another pitfall is repetitive allocation and temporaries. Currently the compiler simply extends the stack frame every time it encounters an unsized assignment. So for example, the code
4504
4505 ```rust
4506 #![feature(unsized_locals)]
4507
4508 fn main() {
4509 let x: Box<[i32]> = Box::new([1, 2, 3, 4, 5]);
4510 let _x = {{{{{{{{{{*x}}}}}}}}}};
4511 }
4512 ```
4513
4514 and the code
4515
4516 ```rust
4517 #![feature(unsized_locals)]
4518
4519 fn main() {
4520 for _ in 0..10 {
4521 let x: Box<[i32]> = Box::new([1, 2, 3, 4, 5]);
4522 let _x = *x;
4523 }
4524 }
4525 ```
4526
4527 will unnecessarily extend the stack frame.
4528 "##,
4529 },
4530 Lint {
4531 label: "unsized_tuple_coercion",
4532 description: r##"# `unsized_tuple_coercion`
4533
4534 The tracking issue for this feature is: [#42877]
4535
4536 [#42877]: https://github.com/rust-lang/rust/issues/42877
4537
4538 ------------------------
4539
4540 This is a part of [RFC0401]. According to the RFC, there should be an implementation like this:
4541
4542 ```rust,ignore (partial-example)
4543 impl<..., T, U: ?Sized> Unsized<(..., U)> for (..., T) where T: Unsized<U> {}
4544 ```
4545
4546 This implementation is currently gated behind `#[feature(unsized_tuple_coercion)]` to avoid insta-stability. Therefore you can use it like this:
4547
4548 ```rust
4549 #![feature(unsized_tuple_coercion)]
4550
4551 fn main() {
4552 let x : ([i32; 3], [i32; 3]) = ([1, 2, 3], [4, 5, 6]);
4553 let y : &([i32; 3], [i32]) = &x;
4554 assert_eq!(y.1[0], 4);
4555 }
4556 ```
4557
4558 [RFC0401]: https://github.com/rust-lang/rfcs/blob/master/text/0401-coercions.md
4559 "##,
4560 },
4561 Lint {
4562 label: "update_panic_count",
4563 description: r##"# `update_panic_count`
4564
4565 This feature is internal to the Rust compiler and is not intended for general use.
4566
4567 ------------------------
4568 "##,
4569 },
4570 Lint {
4571 label: "windows_c",
4572 description: r##"# `windows_c`
4573
4574 This feature is internal to the Rust compiler and is not intended for general use.
4575
4576 ------------------------
4577 "##,
4578 },
4579 Lint {
4580 label: "windows_handle",
4581 description: r##"# `windows_handle`
4582
4583 This feature is internal to the Rust compiler and is not intended for general use.
4584
4585 ------------------------
4586 "##,
4587 },
4588 Lint {
4589 label: "windows_net",
4590 description: r##"# `windows_net`
4591
4592 This feature is internal to the Rust compiler and is not intended for general use.
4593
4594 ------------------------
4595 "##,
4596 },
4597 Lint {
4598 label: "windows_stdio",
4599 description: r##"# `windows_stdio`
4600
4601 This feature is internal to the Rust compiler and is not intended for general use.
4602
4603 ------------------------
4604 "##,
4605 },
4606 ];
4607
4608 pub const CLIPPY_LINTS: &[Lint] = &[
4609 Lint {
4610 label: "clippy::absurd_extreme_comparisons",
4611 description: r##"Checks for comparisons where one side of the relation is
4612 either the minimum or maximum value for its type and warns if it involves a
4613 case that is always true or always false. Only integer and boolean types are
4614 checked."##,
4615 },
4616 Lint {
4617 label: "clippy::almost_swapped",
4618 description: r##"Checks for `foo = bar; bar = foo` sequences."##,
4619 },
4620 Lint {
4621 label: "clippy::approx_constant",
4622 description: r##"Checks for floating point literals that approximate
4623 constants which are defined in
4624 [`std::f32::consts`](https://doc.rust-lang.org/stable/std/f32/consts/#constants)
4625 or
4626 [`std::f64::consts`](https://doc.rust-lang.org/stable/std/f64/consts/#constants),
4627 respectively, suggesting to use the predefined constant."##,
4628 },
4629 Lint {
4630 label: "clippy::as_conversions",
4631 description: r##"Checks for usage of `as` conversions.
4632
4633 Note that this lint is specialized in linting *every single* use of `as`
4634 regardless of whether good alternatives exist or not.
4635 If you want more precise lints for `as`, please consider using these separate lints:
4636 `unnecessary_cast`, `cast_lossless/possible_truncation/possible_wrap/precision_loss/sign_loss`,
4637 `fn_to_numeric_cast(_with_truncation)`, `char_lit_as_u8`, `ref_to_mut` and `ptr_as_ptr`.
4638 There is a good explanation the reason why this lint should work in this way and how it is useful
4639 [in this issue](https://github.com/rust-lang/rust-clippy/issues/5122)."##,
4640 },
4641 Lint {
4642 label: "clippy::assertions_on_constants",
4643 description: r##"Checks for `assert!(true)` and `assert!(false)` calls."##,
4644 },
4645 Lint {
4646 label: "clippy::assign_op_pattern",
4647 description: r##"Checks for `a = a op b` or `a = b commutative_op a`
4648 patterns."##,
4649 },
4650 Lint {
4651 label: "clippy::assign_ops",
4652 description: r##"Nothing. This lint has been deprecated."##,
4653 },
4654 Lint {
4655 label: "clippy::async_yields_async",
4656 description: r##"Checks for async blocks that yield values of types
4657 that can themselves be awaited."##,
4658 },
4659 Lint {
4660 label: "clippy::await_holding_lock",
4661 description: r##"Checks for calls to await while holding a
4662 non-async-aware MutexGuard."##,
4663 },
4664 Lint {
4665 label: "clippy::await_holding_refcell_ref",
4666 description: r##"Checks for calls to await while holding a
4667 `RefCell` `Ref` or `RefMut`."##,
4668 },
4669 Lint {
4670 label: "clippy::bad_bit_mask",
4671 description: r##"Checks for incompatible bit masks in comparisons.
4672
4673 The formula for detecting if an expression of the type `_ <bit_op> m
4674 <cmp_op> c` (where `<bit_op>` is one of {`&`, `|`} and `<cmp_op>` is one of
4675 {`!=`, `>=`, `>`, `!=`, `>=`, `>`}) can be determined from the following
4676 table:
4677
4678 |Comparison |Bit Op|Example |is always|Formula |
4679 |------------|------|------------|---------|----------------------|
4680 |`==` or `!=`| `&` |`x & 2 == 3`|`false` |`c & m != c` |
4681 |`<` or `>=`| `&` |`x & 2 < 3` |`true` |`m < c` |
4682 |`>` or `<=`| `&` |`x & 1 > 1` |`false` |`m <= c` |
4683 |`==` or `!=`| `|` |`x | 1 == 0`|`false` |`c | m != c` |
4684 |`<` or `>=`| `|` |`x | 1 < 1` |`false` |`m >= c` |
4685 |`<=` or `>` | `|` |`x | 1 > 0` |`true` |`m > c` |"##,
4686 },
4687 Lint {
4688 label: "clippy::bind_instead_of_map",
4689 description: r##"Checks for usage of `_.and_then(|x| Some(y))`, `_.and_then(|x| Ok(y))` or
4690 `_.or_else(|x| Err(y))`."##,
4691 },
4692 Lint {
4693 label: "clippy::blacklisted_name",
4694 description: r##"Checks for usage of blacklisted names for variables, such
4695 as `foo`."##,
4696 },
4697 Lint {
4698 label: "clippy::blanket_clippy_restriction_lints",
4699 description: r##"Checks for `warn`/`deny`/`forbid` attributes targeting the whole clippy::restriction category."##,
4700 },
4701 Lint {
4702 label: "clippy::blocks_in_if_conditions",
4703 description: r##"Checks for `if` conditions that use blocks containing an
4704 expression, statements or conditions that use closures with blocks."##,
4705 },
4706 Lint {
4707 label: "clippy::bool_assert_comparison",
4708 description: r##"This lint warns about boolean comparisons in assert-like macros."##,
4709 },
4710 Lint {
4711 label: "clippy::bool_comparison",
4712 description: r##"Checks for expressions of the form `x == true`,
4713 `x != true` and order comparisons such as `x < true` (or vice versa) and
4714 suggest using the variable directly."##,
4715 },
4716 Lint {
4717 label: "clippy::borrow_interior_mutable_const",
4718 description: r##"Checks if `const` items which is interior mutable (e.g.,
4719 contains a `Cell`, `Mutex`, `AtomicXxxx`, etc.) has been borrowed directly."##,
4720 },
4721 Lint {
4722 label: "clippy::borrowed_box",
4723 description: r##"Checks for use of `&Box<T>` anywhere in the code.
4724 Check the [Box documentation](https://doc.rust-lang.org/std/boxed/index.html) for more information."##,
4725 },
4726 Lint {
4727 label: "clippy::box_collection",
4728 description: r##"Checks for use of `Box<T>` where T is a collection such as Vec anywhere in the code.
4729 Check the [Box documentation](https://doc.rust-lang.org/std/boxed/index.html) for more information."##,
4730 },
4731 Lint {
4732 label: "clippy::boxed_local",
4733 description: r##"Checks for usage of `Box<T>` where an unboxed `T` would
4734 work fine."##,
4735 },
4736 Lint {
4737 label: "clippy::branches_sharing_code",
4738 description: r##"Checks if the `if` and `else` block contain shared code that can be
4739 moved out of the blocks."##,
4740 },
4741 Lint {
4742 label: "clippy::builtin_type_shadow",
4743 description: r##"Warns if a generic shadows a built-in type."##,
4744 },
4745 Lint {
4746 label: "clippy::bytes_nth",
4747 description: r##"Checks for the use of `.bytes().nth()`."##,
4748 },
4749 Lint {
4750 label: "clippy::cargo_common_metadata",
4751 description: r##"Checks to see if all common metadata is defined in
4752 `Cargo.toml`. See: https://rust-lang-nursery.github.io/api-guidelines/documentation.html#cargotoml-includes-all-common-metadata-c-metadata"##,
4753 },
4754 Lint {
4755 label: "clippy::case_sensitive_file_extension_comparisons",
4756 description: r##"Checks for calls to `ends_with` with possible file extensions
4757 and suggests to use a case-insensitive approach instead."##,
4758 },
4759 Lint {
4760 label: "clippy::cast_lossless",
4761 description: r##"Checks for casts between numerical types that may
4762 be replaced by safe conversion functions."##,
4763 },
4764 Lint {
4765 label: "clippy::cast_possible_truncation",
4766 description: r##"Checks for casts between numerical types that may
4767 truncate large values. This is expected behavior, so the cast is `Allow` by
4768 default."##,
4769 },
4770 Lint {
4771 label: "clippy::cast_possible_wrap",
4772 description: r##"Checks for casts from an unsigned type to a signed type of
4773 the same size. Performing such a cast is a 'no-op' for the compiler,
4774 i.e., nothing is changed at the bit level, and the binary representation of
4775 the value is reinterpreted. This can cause wrapping if the value is too big
4776 for the target signed type. However, the cast works as defined, so this lint
4777 is `Allow` by default."##,
4778 },
4779 Lint {
4780 label: "clippy::cast_precision_loss",
4781 description: r##"Checks for casts from any numerical to a float type where
4782 the receiving type cannot store all values from the original type without
4783 rounding errors. This possible rounding is to be expected, so this lint is
4784 `Allow` by default.
4785
4786 Basically, this warns on casting any integer with 32 or more bits to `f32`
4787 or any 64-bit integer to `f64`."##,
4788 },
4789 Lint {
4790 label: "clippy::cast_ptr_alignment",
4791 description: r##"Checks for casts, using `as` or `pointer::cast`,
4792 from a less-strictly-aligned pointer to a more-strictly-aligned pointer"##,
4793 },
4794 Lint {
4795 label: "clippy::cast_ref_to_mut",
4796 description: r##"Checks for casts of `&T` to `&mut T` anywhere in the code."##,
4797 },
4798 Lint {
4799 label: "clippy::cast_sign_loss",
4800 description: r##"Checks for casts from a signed to an unsigned numerical
4801 type. In this case, negative values wrap around to large positive values,
4802 which can be quite surprising in practice. However, as the cast works as
4803 defined, this lint is `Allow` by default."##,
4804 },
4805 Lint {
4806 label: "clippy::char_lit_as_u8",
4807 description: r##"Checks for expressions where a character literal is cast
4808 to `u8` and suggests using a byte literal instead."##,
4809 },
4810 Lint {
4811 label: "clippy::chars_last_cmp",
4812 description: r##"Checks for usage of `_.chars().last()` or
4813 `_.chars().next_back()` on a `str` to check if it ends with a given char."##,
4814 },
4815 Lint {
4816 label: "clippy::chars_next_cmp",
4817 description: r##"Checks for usage of `.chars().next()` on a `str` to check
4818 if it starts with a given char."##,
4819 },
4820 Lint {
4821 label: "clippy::checked_conversions",
4822 description: r##"Checks for explicit bounds checking when casting."##,
4823 },
4824 Lint {
4825 label: "clippy::clone_double_ref",
4826 description: r##"Checks for usage of `.clone()` on an `&&T`."##,
4827 },
4828 Lint {
4829 label: "clippy::clone_on_copy",
4830 description: r##"Checks for usage of `.clone()` on a `Copy` type."##,
4831 },
4832 Lint {
4833 label: "clippy::clone_on_ref_ptr",
4834 description: r##"Checks for usage of `.clone()` on a ref-counted pointer,
4835 (`Rc`, `Arc`, `rc::Weak`, or `sync::Weak`), and suggests calling Clone via unified
4836 function syntax instead (e.g., `Rc::clone(foo)`)."##,
4837 },
4838 Lint {
4839 label: "clippy::cloned_instead_of_copied",
4840 description: r##"Checks for usages of `cloned()` on an `Iterator` or `Option` where
4841 `copied()` could be used instead."##,
4842 },
4843 Lint { label: "clippy::cmp_nan", description: r##"Checks for comparisons to NaN."## },
4844 Lint {
4845 label: "clippy::cmp_null",
4846 description: r##"This lint checks for equality comparisons with `ptr::null`"##,
4847 },
4848 Lint {
4849 label: "clippy::cmp_owned",
4850 description: r##"Checks for conversions to owned values just for the sake
4851 of a comparison."##,
4852 },
4853 Lint {
4854 label: "clippy::cognitive_complexity",
4855 description: r##"Checks for methods with high cognitive complexity."##,
4856 },
4857 Lint {
4858 label: "clippy::collapsible_else_if",
4859 description: r##"Checks for collapsible `else { if ... }` expressions
4860 that can be collapsed to `else if ...`."##,
4861 },
4862 Lint {
4863 label: "clippy::collapsible_if",
4864 description: r##"Checks for nested `if` statements which can be collapsed
4865 by `&&`-combining their conditions."##,
4866 },
4867 Lint {
4868 label: "clippy::collapsible_match",
4869 description: r##"Finds nested `match` or `if let` expressions where the patterns may be collapsed together
4870 without adding any branches.
4871
4872 Note that this lint is not intended to find _all_ cases where nested match patterns can be merged, but only
4873 cases where merging would most likely make the code more readable."##,
4874 },
4875 Lint {
4876 label: "clippy::comparison_chain",
4877 description: r##"Checks comparison chains written with `if` that can be
4878 rewritten with `match` and `cmp`."##,
4879 },
4880 Lint {
4881 label: "clippy::comparison_to_empty",
4882 description: r##"Checks for comparing to an empty slice such as `` or `[]`,
4883 and suggests using `.is_empty()` where applicable."##,
4884 },
4885 Lint {
4886 label: "clippy::copy_iterator",
4887 description: r##"Checks for types that implement `Copy` as well as
4888 `Iterator`."##,
4889 },
4890 Lint {
4891 label: "clippy::create_dir",
4892 description: r##"Checks usage of `std::fs::create_dir` and suggest using `std::fs::create_dir_all` instead."##,
4893 },
4894 Lint {
4895 label: "clippy::crosspointer_transmute",
4896 description: r##"Checks for transmutes between a type `T` and `*T`."##,
4897 },
4898 Lint { label: "clippy::dbg_macro", description: r##"Checks for usage of dbg!() macro."## },
4899 Lint {
4900 label: "clippy::debug_assert_with_mut_call",
4901 description: r##"Checks for function/method calls with a mutable
4902 parameter in `debug_assert!`, `debug_assert_eq!` and `debug_assert_ne!` macros."##,
4903 },
4904 Lint {
4905 label: "clippy::decimal_literal_representation",
4906 description: r##"Warns if there is a better representation for a numeric literal."##,
4907 },
4908 Lint {
4909 label: "clippy::declare_interior_mutable_const",
4910 description: r##"Checks for declaration of `const` items which is interior
4911 mutable (e.g., contains a `Cell`, `Mutex`, `AtomicXxxx`, etc.)."##,
4912 },
4913 Lint {
4914 label: "clippy::default_numeric_fallback",
4915 description: r##"Checks for usage of unconstrained numeric literals which may cause default numeric fallback in type
4916 inference.
4917
4918 Default numeric fallback means that if numeric types have not yet been bound to concrete
4919 types at the end of type inference, then integer type is bound to `i32`, and similarly
4920 floating type is bound to `f64`.
4921
4922 See [RFC0212](https://github.com/rust-lang/rfcs/blob/master/text/0212-restore-int-fallback.md) for more information about the fallback."##,
4923 },
4924 Lint {
4925 label: "clippy::default_trait_access",
4926 description: r##"Checks for literal calls to `Default::default()`."##,
4927 },
4928 Lint {
4929 label: "clippy::deprecated_cfg_attr",
4930 description: r##"Checks for `#[cfg_attr(rustfmt, rustfmt_skip)]` and suggests to replace it
4931 with `#[rustfmt::skip]`."##,
4932 },
4933 Lint {
4934 label: "clippy::deprecated_semver",
4935 description: r##"Checks for `#[deprecated]` annotations with a `since`
4936 field that is not a valid semantic version."##,
4937 },
4938 Lint {
4939 label: "clippy::deref_addrof",
4940 description: r##"Checks for usage of `*&` and `*&mut` in expressions."##,
4941 },
4942 Lint {
4943 label: "clippy::derivable_impls",
4944 description: r##"Detects manual `std::default::Default` implementations that are identical to a derived implementation."##,
4945 },
4946 Lint {
4947 label: "clippy::derive_hash_xor_eq",
4948 description: r##"Checks for deriving `Hash` but implementing `PartialEq`
4949 explicitly or vice versa."##,
4950 },
4951 Lint {
4952 label: "clippy::derive_ord_xor_partial_ord",
4953 description: r##"Checks for deriving `Ord` but implementing `PartialOrd`
4954 explicitly or vice versa."##,
4955 },
4956 Lint {
4957 label: "clippy::disallowed_methods",
4958 description: r##"Denies the configured methods and functions in clippy.toml"##,
4959 },
4960 Lint {
4961 label: "clippy::disallowed_script_idents",
4962 description: r##"Checks for usage of unicode scripts other than those explicitly allowed
4963 by the lint config.
4964
4965 This lint doesn't take into account non-text scripts such as `Unknown` and `Linear_A`.
4966 It also ignores the `Common` script type.
4967 While configuring, be sure to use official script name [aliases] from
4968 [the list of supported scripts][supported_scripts].
4969
4970 See also: [`non_ascii_idents`].
4971
4972 [aliases]: http://www.unicode.org/reports/tr24/tr24-31.html#Script_Value_Aliases
4973 [supported_scripts]: https://www.unicode.org/iso15924/iso15924-codes.html"##,
4974 },
4975 Lint {
4976 label: "clippy::disallowed_types",
4977 description: r##"Denies the configured types in clippy.toml."##,
4978 },
4979 Lint {
4980 label: "clippy::diverging_sub_expression",
4981 description: r##"Checks for diverging calls that are not match arms or
4982 statements."##,
4983 },
4984 Lint {
4985 label: "clippy::doc_markdown",
4986 description: r##"Checks for the presence of `_`, `::` or camel-case words
4987 outside ticks in documentation."##,
4988 },
4989 Lint {
4990 label: "clippy::double_comparisons",
4991 description: r##"Checks for double comparisons that could be simplified to a single expression."##,
4992 },
4993 Lint {
4994 label: "clippy::double_must_use",
4995 description: r##"Checks for a `#[must_use]` attribute without
4996 further information on functions and methods that return a type already
4997 marked as `#[must_use]`."##,
4998 },
4999 Lint {
5000 label: "clippy::double_neg",
5001 description: r##"Detects expressions of the form `--x`."##,
5002 },
5003 Lint {
5004 label: "clippy::double_parens",
5005 description: r##"Checks for unnecessary double parentheses."##,
5006 },
5007 Lint {
5008 label: "clippy::drop_copy",
5009 description: r##"Checks for calls to `std::mem::drop` with a value
5010 that derives the Copy trait"##,
5011 },
5012 Lint {
5013 label: "clippy::drop_ref",
5014 description: r##"Checks for calls to `std::mem::drop` with a reference
5015 instead of an owned value."##,
5016 },
5017 Lint {
5018 label: "clippy::duplicate_underscore_argument",
5019 description: r##"Checks for function arguments having the similar names
5020 differing by an underscore."##,
5021 },
5022 Lint {
5023 label: "clippy::duration_subsec",
5024 description: r##"Checks for calculation of subsecond microseconds or milliseconds
5025 from other `Duration` methods."##,
5026 },
5027 Lint {
5028 label: "clippy::else_if_without_else",
5029 description: r##"Checks for usage of if expressions with an `else if` branch,
5030 but without a final `else` branch."##,
5031 },
5032 Lint {
5033 label: "clippy::empty_enum",
5034 description: r##"Checks for `enum`s with no variants.
5035
5036 As of this writing, the `never_type` is still a
5037 nightly-only experimental API. Therefore, this lint is only triggered
5038 if the `never_type` is enabled."##,
5039 },
5040 Lint {
5041 label: "clippy::empty_line_after_outer_attr",
5042 description: r##"Checks for empty lines after outer attributes"##,
5043 },
5044 Lint { label: "clippy::empty_loop", description: r##"Checks for empty `loop` expressions."## },
5045 Lint {
5046 label: "clippy::enum_clike_unportable_variant",
5047 description: r##"Checks for C-like enumerations that are
5048 `repr(isize/usize)` and have values that don't fit into an `i32`."##,
5049 },
5050 Lint { label: "clippy::enum_glob_use", description: r##"Checks for `use Enum::*`."## },
5051 Lint {
5052 label: "clippy::enum_variant_names",
5053 description: r##"Detects enumeration variants that are prefixed or suffixed
5054 by the same characters."##,
5055 },
5056 Lint {
5057 label: "clippy::eq_op",
5058 description: r##"Checks for equal operands to comparison, logical and
5059 bitwise, difference and division binary operators (`==`, `>`, etc., `&&`,
5060 `||`, `&`, `|`, `^`, `-` and `/`)."##,
5061 },
5062 Lint {
5063 label: "clippy::equatable_if_let",
5064 description: r##"Checks for pattern matchings that can be expressed using equality."##,
5065 },
5066 Lint {
5067 label: "clippy::erasing_op",
5068 description: r##"Checks for erasing operations, e.g., `x * 0`."##,
5069 },
5070 Lint {
5071 label: "clippy::eval_order_dependence",
5072 description: r##"Checks for a read and a write to the same variable where
5073 whether the read occurs before or after the write depends on the evaluation
5074 order of sub-expressions."##,
5075 },
5076 Lint {
5077 label: "clippy::excessive_precision",
5078 description: r##"Checks for float literals with a precision greater
5079 than that supported by the underlying type."##,
5080 },
5081 Lint {
5082 label: "clippy::exhaustive_enums",
5083 description: r##"Warns on any exported `enum`s that are not tagged `#[non_exhaustive]`"##,
5084 },
5085 Lint {
5086 label: "clippy::exhaustive_structs",
5087 description: r##"Warns on any exported `structs`s that are not tagged `#[non_exhaustive]`"##,
5088 },
5089 Lint {
5090 label: "clippy::exit",
5091 description: r##"`exit()` terminates the program and doesn't provide a
5092 stack trace."##,
5093 },
5094 Lint {
5095 label: "clippy::expect_fun_call",
5096 description: r##"Checks for calls to `.expect(&format!(...))`, `.expect(foo(..))`,
5097 etc., and suggests to use `unwrap_or_else` instead"##,
5098 },
5099 Lint {
5100 label: "clippy::expect_used",
5101 description: r##"Checks for `.expect()` calls on `Option`s and `Result`s."##,
5102 },
5103 Lint {
5104 label: "clippy::expl_impl_clone_on_copy",
5105 description: r##"Checks for explicit `Clone` implementations for `Copy`
5106 types."##,
5107 },
5108 Lint {
5109 label: "clippy::explicit_counter_loop",
5110 description: r##"Checks `for` loops over slices with an explicit counter
5111 and suggests the use of `.enumerate()`."##,
5112 },
5113 Lint {
5114 label: "clippy::explicit_deref_methods",
5115 description: r##"Checks for explicit `deref()` or `deref_mut()` method calls."##,
5116 },
5117 Lint {
5118 label: "clippy::explicit_into_iter_loop",
5119 description: r##"Checks for loops on `y.into_iter()` where `y` will do, and
5120 suggests the latter."##,
5121 },
5122 Lint {
5123 label: "clippy::explicit_iter_loop",
5124 description: r##"Checks for loops on `x.iter()` where `&x` will do, and
5125 suggests the latter."##,
5126 },
5127 Lint {
5128 label: "clippy::explicit_write",
5129 description: r##"Checks for usage of `write!()` / `writeln()!` which can be
5130 replaced with `(e)print!()` / `(e)println!()`"##,
5131 },
5132 Lint {
5133 label: "clippy::extend_from_slice",
5134 description: r##"Nothing. This lint has been deprecated."##,
5135 },
5136 Lint {
5137 label: "clippy::extend_with_drain",
5138 description: r##"Checks for occurrences where one vector gets extended instead of append"##,
5139 },
5140 Lint {
5141 label: "clippy::extra_unused_lifetimes",
5142 description: r##"Checks for lifetimes in generics that are never used
5143 anywhere else."##,
5144 },
5145 Lint {
5146 label: "clippy::fallible_impl_from",
5147 description: r##"Checks for impls of `From<..>` that contain `panic!()` or `unwrap()`"##,
5148 },
5149 Lint {
5150 label: "clippy::field_reassign_with_default",
5151 description: r##"Checks for immediate reassignment of fields initialized
5152 with Default::default()."##,
5153 },
5154 Lint {
5155 label: "clippy::filetype_is_file",
5156 description: r##"Checks for `FileType::is_file()`."##,
5157 },
5158 Lint {
5159 label: "clippy::filter_map",
5160 description: r##"Nothing. This lint has been deprecated."##,
5161 },
5162 Lint {
5163 label: "clippy::filter_map_identity",
5164 description: r##"Checks for usage of `filter_map(|x| x)`."##,
5165 },
5166 Lint {
5167 label: "clippy::filter_map_next",
5168 description: r##"Checks for usage of `_.filter_map(_).next()`."##,
5169 },
5170 Lint {
5171 label: "clippy::filter_next",
5172 description: r##"Checks for usage of `_.filter(_).next()`."##,
5173 },
5174 Lint { label: "clippy::find_map", description: r##"Nothing. This lint has been deprecated."## },
5175 Lint {
5176 label: "clippy::flat_map_identity",
5177 description: r##"Checks for usage of `flat_map(|x| x)`."##,
5178 },
5179 Lint {
5180 label: "clippy::flat_map_option",
5181 description: r##"Checks for usages of `Iterator::flat_map()` where `filter_map()` could be
5182 used instead."##,
5183 },
5184 Lint { label: "clippy::float_arithmetic", description: r##"Checks for float arithmetic."## },
5185 Lint {
5186 label: "clippy::float_cmp",
5187 description: r##"Checks for (in-)equality comparisons on floating-point
5188 values (apart from zero), except in functions called `*eq*` (which probably
5189 implement equality for a type involving floats)."##,
5190 },
5191 Lint {
5192 label: "clippy::float_cmp_const",
5193 description: r##"Checks for (in-)equality comparisons on floating-point
5194 value and constant, except in functions called `*eq*` (which probably
5195 implement equality for a type involving floats)."##,
5196 },
5197 Lint {
5198 label: "clippy::float_equality_without_abs",
5199 description: r##"Checks for statements of the form `(a - b) < f32::EPSILON` or
5200 `(a - b) < f64::EPSILON`. Notes the missing `.abs()`."##,
5201 },
5202 Lint {
5203 label: "clippy::fn_address_comparisons",
5204 description: r##"Checks for comparisons with an address of a function item."##,
5205 },
5206 Lint {
5207 label: "clippy::fn_params_excessive_bools",
5208 description: r##"Checks for excessive use of
5209 bools in function definitions."##,
5210 },
5211 Lint {
5212 label: "clippy::fn_to_numeric_cast",
5213 description: r##"Checks for casts of function pointers to something other than usize"##,
5214 },
5215 Lint {
5216 label: "clippy::fn_to_numeric_cast_any",
5217 description: r##"Checks for casts of a function pointer to any integer type."##,
5218 },
5219 Lint {
5220 label: "clippy::fn_to_numeric_cast_with_truncation",
5221 description: r##"Checks for casts of a function pointer to a numeric type not wide enough to
5222 store address."##,
5223 },
5224 Lint {
5225 label: "clippy::for_kv_map",
5226 description: r##"Checks for iterating a map (`HashMap` or `BTreeMap`) and
5227 ignoring either the keys or values."##,
5228 },
5229 Lint {
5230 label: "clippy::for_loops_over_fallibles",
5231 description: r##"Checks for `for` loops over `Option` or `Result` values."##,
5232 },
5233 Lint {
5234 label: "clippy::forget_copy",
5235 description: r##"Checks for calls to `std::mem::forget` with a value that
5236 derives the Copy trait"##,
5237 },
5238 Lint {
5239 label: "clippy::forget_ref",
5240 description: r##"Checks for calls to `std::mem::forget` with a reference
5241 instead of an owned value."##,
5242 },
5243 Lint {
5244 label: "clippy::format_in_format_args",
5245 description: r##"Detects `format!` within the arguments of another macro that does
5246 formatting such as `format!` itself, `write!` or `println!`. Suggests
5247 inlining the `format!` call."##,
5248 },
5249 Lint {
5250 label: "clippy::from_iter_instead_of_collect",
5251 description: r##"Checks for `from_iter()` function calls on types that implement the `FromIterator`
5252 trait."##,
5253 },
5254 Lint {
5255 label: "clippy::from_over_into",
5256 description: r##"Searches for implementations of the `Into<..>` trait and suggests to implement `From<..>` instead."##,
5257 },
5258 Lint {
5259 label: "clippy::from_str_radix_10",
5260 description: r##"Checks for function invocations of the form `primitive::from_str_radix(s, 10)`"##,
5261 },
5262 Lint {
5263 label: "clippy::future_not_send",
5264 description: r##"This lint requires Future implementations returned from
5265 functions and methods to implement the `Send` marker trait. It is mostly
5266 used by library authors (public and internal) that target an audience where
5267 multithreaded executors are likely to be used for running these Futures."##,
5268 },
5269 Lint {
5270 label: "clippy::get_last_with_len",
5271 description: r##"Checks for using `x.get(x.len() - 1)` instead of
5272 `x.last()`."##,
5273 },
5274 Lint {
5275 label: "clippy::get_unwrap",
5276 description: r##"Checks for use of `.get().unwrap()` (or
5277 `.get_mut().unwrap`) on a standard library type which implements `Index`"##,
5278 },
5279 Lint {
5280 label: "clippy::identity_op",
5281 description: r##"Checks for identity operations, e.g., `x + 0`."##,
5282 },
5283 Lint {
5284 label: "clippy::if_let_mutex",
5285 description: r##"Checks for `Mutex::lock` calls in `if let` expression
5286 with lock calls in any of the else blocks."##,
5287 },
5288 Lint {
5289 label: "clippy::if_let_redundant_pattern_matching",
5290 description: r##"Nothing. This lint has been deprecated."##,
5291 },
5292 Lint {
5293 label: "clippy::if_not_else",
5294 description: r##"Checks for usage of `!` or `!=` in an if condition with an
5295 else branch."##,
5296 },
5297 Lint {
5298 label: "clippy::if_same_then_else",
5299 description: r##"Checks for `if/else` with the same body as the *then* part
5300 and the *else* part."##,
5301 },
5302 Lint {
5303 label: "clippy::if_then_some_else_none",
5304 description: r##"Checks for if-else that could be written to `bool::then`."##,
5305 },
5306 Lint {
5307 label: "clippy::ifs_same_cond",
5308 description: r##"Checks for consecutive `if`s with the same condition."##,
5309 },
5310 Lint {
5311 label: "clippy::implicit_clone",
5312 description: r##"Checks for the usage of `_.to_owned()`, `vec.to_vec()`, or similar when calling `_.clone()` would be clearer."##,
5313 },
5314 Lint {
5315 label: "clippy::implicit_hasher",
5316 description: r##"Checks for public `impl` or `fn` missing generalization
5317 over different hashers and implicitly defaulting to the default hashing
5318 algorithm (`SipHash`)."##,
5319 },
5320 Lint {
5321 label: "clippy::implicit_return",
5322 description: r##"Checks for missing return statements at the end of a block."##,
5323 },
5324 Lint {
5325 label: "clippy::implicit_saturating_sub",
5326 description: r##"Checks for implicit saturating subtraction."##,
5327 },
5328 Lint {
5329 label: "clippy::imprecise_flops",
5330 description: r##"Looks for floating-point expressions that
5331 can be expressed using built-in methods to improve accuracy
5332 at the cost of performance."##,
5333 },
5334 Lint {
5335 label: "clippy::inconsistent_digit_grouping",
5336 description: r##"Warns if an integral or floating-point constant is
5337 grouped inconsistently with underscores."##,
5338 },
5339 Lint {
5340 label: "clippy::inconsistent_struct_constructor",
5341 description: r##"Checks for struct constructors where all fields are shorthand and
5342 the order of the field init shorthand in the constructor is inconsistent
5343 with the order in the struct definition."##,
5344 },
5345 Lint {
5346 label: "clippy::index_refutable_slice",
5347 description: r##"The lint checks for slice bindings in patterns that are only used to
5348 access individual slice values."##,
5349 },
5350 Lint {
5351 label: "clippy::indexing_slicing",
5352 description: r##"Checks for usage of indexing or slicing. Arrays are special cases, this lint
5353 does report on arrays if we can tell that slicing operations are in bounds and does not
5354 lint on constant `usize` indexing on arrays because that is handled by rustc's `const_err` lint."##,
5355 },
5356 Lint {
5357 label: "clippy::ineffective_bit_mask",
5358 description: r##"Checks for bit masks in comparisons which can be removed
5359 without changing the outcome. The basic structure can be seen in the
5360 following table:
5361
5362 |Comparison| Bit Op |Example |equals |
5363 |----------|---------|-----------|-------|
5364 |`>` / `<=`|`|` / `^`|`x | 2 > 3`|`x > 3`|
5365 |`<` / `>=`|`|` / `^`|`x ^ 1 < 4`|`x < 4`|"##,
5366 },
5367 Lint {
5368 label: "clippy::inefficient_to_string",
5369 description: r##"Checks for usage of `.to_string()` on an `&&T` where
5370 `T` implements `ToString` directly (like `&&str` or `&&String`)."##,
5371 },
5372 Lint {
5373 label: "clippy::infallible_destructuring_match",
5374 description: r##"Checks for matches being used to destructure a single-variant enum
5375 or tuple struct where a `let` will suffice."##,
5376 },
5377 Lint {
5378 label: "clippy::infinite_iter",
5379 description: r##"Checks for iteration that is guaranteed to be infinite."##,
5380 },
5381 Lint {
5382 label: "clippy::inherent_to_string",
5383 description: r##"Checks for the definition of inherent methods with a signature of `to_string(&self) -> String`."##,
5384 },
5385 Lint {
5386 label: "clippy::inherent_to_string_shadow_display",
5387 description: r##"Checks for the definition of inherent methods with a signature of `to_string(&self) -> String` and if the type implementing this method also implements the `Display` trait."##,
5388 },
5389 Lint {
5390 label: "clippy::inline_always",
5391 description: r##"Checks for items annotated with `#[inline(always)]`,
5392 unless the annotated function is empty or simply panics."##,
5393 },
5394 Lint {
5395 label: "clippy::inline_asm_x86_att_syntax",
5396 description: r##"Checks for usage of AT&T x86 assembly syntax."##,
5397 },
5398 Lint {
5399 label: "clippy::inline_asm_x86_intel_syntax",
5400 description: r##"Checks for usage of Intel x86 assembly syntax."##,
5401 },
5402 Lint {
5403 label: "clippy::inline_fn_without_body",
5404 description: r##"Checks for `#[inline]` on trait methods without bodies"##,
5405 },
5406 Lint {
5407 label: "clippy::inspect_for_each",
5408 description: r##"Checks for usage of `inspect().for_each()`."##,
5409 },
5410 Lint {
5411 label: "clippy::int_plus_one",
5412 description: r##"Checks for usage of `x >= y + 1` or `x - 1 >= y` (and `<=`) in a block"##,
5413 },
5414 Lint {
5415 label: "clippy::integer_arithmetic",
5416 description: r##"Checks for integer arithmetic operations which could overflow or panic.
5417
5418 Specifically, checks for any operators (`+`, `-`, `*`, `<<`, etc) which are capable
5419 of overflowing according to the [Rust
5420 Reference](https://doc.rust-lang.org/reference/expressions/operator-expr.html#overflow),
5421 or which can panic (`/`, `%`). No bounds analysis or sophisticated reasoning is
5422 attempted."##,
5423 },
5424 Lint { label: "clippy::integer_division", description: r##"Checks for division of integers"## },
5425 Lint {
5426 label: "clippy::into_iter_on_ref",
5427 description: r##"Checks for `into_iter` calls on references which should be replaced by `iter`
5428 or `iter_mut`."##,
5429 },
5430 Lint {
5431 label: "clippy::invalid_null_ptr_usage",
5432 description: r##"This lint checks for invalid usages of `ptr::null`."##,
5433 },
5434 Lint {
5435 label: "clippy::invalid_regex",
5436 description: r##"Checks [regex](https://crates.io/crates/regex) creation
5437 (with `Regex::new`, `RegexBuilder::new`, or `RegexSet::new`) for correct
5438 regex syntax."##,
5439 },
5440 Lint {
5441 label: "clippy::invalid_upcast_comparisons",
5442 description: r##"Checks for comparisons where the relation is always either
5443 true or false, but where one side has been upcast so that the comparison is
5444 necessary. Only integer types are checked."##,
5445 },
5446 Lint {
5447 label: "clippy::invisible_characters",
5448 description: r##"Checks for invisible Unicode characters in the code."##,
5449 },
5450 Lint {
5451 label: "clippy::items_after_statements",
5452 description: r##"Checks for items declared after some statement in a block."##,
5453 },
5454 Lint {
5455 label: "clippy::iter_cloned_collect",
5456 description: r##"Checks for the use of `.cloned().collect()` on slice to
5457 create a `Vec`."##,
5458 },
5459 Lint {
5460 label: "clippy::iter_count",
5461 description: r##"Checks for the use of `.iter().count()`."##,
5462 },
5463 Lint { label: "clippy::iter_next_loop", description: r##"Checks for loops on `x.next()`."## },
5464 Lint {
5465 label: "clippy::iter_next_slice",
5466 description: r##"Checks for usage of `iter().next()` on a Slice or an Array"##,
5467 },
5468 Lint {
5469 label: "clippy::iter_not_returning_iterator",
5470 description: r##"Detects methods named `iter` or `iter_mut` that do not have a return type that implements `Iterator`."##,
5471 },
5472 Lint {
5473 label: "clippy::iter_nth",
5474 description: r##"Checks for use of `.iter().nth()` (and the related
5475 `.iter_mut().nth()`) on standard library types with *O*(1) element access."##,
5476 },
5477 Lint {
5478 label: "clippy::iter_nth_zero",
5479 description: r##"Checks for the use of `iter.nth(0)`."##,
5480 },
5481 Lint {
5482 label: "clippy::iter_skip_next",
5483 description: r##"Checks for use of `.skip(x).next()` on iterators."##,
5484 },
5485 Lint {
5486 label: "clippy::iterator_step_by_zero",
5487 description: r##"Checks for calling `.step_by(0)` on iterators which panics."##,
5488 },
5489 Lint {
5490 label: "clippy::just_underscores_and_digits",
5491 description: r##"Checks if you have variables whose name consists of just
5492 underscores and digits."##,
5493 },
5494 Lint {
5495 label: "clippy::large_const_arrays",
5496 description: r##"Checks for large `const` arrays that should
5497 be defined as `static` instead."##,
5498 },
5499 Lint {
5500 label: "clippy::large_digit_groups",
5501 description: r##"Warns if the digits of an integral or floating-point
5502 constant are grouped into groups that
5503 are too large."##,
5504 },
5505 Lint {
5506 label: "clippy::large_enum_variant",
5507 description: r##"Checks for large size differences between variants on
5508 `enum`s."##,
5509 },
5510 Lint {
5511 label: "clippy::large_stack_arrays",
5512 description: r##"Checks for local arrays that may be too large."##,
5513 },
5514 Lint {
5515 label: "clippy::large_types_passed_by_value",
5516 description: r##"Checks for functions taking arguments by value, where
5517 the argument type is `Copy` and large enough to be worth considering
5518 passing by reference. Does not trigger if the function is being exported,
5519 because that might induce API breakage, if the parameter is declared as mutable,
5520 or if the argument is a `self`."##,
5521 },
5522 Lint {
5523 label: "clippy::len_without_is_empty",
5524 description: r##"Checks for items that implement `.len()` but not
5525 `.is_empty()`."##,
5526 },
5527 Lint {
5528 label: "clippy::len_zero",
5529 description: r##"Checks for getting the length of something via `.len()`
5530 just to compare to zero, and suggests using `.is_empty()` where applicable."##,
5531 },
5532 Lint {
5533 label: "clippy::let_and_return",
5534 description: r##"Checks for `let`-bindings, which are subsequently
5535 returned."##,
5536 },
5537 Lint {
5538 label: "clippy::let_underscore_drop",
5539 description: r##"Checks for `let _ = <expr>`
5540 where expr has a type that implements `Drop`"##,
5541 },
5542 Lint {
5543 label: "clippy::let_underscore_lock",
5544 description: r##"Checks for `let _ = sync_lock`.
5545 This supports `mutex` and `rwlock` in `std::sync` and `parking_lot`."##,
5546 },
5547 Lint {
5548 label: "clippy::let_underscore_must_use",
5549 description: r##"Checks for `let _ = <expr>` where expr is `#[must_use]`"##,
5550 },
5551 Lint { label: "clippy::let_unit_value", description: r##"Checks for binding a unit value."## },
5552 Lint {
5553 label: "clippy::linkedlist",
5554 description: r##"Checks for usage of any `LinkedList`, suggesting to use a
5555 `Vec` or a `VecDeque` (formerly called `RingBuf`)."##,
5556 },
5557 Lint {
5558 label: "clippy::logic_bug",
5559 description: r##"Checks for boolean expressions that contain terminals that
5560 can be eliminated."##,
5561 },
5562 Lint {
5563 label: "clippy::lossy_float_literal",
5564 description: r##"Checks for whole number float literals that
5565 cannot be represented as the underlying type without loss."##,
5566 },
5567 Lint {
5568 label: "clippy::macro_use_imports",
5569 description: r##"Checks for `#[macro_use] use...`."##,
5570 },
5571 Lint {
5572 label: "clippy::main_recursion",
5573 description: r##"Checks for recursion using the entrypoint."##,
5574 },
5575 Lint {
5576 label: "clippy::manual_assert",
5577 description: r##"Detects `if`-then-`panic!` that can be replaced with `assert!`."##,
5578 },
5579 Lint {
5580 label: "clippy::manual_async_fn",
5581 description: r##"It checks for manual implementations of `async` functions."##,
5582 },
5583 Lint {
5584 label: "clippy::manual_filter_map",
5585 description: r##"Checks for usage of `_.filter(_).map(_)` that can be written more simply
5586 as `filter_map(_)`."##,
5587 },
5588 Lint {
5589 label: "clippy::manual_find_map",
5590 description: r##"Checks for usage of `_.find(_).map(_)` that can be written more simply
5591 as `find_map(_)`."##,
5592 },
5593 Lint {
5594 label: "clippy::manual_flatten",
5595 description: r##"Check for unnecessary `if let` usage in a for loop
5596 where only the `Some` or `Ok` variant of the iterator element is used."##,
5597 },
5598 Lint {
5599 label: "clippy::manual_map",
5600 description: r##"Checks for usages of `match` which could be implemented using `map`"##,
5601 },
5602 Lint {
5603 label: "clippy::manual_memcpy",
5604 description: r##"Checks for for-loops that manually copy items between
5605 slices that could be optimized by having a memcpy."##,
5606 },
5607 Lint {
5608 label: "clippy::manual_non_exhaustive",
5609 description: r##"Checks for manual implementations of the non-exhaustive pattern."##,
5610 },
5611 Lint {
5612 label: "clippy::manual_ok_or",
5613 description: r##"Finds patterns that reimplement `Option::ok_or`."##,
5614 },
5615 Lint {
5616 label: "clippy::manual_range_contains",
5617 description: r##"Checks for expressions like `x >= 3 && x < 8` that could
5618 be more readably expressed as `(3..8).contains(x)`."##,
5619 },
5620 Lint {
5621 label: "clippy::manual_saturating_arithmetic",
5622 description: r##"Checks for `.checked_add/sub(x).unwrap_or(MAX/MIN)`."##,
5623 },
5624 Lint {
5625 label: "clippy::manual_split_once",
5626 description: r##"Checks for usages of `str::splitn(2, _)`"##,
5627 },
5628 Lint {
5629 label: "clippy::manual_str_repeat",
5630 description: r##"Checks for manual implementations of `str::repeat`"##,
5631 },
5632 Lint {
5633 label: "clippy::manual_strip",
5634 description: r##"Suggests using `strip_{prefix,suffix}` over `str::{starts,ends}_with` and slicing using
5635 the pattern's length."##,
5636 },
5637 Lint { label: "clippy::manual_swap", description: r##"Checks for manual swapping."## },
5638 Lint {
5639 label: "clippy::manual_unwrap_or",
5640 description: r##"Finds patterns that reimplement `Option::unwrap_or` or `Result::unwrap_or`."##,
5641 },
5642 Lint {
5643 label: "clippy::many_single_char_names",
5644 description: r##"Checks for too many variables whose name consists of a
5645 single character."##,
5646 },
5647 Lint {
5648 label: "clippy::map_clone",
5649 description: r##"Checks for usage of `map(|x| x.clone())` or
5650 dereferencing closures for `Copy` types, on `Iterator` or `Option`,
5651 and suggests `cloned()` or `copied()` instead"##,
5652 },
5653 Lint {
5654 label: "clippy::map_collect_result_unit",
5655 description: r##"Checks for usage of `_.map(_).collect::<Result<(), _>()`."##,
5656 },
5657 Lint {
5658 label: "clippy::map_entry",
5659 description: r##"Checks for uses of `contains_key` + `insert` on `HashMap`
5660 or `BTreeMap`."##,
5661 },
5662 Lint {
5663 label: "clippy::map_err_ignore",
5664 description: r##"Checks for instances of `map_err(|_| Some::Enum)`"##,
5665 },
5666 Lint {
5667 label: "clippy::map_flatten",
5668 description: r##"Checks for usage of `_.map(_).flatten(_)` on `Iterator` and `Option`"##,
5669 },
5670 Lint {
5671 label: "clippy::map_identity",
5672 description: r##"Checks for instances of `map(f)` where `f` is the identity function."##,
5673 },
5674 Lint {
5675 label: "clippy::map_unwrap_or",
5676 description: r##"Checks for usage of `option.map(_).unwrap_or(_)` or `option.map(_).unwrap_or_else(_)` or
5677 `result.map(_).unwrap_or_else(_)`."##,
5678 },
5679 Lint {
5680 label: "clippy::match_as_ref",
5681 description: r##"Checks for match which is used to add a reference to an
5682 `Option` value."##,
5683 },
5684 Lint {
5685 label: "clippy::match_bool",
5686 description: r##"Checks for matches where match expression is a `bool`. It
5687 suggests to replace the expression with an `if...else` block."##,
5688 },
5689 Lint {
5690 label: "clippy::match_like_matches_macro",
5691 description: r##"Checks for `match` or `if let` expressions producing a
5692 `bool` that could be written using `matches!`"##,
5693 },
5694 Lint {
5695 label: "clippy::match_on_vec_items",
5696 description: r##"Checks for `match vec[idx]` or `match vec[n..m]`."##,
5697 },
5698 Lint {
5699 label: "clippy::match_overlapping_arm",
5700 description: r##"Checks for overlapping match arms."##,
5701 },
5702 Lint {
5703 label: "clippy::match_ref_pats",
5704 description: r##"Checks for matches where all arms match a reference,
5705 suggesting to remove the reference and deref the matched expression
5706 instead. It also checks for `if let &foo = bar` blocks."##,
5707 },
5708 Lint {
5709 label: "clippy::match_result_ok",
5710 description: r##"Checks for unnecessary `ok()` in `while let`."##,
5711 },
5712 Lint {
5713 label: "clippy::match_same_arms",
5714 description: r##"Checks for `match` with identical arm bodies."##,
5715 },
5716 Lint {
5717 label: "clippy::match_single_binding",
5718 description: r##"Checks for useless match that binds to only one value."##,
5719 },
5720 Lint {
5721 label: "clippy::match_str_case_mismatch",
5722 description: r##"Checks for `match` expressions modifying the case of a string with non-compliant arms"##,
5723 },
5724 Lint {
5725 label: "clippy::match_wild_err_arm",
5726 description: r##"Checks for arm which matches all errors with `Err(_)`
5727 and take drastic actions like `panic!`."##,
5728 },
5729 Lint {
5730 label: "clippy::match_wildcard_for_single_variants",
5731 description: r##"Checks for wildcard enum matches for a single variant."##,
5732 },
5733 Lint {
5734 label: "clippy::maybe_infinite_iter",
5735 description: r##"Checks for iteration that may be infinite."##,
5736 },
5737 Lint {
5738 label: "clippy::mem_forget",
5739 description: r##"Checks for usage of `std::mem::forget(t)` where `t` is
5740 `Drop`."##,
5741 },
5742 Lint {
5743 label: "clippy::mem_replace_option_with_none",
5744 description: r##"Checks for `mem::replace()` on an `Option` with
5745 `None`."##,
5746 },
5747 Lint {
5748 label: "clippy::mem_replace_with_default",
5749 description: r##"Checks for `std::mem::replace` on a value of type
5750 `T` with `T::default()`."##,
5751 },
5752 Lint {
5753 label: "clippy::mem_replace_with_uninit",
5754 description: r##"Checks for `mem::replace(&mut _, mem::uninitialized())`
5755 and `mem::replace(&mut _, mem::zeroed())`."##,
5756 },
5757 Lint {
5758 label: "clippy::min_max",
5759 description: r##"Checks for expressions where `std::cmp::min` and `max` are
5760 used to clamp values, but switched so that the result is constant."##,
5761 },
5762 Lint {
5763 label: "clippy::misaligned_transmute",
5764 description: r##"Nothing. This lint has been deprecated."##,
5765 },
5766 Lint {
5767 label: "clippy::mismatched_target_os",
5768 description: r##"Checks for cfg attributes having operating systems used in target family position."##,
5769 },
5770 Lint {
5771 label: "clippy::misrefactored_assign_op",
5772 description: r##"Checks for `a op= a op b` or `a op= b op a` patterns."##,
5773 },
5774 Lint {
5775 label: "clippy::missing_const_for_fn",
5776 description: r##"Suggests the use of `const` in functions and methods where possible."##,
5777 },
5778 Lint {
5779 label: "clippy::missing_docs_in_private_items",
5780 description: r##"Warns if there is missing doc for any documentable item
5781 (public or private)."##,
5782 },
5783 Lint {
5784 label: "clippy::missing_enforced_import_renames",
5785 description: r##"Checks for imports that do not rename the item as specified
5786 in the `enforce-import-renames` config option."##,
5787 },
5788 Lint {
5789 label: "clippy::missing_errors_doc",
5790 description: r##"Checks the doc comments of publicly visible functions that
5791 return a `Result` type and warns if there is no `# Errors` section."##,
5792 },
5793 Lint {
5794 label: "clippy::missing_inline_in_public_items",
5795 description: r##"It lints if an exported function, method, trait method with default impl,
5796 or trait method impl is not `#[inline]`."##,
5797 },
5798 Lint {
5799 label: "clippy::missing_panics_doc",
5800 description: r##"Checks the doc comments of publicly visible functions that
5801 may panic and warns if there is no `# Panics` section."##,
5802 },
5803 Lint {
5804 label: "clippy::missing_safety_doc",
5805 description: r##"Checks for the doc comments of publicly visible
5806 unsafe functions and warns if there is no `# Safety` section."##,
5807 },
5808 Lint {
5809 label: "clippy::mistyped_literal_suffixes",
5810 description: r##"Warns for mistyped suffix in literals"##,
5811 },
5812 Lint {
5813 label: "clippy::mixed_case_hex_literals",
5814 description: r##"Warns on hexadecimal literals with mixed-case letter
5815 digits."##,
5816 },
5817 Lint {
5818 label: "clippy::mod_module_files",
5819 description: r##"Checks that module layout uses only self named module files, bans mod.rs files."##,
5820 },
5821 Lint {
5822 label: "clippy::module_inception",
5823 description: r##"Checks for modules that have the same name as their
5824 parent module"##,
5825 },
5826 Lint {
5827 label: "clippy::module_name_repetitions",
5828 description: r##"Detects type names that are prefixed or suffixed by the
5829 containing module's name."##,
5830 },
5831 Lint { label: "clippy::modulo_arithmetic", description: r##"Checks for modulo arithmetic."## },
5832 Lint {
5833 label: "clippy::modulo_one",
5834 description: r##"Checks for getting the remainder of a division by one or minus
5835 one."##,
5836 },
5837 Lint {
5838 label: "clippy::multiple_crate_versions",
5839 description: r##"Checks to see if multiple versions of a crate are being
5840 used."##,
5841 },
5842 Lint {
5843 label: "clippy::multiple_inherent_impl",
5844 description: r##"Checks for multiple inherent implementations of a struct"##,
5845 },
5846 Lint {
5847 label: "clippy::must_use_candidate",
5848 description: r##"Checks for public functions that have no
5849 `#[must_use]` attribute, but return something not already marked
5850 must-use, have no mutable arg and mutate no statics."##,
5851 },
5852 Lint {
5853 label: "clippy::must_use_unit",
5854 description: r##"Checks for a `#[must_use]` attribute on
5855 unit-returning functions and methods."##,
5856 },
5857 Lint {
5858 label: "clippy::mut_from_ref",
5859 description: r##"This lint checks for functions that take immutable
5860 references and return mutable ones."##,
5861 },
5862 Lint {
5863 label: "clippy::mut_mut",
5864 description: r##"Checks for instances of `mut mut` references."##,
5865 },
5866 Lint {
5867 label: "clippy::mut_mutex_lock",
5868 description: r##"Checks for `&mut Mutex::lock` calls"##,
5869 },
5870 Lint {
5871 label: "clippy::mut_range_bound",
5872 description: r##"Checks for loops which have a range bound that is a mutable variable"##,
5873 },
5874 Lint {
5875 label: "clippy::mutable_key_type",
5876 description: r##"Checks for sets/maps with mutable key types."##,
5877 },
5878 Lint {
5879 label: "clippy::mutex_atomic",
5880 description: r##"Checks for usages of `Mutex<X>` where an atomic will do."##,
5881 },
5882 Lint {
5883 label: "clippy::mutex_integer",
5884 description: r##"Checks for usages of `Mutex<X>` where `X` is an integral
5885 type."##,
5886 },
5887 Lint { label: "clippy::naive_bytecount", description: r##"Checks for naive byte counts"## },
5888 Lint {
5889 label: "clippy::needless_arbitrary_self_type",
5890 description: r##"The lint checks for `self` in fn parameters that
5891 specify the `Self`-type explicitly"##,
5892 },
5893 Lint {
5894 label: "clippy::needless_bitwise_bool",
5895 description: r##"Checks for uses of bitwise and/or operators between booleans, where performance may be improved by using
5896 a lazy and."##,
5897 },
5898 Lint {
5899 label: "clippy::needless_bool",
5900 description: r##"Checks for expressions of the form `if c { true } else {
5901 false }` (or vice versa) and suggests using the condition directly."##,
5902 },
5903 Lint {
5904 label: "clippy::needless_borrow",
5905 description: r##"Checks for address of operations (`&`) that are going to
5906 be dereferenced immediately by the compiler."##,
5907 },
5908 Lint {
5909 label: "clippy::needless_borrowed_reference",
5910 description: r##"Checks for bindings that destructure a reference and borrow the inner
5911 value with `&ref`."##,
5912 },
5913 Lint {
5914 label: "clippy::needless_collect",
5915 description: r##"Checks for functions collecting an iterator when collect
5916 is not needed."##,
5917 },
5918 Lint {
5919 label: "clippy::needless_continue",
5920 description: r##"The lint checks for `if`-statements appearing in loops
5921 that contain a `continue` statement in either their main blocks or their
5922 `else`-blocks, when omitting the `else`-block possibly with some
5923 rearrangement of code can make the code easier to understand."##,
5924 },
5925 Lint {
5926 label: "clippy::needless_doctest_main",
5927 description: r##"Checks for `fn main() { .. }` in doctests"##,
5928 },
5929 Lint {
5930 label: "clippy::needless_for_each",
5931 description: r##"Checks for usage of `for_each` that would be more simply written as a
5932 `for` loop."##,
5933 },
5934 Lint {
5935 label: "clippy::needless_late_init",
5936 description: r##"Checks for late initializations that can be replaced by a `let` statement
5937 with an initializer."##,
5938 },
5939 Lint {
5940 label: "clippy::needless_lifetimes",
5941 description: r##"Checks for lifetime annotations which can be removed by
5942 relying on lifetime elision."##,
5943 },
5944 Lint {
5945 label: "clippy::needless_option_as_deref",
5946 description: r##"Checks for no-op uses of Option::{as_deref,as_deref_mut},
5947 for example, `Option<&T>::as_deref()` returns the same type."##,
5948 },
5949 Lint {
5950 label: "clippy::needless_pass_by_value",
5951 description: r##"Checks for functions taking arguments by value, but not
5952 consuming them in its
5953 body."##,
5954 },
5955 Lint {
5956 label: "clippy::needless_question_mark",
5957 description: r##"Suggests alternatives for useless applications of `?` in terminating expressions"##,
5958 },
5959 Lint {
5960 label: "clippy::needless_range_loop",
5961 description: r##"Checks for looping over the range of `0..len` of some
5962 collection just to get the values by index."##,
5963 },
5964 Lint {
5965 label: "clippy::needless_return",
5966 description: r##"Checks for return statements at the end of a block."##,
5967 },
5968 Lint {
5969 label: "clippy::needless_splitn",
5970 description: r##"Checks for usages of `str::splitn` (or `str::rsplitn`) where using `str::split` would be the same."##,
5971 },
5972 Lint {
5973 label: "clippy::needless_update",
5974 description: r##"Checks for needlessly including a base struct on update
5975 when all fields are changed anyway.
5976
5977 This lint is not applied to structs marked with
5978 [non_exhaustive](https://doc.rust-lang.org/reference/attributes/type_system.html)."##,
5979 },
5980 Lint {
5981 label: "clippy::neg_cmp_op_on_partial_ord",
5982 description: r##"Checks for the usage of negated comparison operators on types which only implement
5983 `PartialOrd` (e.g., `f64`)."##,
5984 },
5985 Lint {
5986 label: "clippy::neg_multiply",
5987 description: r##"Checks for multiplication by -1 as a form of negation."##,
5988 },
5989 Lint {
5990 label: "clippy::negative_feature_names",
5991 description: r##"Checks for negative feature names with prefix `no-` or `not-`"##,
5992 },
5993 Lint {
5994 label: "clippy::never_loop",
5995 description: r##"Checks for loops that will always `break`, `return` or
5996 `continue` an outer loop."##,
5997 },
5998 Lint {
5999 label: "clippy::new_ret_no_self",
6000 description: r##"Checks for `new` not returning a type that contains `Self`."##,
6001 },
6002 Lint {
6003 label: "clippy::new_without_default",
6004 description: r##"Checks for types with a `fn new() -> Self` method and no
6005 implementation of
6006 [`Default`](https://doc.rust-lang.org/std/default/trait.Default.html)."##,
6007 },
6008 Lint {
6009 label: "clippy::no_effect",
6010 description: r##"Checks for statements which have no effect."##,
6011 },
6012 Lint {
6013 label: "clippy::no_effect_underscore_binding",
6014 description: r##"Checks for binding to underscore prefixed variable without side-effects."##,
6015 },
6016 Lint {
6017 label: "clippy::non_ascii_literal",
6018 description: r##"Checks for non-ASCII characters in string and char literals."##,
6019 },
6020 Lint {
6021 label: "clippy::non_octal_unix_permissions",
6022 description: r##"Checks for non-octal values used to set Unix file permissions."##,
6023 },
6024 Lint {
6025 label: "clippy::non_send_fields_in_send_ty",
6026 description: r##"This lint warns about a `Send` implementation for a type that
6027 contains fields that are not safe to be sent across threads.
6028 It tries to detect fields that can cause a soundness issue
6029 when sent to another thread (e.g., `Rc`) while allowing `!Send` fields
6030 that are expected to exist in a `Send` type, such as raw pointers."##,
6031 },
6032 Lint {
6033 label: "clippy::nonminimal_bool",
6034 description: r##"Checks for boolean expressions that can be written more
6035 concisely."##,
6036 },
6037 Lint {
6038 label: "clippy::nonsensical_open_options",
6039 description: r##"Checks for duplicate open options as well as combinations
6040 that make no sense."##,
6041 },
6042 Lint {
6043 label: "clippy::nonstandard_macro_braces",
6044 description: r##"Checks that common macros are used with consistent bracing."##,
6045 },
6046 Lint {
6047 label: "clippy::not_unsafe_ptr_arg_deref",
6048 description: r##"Checks for public functions that dereference raw pointer
6049 arguments but are not marked `unsafe`."##,
6050 },
6051 Lint {
6052 label: "clippy::octal_escapes",
6053 description: r##"Checks for `\\0` escapes in string and byte literals that look like octal
6054 character escapes in C."##,
6055 },
6056 Lint { label: "clippy::ok_expect", description: r##"Checks for usage of `ok().expect(..)`."## },
6057 Lint {
6058 label: "clippy::op_ref",
6059 description: r##"Checks for arguments to `==` which have their address
6060 taken to satisfy a bound
6061 and suggests to dereference the other argument instead"##,
6062 },
6063 Lint {
6064 label: "clippy::option_as_ref_deref",
6065 description: r##"Checks for usage of `_.as_ref().map(Deref::deref)` or it's aliases (such as String::as_str)."##,
6066 },
6067 Lint {
6068 label: "clippy::option_env_unwrap",
6069 description: r##"Checks for usage of `option_env!(...).unwrap()` and
6070 suggests usage of the `env!` macro."##,
6071 },
6072 Lint {
6073 label: "clippy::option_filter_map",
6074 description: r##"Checks for indirect collection of populated `Option`"##,
6075 },
6076 Lint {
6077 label: "clippy::option_if_let_else",
6078 description: r##"Lints usage of `if let Some(v) = ... { y } else { x }` which is more
6079 idiomatically done with `Option::map_or` (if the else bit is a pure
6080 expression) or `Option::map_or_else` (if the else bit is an impure
6081 expression)."##,
6082 },
6083 Lint {
6084 label: "clippy::option_map_or_none",
6085 description: r##"Checks for usage of `_.map_or(None, _)`."##,
6086 },
6087 Lint {
6088 label: "clippy::option_map_unit_fn",
6089 description: r##"Checks for usage of `option.map(f)` where f is a function
6090 or closure that returns the unit type `()`."##,
6091 },
6092 Lint {
6093 label: "clippy::option_option",
6094 description: r##"Checks for use of `Option<Option<_>>` in function signatures and type
6095 definitions"##,
6096 },
6097 Lint {
6098 label: "clippy::or_fun_call",
6099 description: r##"Checks for calls to `.or(foo(..))`, `.unwrap_or(foo(..))`,
6100 etc., and suggests to use `or_else`, `unwrap_or_else`, etc., or
6101 `unwrap_or_default` instead."##,
6102 },
6103 Lint {
6104 label: "clippy::out_of_bounds_indexing",
6105 description: r##"Checks for out of bounds array indexing with a constant
6106 index."##,
6107 },
6108 Lint {
6109 label: "clippy::overflow_check_conditional",
6110 description: r##"Detects classic underflow/overflow checks."##,
6111 },
6112 Lint { label: "clippy::panic", description: r##"Checks for usage of `panic!`."## },
6113 Lint {
6114 label: "clippy::panic_in_result_fn",
6115 description: r##"Checks for usage of `panic!`, `unimplemented!`, `todo!`, `unreachable!` or assertions in a function of type result."##,
6116 },
6117 Lint {
6118 label: "clippy::panicking_unwrap",
6119 description: r##"Checks for calls of `unwrap[_err]()` that will always fail."##,
6120 },
6121 Lint {
6122 label: "clippy::partialeq_ne_impl",
6123 description: r##"Checks for manual re-implementations of `PartialEq::ne`."##,
6124 },
6125 Lint {
6126 label: "clippy::path_buf_push_overwrite",
6127 description: r##"* Checks for [push](https://doc.rust-lang.org/std/path/struct.PathBuf.html#method.push)
6128 calls on `PathBuf` that can cause overwrites."##,
6129 },
6130 Lint {
6131 label: "clippy::pattern_type_mismatch",
6132 description: r##"Checks for patterns that aren't exact representations of the types
6133 they are applied to.
6134
6135 To satisfy this lint, you will have to adjust either the expression that is matched
6136 against or the pattern itself, as well as the bindings that are introduced by the
6137 adjusted patterns. For matching you will have to either dereference the expression
6138 with the `*` operator, or amend the patterns to explicitly match against `&<pattern>`
6139 or `&mut <pattern>` depending on the reference mutability. For the bindings you need
6140 to use the inverse. You can leave them as plain bindings if you wish for the value
6141 to be copied, but you must use `ref mut <variable>` or `ref <variable>` to construct
6142 a reference into the matched structure.
6143
6144 If you are looking for a way to learn about ownership semantics in more detail, it
6145 is recommended to look at IDE options available to you to highlight types, lifetimes
6146 and reference semantics in your code. The available tooling would expose these things
6147 in a general way even outside of the various pattern matching mechanics. Of course
6148 this lint can still be used to highlight areas of interest and ensure a good understanding
6149 of ownership semantics."##,
6150 },
6151 Lint {
6152 label: "clippy::possible_missing_comma",
6153 description: r##"Checks for possible missing comma in an array. It lints if
6154 an array element is a binary operator expression and it lies on two lines."##,
6155 },
6156 Lint {
6157 label: "clippy::precedence",
6158 description: r##"Checks for operations where precedence may be unclear
6159 and suggests to add parentheses. Currently it catches the following:
6160 * mixed usage of arithmetic and bit shifting/combining operators without
6161 parentheses
6162 * a negative numeric literal (which is really a unary `-` followed by a
6163 numeric literal)
6164 followed by a method call"##,
6165 },
6166 Lint {
6167 label: "clippy::print_literal",
6168 description: r##"This lint warns about the use of literals as `print!`/`println!` args."##,
6169 },
6170 Lint {
6171 label: "clippy::print_stderr",
6172 description: r##"Checks for printing on *stderr*. The purpose of this lint
6173 is to catch debugging remnants."##,
6174 },
6175 Lint {
6176 label: "clippy::print_stdout",
6177 description: r##"Checks for printing on *stdout*. The purpose of this lint
6178 is to catch debugging remnants."##,
6179 },
6180 Lint {
6181 label: "clippy::print_with_newline",
6182 description: r##"This lint warns when you use `print!()` with a format
6183 string that ends in a newline."##,
6184 },
6185 Lint {
6186 label: "clippy::println_empty_string",
6187 description: r##"This lint warns when you use `println!()` to
6188 print a newline."##,
6189 },
6190 Lint {
6191 label: "clippy::ptr_arg",
6192 description: r##"This lint checks for function arguments of type `&String`
6193 or `&Vec` unless the references are mutable. It will also suggest you
6194 replace `.clone()` calls with the appropriate `.to_owned()`/`to_string()`
6195 calls."##,
6196 },
6197 Lint {
6198 label: "clippy::ptr_as_ptr",
6199 description: r##"Checks for `as` casts between raw pointers without changing its mutability,
6200 namely `*const T` to `*const U` and `*mut T` to `*mut U`."##,
6201 },
6202 Lint { label: "clippy::ptr_eq", description: r##"Use `std::ptr::eq` when applicable"## },
6203 Lint {
6204 label: "clippy::ptr_offset_with_cast",
6205 description: r##"Checks for usage of the `offset` pointer method with a `usize` casted to an
6206 `isize`."##,
6207 },
6208 Lint {
6209 label: "clippy::pub_enum_variant_names",
6210 description: r##"Nothing. This lint has been deprecated."##,
6211 },
6212 Lint {
6213 label: "clippy::question_mark",
6214 description: r##"Checks for expressions that could be replaced by the question mark operator."##,
6215 },
6216 Lint {
6217 label: "clippy::range_minus_one",
6218 description: r##"Checks for inclusive ranges where 1 is subtracted from
6219 the upper bound, e.g., `x..=(y-1)`."##,
6220 },
6221 Lint {
6222 label: "clippy::range_plus_one",
6223 description: r##"Checks for exclusive ranges where 1 is added to the
6224 upper bound, e.g., `x..(y+1)`."##,
6225 },
6226 Lint {
6227 label: "clippy::range_step_by_zero",
6228 description: r##"Nothing. This lint has been deprecated."##,
6229 },
6230 Lint {
6231 label: "clippy::range_zip_with_len",
6232 description: r##"Checks for zipping a collection with the range of
6233 `0.._.len()`."##,
6234 },
6235 Lint {
6236 label: "clippy::rc_buffer",
6237 description: r##"Checks for `Rc<T>` and `Arc<T>` when `T` is a mutable buffer type such as `String` or `Vec`."##,
6238 },
6239 Lint { label: "clippy::rc_mutex", description: r##"Checks for `Rc<Mutex<T>>`."## },
6240 Lint {
6241 label: "clippy::redundant_allocation",
6242 description: r##"Checks for use of redundant allocations anywhere in the code."##,
6243 },
6244 Lint {
6245 label: "clippy::redundant_clone",
6246 description: r##"Checks for a redundant `clone()` (and its relatives) which clones an owned
6247 value that is going to be dropped without further use."##,
6248 },
6249 Lint {
6250 label: "clippy::redundant_closure",
6251 description: r##"Checks for closures which just call another function where
6252 the function can be called directly. `unsafe` functions or calls where types
6253 get adjusted are ignored."##,
6254 },
6255 Lint {
6256 label: "clippy::redundant_closure_call",
6257 description: r##"Detects closures called in the same expression where they
6258 are defined."##,
6259 },
6260 Lint {
6261 label: "clippy::redundant_closure_for_method_calls",
6262 description: r##"Checks for closures which only invoke a method on the closure
6263 argument and can be replaced by referencing the method directly."##,
6264 },
6265 Lint {
6266 label: "clippy::redundant_else",
6267 description: r##"Checks for `else` blocks that can be removed without changing semantics."##,
6268 },
6269 Lint {
6270 label: "clippy::redundant_feature_names",
6271 description: r##"Checks for feature names with prefix `use-`, `with-` or suffix `-support`"##,
6272 },
6273 Lint {
6274 label: "clippy::redundant_field_names",
6275 description: r##"Checks for fields in struct literals where shorthands
6276 could be used."##,
6277 },
6278 Lint {
6279 label: "clippy::redundant_pattern",
6280 description: r##"Checks for patterns in the form `name @ _`."##,
6281 },
6282 Lint {
6283 label: "clippy::redundant_pattern_matching",
6284 description: r##"Lint for redundant pattern matching over `Result`, `Option`,
6285 `std::task::Poll` or `std::net::IpAddr`"##,
6286 },
6287 Lint {
6288 label: "clippy::redundant_pub_crate",
6289 description: r##"Checks for items declared `pub(crate)` that are not crate visible because they
6290 are inside a private module."##,
6291 },
6292 Lint {
6293 label: "clippy::redundant_slicing",
6294 description: r##"Checks for redundant slicing expressions which use the full range, and
6295 do not change the type."##,
6296 },
6297 Lint {
6298 label: "clippy::redundant_static_lifetimes",
6299 description: r##"Checks for constants and statics with an explicit `'static` lifetime."##,
6300 },
6301 Lint {
6302 label: "clippy::ref_binding_to_reference",
6303 description: r##"Checks for `ref` bindings which create a reference to a reference."##,
6304 },
6305 Lint {
6306 label: "clippy::ref_in_deref",
6307 description: r##"Checks for references in expressions that use
6308 auto dereference."##,
6309 },
6310 Lint {
6311 label: "clippy::ref_option_ref",
6312 description: r##"Checks for usage of `&Option<&T>`."##,
6313 },
6314 Lint {
6315 label: "clippy::regex_macro",
6316 description: r##"Nothing. This lint has been deprecated."##,
6317 },
6318 Lint {
6319 label: "clippy::repeat_once",
6320 description: r##"Checks for usage of `.repeat(1)` and suggest the following method for each types.
6321 - `.to_string()` for `str`
6322 - `.clone()` for `String`
6323 - `.to_vec()` for `slice`
6324
6325 The lint will evaluate constant expressions and values as arguments of `.repeat(..)` and emit a message if
6326 they are equivalent to `1`. (Related discussion in [rust-clippy#7306](https://github.com/rust-lang/rust-clippy/issues/7306))"##,
6327 },
6328 Lint {
6329 label: "clippy::replace_consts",
6330 description: r##"Nothing. This lint has been deprecated."##,
6331 },
6332 Lint {
6333 label: "clippy::rest_pat_in_fully_bound_structs",
6334 description: r##"Checks for unnecessary '..' pattern binding on struct when all fields are explicitly matched."##,
6335 },
6336 Lint {
6337 label: "clippy::result_map_or_into_option",
6338 description: r##"Checks for usage of `_.map_or(None, Some)`."##,
6339 },
6340 Lint {
6341 label: "clippy::result_map_unit_fn",
6342 description: r##"Checks for usage of `result.map(f)` where f is a function
6343 or closure that returns the unit type `()`."##,
6344 },
6345 Lint {
6346 label: "clippy::result_unit_err",
6347 description: r##"Checks for public functions that return a `Result`
6348 with an `Err` type of `()`. It suggests using a custom type that
6349 implements `std::error::Error`."##,
6350 },
6351 Lint {
6352 label: "clippy::return_self_not_must_use",
6353 description: r##"This lint warns when a method returning `Self` doesn't have the `#[must_use]` attribute."##,
6354 },
6355 Lint {
6356 label: "clippy::reversed_empty_ranges",
6357 description: r##"Checks for range expressions `x..y` where both `x` and `y`
6358 are constant and `x` is greater or equal to `y`."##,
6359 },
6360 Lint {
6361 label: "clippy::same_functions_in_if_condition",
6362 description: r##"Checks for consecutive `if`s with the same function call."##,
6363 },
6364 Lint {
6365 label: "clippy::same_item_push",
6366 description: r##"Checks whether a for loop is being used to push a constant
6367 value into a Vec."##,
6368 },
6369 Lint {
6370 label: "clippy::same_name_method",
6371 description: r##"It lints if a struct has two methods with the same name:
6372 one from a trait, another not from trait."##,
6373 },
6374 Lint {
6375 label: "clippy::search_is_some",
6376 description: r##"Checks for an iterator or string search (such as `find()`,
6377 `position()`, or `rposition()`) followed by a call to `is_some()` or `is_none()`."##,
6378 },
6379 Lint {
6380 label: "clippy::self_assignment",
6381 description: r##"Checks for explicit self-assignments."##,
6382 },
6383 Lint {
6384 label: "clippy::self_named_constructors",
6385 description: r##"Warns when constructors have the same name as their types."##,
6386 },
6387 Lint {
6388 label: "clippy::self_named_module_files",
6389 description: r##"Checks that module layout uses only mod.rs files."##,
6390 },
6391 Lint {
6392 label: "clippy::semicolon_if_nothing_returned",
6393 description: r##"Looks for blocks of expressions and fires if the last expression returns
6394 `()` but is not followed by a semicolon."##,
6395 },
6396 Lint {
6397 label: "clippy::separated_literal_suffix",
6398 description: r##"Warns if literal suffixes are separated by an underscore.
6399 To enforce separated literal suffix style,
6400 see the `unseparated_literal_suffix` lint."##,
6401 },
6402 Lint {
6403 label: "clippy::serde_api_misuse",
6404 description: r##"Checks for mis-uses of the serde API."##,
6405 },
6406 Lint {
6407 label: "clippy::shadow_reuse",
6408 description: r##"Checks for bindings that shadow other bindings already in
6409 scope, while reusing the original value."##,
6410 },
6411 Lint {
6412 label: "clippy::shadow_same",
6413 description: r##"Checks for bindings that shadow other bindings already in
6414 scope, while just changing reference level or mutability."##,
6415 },
6416 Lint {
6417 label: "clippy::shadow_unrelated",
6418 description: r##"Checks for bindings that shadow other bindings already in
6419 scope, either without an initialization or with one that does not even use
6420 the original value."##,
6421 },
6422 Lint {
6423 label: "clippy::short_circuit_statement",
6424 description: r##"Checks for the use of short circuit boolean conditions as
6425 a
6426 statement."##,
6427 },
6428 Lint {
6429 label: "clippy::should_assert_eq",
6430 description: r##"Nothing. This lint has been deprecated."##,
6431 },
6432 Lint {
6433 label: "clippy::should_implement_trait",
6434 description: r##"Checks for methods that should live in a trait
6435 implementation of a `std` trait (see [llogiq's blog
6436 post](http://llogiq.github.io/2015/07/30/traits.html) for further
6437 information) instead of an inherent implementation."##,
6438 },
6439 Lint {
6440 label: "clippy::similar_names",
6441 description: r##"Checks for names that are very similar and thus confusing."##,
6442 },
6443 Lint {
6444 label: "clippy::single_char_add_str",
6445 description: r##"Warns when using `push_str`/`insert_str` with a single-character string literal
6446 where `push`/`insert` with a `char` would work fine."##,
6447 },
6448 Lint {
6449 label: "clippy::single_char_pattern",
6450 description: r##"Checks for string methods that receive a single-character
6451 `str` as an argument, e.g., `_.split(x)`."##,
6452 },
6453 Lint {
6454 label: "clippy::single_component_path_imports",
6455 description: r##"Checking for imports with single component use path."##,
6456 },
6457 Lint {
6458 label: "clippy::single_element_loop",
6459 description: r##"Checks whether a for loop has a single element."##,
6460 },
6461 Lint {
6462 label: "clippy::single_match",
6463 description: r##"Checks for matches with a single arm where an `if let`
6464 will usually suffice."##,
6465 },
6466 Lint {
6467 label: "clippy::single_match_else",
6468 description: r##"Checks for matches with two arms where an `if let else` will
6469 usually suffice."##,
6470 },
6471 Lint {
6472 label: "clippy::size_of_in_element_count",
6473 description: r##"Detects expressions where
6474 `size_of::<T>` or `size_of_val::<T>` is used as a
6475 count of elements of type `T`"##,
6476 },
6477 Lint {
6478 label: "clippy::skip_while_next",
6479 description: r##"Checks for usage of `_.skip_while(condition).next()`."##,
6480 },
6481 Lint {
6482 label: "clippy::slow_vector_initialization",
6483 description: r##"Checks slow zero-filled vector initialization"##,
6484 },
6485 Lint {
6486 label: "clippy::stable_sort_primitive",
6487 description: r##"When sorting primitive values (integers, bools, chars, as well
6488 as arrays, slices, and tuples of such items), it is better to
6489 use an unstable sort than a stable sort."##,
6490 },
6491 Lint {
6492 label: "clippy::str_to_string",
6493 description: r##"This lint checks for `.to_string()` method calls on values of type `&str`."##,
6494 },
6495 Lint {
6496 label: "clippy::string_add",
6497 description: r##"Checks for all instances of `x + _` where `x` is of type
6498 `String`, but only if [`string_add_assign`](#string_add_assign) does *not*
6499 match."##,
6500 },
6501 Lint {
6502 label: "clippy::string_add_assign",
6503 description: r##"Checks for string appends of the form `x = x + y` (without
6504 `let`!)."##,
6505 },
6506 Lint {
6507 label: "clippy::string_extend_chars",
6508 description: r##"Checks for the use of `.extend(s.chars())` where s is a
6509 `&str` or `String`."##,
6510 },
6511 Lint {
6512 label: "clippy::string_from_utf8_as_bytes",
6513 description: r##"Check if the string is transformed to byte array and casted back to string."##,
6514 },
6515 Lint {
6516 label: "clippy::string_lit_as_bytes",
6517 description: r##"Checks for the `as_bytes` method called on string literals
6518 that contain only ASCII characters."##,
6519 },
6520 Lint {
6521 label: "clippy::string_slice",
6522 description: r##"Checks for slice operations on strings"##,
6523 },
6524 Lint {
6525 label: "clippy::string_to_string",
6526 description: r##"This lint checks for `.to_string()` method calls on values of type `String`."##,
6527 },
6528 Lint {
6529 label: "clippy::strlen_on_c_strings",
6530 description: r##"Checks for usage of `libc::strlen` on a `CString` or `CStr` value,
6531 and suggest calling `as_bytes().len()` or `to_bytes().len()` respectively instead."##,
6532 },
6533 Lint {
6534 label: "clippy::struct_excessive_bools",
6535 description: r##"Checks for excessive
6536 use of bools in structs."##,
6537 },
6538 Lint {
6539 label: "clippy::suboptimal_flops",
6540 description: r##"Looks for floating-point expressions that
6541 can be expressed using built-in methods to improve both
6542 accuracy and performance."##,
6543 },
6544 Lint {
6545 label: "clippy::suspicious_arithmetic_impl",
6546 description: r##"Lints for suspicious operations in impls of arithmetic operators, e.g.
6547 subtracting elements in an Add impl."##,
6548 },
6549 Lint {
6550 label: "clippy::suspicious_assignment_formatting",
6551 description: r##"Checks for use of the non-existent `=*`, `=!` and `=-`
6552 operators."##,
6553 },
6554 Lint {
6555 label: "clippy::suspicious_else_formatting",
6556 description: r##"Checks for formatting of `else`. It lints if the `else`
6557 is followed immediately by a newline or the `else` seems to be missing."##,
6558 },
6559 Lint {
6560 label: "clippy::suspicious_map",
6561 description: r##"Checks for calls to `map` followed by a `count`."##,
6562 },
6563 Lint {
6564 label: "clippy::suspicious_op_assign_impl",
6565 description: r##"Lints for suspicious operations in impls of OpAssign, e.g.
6566 subtracting elements in an AddAssign impl."##,
6567 },
6568 Lint {
6569 label: "clippy::suspicious_operation_groupings",
6570 description: r##"Checks for unlikely usages of binary operators that are almost
6571 certainly typos and/or copy/paste errors, given the other usages
6572 of binary operators nearby."##,
6573 },
6574 Lint {
6575 label: "clippy::suspicious_splitn",
6576 description: r##"Checks for calls to [`splitn`]
6577 (https://doc.rust-lang.org/std/primitive.str.html#method.splitn) and
6578 related functions with either zero or one splits."##,
6579 },
6580 Lint {
6581 label: "clippy::suspicious_unary_op_formatting",
6582 description: r##"Checks the formatting of a unary operator on the right hand side
6583 of a binary operator. It lints if there is no space between the binary and unary operators,
6584 but there is a space between the unary and its operand."##,
6585 },
6586 Lint {
6587 label: "clippy::tabs_in_doc_comments",
6588 description: r##"Checks doc comments for usage of tab characters."##,
6589 },
6590 Lint {
6591 label: "clippy::temporary_assignment",
6592 description: r##"Checks for construction of a structure or tuple just to
6593 assign a value in it."##,
6594 },
6595 Lint {
6596 label: "clippy::to_digit_is_some",
6597 description: r##"Checks for `.to_digit(..).is_some()` on `char`s."##,
6598 },
6599 Lint {
6600 label: "clippy::to_string_in_display",
6601 description: r##"Checks for uses of `to_string()` in `Display` traits."##,
6602 },
6603 Lint {
6604 label: "clippy::to_string_in_format_args",
6605 description: r##"Checks for [`ToString::to_string`](https://doc.rust-lang.org/std/string/trait.ToString.html#tymethod.to_string)
6606 applied to a type that implements [`Display`](https://doc.rust-lang.org/std/fmt/trait.Display.html)
6607 in a macro that does formatting."##,
6608 },
6609 Lint { label: "clippy::todo", description: r##"Checks for usage of `todo!`."## },
6610 Lint {
6611 label: "clippy::too_many_arguments",
6612 description: r##"Checks for functions with too many parameters."##,
6613 },
6614 Lint {
6615 label: "clippy::too_many_lines",
6616 description: r##"Checks for functions with a large amount of lines."##,
6617 },
6618 Lint {
6619 label: "clippy::toplevel_ref_arg",
6620 description: r##"Checks for function arguments and let bindings denoted as
6621 `ref`."##,
6622 },
6623 Lint {
6624 label: "clippy::trailing_empty_array",
6625 description: r##"Displays a warning when a struct with a trailing zero-sized array is declared without a `repr` attribute."##,
6626 },
6627 Lint {
6628 label: "clippy::trait_duplication_in_bounds",
6629 description: r##"Checks for cases where generics are being used and multiple
6630 syntax specifications for trait bounds are used simultaneously."##,
6631 },
6632 Lint {
6633 label: "clippy::transmute_bytes_to_str",
6634 description: r##"Checks for transmutes from a `&[u8]` to a `&str`."##,
6635 },
6636 Lint {
6637 label: "clippy::transmute_float_to_int",
6638 description: r##"Checks for transmutes from a float to an integer."##,
6639 },
6640 Lint {
6641 label: "clippy::transmute_int_to_bool",
6642 description: r##"Checks for transmutes from an integer to a `bool`."##,
6643 },
6644 Lint {
6645 label: "clippy::transmute_int_to_char",
6646 description: r##"Checks for transmutes from an integer to a `char`."##,
6647 },
6648 Lint {
6649 label: "clippy::transmute_int_to_float",
6650 description: r##"Checks for transmutes from an integer to a float."##,
6651 },
6652 Lint {
6653 label: "clippy::transmute_num_to_bytes",
6654 description: r##"Checks for transmutes from a number to an array of `u8`"##,
6655 },
6656 Lint {
6657 label: "clippy::transmute_ptr_to_ptr",
6658 description: r##"Checks for transmutes from a pointer to a pointer, or
6659 from a reference to a reference."##,
6660 },
6661 Lint {
6662 label: "clippy::transmute_ptr_to_ref",
6663 description: r##"Checks for transmutes from a pointer to a reference."##,
6664 },
6665 Lint {
6666 label: "clippy::transmutes_expressible_as_ptr_casts",
6667 description: r##"Checks for transmutes that could be a pointer cast."##,
6668 },
6669 Lint {
6670 label: "clippy::transmuting_null",
6671 description: r##"Checks for transmute calls which would receive a null pointer."##,
6672 },
6673 Lint {
6674 label: "clippy::trivial_regex",
6675 description: r##"Checks for trivial [regex](https://crates.io/crates/regex)
6676 creation (with `Regex::new`, `RegexBuilder::new`, or `RegexSet::new`)."##,
6677 },
6678 Lint {
6679 label: "clippy::trivially_copy_pass_by_ref",
6680 description: r##"Checks for functions taking arguments by reference, where
6681 the argument type is `Copy` and small enough to be more efficient to always
6682 pass by value."##,
6683 },
6684 Lint { label: "clippy::try_err", description: r##"Checks for usages of `Err(x)?`."## },
6685 Lint {
6686 label: "clippy::type_complexity",
6687 description: r##"Checks for types used in structs, parameters and `let`
6688 declarations above a certain complexity threshold."##,
6689 },
6690 Lint {
6691 label: "clippy::type_repetition_in_bounds",
6692 description: r##"This lint warns about unnecessary type repetitions in trait bounds"##,
6693 },
6694 Lint {
6695 label: "clippy::undocumented_unsafe_blocks",
6696 description: r##"Checks for `unsafe` blocks without a `// Safety: ` comment
6697 explaining why the unsafe operations performed inside
6698 the block are safe."##,
6699 },
6700 Lint {
6701 label: "clippy::undropped_manually_drops",
6702 description: r##"Prevents the safe `std::mem::drop` function from being called on `std::mem::ManuallyDrop`."##,
6703 },
6704 Lint {
6705 label: "clippy::unicode_not_nfc",
6706 description: r##"Checks for string literals that contain Unicode in a form
6707 that is not equal to its
6708 [NFC-recomposition](http://www.unicode.org/reports/tr15/#Norm_Forms)."##,
6709 },
6710 Lint {
6711 label: "clippy::unimplemented",
6712 description: r##"Checks for usage of `unimplemented!`."##,
6713 },
6714 Lint {
6715 label: "clippy::uninit_assumed_init",
6716 description: r##"Checks for `MaybeUninit::uninit().assume_init()`."##,
6717 },
6718 Lint {
6719 label: "clippy::uninit_vec",
6720 description: r##"Checks for `set_len()` call that creates `Vec` with uninitialized elements.
6721 This is commonly caused by calling `set_len()` right after allocating or
6722 reserving a buffer with `new()`, `default()`, `with_capacity()`, or `reserve()`."##,
6723 },
6724 Lint {
6725 label: "clippy::unit_arg",
6726 description: r##"Checks for passing a unit value as an argument to a function without using a
6727 unit literal (`()`)."##,
6728 },
6729 Lint {
6730 label: "clippy::unit_cmp",
6731 description: r##"Checks for comparisons to unit. This includes all binary
6732 comparisons (like `==` and `<`) and asserts."##,
6733 },
6734 Lint { label: "clippy::unit_hash", description: r##"Detects `().hash(_)`."## },
6735 Lint {
6736 label: "clippy::unit_return_expecting_ord",
6737 description: r##"Checks for functions that expect closures of type
6738 Fn(...) -> Ord where the implemented closure returns the unit type.
6739 The lint also suggests to remove the semi-colon at the end of the statement if present."##,
6740 },
6741 Lint {
6742 label: "clippy::unnecessary_cast",
6743 description: r##"Checks for casts to the same type, casts of int literals to integer types
6744 and casts of float literals to float types."##,
6745 },
6746 Lint {
6747 label: "clippy::unnecessary_filter_map",
6748 description: r##"Checks for `filter_map` calls which could be replaced by `filter` or `map`.
6749 More specifically it checks if the closure provided is only performing one of the
6750 filter or map operations and suggests the appropriate option."##,
6751 },
6752 Lint {
6753 label: "clippy::unnecessary_fold",
6754 description: r##"Checks for using `fold` when a more succinct alternative exists.
6755 Specifically, this checks for `fold`s which could be replaced by `any`, `all`,
6756 `sum` or `product`."##,
6757 },
6758 Lint {
6759 label: "clippy::unnecessary_lazy_evaluations",
6760 description: r##"As the counterpart to `or_fun_call`, this lint looks for unnecessary
6761 lazily evaluated closures on `Option` and `Result`.
6762
6763 This lint suggests changing the following functions, when eager evaluation results in
6764 simpler code:
6765 - `unwrap_or_else` to `unwrap_or`
6766 - `and_then` to `and`
6767 - `or_else` to `or`
6768 - `get_or_insert_with` to `get_or_insert`
6769 - `ok_or_else` to `ok_or`"##,
6770 },
6771 Lint {
6772 label: "clippy::unnecessary_mut_passed",
6773 description: r##"Detects passing a mutable reference to a function that only
6774 requires an immutable reference."##,
6775 },
6776 Lint {
6777 label: "clippy::unnecessary_operation",
6778 description: r##"Checks for expression statements that can be reduced to a
6779 sub-expression."##,
6780 },
6781 Lint {
6782 label: "clippy::unnecessary_self_imports",
6783 description: r##"Checks for imports ending in `::{self}`."##,
6784 },
6785 Lint {
6786 label: "clippy::unnecessary_sort_by",
6787 description: r##"Detects uses of `Vec::sort_by` passing in a closure
6788 which compares the two arguments, either directly or indirectly."##,
6789 },
6790 Lint {
6791 label: "clippy::unnecessary_to_owned",
6792 description: r##"Checks for unnecessary calls to [`ToOwned::to_owned`](https://doc.rust-lang.org/std/borrow/trait.ToOwned.html#tymethod.to_owned)
6793 and other `to_owned`-like functions."##,
6794 },
6795 Lint {
6796 label: "clippy::unnecessary_unwrap",
6797 description: r##"Checks for calls of `unwrap[_err]()` that cannot fail."##,
6798 },
6799 Lint {
6800 label: "clippy::unnecessary_wraps",
6801 description: r##"Checks for private functions that only return `Ok` or `Some`."##,
6802 },
6803 Lint {
6804 label: "clippy::unneeded_field_pattern",
6805 description: r##"Checks for structure field patterns bound to wildcards."##,
6806 },
6807 Lint {
6808 label: "clippy::unneeded_wildcard_pattern",
6809 description: r##"Checks for tuple patterns with a wildcard
6810 pattern (`_`) is next to a rest pattern (`..`).
6811
6812 _NOTE_: While `_, ..` means there is at least one element left, `..`
6813 means there are 0 or more elements left. This can make a difference
6814 when refactoring, but shouldn't result in errors in the refactored code,
6815 since the wildcard pattern isn't used anyway."##,
6816 },
6817 Lint {
6818 label: "clippy::unnested_or_patterns",
6819 description: r##"Checks for unnested or-patterns, e.g., `Some(0) | Some(2)` and
6820 suggests replacing the pattern with a nested one, `Some(0 | 2)`.
6821
6822 Another way to think of this is that it rewrites patterns in
6823 *disjunctive normal form (DNF)* into *conjunctive normal form (CNF)*."##,
6824 },
6825 Lint { label: "clippy::unreachable", description: r##"Checks for usage of `unreachable!`."## },
6826 Lint {
6827 label: "clippy::unreadable_literal",
6828 description: r##"Warns if a long integral or floating-point constant does
6829 not contain underscores."##,
6830 },
6831 Lint {
6832 label: "clippy::unsafe_derive_deserialize",
6833 description: r##"Checks for deriving `serde::Deserialize` on a type that
6834 has methods using `unsafe`."##,
6835 },
6836 Lint {
6837 label: "clippy::unsafe_removed_from_name",
6838 description: r##"Checks for imports that remove unsafe from an item's
6839 name."##,
6840 },
6841 Lint {
6842 label: "clippy::unsafe_vector_initialization",
6843 description: r##"Nothing. This lint has been deprecated."##,
6844 },
6845 Lint {
6846 label: "clippy::unseparated_literal_suffix",
6847 description: r##"Warns if literal suffixes are not separated by an
6848 underscore.
6849 To enforce unseparated literal suffix style,
6850 see the `separated_literal_suffix` lint."##,
6851 },
6852 Lint {
6853 label: "clippy::unsound_collection_transmute",
6854 description: r##"Checks for transmutes between collections whose
6855 types have different ABI, size or alignment."##,
6856 },
6857 Lint {
6858 label: "clippy::unstable_as_mut_slice",
6859 description: r##"Nothing. This lint has been deprecated."##,
6860 },
6861 Lint {
6862 label: "clippy::unstable_as_slice",
6863 description: r##"Nothing. This lint has been deprecated."##,
6864 },
6865 Lint {
6866 label: "clippy::unused_async",
6867 description: r##"Checks for functions that are declared `async` but have no `.await`s inside of them."##,
6868 },
6869 Lint {
6870 label: "clippy::unused_collect",
6871 description: r##"Nothing. This lint has been deprecated."##,
6872 },
6873 Lint {
6874 label: "clippy::unused_io_amount",
6875 description: r##"Checks for unused written/read amount."##,
6876 },
6877 Lint {
6878 label: "clippy::unused_self",
6879 description: r##"Checks methods that contain a `self` argument but don't use it"##,
6880 },
6881 Lint {
6882 label: "clippy::unused_unit",
6883 description: r##"Checks for unit (`()`) expressions that can be removed."##,
6884 },
6885 Lint {
6886 label: "clippy::unusual_byte_groupings",
6887 description: r##"Warns if hexadecimal or binary literals are not grouped
6888 by nibble or byte."##,
6889 },
6890 Lint {
6891 label: "clippy::unwrap_in_result",
6892 description: r##"Checks for functions of type `Result` that contain `expect()` or `unwrap()`"##,
6893 },
6894 Lint {
6895 label: "clippy::unwrap_or_else_default",
6896 description: r##"Checks for usages of `_.unwrap_or_else(Default::default)` on `Option` and
6897 `Result` values."##,
6898 },
6899 Lint {
6900 label: "clippy::unwrap_used",
6901 description: r##"Checks for `.unwrap()` calls on `Option`s and on `Result`s."##,
6902 },
6903 Lint {
6904 label: "clippy::upper_case_acronyms",
6905 description: r##"Checks for fully capitalized names and optionally names containing a capitalized acronym."##,
6906 },
6907 Lint {
6908 label: "clippy::use_debug",
6909 description: r##"Checks for use of `Debug` formatting. The purpose of this
6910 lint is to catch debugging remnants."##,
6911 },
6912 Lint {
6913 label: "clippy::use_self",
6914 description: r##"Checks for unnecessary repetition of structure name when a
6915 replacement with `Self` is applicable."##,
6916 },
6917 Lint {
6918 label: "clippy::used_underscore_binding",
6919 description: r##"Checks for the use of bindings with a single leading
6920 underscore."##,
6921 },
6922 Lint {
6923 label: "clippy::useless_asref",
6924 description: r##"Checks for usage of `.as_ref()` or `.as_mut()` where the
6925 types before and after the call are the same."##,
6926 },
6927 Lint {
6928 label: "clippy::useless_attribute",
6929 description: r##"Checks for `extern crate` and `use` items annotated with
6930 lint attributes.
6931
6932 This lint permits `#[allow(unused_imports)]`, `#[allow(deprecated)]`,
6933 `#[allow(unreachable_pub)]`, `#[allow(clippy::wildcard_imports)]` and
6934 `#[allow(clippy::enum_glob_use)]` on `use` items and `#[allow(unused_imports)]` on
6935 `extern crate` items with a `#[macro_use]` attribute."##,
6936 },
6937 Lint {
6938 label: "clippy::useless_conversion",
6939 description: r##"Checks for `Into`, `TryInto`, `From`, `TryFrom`, or `IntoIter` calls
6940 which uselessly convert to the same type."##,
6941 },
6942 Lint {
6943 label: "clippy::useless_format",
6944 description: r##"Checks for the use of `format!(string literal with no
6945 argument)` and `format!({}, foo)` where `foo` is a string."##,
6946 },
6947 Lint {
6948 label: "clippy::useless_let_if_seq",
6949 description: r##"Checks for variable declarations immediately followed by a
6950 conditional affectation."##,
6951 },
6952 Lint {
6953 label: "clippy::useless_transmute",
6954 description: r##"Checks for transmutes to the original type of the object
6955 and transmutes that could be a cast."##,
6956 },
6957 Lint {
6958 label: "clippy::useless_vec",
6959 description: r##"Checks for usage of `&vec![..]` when using `&[..]` would
6960 be possible."##,
6961 },
6962 Lint {
6963 label: "clippy::vec_box",
6964 description: r##"Checks for use of `Vec<Box<T>>` where T: Sized anywhere in the code.
6965 Check the [Box documentation](https://doc.rust-lang.org/std/boxed/index.html) for more information."##,
6966 },
6967 Lint {
6968 label: "clippy::vec_init_then_push",
6969 description: r##"Checks for calls to `push` immediately after creating a new `Vec`."##,
6970 },
6971 Lint {
6972 label: "clippy::vec_resize_to_zero",
6973 description: r##"Finds occurrences of `Vec::resize(0, an_int)`"##,
6974 },
6975 Lint {
6976 label: "clippy::verbose_bit_mask",
6977 description: r##"Checks for bit masks that can be replaced by a call
6978 to `trailing_zeros`"##,
6979 },
6980 Lint {
6981 label: "clippy::verbose_file_reads",
6982 description: r##"Checks for use of File::read_to_end and File::read_to_string."##,
6983 },
6984 Lint {
6985 label: "clippy::vtable_address_comparisons",
6986 description: r##"Checks for comparisons with an address of a trait vtable."##,
6987 },
6988 Lint {
6989 label: "clippy::while_immutable_condition",
6990 description: r##"Checks whether variables used within while loop condition
6991 can be (and are) mutated in the body."##,
6992 },
6993 Lint {
6994 label: "clippy::while_let_loop",
6995 description: r##"Detects `loop + match` combinations that are easier
6996 written as a `while let` loop."##,
6997 },
6998 Lint {
6999 label: "clippy::while_let_on_iterator",
7000 description: r##"Checks for `while let` expressions on iterators."##,
7001 },
7002 Lint {
7003 label: "clippy::wildcard_dependencies",
7004 description: r##"Checks for wildcard dependencies in the `Cargo.toml`."##,
7005 },
7006 Lint {
7007 label: "clippy::wildcard_enum_match_arm",
7008 description: r##"Checks for wildcard enum matches using `_`."##,
7009 },
7010 Lint {
7011 label: "clippy::wildcard_imports",
7012 description: r##"Checks for wildcard imports `use _::*`."##,
7013 },
7014 Lint {
7015 label: "clippy::wildcard_in_or_patterns",
7016 description: r##"Checks for wildcard pattern used with others patterns in same match arm."##,
7017 },
7018 Lint {
7019 label: "clippy::write_literal",
7020 description: r##"This lint warns about the use of literals as `write!`/`writeln!` args."##,
7021 },
7022 Lint {
7023 label: "clippy::write_with_newline",
7024 description: r##"This lint warns when you use `write!()` with a format
7025 string that
7026 ends in a newline."##,
7027 },
7028 Lint {
7029 label: "clippy::writeln_empty_string",
7030 description: r##"This lint warns when you use `writeln!(buf, )` to
7031 print a newline."##,
7032 },
7033 Lint {
7034 label: "clippy::wrong_pub_self_convention",
7035 description: r##"Nothing. This lint has been deprecated."##,
7036 },
7037 Lint {
7038 label: "clippy::wrong_self_convention",
7039 description: r##"Checks for methods with certain name prefixes and which
7040 doesn't match how self is taken. The actual rules are:
7041
7042 |Prefix |Postfix |`self` taken | `self` type |
7043 |-------|------------|-----------------------|--------------|
7044 |`as_` | none |`&self` or `&mut self` | any |
7045 |`from_`| none | none | any |
7046 |`into_`| none |`self` | any |
7047 |`is_` | none |`&self` or none | any |
7048 |`to_` | `_mut` |`&mut self` | any |
7049 |`to_` | not `_mut` |`self` | `Copy` |
7050 |`to_` | not `_mut` |`&self` | not `Copy` |
7051
7052 Note: Clippy doesn't trigger methods with `to_` prefix in:
7053 - Traits definition.
7054 Clippy can not tell if a type that implements a trait is `Copy` or not.
7055 - Traits implementation, when `&self` is taken.
7056 The method signature is controlled by the trait and often `&self` is required for all types that implement the trait
7057 (see e.g. the `std::string::ToString` trait).
7058
7059 Clippy allows `Pin<&Self>` and `Pin<&mut Self>` if `&self` and `&mut self` is required.
7060
7061 Please find more info here:
7062 https://rust-lang.github.io/api-guidelines/naming.html#ad-hoc-conversions-follow-as_-to_-into_-conventions-c-conv"##,
7063 },
7064 Lint {
7065 label: "clippy::wrong_transmute",
7066 description: r##"Checks for transmutes that can't ever be correct on any
7067 architecture."##,
7068 },
7069 Lint { label: "clippy::zero_divided_by_zero", description: r##"Checks for `0.0 / 0.0`."## },
7070 Lint {
7071 label: "clippy::zero_prefixed_literal",
7072 description: r##"Warns if an integral constant literal starts with `0`."##,
7073 },
7074 Lint {
7075 label: "clippy::zero_ptr",
7076 description: r##"Catch casts from `0` to some pointer type"##,
7077 },
7078 Lint {
7079 label: "clippy::zero_sized_map_values",
7080 description: r##"Checks for maps with zero-sized value types anywhere in the code."##,
7081 },
7082 Lint {
7083 label: "clippy::zst_offset",
7084 description: r##"Checks for `offset(_)`, `wrapping_`{`add`, `sub`}, etc. on raw pointers to
7085 zero-sized types"##,
7086 },
7087 ];
7088 pub const CLIPPY_LINT_GROUPS: &[LintGroup] = &[
7089 LintGroup {
7090 lint: Lint {
7091 label: "clippy::cargo",
7092 description: r##"lint group for: clippy::cargo_common_metadata, clippy::multiple_crate_versions, clippy::negative_feature_names, clippy::redundant_feature_names, clippy::wildcard_dependencies"##,
7093 },
7094 children: &[
7095 "clippy::cargo_common_metadata",
7096 "clippy::multiple_crate_versions",
7097 "clippy::negative_feature_names",
7098 "clippy::redundant_feature_names",
7099 "clippy::wildcard_dependencies",
7100 ],
7101 },
7102 LintGroup {
7103 lint: Lint {
7104 label: "clippy::complexity",
7105 description: r##"lint group for: clippy::bind_instead_of_map, clippy::bool_comparison, clippy::borrowed_box, clippy::char_lit_as_u8, clippy::clone_on_copy, clippy::crosspointer_transmute, clippy::deprecated_cfg_attr, clippy::deref_addrof, clippy::derivable_impls, clippy::diverging_sub_expression, clippy::double_comparisons, clippy::double_parens, clippy::duration_subsec, clippy::explicit_counter_loop, clippy::explicit_write, clippy::extra_unused_lifetimes, clippy::filter_map_identity, clippy::filter_next, clippy::flat_map_identity, clippy::get_last_with_len, clippy::identity_op, clippy::inspect_for_each, clippy::int_plus_one, clippy::iter_count, clippy::manual_filter_map, clippy::manual_find_map, clippy::manual_flatten, 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_borrowed_reference, clippy::needless_lifetimes, clippy::needless_option_as_deref, clippy::needless_question_mark, clippy::needless_splitn, clippy::needless_update, clippy::neg_cmp_op_on_partial_ord, clippy::no_effect, clippy::nonminimal_bool, clippy::option_as_ref_deref, clippy::option_filter_map, clippy::option_map_unit_fn, clippy::overflow_check_conditional, clippy::partialeq_ne_impl, clippy::precedence, clippy::ptr_offset_with_cast, clippy::range_zip_with_len, clippy::redundant_closure_call, clippy::redundant_slicing, clippy::ref_in_deref, clippy::repeat_once, clippy::result_map_unit_fn, clippy::search_is_some, 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_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_operation, clippy::unnecessary_sort_by, clippy::unnecessary_unwrap, clippy::unneeded_wildcard_pattern, clippy::useless_asref, clippy::useless_conversion, clippy::useless_format, clippy::vec_box, clippy::while_let_loop, clippy::wildcard_in_or_patterns, clippy::zero_divided_by_zero, clippy::zero_prefixed_literal"##,
7106 },
7107 children: &[
7108 "clippy::bind_instead_of_map",
7109 "clippy::bool_comparison",
7110 "clippy::borrowed_box",
7111 "clippy::char_lit_as_u8",
7112 "clippy::clone_on_copy",
7113 "clippy::crosspointer_transmute",
7114 "clippy::deprecated_cfg_attr",
7115 "clippy::deref_addrof",
7116 "clippy::derivable_impls",
7117 "clippy::diverging_sub_expression",
7118 "clippy::double_comparisons",
7119 "clippy::double_parens",
7120 "clippy::duration_subsec",
7121 "clippy::explicit_counter_loop",
7122 "clippy::explicit_write",
7123 "clippy::extra_unused_lifetimes",
7124 "clippy::filter_map_identity",
7125 "clippy::filter_next",
7126 "clippy::flat_map_identity",
7127 "clippy::get_last_with_len",
7128 "clippy::identity_op",
7129 "clippy::inspect_for_each",
7130 "clippy::int_plus_one",
7131 "clippy::iter_count",
7132 "clippy::manual_filter_map",
7133 "clippy::manual_find_map",
7134 "clippy::manual_flatten",
7135 "clippy::manual_split_once",
7136 "clippy::manual_strip",
7137 "clippy::manual_swap",
7138 "clippy::manual_unwrap_or",
7139 "clippy::map_flatten",
7140 "clippy::map_identity",
7141 "clippy::match_as_ref",
7142 "clippy::match_single_binding",
7143 "clippy::needless_arbitrary_self_type",
7144 "clippy::needless_bool",
7145 "clippy::needless_borrowed_reference",
7146 "clippy::needless_lifetimes",
7147 "clippy::needless_option_as_deref",
7148 "clippy::needless_question_mark",
7149 "clippy::needless_splitn",
7150 "clippy::needless_update",
7151 "clippy::neg_cmp_op_on_partial_ord",
7152 "clippy::no_effect",
7153 "clippy::nonminimal_bool",
7154 "clippy::option_as_ref_deref",
7155 "clippy::option_filter_map",
7156 "clippy::option_map_unit_fn",
7157 "clippy::overflow_check_conditional",
7158 "clippy::partialeq_ne_impl",
7159 "clippy::precedence",
7160 "clippy::ptr_offset_with_cast",
7161 "clippy::range_zip_with_len",
7162 "clippy::redundant_closure_call",
7163 "clippy::redundant_slicing",
7164 "clippy::ref_in_deref",
7165 "clippy::repeat_once",
7166 "clippy::result_map_unit_fn",
7167 "clippy::search_is_some",
7168 "clippy::short_circuit_statement",
7169 "clippy::single_element_loop",
7170 "clippy::skip_while_next",
7171 "clippy::string_from_utf8_as_bytes",
7172 "clippy::strlen_on_c_strings",
7173 "clippy::temporary_assignment",
7174 "clippy::too_many_arguments",
7175 "clippy::transmute_bytes_to_str",
7176 "clippy::transmute_float_to_int",
7177 "clippy::transmute_int_to_bool",
7178 "clippy::transmute_int_to_char",
7179 "clippy::transmute_int_to_float",
7180 "clippy::transmute_num_to_bytes",
7181 "clippy::transmute_ptr_to_ref",
7182 "clippy::transmutes_expressible_as_ptr_casts",
7183 "clippy::type_complexity",
7184 "clippy::unit_arg",
7185 "clippy::unnecessary_cast",
7186 "clippy::unnecessary_filter_map",
7187 "clippy::unnecessary_operation",
7188 "clippy::unnecessary_sort_by",
7189 "clippy::unnecessary_unwrap",
7190 "clippy::unneeded_wildcard_pattern",
7191 "clippy::useless_asref",
7192 "clippy::useless_conversion",
7193 "clippy::useless_format",
7194 "clippy::vec_box",
7195 "clippy::while_let_loop",
7196 "clippy::wildcard_in_or_patterns",
7197 "clippy::zero_divided_by_zero",
7198 "clippy::zero_prefixed_literal",
7199 ],
7200 },
7201 LintGroup {
7202 lint: Lint {
7203 label: "clippy::correctness",
7204 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_ref_to_mut, clippy::clone_double_ref, clippy::cmp_nan, clippy::deprecated_semver, clippy::derive_hash_xor_eq, clippy::derive_ord_xor_partial_ord, clippy::drop_copy, clippy::drop_ref, clippy::enum_clike_unportable_variant, clippy::eq_op, clippy::erasing_op, clippy::fn_address_comparisons, clippy::forget_copy, clippy::forget_ref, clippy::if_let_mutex, clippy::if_same_then_else, clippy::ifs_same_cond, 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::iterator_step_by_zero, clippy::let_underscore_lock, clippy::logic_bug, 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::panicking_unwrap, clippy::possible_missing_comma, clippy::reversed_empty_ranges, clippy::self_assignment, clippy::serde_api_misuse, clippy::size_of_in_element_count, clippy::suspicious_splitn, clippy::to_string_in_display, clippy::transmuting_null, clippy::undropped_manually_drops, 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::vtable_address_comparisons, clippy::while_immutable_condition, clippy::wrong_transmute, clippy::zst_offset"##,
7205 },
7206 children: &[
7207 "clippy::absurd_extreme_comparisons",
7208 "clippy::almost_swapped",
7209 "clippy::approx_constant",
7210 "clippy::async_yields_async",
7211 "clippy::bad_bit_mask",
7212 "clippy::cast_ref_to_mut",
7213 "clippy::clone_double_ref",
7214 "clippy::cmp_nan",
7215 "clippy::deprecated_semver",
7216 "clippy::derive_hash_xor_eq",
7217 "clippy::derive_ord_xor_partial_ord",
7218 "clippy::drop_copy",
7219 "clippy::drop_ref",
7220 "clippy::enum_clike_unportable_variant",
7221 "clippy::eq_op",
7222 "clippy::erasing_op",
7223 "clippy::fn_address_comparisons",
7224 "clippy::forget_copy",
7225 "clippy::forget_ref",
7226 "clippy::if_let_mutex",
7227 "clippy::if_same_then_else",
7228 "clippy::ifs_same_cond",
7229 "clippy::ineffective_bit_mask",
7230 "clippy::infinite_iter",
7231 "clippy::inherent_to_string_shadow_display",
7232 "clippy::inline_fn_without_body",
7233 "clippy::invalid_null_ptr_usage",
7234 "clippy::invalid_regex",
7235 "clippy::invisible_characters",
7236 "clippy::iter_next_loop",
7237 "clippy::iterator_step_by_zero",
7238 "clippy::let_underscore_lock",
7239 "clippy::logic_bug",
7240 "clippy::match_str_case_mismatch",
7241 "clippy::mem_replace_with_uninit",
7242 "clippy::min_max",
7243 "clippy::mismatched_target_os",
7244 "clippy::mistyped_literal_suffixes",
7245 "clippy::modulo_one",
7246 "clippy::mut_from_ref",
7247 "clippy::never_loop",
7248 "clippy::non_octal_unix_permissions",
7249 "clippy::nonsensical_open_options",
7250 "clippy::not_unsafe_ptr_arg_deref",
7251 "clippy::option_env_unwrap",
7252 "clippy::out_of_bounds_indexing",
7253 "clippy::panicking_unwrap",
7254 "clippy::possible_missing_comma",
7255 "clippy::reversed_empty_ranges",
7256 "clippy::self_assignment",
7257 "clippy::serde_api_misuse",
7258 "clippy::size_of_in_element_count",
7259 "clippy::suspicious_splitn",
7260 "clippy::to_string_in_display",
7261 "clippy::transmuting_null",
7262 "clippy::undropped_manually_drops",
7263 "clippy::uninit_assumed_init",
7264 "clippy::uninit_vec",
7265 "clippy::unit_cmp",
7266 "clippy::unit_hash",
7267 "clippy::unit_return_expecting_ord",
7268 "clippy::unsound_collection_transmute",
7269 "clippy::unused_io_amount",
7270 "clippy::useless_attribute",
7271 "clippy::vec_resize_to_zero",
7272 "clippy::vtable_address_comparisons",
7273 "clippy::while_immutable_condition",
7274 "clippy::wrong_transmute",
7275 "clippy::zst_offset",
7276 ],
7277 },
7278 LintGroup {
7279 lint: Lint {
7280 label: "clippy::deprecated",
7281 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"##,
7282 },
7283 children: &[
7284 "clippy::assign_ops",
7285 "clippy::extend_from_slice",
7286 "clippy::filter_map",
7287 "clippy::find_map",
7288 "clippy::if_let_redundant_pattern_matching",
7289 "clippy::misaligned_transmute",
7290 "clippy::pub_enum_variant_names",
7291 "clippy::range_step_by_zero",
7292 "clippy::regex_macro",
7293 "clippy::replace_consts",
7294 "clippy::should_assert_eq",
7295 "clippy::unsafe_vector_initialization",
7296 "clippy::unstable_as_mut_slice",
7297 "clippy::unstable_as_slice",
7298 "clippy::unused_collect",
7299 "clippy::wrong_pub_self_convention",
7300 ],
7301 },
7302 LintGroup {
7303 lint: Lint {
7304 label: "clippy::nursery",
7305 description: r##"lint group for: clippy::branches_sharing_code, clippy::cognitive_complexity, clippy::debug_assert_with_mut_call, clippy::disallowed_methods, clippy::disallowed_types, clippy::empty_line_after_outer_attr, clippy::equatable_if_let, clippy::fallible_impl_from, clippy::future_not_send, clippy::imprecise_flops, clippy::index_refutable_slice, clippy::missing_const_for_fn, clippy::mutex_integer, clippy::non_send_fields_in_send_ty, clippy::nonstandard_macro_braces, clippy::option_if_let_else, clippy::path_buf_push_overwrite, clippy::redundant_pub_crate, clippy::string_lit_as_bytes, clippy::suboptimal_flops, clippy::suspicious_operation_groupings, clippy::trailing_empty_array, clippy::trivial_regex, clippy::use_self, clippy::useless_let_if_seq, clippy::useless_transmute"##,
7306 },
7307 children: &[
7308 "clippy::branches_sharing_code",
7309 "clippy::cognitive_complexity",
7310 "clippy::debug_assert_with_mut_call",
7311 "clippy::disallowed_methods",
7312 "clippy::disallowed_types",
7313 "clippy::empty_line_after_outer_attr",
7314 "clippy::equatable_if_let",
7315 "clippy::fallible_impl_from",
7316 "clippy::future_not_send",
7317 "clippy::imprecise_flops",
7318 "clippy::index_refutable_slice",
7319 "clippy::missing_const_for_fn",
7320 "clippy::mutex_integer",
7321 "clippy::non_send_fields_in_send_ty",
7322 "clippy::nonstandard_macro_braces",
7323 "clippy::option_if_let_else",
7324 "clippy::path_buf_push_overwrite",
7325 "clippy::redundant_pub_crate",
7326 "clippy::string_lit_as_bytes",
7327 "clippy::suboptimal_flops",
7328 "clippy::suspicious_operation_groupings",
7329 "clippy::trailing_empty_array",
7330 "clippy::trivial_regex",
7331 "clippy::use_self",
7332 "clippy::useless_let_if_seq",
7333 "clippy::useless_transmute",
7334 ],
7335 },
7336 LintGroup {
7337 lint: Lint {
7338 label: "clippy::pedantic",
7339 description: r##"lint group for: clippy::await_holding_lock, clippy::await_holding_refcell_ref, 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_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::implicit_clone, clippy::implicit_hasher, clippy::implicit_saturating_sub, clippy::inconsistent_struct_constructor, clippy::inefficient_to_string, clippy::inline_always, clippy::invalid_upcast_comparisons, clippy::items_after_statements, clippy::iter_not_returning_iterator, clippy::large_digit_groups, clippy::large_stack_arrays, clippy::large_types_passed_by_value, clippy::let_underscore_drop, clippy::let_unit_value, clippy::linkedlist, clippy::macro_use_imports, clippy::manual_assert, clippy::manual_ok_or, 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::missing_errors_doc, 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::no_effect_underscore_binding, clippy::option_option, clippy::ptr_as_ptr, clippy::range_minus_one, clippy::range_plus_one, clippy::redundant_closure_for_method_calls, clippy::redundant_else, clippy::ref_binding_to_reference, clippy::ref_option_ref, clippy::same_functions_in_if_condition, clippy::semicolon_if_nothing_returned, clippy::similar_names, clippy::single_match_else, clippy::string_add_assign, clippy::struct_excessive_bools, clippy::too_many_lines, clippy::trait_duplication_in_bounds, clippy::transmute_ptr_to_ptr, clippy::trivially_copy_pass_by_ref, clippy::type_repetition_in_bounds, clippy::unicode_not_nfc, 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"##,
7340 },
7341 children: &[
7342 "clippy::await_holding_lock",
7343 "clippy::await_holding_refcell_ref",
7344 "clippy::case_sensitive_file_extension_comparisons",
7345 "clippy::cast_lossless",
7346 "clippy::cast_possible_truncation",
7347 "clippy::cast_possible_wrap",
7348 "clippy::cast_precision_loss",
7349 "clippy::cast_ptr_alignment",
7350 "clippy::cast_sign_loss",
7351 "clippy::checked_conversions",
7352 "clippy::cloned_instead_of_copied",
7353 "clippy::copy_iterator",
7354 "clippy::default_trait_access",
7355 "clippy::doc_markdown",
7356 "clippy::empty_enum",
7357 "clippy::enum_glob_use",
7358 "clippy::expl_impl_clone_on_copy",
7359 "clippy::explicit_deref_methods",
7360 "clippy::explicit_into_iter_loop",
7361 "clippy::explicit_iter_loop",
7362 "clippy::filter_map_next",
7363 "clippy::flat_map_option",
7364 "clippy::float_cmp",
7365 "clippy::fn_params_excessive_bools",
7366 "clippy::from_iter_instead_of_collect",
7367 "clippy::if_not_else",
7368 "clippy::implicit_clone",
7369 "clippy::implicit_hasher",
7370 "clippy::implicit_saturating_sub",
7371 "clippy::inconsistent_struct_constructor",
7372 "clippy::inefficient_to_string",
7373 "clippy::inline_always",
7374 "clippy::invalid_upcast_comparisons",
7375 "clippy::items_after_statements",
7376 "clippy::iter_not_returning_iterator",
7377 "clippy::large_digit_groups",
7378 "clippy::large_stack_arrays",
7379 "clippy::large_types_passed_by_value",
7380 "clippy::let_underscore_drop",
7381 "clippy::let_unit_value",
7382 "clippy::linkedlist",
7383 "clippy::macro_use_imports",
7384 "clippy::manual_assert",
7385 "clippy::manual_ok_or",
7386 "clippy::many_single_char_names",
7387 "clippy::map_unwrap_or",
7388 "clippy::match_bool",
7389 "clippy::match_on_vec_items",
7390 "clippy::match_same_arms",
7391 "clippy::match_wild_err_arm",
7392 "clippy::match_wildcard_for_single_variants",
7393 "clippy::maybe_infinite_iter",
7394 "clippy::missing_errors_doc",
7395 "clippy::missing_panics_doc",
7396 "clippy::module_name_repetitions",
7397 "clippy::must_use_candidate",
7398 "clippy::mut_mut",
7399 "clippy::naive_bytecount",
7400 "clippy::needless_bitwise_bool",
7401 "clippy::needless_continue",
7402 "clippy::needless_for_each",
7403 "clippy::needless_pass_by_value",
7404 "clippy::no_effect_underscore_binding",
7405 "clippy::option_option",
7406 "clippy::ptr_as_ptr",
7407 "clippy::range_minus_one",
7408 "clippy::range_plus_one",
7409 "clippy::redundant_closure_for_method_calls",
7410 "clippy::redundant_else",
7411 "clippy::ref_binding_to_reference",
7412 "clippy::ref_option_ref",
7413 "clippy::same_functions_in_if_condition",
7414 "clippy::semicolon_if_nothing_returned",
7415 "clippy::similar_names",
7416 "clippy::single_match_else",
7417 "clippy::string_add_assign",
7418 "clippy::struct_excessive_bools",
7419 "clippy::too_many_lines",
7420 "clippy::trait_duplication_in_bounds",
7421 "clippy::transmute_ptr_to_ptr",
7422 "clippy::trivially_copy_pass_by_ref",
7423 "clippy::type_repetition_in_bounds",
7424 "clippy::unicode_not_nfc",
7425 "clippy::unnecessary_wraps",
7426 "clippy::unnested_or_patterns",
7427 "clippy::unreadable_literal",
7428 "clippy::unsafe_derive_deserialize",
7429 "clippy::unused_async",
7430 "clippy::unused_self",
7431 "clippy::used_underscore_binding",
7432 "clippy::verbose_bit_mask",
7433 "clippy::wildcard_imports",
7434 "clippy::zero_sized_map_values",
7435 ],
7436 },
7437 LintGroup {
7438 lint: Lint {
7439 label: "clippy::perf",
7440 description: r##"lint group for: clippy::box_collection, clippy::boxed_local, clippy::cmp_owned, clippy::expect_fun_call, clippy::extend_with_drain, clippy::format_in_format_args, clippy::iter_nth, clippy::large_const_arrays, clippy::large_enum_variant, clippy::manual_memcpy, clippy::manual_str_repeat, clippy::map_entry, clippy::mutex_atomic, clippy::needless_collect, clippy::or_fun_call, clippy::redundant_allocation, clippy::redundant_clone, clippy::single_char_pattern, clippy::slow_vector_initialization, clippy::stable_sort_primitive, clippy::to_string_in_format_args, clippy::unnecessary_to_owned, clippy::useless_vec, clippy::vec_init_then_push"##,
7441 },
7442 children: &[
7443 "clippy::box_collection",
7444 "clippy::boxed_local",
7445 "clippy::cmp_owned",
7446 "clippy::expect_fun_call",
7447 "clippy::extend_with_drain",
7448 "clippy::format_in_format_args",
7449 "clippy::iter_nth",
7450 "clippy::large_const_arrays",
7451 "clippy::large_enum_variant",
7452 "clippy::manual_memcpy",
7453 "clippy::manual_str_repeat",
7454 "clippy::map_entry",
7455 "clippy::mutex_atomic",
7456 "clippy::needless_collect",
7457 "clippy::or_fun_call",
7458 "clippy::redundant_allocation",
7459 "clippy::redundant_clone",
7460 "clippy::single_char_pattern",
7461 "clippy::slow_vector_initialization",
7462 "clippy::stable_sort_primitive",
7463 "clippy::to_string_in_format_args",
7464 "clippy::unnecessary_to_owned",
7465 "clippy::useless_vec",
7466 "clippy::vec_init_then_push",
7467 ],
7468 },
7469 LintGroup {
7470 lint: Lint {
7471 label: "clippy::restriction",
7472 description: r##"lint group for: clippy::as_conversions, clippy::clone_on_ref_ptr, clippy::create_dir, clippy::dbg_macro, clippy::decimal_literal_representation, clippy::default_numeric_fallback, clippy::disallowed_script_idents, clippy::else_if_without_else, 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::get_unwrap, clippy::if_then_some_else_none, clippy::implicit_return, clippy::indexing_slicing, clippy::inline_asm_x86_att_syntax, clippy::inline_asm_x86_intel_syntax, clippy::integer_arithmetic, clippy::integer_division, clippy::let_underscore_must_use, clippy::lossy_float_literal, clippy::map_err_ignore, clippy::mem_forget, clippy::missing_docs_in_private_items, clippy::missing_enforced_import_renames, clippy::missing_inline_in_public_items, clippy::mod_module_files, clippy::modulo_arithmetic, clippy::multiple_inherent_impl, clippy::non_ascii_literal, clippy::panic, clippy::panic_in_result_fn, clippy::pattern_type_mismatch, clippy::print_stderr, clippy::print_stdout, clippy::rc_buffer, clippy::rc_mutex, clippy::rest_pat_in_fully_bound_structs, clippy::same_name_method, clippy::self_named_module_files, clippy::separated_literal_suffix, clippy::shadow_reuse, clippy::shadow_same, clippy::shadow_unrelated, clippy::str_to_string, clippy::string_add, clippy::string_slice, clippy::string_to_string, clippy::todo, clippy::undocumented_unsafe_blocks, clippy::unimplemented, 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"##,
7473 },
7474 children: &[
7475 "clippy::as_conversions",
7476 "clippy::clone_on_ref_ptr",
7477 "clippy::create_dir",
7478 "clippy::dbg_macro",
7479 "clippy::decimal_literal_representation",
7480 "clippy::default_numeric_fallback",
7481 "clippy::disallowed_script_idents",
7482 "clippy::else_if_without_else",
7483 "clippy::exhaustive_enums",
7484 "clippy::exhaustive_structs",
7485 "clippy::exit",
7486 "clippy::expect_used",
7487 "clippy::filetype_is_file",
7488 "clippy::float_arithmetic",
7489 "clippy::float_cmp_const",
7490 "clippy::fn_to_numeric_cast_any",
7491 "clippy::get_unwrap",
7492 "clippy::if_then_some_else_none",
7493 "clippy::implicit_return",
7494 "clippy::indexing_slicing",
7495 "clippy::inline_asm_x86_att_syntax",
7496 "clippy::inline_asm_x86_intel_syntax",
7497 "clippy::integer_arithmetic",
7498 "clippy::integer_division",
7499 "clippy::let_underscore_must_use",
7500 "clippy::lossy_float_literal",
7501 "clippy::map_err_ignore",
7502 "clippy::mem_forget",
7503 "clippy::missing_docs_in_private_items",
7504 "clippy::missing_enforced_import_renames",
7505 "clippy::missing_inline_in_public_items",
7506 "clippy::mod_module_files",
7507 "clippy::modulo_arithmetic",
7508 "clippy::multiple_inherent_impl",
7509 "clippy::non_ascii_literal",
7510 "clippy::panic",
7511 "clippy::panic_in_result_fn",
7512 "clippy::pattern_type_mismatch",
7513 "clippy::print_stderr",
7514 "clippy::print_stdout",
7515 "clippy::rc_buffer",
7516 "clippy::rc_mutex",
7517 "clippy::rest_pat_in_fully_bound_structs",
7518 "clippy::same_name_method",
7519 "clippy::self_named_module_files",
7520 "clippy::separated_literal_suffix",
7521 "clippy::shadow_reuse",
7522 "clippy::shadow_same",
7523 "clippy::shadow_unrelated",
7524 "clippy::str_to_string",
7525 "clippy::string_add",
7526 "clippy::string_slice",
7527 "clippy::string_to_string",
7528 "clippy::todo",
7529 "clippy::undocumented_unsafe_blocks",
7530 "clippy::unimplemented",
7531 "clippy::unnecessary_self_imports",
7532 "clippy::unneeded_field_pattern",
7533 "clippy::unreachable",
7534 "clippy::unseparated_literal_suffix",
7535 "clippy::unwrap_in_result",
7536 "clippy::unwrap_used",
7537 "clippy::use_debug",
7538 "clippy::verbose_file_reads",
7539 "clippy::wildcard_enum_match_arm",
7540 ],
7541 },
7542 LintGroup {
7543 lint: Lint {
7544 label: "clippy::style",
7545 description: r##"lint group for: clippy::assertions_on_constants, clippy::assign_op_pattern, clippy::blacklisted_name, clippy::blocks_in_if_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::double_must_use, clippy::double_neg, clippy::duplicate_underscore_argument, clippy::enum_variant_names, clippy::excessive_precision, clippy::field_reassign_with_default, 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::inconsistent_digit_grouping, clippy::infallible_destructuring_match, clippy::inherent_to_string, clippy::into_iter_on_ref, 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::main_recursion, clippy::manual_async_fn, clippy::manual_map, clippy::manual_non_exhaustive, clippy::manual_range_contains, clippy::manual_saturating_arithmetic, 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_safety_doc, clippy::mixed_case_hex_literals, clippy::module_inception, clippy::must_use_unit, clippy::mut_mutex_lock, clippy::needless_borrow, clippy::needless_doctest_main, clippy::needless_late_init, clippy::needless_range_loop, clippy::needless_return, clippy::neg_multiply, clippy::new_ret_no_self, clippy::new_without_default, clippy::ok_expect, clippy::op_ref, clippy::option_map_or_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::toplevel_ref_arg, clippy::try_err, clippy::unnecessary_fold, clippy::unnecessary_lazy_evaluations, clippy::unnecessary_mut_passed, clippy::unsafe_removed_from_name, clippy::unused_unit, clippy::unusual_byte_groupings, clippy::unwrap_or_else_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"##,
7546 },
7547 children: &[
7548 "clippy::assertions_on_constants",
7549 "clippy::assign_op_pattern",
7550 "clippy::blacklisted_name",
7551 "clippy::blocks_in_if_conditions",
7552 "clippy::bool_assert_comparison",
7553 "clippy::borrow_interior_mutable_const",
7554 "clippy::builtin_type_shadow",
7555 "clippy::bytes_nth",
7556 "clippy::chars_last_cmp",
7557 "clippy::chars_next_cmp",
7558 "clippy::cmp_null",
7559 "clippy::collapsible_else_if",
7560 "clippy::collapsible_if",
7561 "clippy::collapsible_match",
7562 "clippy::comparison_chain",
7563 "clippy::comparison_to_empty",
7564 "clippy::declare_interior_mutable_const",
7565 "clippy::double_must_use",
7566 "clippy::double_neg",
7567 "clippy::duplicate_underscore_argument",
7568 "clippy::enum_variant_names",
7569 "clippy::excessive_precision",
7570 "clippy::field_reassign_with_default",
7571 "clippy::fn_to_numeric_cast",
7572 "clippy::fn_to_numeric_cast_with_truncation",
7573 "clippy::for_kv_map",
7574 "clippy::from_over_into",
7575 "clippy::from_str_radix_10",
7576 "clippy::inconsistent_digit_grouping",
7577 "clippy::infallible_destructuring_match",
7578 "clippy::inherent_to_string",
7579 "clippy::into_iter_on_ref",
7580 "clippy::iter_cloned_collect",
7581 "clippy::iter_next_slice",
7582 "clippy::iter_nth_zero",
7583 "clippy::iter_skip_next",
7584 "clippy::just_underscores_and_digits",
7585 "clippy::len_without_is_empty",
7586 "clippy::len_zero",
7587 "clippy::let_and_return",
7588 "clippy::main_recursion",
7589 "clippy::manual_async_fn",
7590 "clippy::manual_map",
7591 "clippy::manual_non_exhaustive",
7592 "clippy::manual_range_contains",
7593 "clippy::manual_saturating_arithmetic",
7594 "clippy::map_clone",
7595 "clippy::map_collect_result_unit",
7596 "clippy::match_like_matches_macro",
7597 "clippy::match_overlapping_arm",
7598 "clippy::match_ref_pats",
7599 "clippy::match_result_ok",
7600 "clippy::mem_replace_option_with_none",
7601 "clippy::mem_replace_with_default",
7602 "clippy::missing_safety_doc",
7603 "clippy::mixed_case_hex_literals",
7604 "clippy::module_inception",
7605 "clippy::must_use_unit",
7606 "clippy::mut_mutex_lock",
7607 "clippy::needless_borrow",
7608 "clippy::needless_doctest_main",
7609 "clippy::needless_late_init",
7610 "clippy::needless_range_loop",
7611 "clippy::needless_return",
7612 "clippy::neg_multiply",
7613 "clippy::new_ret_no_self",
7614 "clippy::new_without_default",
7615 "clippy::ok_expect",
7616 "clippy::op_ref",
7617 "clippy::option_map_or_none",
7618 "clippy::print_literal",
7619 "clippy::print_with_newline",
7620 "clippy::println_empty_string",
7621 "clippy::ptr_arg",
7622 "clippy::ptr_eq",
7623 "clippy::question_mark",
7624 "clippy::redundant_closure",
7625 "clippy::redundant_field_names",
7626 "clippy::redundant_pattern",
7627 "clippy::redundant_pattern_matching",
7628 "clippy::redundant_static_lifetimes",
7629 "clippy::result_map_or_into_option",
7630 "clippy::result_unit_err",
7631 "clippy::same_item_push",
7632 "clippy::self_named_constructors",
7633 "clippy::should_implement_trait",
7634 "clippy::single_char_add_str",
7635 "clippy::single_component_path_imports",
7636 "clippy::single_match",
7637 "clippy::string_extend_chars",
7638 "clippy::tabs_in_doc_comments",
7639 "clippy::to_digit_is_some",
7640 "clippy::toplevel_ref_arg",
7641 "clippy::try_err",
7642 "clippy::unnecessary_fold",
7643 "clippy::unnecessary_lazy_evaluations",
7644 "clippy::unnecessary_mut_passed",
7645 "clippy::unsafe_removed_from_name",
7646 "clippy::unused_unit",
7647 "clippy::unusual_byte_groupings",
7648 "clippy::unwrap_or_else_default",
7649 "clippy::upper_case_acronyms",
7650 "clippy::while_let_on_iterator",
7651 "clippy::write_literal",
7652 "clippy::write_with_newline",
7653 "clippy::writeln_empty_string",
7654 "clippy::wrong_self_convention",
7655 "clippy::zero_ptr",
7656 ],
7657 },
7658 LintGroup {
7659 lint: Lint {
7660 label: "clippy::suspicious",
7661 description: r##"lint group for: clippy::blanket_clippy_restriction_lints, clippy::empty_loop, clippy::eval_order_dependence, clippy::float_equality_without_abs, clippy::for_loops_over_fallibles, clippy::misrefactored_assign_op, clippy::mut_range_bound, clippy::mutable_key_type, clippy::octal_escapes, clippy::return_self_not_must_use, clippy::suspicious_arithmetic_impl, clippy::suspicious_assignment_formatting, clippy::suspicious_else_formatting, clippy::suspicious_map, clippy::suspicious_op_assign_impl, clippy::suspicious_unary_op_formatting"##,
7662 },
7663 children: &[
7664 "clippy::blanket_clippy_restriction_lints",
7665 "clippy::empty_loop",
7666 "clippy::eval_order_dependence",
7667 "clippy::float_equality_without_abs",
7668 "clippy::for_loops_over_fallibles",
7669 "clippy::misrefactored_assign_op",
7670 "clippy::mut_range_bound",
7671 "clippy::mutable_key_type",
7672 "clippy::octal_escapes",
7673 "clippy::return_self_not_must_use",
7674 "clippy::suspicious_arithmetic_impl",
7675 "clippy::suspicious_assignment_formatting",
7676 "clippy::suspicious_else_formatting",
7677 "clippy::suspicious_map",
7678 "clippy::suspicious_op_assign_impl",
7679 "clippy::suspicious_unary_op_formatting",
7680 ],
7681 },
7682 ];