]> git.lizzy.rs Git - rust.git/blob - src/librustc_lint/lib.rs
Auto merge of #50630 - sharkdp:fix-50619, r=sfackler
[rust.git] / src / librustc_lint / lib.rs
1 // Copyright 2015 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
4 //
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
10
11 //! Lints in the Rust compiler.
12 //!
13 //! This currently only contains the definitions and implementations
14 //! of most of the lints that `rustc` supports directly, it does not
15 //! contain the infrastructure for defining/registering lints. That is
16 //! available in `rustc::lint` and `rustc_plugin` respectively.
17 //!
18 //! # Note
19 //!
20 //! This API is completely unstable and subject to change.
21
22 #![doc(html_logo_url = "https://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png",
23       html_favicon_url = "https://doc.rust-lang.org/favicon.ico",
24       html_root_url = "https://doc.rust-lang.org/nightly/")]
25
26 #![cfg_attr(test, feature(test))]
27 #![feature(box_patterns)]
28 #![feature(box_syntax)]
29 #![feature(macro_vis_matcher)]
30 #![feature(quote)]
31 #![feature(rustc_diagnostic_macros)]
32 #![feature(macro_at_most_once_rep)]
33
34 extern crate syntax;
35 #[macro_use]
36 extern crate rustc;
37 #[macro_use]
38 extern crate log;
39 extern crate rustc_mir;
40 extern crate rustc_target;
41 extern crate syntax_pos;
42
43 use rustc::lint;
44 use rustc::lint::builtin::{BARE_TRAIT_OBJECTS, ABSOLUTE_PATHS_NOT_STARTING_WITH_CRATE};
45 use rustc::session;
46 use rustc::util;
47
48 use session::Session;
49 use syntax::edition::Edition;
50 use lint::LintId;
51 use lint::FutureIncompatibleInfo;
52
53 mod bad_style;
54 mod builtin;
55 mod types;
56 mod unused;
57
58 use bad_style::*;
59 use builtin::*;
60 use types::*;
61 use unused::*;
62
63 /// Useful for other parts of the compiler.
64 pub use builtin::SoftLints;
65
66 /// Tell the `LintStore` about all the built-in lints (the ones
67 /// defined in this crate and the ones defined in
68 /// `rustc::lint::builtin`).
69 pub fn register_builtins(store: &mut lint::LintStore, sess: Option<&Session>) {
70     macro_rules! add_builtin {
71         ($sess:ident, $($name:ident),*,) => (
72             {$(
73                 store.register_late_pass($sess, false, box $name);
74                 )*}
75             )
76     }
77
78     macro_rules! add_early_builtin {
79         ($sess:ident, $($name:ident),*,) => (
80             {$(
81                 store.register_early_pass($sess, false, box $name);
82                 )*}
83             )
84     }
85
86     macro_rules! add_builtin_with_new {
87         ($sess:ident, $($name:ident),*,) => (
88             {$(
89                 store.register_late_pass($sess, false, box $name::new());
90                 )*}
91             )
92     }
93
94     macro_rules! add_early_builtin_with_new {
95         ($sess:ident, $($name:ident),*,) => (
96             {$(
97                 store.register_early_pass($sess, false, box $name::new());
98                 )*}
99             )
100     }
101
102     macro_rules! add_lint_group {
103         ($sess:ident, $name:expr, $($lint:ident),*) => (
104             store.register_group($sess, false, $name, vec![$(LintId::of($lint)),*]);
105             )
106     }
107
108     add_early_builtin!(sess,
109                        UnusedParens,
110                        UnusedImportBraces,
111                        AnonymousParameters,
112                        UnusedDocComment,
113                        BadRepr,
114                        );
115
116     add_early_builtin_with_new!(sess,
117                                 DeprecatedAttr,
118                                 );
119
120     add_builtin!(sess,
121                  HardwiredLints,
122                  WhileTrue,
123                  ImproperCTypes,
124                  VariantSizeDifferences,
125                  BoxPointers,
126                  UnusedAttributes,
127                  PathStatements,
128                  UnusedResults,
129                  NonCamelCaseTypes,
130                  NonSnakeCase,
131                  NonUpperCaseGlobals,
132                  NonShorthandFieldPatterns,
133                  UnsafeCode,
134                  UnusedAllocation,
135                  MissingCopyImplementations,
136                  UnstableFeatures,
137                  UnconditionalRecursion,
138                  InvalidNoMangleItems,
139                  PluginAsLibrary,
140                  MutableTransmutes,
141                  UnionsWithDropFields,
142                  UnreachablePub,
143                  TypeAliasBounds,
144                  UnusedBrokenConst,
145                  TrivialConstraints,
146                  );
147
148     add_builtin_with_new!(sess,
149                           TypeLimits,
150                           MissingDoc,
151                           MissingDebugImplementations,
152                           );
153
154     add_lint_group!(sess,
155                     "bad_style",
156                     NON_CAMEL_CASE_TYPES,
157                     NON_SNAKE_CASE,
158                     NON_UPPER_CASE_GLOBALS);
159
160     add_lint_group!(sess,
161                     "nonstandard_style",
162                     NON_CAMEL_CASE_TYPES,
163                     NON_SNAKE_CASE,
164                     NON_UPPER_CASE_GLOBALS);
165
166     add_lint_group!(sess,
167                     "unused",
168                     UNUSED_IMPORTS,
169                     UNUSED_VARIABLES,
170                     UNUSED_ASSIGNMENTS,
171                     DEAD_CODE,
172                     UNUSED_MUT,
173                     UNREACHABLE_CODE,
174                     UNREACHABLE_PATTERNS,
175                     UNUSED_MUST_USE,
176                     UNUSED_UNSAFE,
177                     PATH_STATEMENTS,
178                     UNUSED_ATTRIBUTES,
179                     UNUSED_MACROS,
180                     UNUSED_ALLOCATION,
181                     UNUSED_DOC_COMMENTS,
182                     UNUSED_EXTERN_CRATES,
183                     UNUSED_FEATURES,
184                     UNUSED_LABELS,
185                     UNUSED_PARENS);
186
187     add_lint_group!(sess,
188                     "rust_2018_idioms",
189                     BARE_TRAIT_OBJECTS,
190                     UNREACHABLE_PUB,
191                     UNUSED_EXTERN_CRATES);
192
193     // Guidelines for creating a future incompatibility lint:
194     //
195     // - Create a lint defaulting to warn as normal, with ideally the same error
196     //   message you would normally give
197     // - Add a suitable reference, typically an RFC or tracking issue. Go ahead
198     //   and include the full URL, sort items in ascending order of issue numbers.
199     // - Later, change lint to error
200     // - Eventually, remove lint
201     store.register_future_incompatible(sess,
202                                        vec![
203         FutureIncompatibleInfo {
204             id: LintId::of(PRIVATE_IN_PUBLIC),
205             reference: "issue #34537 <https://github.com/rust-lang/rust/issues/34537>",
206             edition: None,
207         },
208         FutureIncompatibleInfo {
209             id: LintId::of(PUB_USE_OF_PRIVATE_EXTERN_CRATE),
210             reference: "issue #34537 <https://github.com/rust-lang/rust/issues/34537>",
211             edition: None,
212         },
213         FutureIncompatibleInfo {
214             id: LintId::of(PATTERNS_IN_FNS_WITHOUT_BODY),
215             reference: "issue #35203 <https://github.com/rust-lang/rust/issues/35203>",
216             edition: None,
217         },
218         FutureIncompatibleInfo {
219             id: LintId::of(DUPLICATE_MACRO_EXPORTS),
220             reference: "issue #35896 <https://github.com/rust-lang/rust/issues/35896>",
221             edition: Some(Edition::Edition2018),
222         },
223         FutureIncompatibleInfo {
224             id: LintId::of(SAFE_EXTERN_STATICS),
225             reference: "issue #36247 <https://github.com/rust-lang/rust/issues/36247>",
226             edition: None,
227         },
228         FutureIncompatibleInfo {
229             id: LintId::of(INVALID_TYPE_PARAM_DEFAULT),
230             reference: "issue #36887 <https://github.com/rust-lang/rust/issues/36887>",
231             edition: None,
232         },
233         FutureIncompatibleInfo {
234             id: LintId::of(LEGACY_DIRECTORY_OWNERSHIP),
235             reference: "issue #37872 <https://github.com/rust-lang/rust/issues/37872>",
236             edition: None,
237         },
238         FutureIncompatibleInfo {
239             id: LintId::of(LEGACY_CONSTRUCTOR_VISIBILITY),
240             reference: "issue #39207 <https://github.com/rust-lang/rust/issues/39207>",
241             edition: None,
242         },
243         FutureIncompatibleInfo {
244             id: LintId::of(MISSING_FRAGMENT_SPECIFIER),
245             reference: "issue #40107 <https://github.com/rust-lang/rust/issues/40107>",
246             edition: None,
247         },
248         FutureIncompatibleInfo {
249             id: LintId::of(ILLEGAL_FLOATING_POINT_LITERAL_PATTERN),
250             reference: "issue #41620 <https://github.com/rust-lang/rust/issues/41620>",
251             edition: None,
252         },
253         FutureIncompatibleInfo {
254             id: LintId::of(ANONYMOUS_PARAMETERS),
255             reference: "issue #41686 <https://github.com/rust-lang/rust/issues/41686>",
256             edition: None,
257         },
258         FutureIncompatibleInfo {
259             id: LintId::of(PARENTHESIZED_PARAMS_IN_TYPES_AND_MODULES),
260             reference: "issue #42238 <https://github.com/rust-lang/rust/issues/42238>",
261             edition: None,
262         },
263         FutureIncompatibleInfo {
264             id: LintId::of(LATE_BOUND_LIFETIME_ARGUMENTS),
265             reference: "issue #42868 <https://github.com/rust-lang/rust/issues/42868>",
266             edition: None,
267         },
268         FutureIncompatibleInfo {
269             id: LintId::of(SAFE_PACKED_BORROWS),
270             reference: "issue #46043 <https://github.com/rust-lang/rust/issues/46043>",
271             edition: None,
272         },
273         FutureIncompatibleInfo {
274             id: LintId::of(INCOHERENT_FUNDAMENTAL_IMPLS),
275             reference: "issue #46205 <https://github.com/rust-lang/rust/issues/46205>",
276             edition: None,
277         },
278         FutureIncompatibleInfo {
279             id: LintId::of(TYVAR_BEHIND_RAW_POINTER),
280             reference: "issue #46906 <https://github.com/rust-lang/rust/issues/46906>",
281             edition: Some(Edition::Edition2018),
282         },
283         FutureIncompatibleInfo {
284             id: LintId::of(UNSTABLE_NAME_COLLISIONS),
285             reference: "issue #48919 <https://github.com/rust-lang/rust/issues/48919>",
286             edition: None,
287             // Note: this item represents future incompatibility of all unstable functions in the
288             //       standard library, and thus should never be removed or changed to an error.
289         },
290         FutureIncompatibleInfo {
291             id: LintId::of(ABSOLUTE_PATHS_NOT_STARTING_WITH_CRATE),
292             reference: "issue TBD",
293             edition: Some(Edition::Edition2018),
294         },
295         FutureIncompatibleInfo {
296             id: LintId::of(WHERE_CLAUSES_OBJECT_SAFETY),
297             reference: "issue #51443 <https://github.com/rust-lang/rust/issues/51443>",
298             edition: None,
299         },
300         FutureIncompatibleInfo {
301             id: LintId::of(DUPLICATE_ASSOCIATED_TYPE_BINDINGS),
302             reference: "issue #50589 <https://github.com/rust-lang/rust/issues/50589>",
303             edition: None,
304         },
305         ]);
306
307     // Register renamed and removed lints
308     store.register_renamed("single_use_lifetime", "single_use_lifetimes");
309     store.register_renamed("elided_lifetime_in_path", "elided_lifetimes_in_paths");
310     store.register_renamed("bare_trait_object", "bare_trait_objects");
311     store.register_renamed("unstable_name_collision", "unstable_name_collisions");
312     store.register_renamed("unused_doc_comment", "unused_doc_comments");
313     store.register_renamed("unknown_features", "unused_features");
314     store.register_removed("unsigned_negation", "replaced by negate_unsigned feature gate");
315     store.register_removed("negate_unsigned", "cast a signed value instead");
316     store.register_removed("raw_pointer_derive", "using derive with raw pointers is ok");
317     // This was renamed to raw_pointer_derive, which was then removed,
318     // so it is also considered removed
319     store.register_removed("raw_pointer_deriving", "using derive with raw pointers is ok");
320     store.register_removed("drop_with_repr_extern", "drop flags have been removed");
321     store.register_removed("fat_ptr_transmutes", "was accidentally removed back in 2014");
322     store.register_removed("deprecated_attr", "use `deprecated` instead");
323     store.register_removed("transmute_from_fn_item_types",
324         "always cast functions before transmuting them");
325     store.register_removed("hr_lifetime_in_assoc_type",
326         "converted into hard error, see https://github.com/rust-lang/rust/issues/33685");
327     store.register_removed("inaccessible_extern_crate",
328         "converted into hard error, see https://github.com/rust-lang/rust/issues/36886");
329     store.register_removed("super_or_self_in_global_path",
330         "converted into hard error, see https://github.com/rust-lang/rust/issues/36888");
331     store.register_removed("overlapping_inherent_impls",
332         "converted into hard error, see https://github.com/rust-lang/rust/issues/36889");
333     store.register_removed("illegal_floating_point_constant_pattern",
334         "converted into hard error, see https://github.com/rust-lang/rust/issues/36890");
335     store.register_removed("illegal_struct_or_enum_constant_pattern",
336         "converted into hard error, see https://github.com/rust-lang/rust/issues/36891");
337     store.register_removed("lifetime_underscore",
338         "converted into hard error, see https://github.com/rust-lang/rust/issues/36892");
339     store.register_removed("extra_requirement_in_impl",
340         "converted into hard error, see https://github.com/rust-lang/rust/issues/37166");
341     store.register_removed("legacy_imports",
342         "converted into hard error, see https://github.com/rust-lang/rust/issues/38260");
343     store.register_removed("coerce_never",
344         "converted into hard error, see https://github.com/rust-lang/rust/issues/48950");
345     store.register_removed("resolve_trait_on_defaulted_unit",
346         "converted into hard error, see https://github.com/rust-lang/rust/issues/48950");
347 }