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