]> git.lizzy.rs Git - rust.git/blob - src/librustc_lint/lib.rs
When picking a candidate, consider the unstable ones last.
[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 #![deny(warnings)]
26
27 #![cfg_attr(test, feature(test))]
28 #![feature(box_patterns)]
29 #![feature(box_syntax)]
30 #![feature(i128_type)]
31 #![feature(macro_vis_matcher)]
32 #![feature(quote)]
33 #![feature(rustc_diagnostic_macros)]
34 #![cfg_attr(stage0, feature(never_type))]
35
36 #[macro_use]
37 extern crate syntax;
38 #[macro_use]
39 extern crate rustc;
40 #[macro_use]
41 extern crate log;
42 extern crate rustc_mir;
43 extern crate syntax_pos;
44
45 use rustc::lint;
46 use rustc::lint::builtin::BARE_TRAIT_OBJECT;
47 use rustc::session;
48 use rustc::util;
49
50 use session::Session;
51 use syntax::edition::Edition;
52 use lint::LintId;
53 use lint::FutureIncompatibleInfo;
54
55 mod bad_style;
56 mod builtin;
57 mod types;
58 mod unused;
59
60 use bad_style::*;
61 use builtin::*;
62 use types::*;
63 use unused::*;
64
65 /// Tell the `LintStore` about all the built-in lints (the ones
66 /// defined in this crate and the ones defined in
67 /// `rustc::lint::builtin`).
68 pub fn register_builtins(store: &mut lint::LintStore, sess: Option<&Session>) {
69     macro_rules! add_builtin {
70         ($sess:ident, $($name:ident),*,) => (
71             {$(
72                 store.register_late_pass($sess, false, box $name);
73                 )*}
74             )
75     }
76
77     macro_rules! add_early_builtin {
78         ($sess:ident, $($name:ident),*,) => (
79             {$(
80                 store.register_early_pass($sess, false, box $name);
81                 )*}
82             )
83     }
84
85     macro_rules! add_builtin_with_new {
86         ($sess:ident, $($name:ident),*,) => (
87             {$(
88                 store.register_late_pass($sess, false, box $name::new());
89                 )*}
90             )
91     }
92
93     macro_rules! add_early_builtin_with_new {
94         ($sess:ident, $($name:ident),*,) => (
95             {$(
96                 store.register_early_pass($sess, false, box $name::new());
97                 )*}
98             )
99     }
100
101     macro_rules! add_lint_group {
102         ($sess:ident, $name:expr, $($lint:ident),*) => (
103             store.register_group($sess, false, $name, vec![$(LintId::of($lint)),*]);
104             )
105     }
106
107     add_early_builtin!(sess,
108                        UnusedParens,
109                        UnusedImportBraces,
110                        AnonymousParameters,
111                        UnusedDocComment,
112                        );
113
114     add_early_builtin_with_new!(sess,
115                                 DeprecatedAttr,
116                                 );
117
118     add_builtin!(sess,
119                  HardwiredLints,
120                  WhileTrue,
121                  ImproperCTypes,
122                  VariantSizeDifferences,
123                  BoxPointers,
124                  UnusedAttributes,
125                  PathStatements,
126                  UnusedResults,
127                  NonCamelCaseTypes,
128                  NonSnakeCase,
129                  NonUpperCaseGlobals,
130                  NonShorthandFieldPatterns,
131                  UnsafeCode,
132                  UnusedAllocation,
133                  MissingCopyImplementations,
134                  UnstableFeatures,
135                  UnconditionalRecursion,
136                  InvalidNoMangleItems,
137                  PluginAsLibrary,
138                  MutableTransmutes,
139                  UnionsWithDropFields,
140                  UnreachablePub,
141                  TypeAliasBounds,
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_COMMENT,
178                     UNUSED_EXTERN_CRATES,
179                     UNUSED_FEATURES,
180                     UNUSED_PARENS);
181
182     add_lint_group!(sess,
183                     "rust_2018_idioms",
184                     BARE_TRAIT_OBJECT,
185                     UNREACHABLE_PUB);
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: "pr #48552 <https://github.com/rust-lang/rust/pull/48552>",
280             edition: None,
281             // FIXME: create a proper tracking issue.
282             // Note: this item represents future incompatibility of all unstable functions in the
283             //       standard library, and thus should never be removed or changed to an error.
284         },
285         ]);
286
287     // Register renamed and removed lints
288     store.register_renamed("unknown_features", "unused_features");
289     store.register_removed("unsigned_negation", "replaced by negate_unsigned feature gate");
290     store.register_removed("negate_unsigned", "cast a signed value instead");
291     store.register_removed("raw_pointer_derive", "using derive with raw pointers is ok");
292     // This was renamed to raw_pointer_derive, which was then removed,
293     // so it is also considered removed
294     store.register_removed("raw_pointer_deriving", "using derive with raw pointers is ok");
295     store.register_removed("drop_with_repr_extern", "drop flags have been removed");
296     store.register_removed("fat_ptr_transmutes", "was accidentally removed back in 2014");
297     store.register_removed("deprecated_attr", "use `deprecated` instead");
298     store.register_removed("transmute_from_fn_item_types",
299         "always cast functions before transmuting them");
300     store.register_removed("hr_lifetime_in_assoc_type",
301         "converted into hard error, see https://github.com/rust-lang/rust/issues/33685");
302     store.register_removed("inaccessible_extern_crate",
303         "converted into hard error, see https://github.com/rust-lang/rust/issues/36886");
304     store.register_removed("super_or_self_in_global_path",
305         "converted into hard error, see https://github.com/rust-lang/rust/issues/36888");
306     store.register_removed("overlapping_inherent_impls",
307         "converted into hard error, see https://github.com/rust-lang/rust/issues/36889");
308     store.register_removed("illegal_floating_point_constant_pattern",
309         "converted into hard error, see https://github.com/rust-lang/rust/issues/36890");
310     store.register_removed("illegal_struct_or_enum_constant_pattern",
311         "converted into hard error, see https://github.com/rust-lang/rust/issues/36891");
312     store.register_removed("lifetime_underscore",
313         "converted into hard error, see https://github.com/rust-lang/rust/issues/36892");
314     store.register_removed("extra_requirement_in_impl",
315         "converted into hard error, see https://github.com/rust-lang/rust/issues/37166");
316     store.register_removed("coerce_never",
317         "converted into hard error, see https://github.com/rust-lang/rust/issues/48950");
318     store.register_removed("resolve_trait_on_defaulted_unit",
319         "converted into hard error, see https://github.com/rust-lang/rust/issues/48950");
320 }