]> git.lizzy.rs Git - rust.git/blob - src/librustc_lint/lib.rs
Rollup merge of #51401 - estebank:warn-repr, r=cramertj
[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 /// Tell the `LintStore` about all the built-in lints (the ones
64 /// defined in this crate and the ones defined in
65 /// `rustc::lint::builtin`).
66 pub fn register_builtins(store: &mut lint::LintStore, sess: Option<&Session>) {
67     macro_rules! add_builtin {
68         ($sess:ident, $($name:ident),*,) => (
69             {$(
70                 store.register_late_pass($sess, false, box $name);
71                 )*}
72             )
73     }
74
75     macro_rules! add_early_builtin {
76         ($sess:ident, $($name:ident),*,) => (
77             {$(
78                 store.register_early_pass($sess, false, box $name);
79                 )*}
80             )
81     }
82
83     macro_rules! add_builtin_with_new {
84         ($sess:ident, $($name:ident),*,) => (
85             {$(
86                 store.register_late_pass($sess, false, box $name::new());
87                 )*}
88             )
89     }
90
91     macro_rules! add_early_builtin_with_new {
92         ($sess:ident, $($name:ident),*,) => (
93             {$(
94                 store.register_early_pass($sess, false, box $name::new());
95                 )*}
96             )
97     }
98
99     macro_rules! add_lint_group {
100         ($sess:ident, $name:expr, $($lint:ident),*) => (
101             store.register_group($sess, false, $name, vec![$(LintId::of($lint)),*]);
102             )
103     }
104
105     add_early_builtin!(sess,
106                        UnusedParens,
107                        UnusedImportBraces,
108                        AnonymousParameters,
109                        UnusedDocComment,
110                        BadRepr,
111                        );
112
113     add_early_builtin_with_new!(sess,
114                                 DeprecatedAttr,
115                                 );
116
117     add_builtin!(sess,
118                  HardwiredLints,
119                  WhileTrue,
120                  ImproperCTypes,
121                  VariantSizeDifferences,
122                  BoxPointers,
123                  UnusedAttributes,
124                  PathStatements,
125                  UnusedResults,
126                  NonCamelCaseTypes,
127                  NonSnakeCase,
128                  NonUpperCaseGlobals,
129                  NonShorthandFieldPatterns,
130                  UnsafeCode,
131                  UnusedAllocation,
132                  MissingCopyImplementations,
133                  UnstableFeatures,
134                  UnconditionalRecursion,
135                  InvalidNoMangleItems,
136                  PluginAsLibrary,
137                  MutableTransmutes,
138                  UnionsWithDropFields,
139                  UnreachablePub,
140                  TypeAliasBounds,
141                  UnusedBrokenConst,
142                  TrivialConstraints,
143                  );
144
145     add_builtin_with_new!(sess,
146                           TypeLimits,
147                           MissingDoc,
148                           MissingDebugImplementations,
149                           );
150
151     add_lint_group!(sess,
152                     "bad_style",
153                     NON_CAMEL_CASE_TYPES,
154                     NON_SNAKE_CASE,
155                     NON_UPPER_CASE_GLOBALS);
156
157     add_lint_group!(sess,
158                     "nonstandard_style",
159                     NON_CAMEL_CASE_TYPES,
160                     NON_SNAKE_CASE,
161                     NON_UPPER_CASE_GLOBALS);
162
163     add_lint_group!(sess,
164                     "unused",
165                     UNUSED_IMPORTS,
166                     UNUSED_VARIABLES,
167                     UNUSED_ASSIGNMENTS,
168                     DEAD_CODE,
169                     UNUSED_MUT,
170                     UNREACHABLE_CODE,
171                     UNREACHABLE_PATTERNS,
172                     UNUSED_MUST_USE,
173                     UNUSED_UNSAFE,
174                     PATH_STATEMENTS,
175                     UNUSED_ATTRIBUTES,
176                     UNUSED_MACROS,
177                     UNUSED_ALLOCATION,
178                     UNUSED_DOC_COMMENTS,
179                     UNUSED_EXTERN_CRATES,
180                     UNUSED_FEATURES,
181                     UNUSED_LABELS,
182                     UNUSED_PARENS);
183
184     add_lint_group!(sess,
185                     "rust_2018_idioms",
186                     BARE_TRAIT_OBJECTS,
187                     UNREACHABLE_PUB,
188                     UNUSED_EXTERN_CRATES);
189
190     // Guidelines for creating a future incompatibility lint:
191     //
192     // - Create a lint defaulting to warn as normal, with ideally the same error
193     //   message you would normally give
194     // - Add a suitable reference, typically an RFC or tracking issue. Go ahead
195     //   and include the full URL, sort items in ascending order of issue numbers.
196     // - Later, change lint to error
197     // - Eventually, remove lint
198     store.register_future_incompatible(sess,
199                                        vec![
200         FutureIncompatibleInfo {
201             id: LintId::of(PRIVATE_IN_PUBLIC),
202             reference: "issue #34537 <https://github.com/rust-lang/rust/issues/34537>",
203             edition: None,
204         },
205         FutureIncompatibleInfo {
206             id: LintId::of(PUB_USE_OF_PRIVATE_EXTERN_CRATE),
207             reference: "issue #34537 <https://github.com/rust-lang/rust/issues/34537>",
208             edition: None,
209         },
210         FutureIncompatibleInfo {
211             id: LintId::of(PATTERNS_IN_FNS_WITHOUT_BODY),
212             reference: "issue #35203 <https://github.com/rust-lang/rust/issues/35203>",
213             edition: None,
214         },
215         FutureIncompatibleInfo {
216             id: LintId::of(DUPLICATE_MACRO_EXPORTS),
217             reference: "issue #35896 <https://github.com/rust-lang/rust/issues/35896>",
218             edition: Some(Edition::Edition2018),
219         },
220         FutureIncompatibleInfo {
221             id: LintId::of(SAFE_EXTERN_STATICS),
222             reference: "issue #36247 <https://github.com/rust-lang/rust/issues/36247>",
223             edition: None,
224         },
225         FutureIncompatibleInfo {
226             id: LintId::of(INVALID_TYPE_PARAM_DEFAULT),
227             reference: "issue #36887 <https://github.com/rust-lang/rust/issues/36887>",
228             edition: None,
229         },
230         FutureIncompatibleInfo {
231             id: LintId::of(LEGACY_DIRECTORY_OWNERSHIP),
232             reference: "issue #37872 <https://github.com/rust-lang/rust/issues/37872>",
233             edition: None,
234         },
235         FutureIncompatibleInfo {
236             id: LintId::of(LEGACY_CONSTRUCTOR_VISIBILITY),
237             reference: "issue #39207 <https://github.com/rust-lang/rust/issues/39207>",
238             edition: None,
239         },
240         FutureIncompatibleInfo {
241             id: LintId::of(MISSING_FRAGMENT_SPECIFIER),
242             reference: "issue #40107 <https://github.com/rust-lang/rust/issues/40107>",
243             edition: None,
244         },
245         FutureIncompatibleInfo {
246             id: LintId::of(ILLEGAL_FLOATING_POINT_LITERAL_PATTERN),
247             reference: "issue #41620 <https://github.com/rust-lang/rust/issues/41620>",
248             edition: None,
249         },
250         FutureIncompatibleInfo {
251             id: LintId::of(ANONYMOUS_PARAMETERS),
252             reference: "issue #41686 <https://github.com/rust-lang/rust/issues/41686>",
253             edition: None,
254         },
255         FutureIncompatibleInfo {
256             id: LintId::of(PARENTHESIZED_PARAMS_IN_TYPES_AND_MODULES),
257             reference: "issue #42238 <https://github.com/rust-lang/rust/issues/42238>",
258             edition: None,
259         },
260         FutureIncompatibleInfo {
261             id: LintId::of(LATE_BOUND_LIFETIME_ARGUMENTS),
262             reference: "issue #42868 <https://github.com/rust-lang/rust/issues/42868>",
263             edition: None,
264         },
265         FutureIncompatibleInfo {
266             id: LintId::of(SAFE_PACKED_BORROWS),
267             reference: "issue #46043 <https://github.com/rust-lang/rust/issues/46043>",
268             edition: None,
269         },
270         FutureIncompatibleInfo {
271             id: LintId::of(INCOHERENT_FUNDAMENTAL_IMPLS),
272             reference: "issue #46205 <https://github.com/rust-lang/rust/issues/46205>",
273             edition: None,
274         },
275         FutureIncompatibleInfo {
276             id: LintId::of(TYVAR_BEHIND_RAW_POINTER),
277             reference: "issue #46906 <https://github.com/rust-lang/rust/issues/46906>",
278             edition: Some(Edition::Edition2018),
279         },
280         FutureIncompatibleInfo {
281             id: LintId::of(UNSTABLE_NAME_COLLISIONS),
282             reference: "issue #48919 <https://github.com/rust-lang/rust/issues/48919>",
283             edition: None,
284             // Note: this item represents future incompatibility of all unstable functions in the
285             //       standard library, and thus should never be removed or changed to an error.
286         },
287         FutureIncompatibleInfo {
288             id: LintId::of(ABSOLUTE_PATHS_NOT_STARTING_WITH_CRATE),
289             reference: "issue TBD",
290             edition: Some(Edition::Edition2018),
291         },
292         FutureIncompatibleInfo {
293             id: LintId::of(DUPLICATE_ASSOCIATED_TYPE_BINDINGS),
294             reference: "issue #50589 <https://github.com/rust-lang/rust/issues/50589>",
295             edition: None,
296         },
297         ]);
298
299     // Register renamed and removed lints
300     store.register_renamed("single_use_lifetime", "single_use_lifetimes");
301     store.register_renamed("elided_lifetime_in_path", "elided_lifetimes_in_paths");
302     store.register_renamed("bare_trait_object", "bare_trait_objects");
303     store.register_renamed("unstable_name_collision", "unstable_name_collisions");
304     store.register_renamed("unused_doc_comment", "unused_doc_comments");
305     store.register_renamed("unknown_features", "unused_features");
306     store.register_removed("unsigned_negation", "replaced by negate_unsigned feature gate");
307     store.register_removed("negate_unsigned", "cast a signed value instead");
308     store.register_removed("raw_pointer_derive", "using derive with raw pointers is ok");
309     // This was renamed to raw_pointer_derive, which was then removed,
310     // so it is also considered removed
311     store.register_removed("raw_pointer_deriving", "using derive with raw pointers is ok");
312     store.register_removed("drop_with_repr_extern", "drop flags have been removed");
313     store.register_removed("fat_ptr_transmutes", "was accidentally removed back in 2014");
314     store.register_removed("deprecated_attr", "use `deprecated` instead");
315     store.register_removed("transmute_from_fn_item_types",
316         "always cast functions before transmuting them");
317     store.register_removed("hr_lifetime_in_assoc_type",
318         "converted into hard error, see https://github.com/rust-lang/rust/issues/33685");
319     store.register_removed("inaccessible_extern_crate",
320         "converted into hard error, see https://github.com/rust-lang/rust/issues/36886");
321     store.register_removed("super_or_self_in_global_path",
322         "converted into hard error, see https://github.com/rust-lang/rust/issues/36888");
323     store.register_removed("overlapping_inherent_impls",
324         "converted into hard error, see https://github.com/rust-lang/rust/issues/36889");
325     store.register_removed("illegal_floating_point_constant_pattern",
326         "converted into hard error, see https://github.com/rust-lang/rust/issues/36890");
327     store.register_removed("illegal_struct_or_enum_constant_pattern",
328         "converted into hard error, see https://github.com/rust-lang/rust/issues/36891");
329     store.register_removed("lifetime_underscore",
330         "converted into hard error, see https://github.com/rust-lang/rust/issues/36892");
331     store.register_removed("extra_requirement_in_impl",
332         "converted into hard error, see https://github.com/rust-lang/rust/issues/37166");
333     store.register_removed("legacy_imports",
334         "converted into hard error, see https://github.com/rust-lang/rust/issues/38260");
335     store.register_removed("coerce_never",
336         "converted into hard error, see https://github.com/rust-lang/rust/issues/48950");
337     store.register_removed("resolve_trait_on_defaulted_unit",
338         "converted into hard error, see https://github.com/rust-lang/rust/issues/48950");
339 }