]> git.lizzy.rs Git - rust.git/blob - clippy_lints/src/lib.rs
c4c949c792e55c6c53c5a092f8c6af2a74ff303e
[rust.git] / clippy_lints / src / lib.rs
1 // error-pattern:cargo-clippy
2
3 #![feature(box_syntax)]
4 #![feature(alloc)]
5 #![feature(custom_attribute)]
6 #![feature(i128_type)]
7 #![feature(i128)]
8 #![feature(rustc_private)]
9 #![feature(slice_patterns)]
10 #![feature(stmt_expr_attributes)]
11 #![feature(conservative_impl_trait)]
12
13 #![allow(indexing_slicing, shadow_reuse, unknown_lints, missing_docs_in_private_items)]
14
15 extern crate syntax;
16 extern crate syntax_pos;
17 #[macro_use]
18 extern crate rustc;
19 extern crate rustc_data_structures;
20
21 extern crate toml;
22
23 // Only for the compile time checking of paths
24 extern crate core;
25 extern crate alloc;
26
27 // for unicode nfc normalization
28 extern crate unicode_normalization;
29
30 // for semver check in attrs.rs
31 extern crate semver;
32
33 // for regex checking
34 extern crate regex_syntax;
35
36 // for finding minimal boolean expressions
37 extern crate quine_mc_cluskey;
38
39 extern crate rustc_errors;
40 extern crate rustc_plugin;
41 extern crate rustc_const_eval;
42 extern crate rustc_const_math;
43
44 #[macro_use]
45 extern crate matches as matches_macro;
46
47 #[macro_use]
48 extern crate serde_derive;
49 extern crate serde;
50
51 #[macro_use]
52 extern crate lazy_static;
53
54 extern crate itertools;
55 extern crate pulldown_cmark;
56
57 macro_rules! declare_restriction_lint {
58     { pub $name:tt, $description:tt } => {
59         declare_lint! { pub $name, Allow, $description }
60     };
61 }
62
63 pub mod consts;
64 #[macro_use]
65 pub mod utils;
66
67 // begin lints modules, do not remove this comment, it’s used in `update_lints`
68 pub mod approx_const;
69 pub mod arithmetic;
70 pub mod array_indexing;
71 pub mod assign_ops;
72 pub mod attrs;
73 pub mod bit_mask;
74 pub mod blacklisted_name;
75 pub mod block_in_if_condition;
76 pub mod booleans;
77 pub mod bytecount;
78 pub mod collapsible_if;
79 pub mod copies;
80 pub mod cyclomatic_complexity;
81 pub mod derive;
82 pub mod doc;
83 pub mod double_parens;
84 pub mod drop_forget_ref;
85 pub mod empty_enum;
86 pub mod entry;
87 pub mod enum_clike;
88 pub mod enum_glob_use;
89 pub mod enum_variants;
90 pub mod eq_op;
91 pub mod escape;
92 pub mod eta_reduction;
93 pub mod eval_order_dependence;
94 pub mod format;
95 pub mod formatting;
96 pub mod functions;
97 pub mod identity_op;
98 pub mod if_let_redundant_pattern_matching;
99 pub mod if_not_else;
100 pub mod items_after_statements;
101 pub mod large_enum_variant;
102 pub mod len_zero;
103 pub mod let_if_seq;
104 pub mod lifetimes;
105 pub mod literal_digit_grouping;
106 pub mod loops;
107 pub mod map_clone;
108 pub mod matches;
109 pub mod mem_forget;
110 pub mod methods;
111 pub mod minmax;
112 pub mod misc;
113 pub mod misc_early;
114 pub mod missing_doc;
115 pub mod mut_mut;
116 pub mod mut_reference;
117 pub mod mutex_atomic;
118 pub mod needless_bool;
119 pub mod needless_borrow;
120 pub mod needless_borrowed_ref;
121 pub mod needless_continue;
122 pub mod needless_pass_by_value;
123 pub mod needless_update;
124 pub mod neg_multiply;
125 pub mod new_without_default;
126 pub mod no_effect;
127 pub mod non_expressive_names;
128 pub mod ok_if_let;
129 pub mod open_options;
130 pub mod overflow_check_conditional;
131 pub mod panic;
132 pub mod partialeq_ne_impl;
133 pub mod precedence;
134 pub mod print;
135 pub mod ptr;
136 pub mod ranges;
137 pub mod reference;
138 pub mod regex;
139 pub mod returns;
140 pub mod serde_api;
141 pub mod shadow;
142 pub mod should_assert_eq;
143 pub mod strings;
144 pub mod swap;
145 pub mod temporary_assignment;
146 pub mod transmute;
147 pub mod types;
148 pub mod unicode;
149 pub mod unsafe_removed_from_name;
150 pub mod unused_io_amount;
151 pub mod unused_label;
152 pub mod use_self;
153 pub mod vec;
154 pub mod zero_div_zero;
155 // end lints modules, do not remove this comment, it’s used in `update_lints`
156
157 mod reexport {
158     pub use syntax::ast::{Name, NodeId};
159 }
160
161 #[cfg_attr(rustfmt, rustfmt_skip)]
162 pub fn register_plugins(reg: &mut rustc_plugin::Registry) {
163     let conf = match utils::conf::file_from_args(reg.args()) {
164         Ok(file_name) => {
165             // if the user specified a file, it must exist, otherwise default to `clippy.toml` but
166             // do not require the file to exist
167             let file_name = if let Some(file_name) = file_name {
168                 Some(file_name)
169             } else {
170                 match utils::conf::lookup_conf_file() {
171                     Ok(path) => path,
172                     Err(error) => {
173                         reg.sess.struct_err(&format!("error reading Clippy's configuration file: {}", error)).emit();
174                         None
175                     }
176                 }
177             };
178
179             let (conf, errors) = utils::conf::read(file_name.as_ref().map(|p| p.as_ref()));
180
181             // all conf errors are non-fatal, we just use the default conf in case of error
182             for error in errors {
183                 reg.sess.struct_err(&format!("error reading Clippy's configuration file: {}", error)).emit();
184             }
185
186             conf
187         }
188         Err((err, span)) => {
189             reg.sess.struct_span_err(span, err)
190                     .span_note(span, "Clippy will use default configuration")
191                     .emit();
192             toml::from_str("").expect("we never error on empty config files")
193         }
194     };
195
196     let mut store = reg.sess.lint_store.borrow_mut();
197     store.register_removed(
198         "extend_from_slice",
199         "`.extend_from_slice(_)` is a faster way to extend a Vec by a slice",
200     );
201     store.register_removed(
202         "range_step_by_zero",
203         "`iterator.step_by(0)` panics nowadays",
204     );
205     store.register_removed(
206         "unstable_as_slice",
207         "`Vec::as_slice` has been stabilized in 1.7",
208     );
209     store.register_removed(
210         "unstable_as_mut_slice",
211         "`Vec::as_mut_slice` has been stabilized in 1.7",
212     );
213     store.register_removed(
214         "str_to_string",
215         "using `str::to_string` is common even today and specialization will likely happen soon",
216     );
217     store.register_removed(
218         "string_to_string",
219         "using `string::to_string` is common even today and specialization will likely happen soon",
220     );
221     // end deprecated lints, do not remove this comment, it’s used in `update_lints`
222
223     reg.register_late_lint_pass(box serde_api::Serde);
224     reg.register_early_lint_pass(box utils::internal_lints::Clippy);
225     reg.register_late_lint_pass(box utils::internal_lints::LintWithoutLintPass::default());
226     reg.register_late_lint_pass(box utils::inspector::Pass);
227     reg.register_late_lint_pass(box utils::author::Pass);
228     reg.register_late_lint_pass(box types::TypePass);
229     reg.register_late_lint_pass(box booleans::NonminimalBool);
230     reg.register_late_lint_pass(box eq_op::EqOp);
231     reg.register_early_lint_pass(box enum_variants::EnumVariantNames::new(conf.enum_variant_name_threshold));
232     reg.register_late_lint_pass(box enum_glob_use::EnumGlobUse);
233     reg.register_late_lint_pass(box enum_clike::UnportableVariant);
234     reg.register_late_lint_pass(box bit_mask::BitMask);
235     reg.register_late_lint_pass(box ptr::PointerPass);
236     reg.register_late_lint_pass(box needless_bool::NeedlessBool);
237     reg.register_late_lint_pass(box needless_bool::BoolComparison);
238     reg.register_late_lint_pass(box approx_const::Pass);
239     reg.register_late_lint_pass(box misc::Pass);
240     reg.register_early_lint_pass(box precedence::Precedence);
241     reg.register_early_lint_pass(box needless_continue::NeedlessContinue);
242     reg.register_late_lint_pass(box eta_reduction::EtaPass);
243     reg.register_late_lint_pass(box identity_op::IdentityOp);
244     reg.register_early_lint_pass(box items_after_statements::ItemsAfterStatements);
245     reg.register_late_lint_pass(box mut_mut::MutMut);
246     reg.register_late_lint_pass(box mut_reference::UnnecessaryMutPassed);
247     reg.register_late_lint_pass(box len_zero::LenZero);
248     reg.register_late_lint_pass(box attrs::AttrPass);
249     reg.register_early_lint_pass(box collapsible_if::CollapsibleIf);
250     reg.register_late_lint_pass(box block_in_if_condition::BlockInIfCondition);
251     reg.register_late_lint_pass(box unicode::Unicode);
252     reg.register_late_lint_pass(box strings::StringAdd);
253     reg.register_early_lint_pass(box returns::ReturnPass);
254     reg.register_late_lint_pass(box methods::Pass);
255     reg.register_late_lint_pass(box shadow::Pass);
256     reg.register_late_lint_pass(box types::LetPass);
257     reg.register_late_lint_pass(box types::UnitCmp);
258     reg.register_late_lint_pass(box loops::Pass);
259     reg.register_late_lint_pass(box lifetimes::LifetimePass);
260     reg.register_late_lint_pass(box entry::HashMapLint);
261     reg.register_late_lint_pass(box ranges::StepByZero);
262     reg.register_late_lint_pass(box types::CastPass);
263     reg.register_late_lint_pass(box types::TypeComplexityPass::new(conf.type_complexity_threshold));
264     reg.register_late_lint_pass(box matches::MatchPass);
265     reg.register_late_lint_pass(box minmax::MinMaxPass);
266     reg.register_late_lint_pass(box open_options::NonSensical);
267     reg.register_late_lint_pass(box zero_div_zero::Pass);
268     reg.register_late_lint_pass(box mutex_atomic::MutexAtomic);
269     reg.register_late_lint_pass(box needless_update::Pass);
270     reg.register_late_lint_pass(box needless_borrow::NeedlessBorrow);
271     reg.register_late_lint_pass(box no_effect::Pass);
272     reg.register_late_lint_pass(box map_clone::Pass);
273     reg.register_late_lint_pass(box temporary_assignment::Pass);
274     reg.register_late_lint_pass(box transmute::Transmute);
275     reg.register_late_lint_pass(
276         box cyclomatic_complexity::CyclomaticComplexity::new(conf.cyclomatic_complexity_threshold)
277     );
278     reg.register_late_lint_pass(box escape::Pass{too_large_for_stack: conf.too_large_for_stack});
279     reg.register_early_lint_pass(box misc_early::MiscEarly);
280     reg.register_late_lint_pass(box array_indexing::ArrayIndexing);
281     reg.register_late_lint_pass(box panic::Pass);
282     reg.register_late_lint_pass(box strings::StringLitAsBytes);
283     reg.register_late_lint_pass(box derive::Derive);
284     reg.register_late_lint_pass(box types::CharLitAsU8);
285     reg.register_late_lint_pass(box print::Pass);
286     reg.register_late_lint_pass(box vec::Pass);
287     reg.register_early_lint_pass(box non_expressive_names::NonExpressiveNames {
288         single_char_binding_names_threshold: conf.single_char_binding_names_threshold,
289     });
290     reg.register_late_lint_pass(box drop_forget_ref::Pass);
291     reg.register_late_lint_pass(box empty_enum::EmptyEnum);
292     reg.register_late_lint_pass(box types::AbsurdExtremeComparisons);
293     reg.register_late_lint_pass(box types::InvalidUpcastComparisons);
294     reg.register_late_lint_pass(box regex::Pass::default());
295     reg.register_late_lint_pass(box copies::CopyAndPaste);
296     reg.register_late_lint_pass(box format::Pass);
297     reg.register_early_lint_pass(box formatting::Formatting);
298     reg.register_late_lint_pass(box swap::Swap);
299     reg.register_early_lint_pass(box if_not_else::IfNotElse);
300     reg.register_late_lint_pass(box overflow_check_conditional::OverflowCheckConditional);
301     reg.register_late_lint_pass(box unused_label::UnusedLabel);
302     reg.register_late_lint_pass(box new_without_default::NewWithoutDefault);
303     reg.register_late_lint_pass(box blacklisted_name::BlackListedName::new(conf.blacklisted_names));
304     reg.register_late_lint_pass(box functions::Functions::new(conf.too_many_arguments_threshold));
305     reg.register_early_lint_pass(box doc::Doc::new(conf.doc_valid_idents));
306     reg.register_late_lint_pass(box neg_multiply::NegMultiply);
307     reg.register_early_lint_pass(box unsafe_removed_from_name::UnsafeNameRemoval);
308     reg.register_late_lint_pass(box mem_forget::MemForget);
309     reg.register_late_lint_pass(box arithmetic::Arithmetic::default());
310     reg.register_late_lint_pass(box assign_ops::AssignOps);
311     reg.register_late_lint_pass(box let_if_seq::LetIfSeq);
312     reg.register_late_lint_pass(box eval_order_dependence::EvalOrderDependence);
313     reg.register_late_lint_pass(box missing_doc::MissingDoc::new());
314     reg.register_late_lint_pass(box ok_if_let::Pass);
315     reg.register_late_lint_pass(box if_let_redundant_pattern_matching::Pass);
316     reg.register_late_lint_pass(box partialeq_ne_impl::Pass);
317     reg.register_early_lint_pass(box reference::Pass);
318     reg.register_early_lint_pass(box double_parens::DoubleParens);
319     reg.register_late_lint_pass(box unused_io_amount::UnusedIoAmount);
320     reg.register_late_lint_pass(box large_enum_variant::LargeEnumVariant::new(conf.enum_variant_size_threshold));
321     reg.register_late_lint_pass(box should_assert_eq::ShouldAssertEq);
322     reg.register_late_lint_pass(box needless_pass_by_value::NeedlessPassByValue);
323     reg.register_early_lint_pass(box literal_digit_grouping::LiteralDigitGrouping);
324     reg.register_late_lint_pass(box use_self::UseSelf);
325     reg.register_late_lint_pass(box bytecount::ByteCount);
326
327     reg.register_lint_group("clippy_restrictions", vec![
328         arithmetic::FLOAT_ARITHMETIC,
329         arithmetic::INTEGER_ARITHMETIC,
330         array_indexing::INDEXING_SLICING,
331         assign_ops::ASSIGN_OPS,
332     ]);
333
334     reg.register_lint_group("clippy_pedantic", vec![
335         booleans::NONMINIMAL_BOOL,
336         empty_enum::EMPTY_ENUM,
337         enum_glob_use::ENUM_GLOB_USE,
338         enum_variants::PUB_ENUM_VARIANT_NAMES,
339         enum_variants::STUTTER,
340         if_not_else::IF_NOT_ELSE,
341         items_after_statements::ITEMS_AFTER_STATEMENTS,
342         matches::SINGLE_MATCH_ELSE,
343         mem_forget::MEM_FORGET,
344         methods::FILTER_MAP,
345         methods::OPTION_MAP_UNWRAP_OR,
346         methods::OPTION_MAP_UNWRAP_OR_ELSE,
347         methods::OPTION_UNWRAP_USED,
348         methods::RESULT_UNWRAP_USED,
349         methods::WRONG_PUB_SELF_CONVENTION,
350         misc::USED_UNDERSCORE_BINDING,
351         misc_early::UNSEPARATED_LITERAL_SUFFIX,
352         missing_doc::MISSING_DOCS_IN_PRIVATE_ITEMS,
353         mut_mut::MUT_MUT,
354         mutex_atomic::MUTEX_INTEGER,
355         non_expressive_names::SIMILAR_NAMES,
356         print::PRINT_STDOUT,
357         print::USE_DEBUG,
358         shadow::SHADOW_REUSE,
359         shadow::SHADOW_SAME,
360         shadow::SHADOW_UNRELATED,
361         strings::STRING_ADD,
362         strings::STRING_ADD_ASSIGN,
363         types::CAST_POSSIBLE_TRUNCATION,
364         types::CAST_POSSIBLE_WRAP,
365         types::CAST_PRECISION_LOSS,
366         types::CAST_SIGN_LOSS,
367         types::INVALID_UPCAST_COMPARISONS,
368         unicode::NON_ASCII_LITERAL,
369         unicode::UNICODE_NOT_NFC,
370         use_self::USE_SELF,
371     ]);
372
373     reg.register_lint_group("clippy_internal", vec![
374         utils::internal_lints::CLIPPY_LINTS_INTERNAL,
375         utils::internal_lints::LINT_WITHOUT_LINT_PASS,
376     ]);
377
378     reg.register_lint_group("clippy", vec![
379         approx_const::APPROX_CONSTANT,
380         array_indexing::OUT_OF_BOUNDS_INDEXING,
381         assign_ops::ASSIGN_OP_PATTERN,
382         assign_ops::MISREFACTORED_ASSIGN_OP,
383         attrs::DEPRECATED_SEMVER,
384         attrs::INLINE_ALWAYS,
385         attrs::USELESS_ATTRIBUTE,
386         bit_mask::BAD_BIT_MASK,
387         bit_mask::INEFFECTIVE_BIT_MASK,
388         bit_mask::VERBOSE_BIT_MASK,
389         blacklisted_name::BLACKLISTED_NAME,
390         block_in_if_condition::BLOCK_IN_IF_CONDITION_EXPR,
391         block_in_if_condition::BLOCK_IN_IF_CONDITION_STMT,
392         booleans::LOGIC_BUG,
393         bytecount::NAIVE_BYTECOUNT,
394         collapsible_if::COLLAPSIBLE_IF,
395         copies::IF_SAME_THEN_ELSE,
396         copies::IFS_SAME_COND,
397         copies::MATCH_SAME_ARMS,
398         cyclomatic_complexity::CYCLOMATIC_COMPLEXITY,
399         derive::DERIVE_HASH_XOR_EQ,
400         derive::EXPL_IMPL_CLONE_ON_COPY,
401         doc::DOC_MARKDOWN,
402         double_parens::DOUBLE_PARENS,
403         drop_forget_ref::DROP_COPY,
404         drop_forget_ref::DROP_REF,
405         drop_forget_ref::FORGET_COPY,
406         drop_forget_ref::FORGET_REF,
407         entry::MAP_ENTRY,
408         enum_clike::ENUM_CLIKE_UNPORTABLE_VARIANT,
409         enum_variants::ENUM_VARIANT_NAMES,
410         enum_variants::MODULE_INCEPTION,
411         eq_op::EQ_OP,
412         eq_op::OP_REF,
413         escape::BOXED_LOCAL,
414         eta_reduction::REDUNDANT_CLOSURE,
415         eval_order_dependence::DIVERGING_SUB_EXPRESSION,
416         eval_order_dependence::EVAL_ORDER_DEPENDENCE,
417         format::USELESS_FORMAT,
418         formatting::POSSIBLE_MISSING_COMMA,
419         formatting::SUSPICIOUS_ASSIGNMENT_FORMATTING,
420         formatting::SUSPICIOUS_ELSE_FORMATTING,
421         functions::NOT_UNSAFE_PTR_ARG_DEREF,
422         functions::TOO_MANY_ARGUMENTS,
423         identity_op::IDENTITY_OP,
424         if_let_redundant_pattern_matching::IF_LET_REDUNDANT_PATTERN_MATCHING,
425         large_enum_variant::LARGE_ENUM_VARIANT,
426         len_zero::LEN_WITHOUT_IS_EMPTY,
427         len_zero::LEN_ZERO,
428         let_if_seq::USELESS_LET_IF_SEQ,
429         lifetimes::NEEDLESS_LIFETIMES,
430         lifetimes::UNUSED_LIFETIMES,
431         literal_digit_grouping::INCONSISTENT_DIGIT_GROUPING,
432         literal_digit_grouping::LARGE_DIGIT_GROUPS,
433         literal_digit_grouping::UNREADABLE_LITERAL,
434         loops::EMPTY_LOOP,
435         loops::EXPLICIT_COUNTER_LOOP,
436         loops::EXPLICIT_INTO_ITER_LOOP,
437         loops::EXPLICIT_ITER_LOOP,
438         loops::FOR_KV_MAP,
439         loops::FOR_LOOP_OVER_OPTION,
440         loops::FOR_LOOP_OVER_RESULT,
441         loops::ITER_NEXT_LOOP,
442         loops::NEEDLESS_RANGE_LOOP,
443         loops::NEVER_LOOP,
444         loops::REVERSE_RANGE_LOOP,
445         loops::UNUSED_COLLECT,
446         loops::WHILE_LET_LOOP,
447         loops::WHILE_LET_ON_ITERATOR,
448         map_clone::MAP_CLONE,
449         matches::MATCH_BOOL,
450         matches::MATCH_OVERLAPPING_ARM,
451         matches::MATCH_REF_PATS,
452         matches::MATCH_WILD_ERR_ARM,
453         matches::SINGLE_MATCH,
454         methods::CHARS_NEXT_CMP,
455         methods::CLONE_DOUBLE_REF,
456         methods::CLONE_ON_COPY,
457         methods::FILTER_NEXT,
458         methods::GET_UNWRAP,
459         methods::ITER_CLONED_COLLECT,
460         methods::ITER_NTH,
461         methods::ITER_SKIP_NEXT,
462         methods::NEW_RET_NO_SELF,
463         methods::OK_EXPECT,
464         methods::OR_FUN_CALL,
465         methods::SEARCH_IS_SOME,
466         methods::SHOULD_IMPLEMENT_TRAIT,
467         methods::SINGLE_CHAR_PATTERN,
468         methods::STRING_EXTEND_CHARS,
469         methods::TEMPORARY_CSTRING_AS_PTR,
470         methods::WRONG_SELF_CONVENTION,
471         minmax::MIN_MAX,
472         misc::CMP_NAN,
473         misc::CMP_OWNED,
474         misc::FLOAT_CMP,
475         misc::MODULO_ONE,
476         misc::REDUNDANT_PATTERN,
477         misc::SHORT_CIRCUIT_STATEMENT,
478         misc::TOPLEVEL_REF_ARG,
479         misc::ZERO_PTR,
480         misc_early::BUILTIN_TYPE_SHADOW,
481         misc_early::DOUBLE_NEG,
482         misc_early::DUPLICATE_UNDERSCORE_ARGUMENT,
483         misc_early::MIXED_CASE_HEX_LITERALS,
484         misc_early::REDUNDANT_CLOSURE_CALL,
485         misc_early::UNNEEDED_FIELD_PATTERN,
486         misc_early::ZERO_PREFIXED_LITERAL,
487         mut_reference::UNNECESSARY_MUT_PASSED,
488         mutex_atomic::MUTEX_ATOMIC,
489         needless_bool::BOOL_COMPARISON,
490         needless_bool::NEEDLESS_BOOL,
491         needless_borrow::NEEDLESS_BORROW,
492         needless_borrowed_ref::NEEDLESS_BORROWED_REFERENCE,
493         needless_continue::NEEDLESS_CONTINUE,
494         needless_pass_by_value::NEEDLESS_PASS_BY_VALUE,
495         needless_update::NEEDLESS_UPDATE,
496         neg_multiply::NEG_MULTIPLY,
497         new_without_default::NEW_WITHOUT_DEFAULT,
498         new_without_default::NEW_WITHOUT_DEFAULT_DERIVE,
499         no_effect::NO_EFFECT,
500         no_effect::UNNECESSARY_OPERATION,
501         non_expressive_names::MANY_SINGLE_CHAR_NAMES,
502         ok_if_let::IF_LET_SOME_RESULT,
503         open_options::NONSENSICAL_OPEN_OPTIONS,
504         overflow_check_conditional::OVERFLOW_CHECK_CONDITIONAL,
505         panic::PANIC_PARAMS,
506         partialeq_ne_impl::PARTIALEQ_NE_IMPL,
507         precedence::PRECEDENCE,
508         print::PRINT_WITH_NEWLINE,
509         ptr::CMP_NULL,
510         ptr::MUT_FROM_REF,
511         ptr::PTR_ARG,
512         ranges::ITERATOR_STEP_BY_ZERO,
513         ranges::RANGE_ZIP_WITH_LEN,
514         reference::DEREF_ADDROF,
515         regex::INVALID_REGEX,
516         regex::REGEX_MACRO,
517         regex::TRIVIAL_REGEX,
518         returns::LET_AND_RETURN,
519         returns::NEEDLESS_RETURN,
520         serde_api::SERDE_API_MISUSE,
521         should_assert_eq::SHOULD_ASSERT_EQ,
522         strings::STRING_LIT_AS_BYTES,
523         swap::ALMOST_SWAPPED,
524         swap::MANUAL_SWAP,
525         temporary_assignment::TEMPORARY_ASSIGNMENT,
526         transmute::CROSSPOINTER_TRANSMUTE,
527         transmute::TRANSMUTE_PTR_TO_REF,
528         transmute::USELESS_TRANSMUTE,
529         transmute::WRONG_TRANSMUTE,
530         types::ABSURD_EXTREME_COMPARISONS,
531         types::BORROWED_BOX,
532         types::BOX_VEC,
533         types::CHAR_LIT_AS_U8,
534         types::LET_UNIT_VALUE,
535         types::LINKEDLIST,
536         types::TYPE_COMPLEXITY,
537         types::UNIT_CMP,
538         types::UNNECESSARY_CAST,
539         unicode::ZERO_WIDTH_SPACE,
540         unsafe_removed_from_name::UNSAFE_REMOVED_FROM_NAME,
541         unused_io_amount::UNUSED_IO_AMOUNT,
542         unused_label::UNUSED_LABEL,
543         vec::USELESS_VEC,
544         zero_div_zero::ZERO_DIVIDED_BY_ZERO,
545     ]);
546 }
547
548 // only exists to let the dogfood integration test works.
549 // Don't run clippy as an executable directly
550 #[allow(dead_code, print_stdout)]
551 fn main() {
552     panic!("Please use the cargo-clippy executable");
553 }