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