1 // error-pattern:cargo-clippy
3 #![feature(box_syntax)]
4 #![feature(custom_attribute)]
5 #![feature(rustc_private)]
6 #![feature(slice_patterns)]
7 #![feature(stmt_expr_attributes)]
8 #![feature(conservative_impl_trait)]
9 #![feature(range_contains)]
10 #![feature(macro_vis_matcher)]
11 #![allow(unknown_lints, indexing_slicing, shadow_reuse, missing_docs_in_private_items)]
12 #![recursion_limit = "256"]
13 // FIXME(mark-i-m) remove after i128 stablization merges
14 #![allow(stable_features)]
15 #![feature(i128, i128_type)]
19 extern crate rustc_typeck;
21 extern crate syntax_pos;
25 // for unicode nfc normalization
27 extern crate unicode_normalization;
29 // for semver check in attrs.rs
35 extern crate regex_syntax;
37 // for finding minimal boolean expressions
39 extern crate quine_mc_cluskey;
41 extern crate rustc_const_math;
42 extern crate rustc_errors;
43 extern crate rustc_plugin;
46 extern crate matches as matches_macro;
50 extern crate serde_derive;
53 extern crate lazy_static;
55 extern crate itertools;
56 extern crate pulldown_cmark;
60 extern crate if_chain;
62 macro_rules! declare_clippy_lint {
63 { pub $name:tt, style, $description:tt } => {
64 declare_lint! { pub $name, Warn, $description }
66 { pub $name:tt, correctness, $description:tt } => {
67 declare_lint! { pub $name, Deny, $description }
69 { pub $name:tt, complexity, $description:tt } => {
70 declare_lint! { pub $name, Warn, $description }
72 { pub $name:tt, perf, $description:tt } => {
73 declare_lint! { pub $name, Warn, $description }
75 { pub $name:tt, pedantic, $description:tt } => {
76 declare_lint! { pub $name, Allow, $description }
78 { pub $name:tt, restriction, $description:tt } => {
79 declare_lint! { pub $name, Allow, $description }
81 { pub $name:tt, nursery, $description:tt } => {
82 declare_lint! { pub $name, Allow, $description }
84 { pub $name:tt, internal, $description:tt } => {
85 declare_lint! { pub $name, Allow, $description }
87 { pub $name:tt, internal_warn, $description:tt } => {
88 declare_lint! { pub $name, Warn, $description }
96 // begin lints modules, do not remove this comment, it’s used in `update_lints`
99 pub mod array_indexing;
103 pub mod blacklisted_name;
104 pub mod block_in_if_condition;
107 pub mod collapsible_if;
108 pub mod const_static_lifetime;
110 pub mod cyclomatic_complexity;
113 pub mod double_comparison;
114 pub mod double_parens;
115 pub mod drop_forget_ref;
116 pub mod else_if_without_else;
120 pub mod enum_glob_use;
121 pub mod enum_variants;
125 pub mod eta_reduction;
126 pub mod eval_order_dependence;
127 pub mod explicit_write;
128 pub mod fallible_impl_from;
132 pub mod identity_conversion;
134 pub mod if_let_redundant_pattern_matching;
136 pub mod infinite_iter;
137 pub mod inline_fn_without_body;
138 pub mod int_plus_one;
140 pub mod items_after_statements;
141 pub mod large_enum_variant;
145 pub mod literal_representation;
156 pub mod mut_reference;
157 pub mod mutex_atomic;
158 pub mod needless_bool;
159 pub mod needless_borrow;
160 pub mod needless_borrowed_ref;
161 pub mod needless_continue;
162 pub mod needless_pass_by_value;
163 pub mod needless_update;
164 pub mod neg_multiply;
165 pub mod new_without_default;
167 pub mod non_expressive_names;
169 pub mod open_options;
170 pub mod overflow_check_conditional;
172 pub mod partialeq_ne_impl;
175 pub mod question_mark;
177 pub mod redundant_field_names;
180 pub mod replace_consts;
185 pub mod suspicious_trait_impl;
187 pub mod temporary_assignment;
191 pub mod unsafe_removed_from_name;
192 pub mod unused_io_amount;
193 pub mod unused_label;
197 pub mod zero_div_zero;
198 // end lints modules, do not remove this comment, it’s used in `update_lints`
201 pub use syntax::ast::{Name, NodeId};
204 #[cfg_attr(rustfmt, rustfmt_skip)]
205 pub fn register_plugins(reg: &mut rustc_plugin::Registry) {
206 let conf = match utils::conf::file_from_args(reg.args()) {
208 // if the user specified a file, it must exist, otherwise default to `clippy.toml` but
209 // do not require the file to exist
210 let file_name = if let Some(file_name) = file_name {
213 match utils::conf::lookup_conf_file() {
216 reg.sess.struct_err(&format!("error finding Clippy's configuration file: {}", error)).emit();
222 let file_name = file_name.map(|file_name| if file_name.is_relative() {
224 .local_crate_source_file
226 .and_then(|file| std::path::Path::new(&file).parent().map(std::path::Path::to_path_buf))
233 let (conf, errors) = utils::conf::read(file_name.as_ref().map(|p| p.as_ref()));
235 // all conf errors are non-fatal, we just use the default conf in case of error
236 for error in errors {
237 reg.sess.struct_err(&format!("error reading Clippy's configuration file `{}`: {}", file_name.as_ref().and_then(|p| p.to_str()).unwrap_or(""), error)).emit();
242 Err((err, span)) => {
243 reg.sess.struct_span_err(span, err)
244 .span_note(span, "Clippy will use default configuration")
246 toml::from_str("").expect("we never error on empty config files")
250 let mut store = reg.sess.lint_store.borrow_mut();
251 store.register_removed(
253 "`assert!()` will be more flexible with RFC 2011",
255 store.register_removed(
257 "`.extend_from_slice(_)` is a faster way to extend a Vec by a slice",
259 store.register_removed(
260 "range_step_by_zero",
261 "`iterator.step_by(0)` panics nowadays",
263 store.register_removed(
265 "`Vec::as_slice` has been stabilized in 1.7",
267 store.register_removed(
268 "unstable_as_mut_slice",
269 "`Vec::as_mut_slice` has been stabilized in 1.7",
271 store.register_removed(
273 "using `str::to_string` is common even today and specialization will likely happen soon",
275 store.register_removed(
277 "using `string::to_string` is common even today and specialization will likely happen soon",
279 store.register_removed(
280 "misaligned_transmute",
281 "this lint has been split into cast_ptr_alignment and transmute_ptr_to_ptr",
283 // end deprecated lints, do not remove this comment, it’s used in `update_lints`
285 reg.register_late_lint_pass(box serde_api::Serde);
286 reg.register_early_lint_pass(box utils::internal_lints::Clippy);
287 reg.register_late_lint_pass(box utils::internal_lints::LintWithoutLintPass::default());
288 reg.register_late_lint_pass(box utils::inspector::Pass);
289 reg.register_late_lint_pass(box utils::author::Pass);
290 reg.register_late_lint_pass(box types::TypePass);
291 reg.register_late_lint_pass(box booleans::NonminimalBool);
292 reg.register_late_lint_pass(box eq_op::EqOp);
293 reg.register_early_lint_pass(box enum_variants::EnumVariantNames::new(conf.enum_variant_name_threshold));
294 reg.register_late_lint_pass(box enum_glob_use::EnumGlobUse);
295 reg.register_late_lint_pass(box enum_clike::UnportableVariant);
296 reg.register_late_lint_pass(box bit_mask::BitMask::new(conf.verbose_bit_mask_threshold));
297 reg.register_late_lint_pass(box ptr::PointerPass);
298 reg.register_late_lint_pass(box needless_bool::NeedlessBool);
299 reg.register_late_lint_pass(box needless_bool::BoolComparison);
300 reg.register_late_lint_pass(box approx_const::Pass);
301 reg.register_late_lint_pass(box misc::Pass);
302 reg.register_early_lint_pass(box precedence::Precedence);
303 reg.register_early_lint_pass(box needless_continue::NeedlessContinue);
304 reg.register_late_lint_pass(box eta_reduction::EtaPass);
305 reg.register_late_lint_pass(box identity_op::IdentityOp);
306 reg.register_late_lint_pass(box erasing_op::ErasingOp);
307 reg.register_early_lint_pass(box items_after_statements::ItemsAfterStatements);
308 reg.register_late_lint_pass(box mut_mut::MutMut);
309 reg.register_late_lint_pass(box mut_reference::UnnecessaryMutPassed);
310 reg.register_late_lint_pass(box len_zero::LenZero);
311 reg.register_late_lint_pass(box attrs::AttrPass);
312 reg.register_early_lint_pass(box collapsible_if::CollapsibleIf);
313 reg.register_late_lint_pass(box block_in_if_condition::BlockInIfCondition);
314 reg.register_late_lint_pass(box unicode::Unicode);
315 reg.register_late_lint_pass(box strings::StringAdd);
316 reg.register_early_lint_pass(box returns::ReturnPass);
317 reg.register_late_lint_pass(box methods::Pass);
318 reg.register_late_lint_pass(box shadow::Pass);
319 reg.register_late_lint_pass(box types::LetPass);
320 reg.register_late_lint_pass(box types::UnitCmp);
321 reg.register_late_lint_pass(box loops::Pass);
322 reg.register_late_lint_pass(box lifetimes::LifetimePass);
323 reg.register_late_lint_pass(box entry::HashMapLint);
324 reg.register_late_lint_pass(box ranges::Pass);
325 reg.register_late_lint_pass(box types::CastPass);
326 reg.register_late_lint_pass(box types::TypeComplexityPass::new(conf.type_complexity_threshold));
327 reg.register_late_lint_pass(box matches::MatchPass);
328 reg.register_late_lint_pass(box minmax::MinMaxPass);
329 reg.register_late_lint_pass(box open_options::NonSensical);
330 reg.register_late_lint_pass(box zero_div_zero::Pass);
331 reg.register_late_lint_pass(box mutex_atomic::MutexAtomic);
332 reg.register_late_lint_pass(box needless_update::Pass);
333 reg.register_late_lint_pass(box needless_borrow::NeedlessBorrow);
334 reg.register_late_lint_pass(box needless_borrowed_ref::NeedlessBorrowedRef);
335 reg.register_late_lint_pass(box no_effect::Pass);
336 reg.register_late_lint_pass(box map_clone::Pass);
337 reg.register_late_lint_pass(box temporary_assignment::Pass);
338 reg.register_late_lint_pass(box transmute::Transmute);
339 reg.register_late_lint_pass(
340 box cyclomatic_complexity::CyclomaticComplexity::new(conf.cyclomatic_complexity_threshold)
342 reg.register_late_lint_pass(box escape::Pass{too_large_for_stack: conf.too_large_for_stack});
343 reg.register_early_lint_pass(box misc_early::MiscEarly);
344 reg.register_late_lint_pass(box array_indexing::ArrayIndexing);
345 reg.register_late_lint_pass(box panic::Pass);
346 reg.register_late_lint_pass(box strings::StringLitAsBytes);
347 reg.register_late_lint_pass(box derive::Derive);
348 reg.register_late_lint_pass(box types::CharLitAsU8);
349 reg.register_late_lint_pass(box write::Pass);
350 reg.register_late_lint_pass(box vec::Pass);
351 reg.register_early_lint_pass(box non_expressive_names::NonExpressiveNames {
352 single_char_binding_names_threshold: conf.single_char_binding_names_threshold,
354 reg.register_late_lint_pass(box drop_forget_ref::Pass);
355 reg.register_late_lint_pass(box empty_enum::EmptyEnum);
356 reg.register_late_lint_pass(box types::AbsurdExtremeComparisons);
357 reg.register_late_lint_pass(box types::InvalidUpcastComparisons);
358 reg.register_late_lint_pass(box regex::Pass::default());
359 reg.register_late_lint_pass(box copies::CopyAndPaste);
360 reg.register_late_lint_pass(box format::Pass);
361 reg.register_early_lint_pass(box formatting::Formatting);
362 reg.register_late_lint_pass(box swap::Swap);
363 reg.register_early_lint_pass(box if_not_else::IfNotElse);
364 reg.register_early_lint_pass(box else_if_without_else::ElseIfWithoutElse);
365 reg.register_early_lint_pass(box int_plus_one::IntPlusOne);
366 reg.register_late_lint_pass(box overflow_check_conditional::OverflowCheckConditional);
367 reg.register_late_lint_pass(box unused_label::UnusedLabel);
368 reg.register_late_lint_pass(box new_without_default::NewWithoutDefault);
369 reg.register_late_lint_pass(box blacklisted_name::BlackListedName::new(conf.blacklisted_names));
370 reg.register_late_lint_pass(box functions::Functions::new(conf.too_many_arguments_threshold));
371 reg.register_early_lint_pass(box doc::Doc::new(conf.doc_valid_idents));
372 reg.register_late_lint_pass(box neg_multiply::NegMultiply);
373 reg.register_early_lint_pass(box unsafe_removed_from_name::UnsafeNameRemoval);
374 reg.register_late_lint_pass(box mem_forget::MemForget);
375 reg.register_late_lint_pass(box arithmetic::Arithmetic::default());
376 reg.register_late_lint_pass(box assign_ops::AssignOps);
377 reg.register_late_lint_pass(box let_if_seq::LetIfSeq);
378 reg.register_late_lint_pass(box eval_order_dependence::EvalOrderDependence);
379 reg.register_late_lint_pass(box missing_doc::MissingDoc::new());
380 reg.register_late_lint_pass(box ok_if_let::Pass);
381 reg.register_late_lint_pass(box if_let_redundant_pattern_matching::Pass);
382 reg.register_late_lint_pass(box partialeq_ne_impl::Pass);
383 reg.register_early_lint_pass(box reference::Pass);
384 reg.register_early_lint_pass(box double_parens::DoubleParens);
385 reg.register_late_lint_pass(box unused_io_amount::UnusedIoAmount);
386 reg.register_late_lint_pass(box large_enum_variant::LargeEnumVariant::new(conf.enum_variant_size_threshold));
387 reg.register_late_lint_pass(box explicit_write::Pass);
388 reg.register_late_lint_pass(box needless_pass_by_value::NeedlessPassByValue);
389 reg.register_early_lint_pass(box literal_representation::LiteralDigitGrouping);
390 reg.register_early_lint_pass(box literal_representation::LiteralRepresentation::new(
391 conf.literal_representation_threshold
393 reg.register_late_lint_pass(box use_self::UseSelf);
394 reg.register_late_lint_pass(box bytecount::ByteCount);
395 reg.register_late_lint_pass(box infinite_iter::Pass);
396 reg.register_late_lint_pass(box inline_fn_without_body::Pass);
397 reg.register_late_lint_pass(box invalid_ref::InvalidRef);
398 reg.register_late_lint_pass(box identity_conversion::IdentityConversion::default());
399 reg.register_late_lint_pass(box types::ImplicitHasher);
400 reg.register_early_lint_pass(box const_static_lifetime::StaticConst);
401 reg.register_late_lint_pass(box fallible_impl_from::FallibleImplFrom);
402 reg.register_late_lint_pass(box replace_consts::ReplaceConsts);
403 reg.register_late_lint_pass(box types::UnitArg);
404 reg.register_late_lint_pass(box double_comparison::DoubleComparisonPass);
405 reg.register_late_lint_pass(box question_mark::QuestionMarkPass);
406 reg.register_late_lint_pass(box suspicious_trait_impl::SuspiciousImpl);
407 reg.register_late_lint_pass(box redundant_field_names::RedundantFieldNames);
410 reg.register_lint_group("clippy_restriction", vec![
411 arithmetic::FLOAT_ARITHMETIC,
412 arithmetic::INTEGER_ARITHMETIC,
413 array_indexing::INDEXING_SLICING,
414 assign_ops::ASSIGN_OPS,
415 else_if_without_else::ELSE_IF_WITHOUT_ELSE,
416 literal_representation::DECIMAL_LITERAL_REPRESENTATION,
417 mem_forget::MEM_FORGET,
418 methods::CLONE_ON_REF_PTR,
419 methods::OPTION_UNWRAP_USED,
420 methods::RESULT_UNWRAP_USED,
421 methods::WRONG_PUB_SELF_CONVENTION,
422 misc::FLOAT_CMP_CONST,
423 missing_doc::MISSING_DOCS_IN_PRIVATE_ITEMS,
424 shadow::SHADOW_REUSE,
426 shadow::SHADOW_UNRELATED,
432 reg.register_lint_group("clippy_pedantic", vec![
433 attrs::INLINE_ALWAYS,
434 copies::MATCH_SAME_ARMS,
435 derive::EXPL_IMPL_CLONE_ON_COPY,
437 empty_enum::EMPTY_ENUM,
438 enum_glob_use::ENUM_GLOB_USE,
439 enum_variants::PUB_ENUM_VARIANT_NAMES,
440 enum_variants::STUTTER,
441 if_not_else::IF_NOT_ELSE,
442 infinite_iter::MAYBE_INFINITE_ITER,
443 items_after_statements::ITEMS_AFTER_STATEMENTS,
444 matches::SINGLE_MATCH_ELSE,
446 methods::OPTION_MAP_UNWRAP_OR,
447 methods::OPTION_MAP_UNWRAP_OR_ELSE,
448 methods::RESULT_MAP_UNWRAP_OR_ELSE,
449 misc::USED_UNDERSCORE_BINDING,
450 misc_early::UNSEPARATED_LITERAL_SUFFIX,
452 needless_continue::NEEDLESS_CONTINUE,
453 non_expressive_names::SIMILAR_NAMES,
454 replace_consts::REPLACE_CONSTS,
455 strings::STRING_ADD_ASSIGN,
456 types::CAST_POSSIBLE_TRUNCATION,
457 types::CAST_POSSIBLE_WRAP,
458 types::CAST_PRECISION_LOSS,
459 types::CAST_SIGN_LOSS,
460 types::INVALID_UPCAST_COMPARISONS,
462 unicode::NON_ASCII_LITERAL,
463 unicode::UNICODE_NOT_NFC,
467 reg.register_lint_group("clippy_internal", vec![
468 utils::internal_lints::CLIPPY_LINTS_INTERNAL,
469 utils::internal_lints::LINT_WITHOUT_LINT_PASS,
472 reg.register_lint_group("clippy", vec![
473 approx_const::APPROX_CONSTANT,
474 array_indexing::OUT_OF_BOUNDS_INDEXING,
475 assign_ops::ASSIGN_OP_PATTERN,
476 assign_ops::MISREFACTORED_ASSIGN_OP,
477 attrs::DEPRECATED_SEMVER,
478 attrs::USELESS_ATTRIBUTE,
479 bit_mask::BAD_BIT_MASK,
480 bit_mask::INEFFECTIVE_BIT_MASK,
481 bit_mask::VERBOSE_BIT_MASK,
482 blacklisted_name::BLACKLISTED_NAME,
483 block_in_if_condition::BLOCK_IN_IF_CONDITION_EXPR,
484 block_in_if_condition::BLOCK_IN_IF_CONDITION_STMT,
486 booleans::NONMINIMAL_BOOL,
487 bytecount::NAIVE_BYTECOUNT,
488 collapsible_if::COLLAPSIBLE_IF,
489 const_static_lifetime::CONST_STATIC_LIFETIME,
490 copies::IF_SAME_THEN_ELSE,
491 copies::IFS_SAME_COND,
492 cyclomatic_complexity::CYCLOMATIC_COMPLEXITY,
493 derive::DERIVE_HASH_XOR_EQ,
494 double_comparison::DOUBLE_COMPARISONS,
495 double_parens::DOUBLE_PARENS,
496 drop_forget_ref::DROP_COPY,
497 drop_forget_ref::DROP_REF,
498 drop_forget_ref::FORGET_COPY,
499 drop_forget_ref::FORGET_REF,
501 enum_clike::ENUM_CLIKE_UNPORTABLE_VARIANT,
502 enum_variants::ENUM_VARIANT_NAMES,
503 enum_variants::MODULE_INCEPTION,
506 erasing_op::ERASING_OP,
508 eta_reduction::REDUNDANT_CLOSURE,
509 eval_order_dependence::DIVERGING_SUB_EXPRESSION,
510 eval_order_dependence::EVAL_ORDER_DEPENDENCE,
511 explicit_write::EXPLICIT_WRITE,
512 format::USELESS_FORMAT,
513 formatting::POSSIBLE_MISSING_COMMA,
514 formatting::SUSPICIOUS_ASSIGNMENT_FORMATTING,
515 formatting::SUSPICIOUS_ELSE_FORMATTING,
516 functions::NOT_UNSAFE_PTR_ARG_DEREF,
517 functions::TOO_MANY_ARGUMENTS,
518 identity_conversion::IDENTITY_CONVERSION,
519 identity_op::IDENTITY_OP,
520 if_let_redundant_pattern_matching::IF_LET_REDUNDANT_PATTERN_MATCHING,
521 infinite_iter::INFINITE_ITER,
522 inline_fn_without_body::INLINE_FN_WITHOUT_BODY,
523 int_plus_one::INT_PLUS_ONE,
524 invalid_ref::INVALID_REF,
525 large_enum_variant::LARGE_ENUM_VARIANT,
526 len_zero::LEN_WITHOUT_IS_EMPTY,
528 let_if_seq::USELESS_LET_IF_SEQ,
529 lifetimes::NEEDLESS_LIFETIMES,
530 lifetimes::UNUSED_LIFETIMES,
531 literal_representation::INCONSISTENT_DIGIT_GROUPING,
532 literal_representation::LARGE_DIGIT_GROUPS,
533 literal_representation::UNREADABLE_LITERAL,
535 loops::EXPLICIT_COUNTER_LOOP,
536 loops::EXPLICIT_INTO_ITER_LOOP,
537 loops::EXPLICIT_ITER_LOOP,
539 loops::FOR_LOOP_OVER_OPTION,
540 loops::FOR_LOOP_OVER_RESULT,
541 loops::ITER_NEXT_LOOP,
542 loops::MANUAL_MEMCPY,
543 loops::MUT_RANGE_BOUND,
544 loops::NEEDLESS_RANGE_LOOP,
546 loops::REVERSE_RANGE_LOOP,
547 loops::UNUSED_COLLECT,
548 loops::WHILE_IMMUTABLE_CONDITION,
549 loops::WHILE_LET_LOOP,
550 loops::WHILE_LET_ON_ITERATOR,
551 map_clone::MAP_CLONE,
552 matches::MATCH_AS_REF,
554 matches::MATCH_OVERLAPPING_ARM,
555 matches::MATCH_REF_PATS,
556 matches::MATCH_WILD_ERR_ARM,
557 matches::SINGLE_MATCH,
558 methods::CHARS_LAST_CMP,
559 methods::CHARS_NEXT_CMP,
560 methods::CLONE_DOUBLE_REF,
561 methods::CLONE_ON_COPY,
562 methods::FILTER_NEXT,
564 methods::ITER_CLONED_COLLECT,
566 methods::ITER_SKIP_NEXT,
567 methods::NEW_RET_NO_SELF,
569 methods::OPTION_MAP_OR_NONE,
570 methods::OR_FUN_CALL,
571 methods::SEARCH_IS_SOME,
572 methods::SHOULD_IMPLEMENT_TRAIT,
573 methods::SINGLE_CHAR_PATTERN,
574 methods::STRING_EXTEND_CHARS,
575 methods::TEMPORARY_CSTRING_AS_PTR,
576 methods::UNNECESSARY_FOLD,
577 methods::USELESS_ASREF,
578 methods::WRONG_SELF_CONVENTION,
584 misc::REDUNDANT_PATTERN,
585 misc::SHORT_CIRCUIT_STATEMENT,
586 misc::TOPLEVEL_REF_ARG,
588 misc_early::BUILTIN_TYPE_SHADOW,
589 misc_early::DOUBLE_NEG,
590 misc_early::DUPLICATE_UNDERSCORE_ARGUMENT,
591 misc_early::MIXED_CASE_HEX_LITERALS,
592 misc_early::REDUNDANT_CLOSURE_CALL,
593 misc_early::UNNEEDED_FIELD_PATTERN,
594 misc_early::ZERO_PREFIXED_LITERAL,
595 mut_reference::UNNECESSARY_MUT_PASSED,
596 mutex_atomic::MUTEX_ATOMIC,
597 needless_bool::BOOL_COMPARISON,
598 needless_bool::NEEDLESS_BOOL,
599 needless_borrowed_ref::NEEDLESS_BORROWED_REFERENCE,
600 needless_pass_by_value::NEEDLESS_PASS_BY_VALUE,
601 needless_update::NEEDLESS_UPDATE,
602 neg_multiply::NEG_MULTIPLY,
603 new_without_default::NEW_WITHOUT_DEFAULT,
604 new_without_default::NEW_WITHOUT_DEFAULT_DERIVE,
605 no_effect::NO_EFFECT,
606 no_effect::UNNECESSARY_OPERATION,
607 non_expressive_names::JUST_UNDERSCORES_AND_DIGITS,
608 non_expressive_names::MANY_SINGLE_CHAR_NAMES,
609 ok_if_let::IF_LET_SOME_RESULT,
610 open_options::NONSENSICAL_OPEN_OPTIONS,
611 overflow_check_conditional::OVERFLOW_CHECK_CONDITIONAL,
613 partialeq_ne_impl::PARTIALEQ_NE_IMPL,
614 precedence::PRECEDENCE,
618 question_mark::QUESTION_MARK,
619 ranges::ITERATOR_STEP_BY_ZERO,
620 ranges::RANGE_MINUS_ONE,
621 ranges::RANGE_ZIP_WITH_LEN,
622 redundant_field_names::REDUNDANT_FIELD_NAMES,
623 reference::DEREF_ADDROF,
624 regex::INVALID_REGEX,
626 regex::TRIVIAL_REGEX,
627 returns::LET_AND_RETURN,
628 returns::NEEDLESS_RETURN,
629 serde_api::SERDE_API_MISUSE,
630 strings::STRING_LIT_AS_BYTES,
631 suspicious_trait_impl::SUSPICIOUS_ARITHMETIC_IMPL,
632 suspicious_trait_impl::SUSPICIOUS_OP_ASSIGN_IMPL,
633 swap::ALMOST_SWAPPED,
635 temporary_assignment::TEMPORARY_ASSIGNMENT,
636 transmute::CROSSPOINTER_TRANSMUTE,
637 transmute::TRANSMUTE_BYTES_TO_STR,
638 transmute::TRANSMUTE_INT_TO_BOOL,
639 transmute::TRANSMUTE_INT_TO_CHAR,
640 transmute::TRANSMUTE_INT_TO_FLOAT,
641 transmute::TRANSMUTE_PTR_TO_PTR,
642 transmute::TRANSMUTE_PTR_TO_REF,
643 transmute::USELESS_TRANSMUTE,
644 transmute::WRONG_TRANSMUTE,
645 types::ABSURD_EXTREME_COMPARISONS,
648 types::CAST_LOSSLESS,
649 types::CAST_PTR_ALIGNMENT,
650 types::CHAR_LIT_AS_U8,
651 types::IMPLICIT_HASHER,
652 types::LET_UNIT_VALUE,
653 types::OPTION_OPTION,
654 types::TYPE_COMPLEXITY,
657 types::UNNECESSARY_CAST,
658 unicode::ZERO_WIDTH_SPACE,
659 unsafe_removed_from_name::UNSAFE_REMOVED_FROM_NAME,
660 unused_io_amount::UNUSED_IO_AMOUNT,
661 unused_label::UNUSED_LABEL,
663 write::PRINT_LITERAL,
664 write::PRINT_WITH_NEWLINE,
665 write::PRINTLN_EMPTY_STRING,
666 write::WRITE_LITERAL,
667 write::WRITE_WITH_NEWLINE,
668 write::WRITELN_EMPTY_STRING,
669 zero_div_zero::ZERO_DIVIDED_BY_ZERO,
672 reg.register_lint_group("clippy_style", vec![
673 assign_ops::ASSIGN_OP_PATTERN,
674 bit_mask::VERBOSE_BIT_MASK,
675 blacklisted_name::BLACKLISTED_NAME,
676 block_in_if_condition::BLOCK_IN_IF_CONDITION_EXPR,
677 block_in_if_condition::BLOCK_IN_IF_CONDITION_STMT,
678 collapsible_if::COLLAPSIBLE_IF,
679 const_static_lifetime::CONST_STATIC_LIFETIME,
680 enum_variants::ENUM_VARIANT_NAMES,
681 enum_variants::MODULE_INCEPTION,
683 eta_reduction::REDUNDANT_CLOSURE,
684 formatting::SUSPICIOUS_ASSIGNMENT_FORMATTING,
685 formatting::SUSPICIOUS_ELSE_FORMATTING,
686 if_let_redundant_pattern_matching::IF_LET_REDUNDANT_PATTERN_MATCHING,
687 len_zero::LEN_WITHOUT_IS_EMPTY,
689 let_if_seq::USELESS_LET_IF_SEQ,
690 literal_representation::INCONSISTENT_DIGIT_GROUPING,
691 literal_representation::LARGE_DIGIT_GROUPS,
692 literal_representation::UNREADABLE_LITERAL,
694 loops::EXPLICIT_INTO_ITER_LOOP,
695 loops::EXPLICIT_ITER_LOOP,
697 loops::NEEDLESS_RANGE_LOOP,
698 loops::WHILE_LET_ON_ITERATOR,
699 map_clone::MAP_CLONE,
701 matches::MATCH_OVERLAPPING_ARM,
702 matches::MATCH_REF_PATS,
703 matches::MATCH_WILD_ERR_ARM,
704 matches::SINGLE_MATCH,
705 methods::CHARS_LAST_CMP,
707 methods::ITER_CLONED_COLLECT,
708 methods::ITER_SKIP_NEXT,
709 methods::NEW_RET_NO_SELF,
711 methods::OPTION_MAP_OR_NONE,
712 methods::SHOULD_IMPLEMENT_TRAIT,
713 methods::STRING_EXTEND_CHARS,
714 methods::UNNECESSARY_FOLD,
715 methods::WRONG_SELF_CONVENTION,
716 misc::REDUNDANT_PATTERN,
717 misc::TOPLEVEL_REF_ARG,
719 misc_early::BUILTIN_TYPE_SHADOW,
720 misc_early::DOUBLE_NEG,
721 misc_early::DUPLICATE_UNDERSCORE_ARGUMENT,
722 misc_early::MIXED_CASE_HEX_LITERALS,
723 misc_early::UNNEEDED_FIELD_PATTERN,
724 mut_reference::UNNECESSARY_MUT_PASSED,
725 needless_pass_by_value::NEEDLESS_PASS_BY_VALUE,
726 neg_multiply::NEG_MULTIPLY,
727 new_without_default::NEW_WITHOUT_DEFAULT,
728 new_without_default::NEW_WITHOUT_DEFAULT_DERIVE,
729 non_expressive_names::JUST_UNDERSCORES_AND_DIGITS,
730 non_expressive_names::MANY_SINGLE_CHAR_NAMES,
731 ok_if_let::IF_LET_SOME_RESULT,
735 question_mark::QUESTION_MARK,
736 ranges::RANGE_MINUS_ONE,
737 redundant_field_names::REDUNDANT_FIELD_NAMES,
739 regex::TRIVIAL_REGEX,
740 returns::LET_AND_RETURN,
741 returns::NEEDLESS_RETURN,
742 strings::STRING_LIT_AS_BYTES,
743 types::IMPLICIT_HASHER,
744 types::LET_UNIT_VALUE,
745 unsafe_removed_from_name::UNSAFE_REMOVED_FROM_NAME,
746 write::PRINT_LITERAL,
747 write::PRINT_WITH_NEWLINE,
748 write::PRINTLN_EMPTY_STRING,
749 write::WRITE_LITERAL,
750 write::WRITE_WITH_NEWLINE,
751 write::WRITELN_EMPTY_STRING,
754 reg.register_lint_group("clippy_complexity", vec![
755 assign_ops::MISREFACTORED_ASSIGN_OP,
756 booleans::NONMINIMAL_BOOL,
757 cyclomatic_complexity::CYCLOMATIC_COMPLEXITY,
758 double_comparison::DOUBLE_COMPARISONS,
759 double_parens::DOUBLE_PARENS,
760 eval_order_dependence::DIVERGING_SUB_EXPRESSION,
761 eval_order_dependence::EVAL_ORDER_DEPENDENCE,
762 explicit_write::EXPLICIT_WRITE,
763 format::USELESS_FORMAT,
764 functions::TOO_MANY_ARGUMENTS,
765 identity_conversion::IDENTITY_CONVERSION,
766 identity_op::IDENTITY_OP,
767 int_plus_one::INT_PLUS_ONE,
768 lifetimes::NEEDLESS_LIFETIMES,
769 lifetimes::UNUSED_LIFETIMES,
770 loops::EXPLICIT_COUNTER_LOOP,
771 loops::MUT_RANGE_BOUND,
772 loops::WHILE_LET_LOOP,
773 matches::MATCH_AS_REF,
774 methods::CHARS_NEXT_CMP,
775 methods::CLONE_ON_COPY,
776 methods::FILTER_NEXT,
777 methods::SEARCH_IS_SOME,
778 methods::USELESS_ASREF,
779 misc::SHORT_CIRCUIT_STATEMENT,
780 misc_early::REDUNDANT_CLOSURE_CALL,
781 misc_early::ZERO_PREFIXED_LITERAL,
782 needless_bool::BOOL_COMPARISON,
783 needless_bool::NEEDLESS_BOOL,
784 needless_borrowed_ref::NEEDLESS_BORROWED_REFERENCE,
785 needless_update::NEEDLESS_UPDATE,
786 no_effect::NO_EFFECT,
787 no_effect::UNNECESSARY_OPERATION,
788 overflow_check_conditional::OVERFLOW_CHECK_CONDITIONAL,
789 partialeq_ne_impl::PARTIALEQ_NE_IMPL,
790 precedence::PRECEDENCE,
791 ranges::RANGE_ZIP_WITH_LEN,
792 reference::DEREF_ADDROF,
794 temporary_assignment::TEMPORARY_ASSIGNMENT,
795 transmute::CROSSPOINTER_TRANSMUTE,
796 transmute::TRANSMUTE_BYTES_TO_STR,
797 transmute::TRANSMUTE_INT_TO_BOOL,
798 transmute::TRANSMUTE_INT_TO_CHAR,
799 transmute::TRANSMUTE_INT_TO_FLOAT,
800 transmute::TRANSMUTE_PTR_TO_PTR,
801 transmute::TRANSMUTE_PTR_TO_REF,
802 transmute::USELESS_TRANSMUTE,
804 types::CAST_LOSSLESS,
805 types::CHAR_LIT_AS_U8,
806 types::OPTION_OPTION,
807 types::TYPE_COMPLEXITY,
809 types::UNNECESSARY_CAST,
810 unused_label::UNUSED_LABEL,
811 zero_div_zero::ZERO_DIVIDED_BY_ZERO,
814 reg.register_lint_group("clippy_correctness", vec![
815 approx_const::APPROX_CONSTANT,
816 array_indexing::OUT_OF_BOUNDS_INDEXING,
817 attrs::DEPRECATED_SEMVER,
818 attrs::USELESS_ATTRIBUTE,
819 bit_mask::BAD_BIT_MASK,
820 bit_mask::INEFFECTIVE_BIT_MASK,
822 copies::IF_SAME_THEN_ELSE,
823 copies::IFS_SAME_COND,
824 derive::DERIVE_HASH_XOR_EQ,
825 drop_forget_ref::DROP_COPY,
826 drop_forget_ref::DROP_REF,
827 drop_forget_ref::FORGET_COPY,
828 drop_forget_ref::FORGET_REF,
829 enum_clike::ENUM_CLIKE_UNPORTABLE_VARIANT,
831 erasing_op::ERASING_OP,
832 formatting::POSSIBLE_MISSING_COMMA,
833 functions::NOT_UNSAFE_PTR_ARG_DEREF,
834 infinite_iter::INFINITE_ITER,
835 inline_fn_without_body::INLINE_FN_WITHOUT_BODY,
836 invalid_ref::INVALID_REF,
837 loops::FOR_LOOP_OVER_OPTION,
838 loops::FOR_LOOP_OVER_RESULT,
839 loops::ITER_NEXT_LOOP,
841 loops::REVERSE_RANGE_LOOP,
842 loops::WHILE_IMMUTABLE_CONDITION,
843 methods::CLONE_DOUBLE_REF,
844 methods::TEMPORARY_CSTRING_AS_PTR,
849 open_options::NONSENSICAL_OPEN_OPTIONS,
851 ranges::ITERATOR_STEP_BY_ZERO,
852 regex::INVALID_REGEX,
853 serde_api::SERDE_API_MISUSE,
854 suspicious_trait_impl::SUSPICIOUS_ARITHMETIC_IMPL,
855 suspicious_trait_impl::SUSPICIOUS_OP_ASSIGN_IMPL,
856 swap::ALMOST_SWAPPED,
857 transmute::WRONG_TRANSMUTE,
858 types::ABSURD_EXTREME_COMPARISONS,
859 types::CAST_PTR_ALIGNMENT,
861 unicode::ZERO_WIDTH_SPACE,
862 unused_io_amount::UNUSED_IO_AMOUNT,
865 reg.register_lint_group("clippy_perf", vec![
866 bytecount::NAIVE_BYTECOUNT,
869 large_enum_variant::LARGE_ENUM_VARIANT,
870 loops::MANUAL_MEMCPY,
871 loops::UNUSED_COLLECT,
873 methods::OR_FUN_CALL,
874 methods::SINGLE_CHAR_PATTERN,
876 mutex_atomic::MUTEX_ATOMIC,
881 reg.register_lint_group("clippy_nursery", vec![
882 attrs::EMPTY_LINE_AFTER_OUTER_ATTR,
883 fallible_impl_from::FALLIBLE_IMPL_FROM,
884 mutex_atomic::MUTEX_INTEGER,
885 needless_borrow::NEEDLESS_BORROW,
886 ranges::RANGE_PLUS_ONE,
890 // only exists to let the dogfood integration test works.
891 // Don't run clippy as an executable directly
892 #[allow(dead_code, print_stdout)]
894 panic!("Please use the cargo-clippy executable");