]> git.lizzy.rs Git - rust.git/blob - src/librustc_lint/lib.rs
rename epoch to edition
[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                        IgnoredGenericBounds,
113                        );
114
115     add_early_builtin_with_new!(sess,
116                                 DeprecatedAttr,
117                                 );
118
119     add_builtin!(sess,
120                  HardwiredLints,
121                  WhileTrue,
122                  ImproperCTypes,
123                  VariantSizeDifferences,
124                  BoxPointers,
125                  UnusedAttributes,
126                  PathStatements,
127                  UnusedResults,
128                  NonCamelCaseTypes,
129                  NonSnakeCase,
130                  NonUpperCaseGlobals,
131                  NonShorthandFieldPatterns,
132                  UnsafeCode,
133                  UnusedAllocation,
134                  MissingCopyImplementations,
135                  UnstableFeatures,
136                  UnconditionalRecursion,
137                  InvalidNoMangleItems,
138                  PluginAsLibrary,
139                  MutableTransmutes,
140                  UnionsWithDropFields,
141                  UnreachablePub,
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         ]);
278
279     // Register renamed and removed lints
280     store.register_renamed("unknown_features", "unused_features");
281     store.register_removed("unsigned_negation", "replaced by negate_unsigned feature gate");
282     store.register_removed("negate_unsigned", "cast a signed value instead");
283     store.register_removed("raw_pointer_derive", "using derive with raw pointers is ok");
284     // This was renamed to raw_pointer_derive, which was then removed,
285     // so it is also considered removed
286     store.register_removed("raw_pointer_deriving", "using derive with raw pointers is ok");
287     store.register_removed("drop_with_repr_extern", "drop flags have been removed");
288     store.register_removed("fat_ptr_transmutes", "was accidentally removed back in 2014");
289     store.register_removed("deprecated_attr", "use `deprecated` instead");
290     store.register_removed("transmute_from_fn_item_types",
291         "always cast functions before transmuting them");
292     store.register_removed("hr_lifetime_in_assoc_type",
293         "converted into hard error, see https://github.com/rust-lang/rust/issues/33685");
294     store.register_removed("inaccessible_extern_crate",
295         "converted into hard error, see https://github.com/rust-lang/rust/issues/36886");
296     store.register_removed("super_or_self_in_global_path",
297         "converted into hard error, see https://github.com/rust-lang/rust/issues/36888");
298     store.register_removed("overlapping_inherent_impls",
299         "converted into hard error, see https://github.com/rust-lang/rust/issues/36889");
300     store.register_removed("illegal_floating_point_constant_pattern",
301         "converted into hard error, see https://github.com/rust-lang/rust/issues/36890");
302     store.register_removed("illegal_struct_or_enum_constant_pattern",
303         "converted into hard error, see https://github.com/rust-lang/rust/issues/36891");
304     store.register_removed("lifetime_underscore",
305         "converted into hard error, see https://github.com/rust-lang/rust/issues/36892");
306     store.register_removed("extra_requirement_in_impl",
307         "converted into hard error, see https://github.com/rust-lang/rust/issues/37166");
308     store.register_removed("coerce_never",
309         "converted into hard error, see https://github.com/rust-lang/rust/issues/48950");
310     store.register_removed("resolve_trait_on_defaulted_unit",
311         "converted into hard error, see https://github.com/rust-lang/rust/issues/48950");
312 }