]> git.lizzy.rs Git - rust.git/blob - src/librustc_lint/lib.rs
Nuke the entire ctfe from orbit, it's the only way to be sure
[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 #![feature(slice_patterns)]
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::session;
47 use rustc::util;
48
49 use session::Session;
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                  );
140
141     add_builtin_with_new!(sess,
142                           TypeLimits,
143                           MissingDoc,
144                           MissingDebugImplementations,
145                           );
146
147     add_lint_group!(sess,
148                     "bad_style",
149                     NON_CAMEL_CASE_TYPES,
150                     NON_SNAKE_CASE,
151                     NON_UPPER_CASE_GLOBALS);
152
153     add_lint_group!(sess,
154                     "nonstandard_style",
155                     NON_CAMEL_CASE_TYPES,
156                     NON_SNAKE_CASE,
157                     NON_UPPER_CASE_GLOBALS);
158
159     add_lint_group!(sess,
160                     "unused",
161                     UNUSED_IMPORTS,
162                     UNUSED_VARIABLES,
163                     UNUSED_ASSIGNMENTS,
164                     DEAD_CODE,
165                     UNUSED_MUT,
166                     UNREACHABLE_CODE,
167                     UNREACHABLE_PATTERNS,
168                     UNUSED_MUST_USE,
169                     UNUSED_UNSAFE,
170                     PATH_STATEMENTS,
171                     UNUSED_ATTRIBUTES,
172                     UNUSED_MACROS,
173                     UNUSED_ALLOCATION,
174                     UNUSED_DOC_COMMENT,
175                     UNUSED_EXTERN_CRATES,
176                     UNUSED_FEATURES,
177                     UNUSED_PARENS);
178
179     // Guidelines for creating a future incompatibility lint:
180     //
181     // - Create a lint defaulting to warn as normal, with ideally the same error
182     //   message you would normally give
183     // - Add a suitable reference, typically an RFC or tracking issue. Go ahead
184     //   and include the full URL, sort items in ascending order of issue numbers.
185     // - Later, change lint to error
186     // - Eventually, remove lint
187     store.register_future_incompatible(sess,
188                                        vec![
189         FutureIncompatibleInfo {
190             id: LintId::of(PRIVATE_IN_PUBLIC),
191             reference: "issue #34537 <https://github.com/rust-lang/rust/issues/34537>",
192             epoch: None,
193         },
194         FutureIncompatibleInfo {
195             id: LintId::of(PUB_USE_OF_PRIVATE_EXTERN_CRATE),
196             reference: "issue #34537 <https://github.com/rust-lang/rust/issues/34537>",
197             epoch: None,
198         },
199         FutureIncompatibleInfo {
200             id: LintId::of(PATTERNS_IN_FNS_WITHOUT_BODY),
201             reference: "issue #35203 <https://github.com/rust-lang/rust/issues/35203>",
202             epoch: None,
203         },
204         FutureIncompatibleInfo {
205             id: LintId::of(SAFE_EXTERN_STATICS),
206             reference: "issue #36247 <https://github.com/rust-lang/rust/issues/36247>",
207             epoch: None,
208         },
209         FutureIncompatibleInfo {
210             id: LintId::of(INVALID_TYPE_PARAM_DEFAULT),
211             reference: "issue #36887 <https://github.com/rust-lang/rust/issues/36887>",
212             epoch: None,
213         },
214         FutureIncompatibleInfo {
215             id: LintId::of(LEGACY_DIRECTORY_OWNERSHIP),
216             reference: "issue #37872 <https://github.com/rust-lang/rust/issues/37872>",
217             epoch: None,
218         },
219         FutureIncompatibleInfo {
220             id: LintId::of(LEGACY_IMPORTS),
221             reference: "issue #38260 <https://github.com/rust-lang/rust/issues/38260>",
222             epoch: None,
223         },
224         FutureIncompatibleInfo {
225             id: LintId::of(LEGACY_CONSTRUCTOR_VISIBILITY),
226             reference: "issue #39207 <https://github.com/rust-lang/rust/issues/39207>",
227             epoch: None,
228         },
229         FutureIncompatibleInfo {
230             id: LintId::of(RESOLVE_TRAIT_ON_DEFAULTED_UNIT),
231             reference: "issue #39216 <https://github.com/rust-lang/rust/issues/39216>",
232             epoch: None,
233         },
234         FutureIncompatibleInfo {
235             id: LintId::of(MISSING_FRAGMENT_SPECIFIER),
236             reference: "issue #40107 <https://github.com/rust-lang/rust/issues/40107>",
237             epoch: None,
238         },
239         FutureIncompatibleInfo {
240             id: LintId::of(ILLEGAL_FLOATING_POINT_LITERAL_PATTERN),
241             reference: "issue #41620 <https://github.com/rust-lang/rust/issues/41620>",
242             epoch: None,
243         },
244         FutureIncompatibleInfo {
245             id: LintId::of(ANONYMOUS_PARAMETERS),
246             reference: "issue #41686 <https://github.com/rust-lang/rust/issues/41686>",
247             epoch: None,
248         },
249         FutureIncompatibleInfo {
250             id: LintId::of(PARENTHESIZED_PARAMS_IN_TYPES_AND_MODULES),
251             reference: "issue #42238 <https://github.com/rust-lang/rust/issues/42238>",
252             epoch: None,
253         },
254         FutureIncompatibleInfo {
255             id: LintId::of(LATE_BOUND_LIFETIME_ARGUMENTS),
256             reference: "issue #42868 <https://github.com/rust-lang/rust/issues/42868>",
257             epoch: None,
258         },
259         FutureIncompatibleInfo {
260             id: LintId::of(SAFE_PACKED_BORROWS),
261             reference: "issue #46043 <https://github.com/rust-lang/rust/issues/46043>",
262             epoch: None,
263         },
264         FutureIncompatibleInfo {
265             id: LintId::of(INCOHERENT_FUNDAMENTAL_IMPLS),
266             reference: "issue #46205 <https://github.com/rust-lang/rust/issues/46205>",
267             epoch: None,
268         },
269         FutureIncompatibleInfo {
270             id: LintId::of(COERCE_NEVER),
271             reference: "issue #46325 <https://github.com/rust-lang/rust/issues/46325>",
272             epoch: 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             epoch: None,
278         },
279          FutureIncompatibleInfo {
280              id: LintId::of(lint::builtin::BARE_TRAIT_OBJECT),
281              reference: "issue #48457 <https://github.com/rust-lang/rust/issues/48457>",
282              epoch: Some(session::config::Epoch::Epoch2018),
283          }
284         ]);
285
286     // Register renamed and removed lints
287     store.register_renamed("unknown_features", "unused_features");
288     store.register_removed("unsigned_negation", "replaced by negate_unsigned feature gate");
289     store.register_removed("negate_unsigned", "cast a signed value instead");
290     store.register_removed("raw_pointer_derive", "using derive with raw pointers is ok");
291     // This was renamed to raw_pointer_derive, which was then removed,
292     // so it is also considered removed
293     store.register_removed("raw_pointer_deriving", "using derive with raw pointers is ok");
294     store.register_removed("drop_with_repr_extern", "drop flags have been removed");
295     store.register_removed("fat_ptr_transmutes", "was accidentally removed back in 2014");
296     store.register_removed("deprecated_attr", "use `deprecated` instead");
297     store.register_removed("transmute_from_fn_item_types",
298         "always cast functions before transmuting them");
299     store.register_removed("hr_lifetime_in_assoc_type",
300         "converted into hard error, see https://github.com/rust-lang/rust/issues/33685");
301     store.register_removed("inaccessible_extern_crate",
302         "converted into hard error, see https://github.com/rust-lang/rust/issues/36886");
303     store.register_removed("super_or_self_in_global_path",
304         "converted into hard error, see https://github.com/rust-lang/rust/issues/36888");
305     store.register_removed("overlapping_inherent_impls",
306         "converted into hard error, see https://github.com/rust-lang/rust/issues/36889");
307     store.register_removed("illegal_floating_point_constant_pattern",
308         "converted into hard error, see https://github.com/rust-lang/rust/issues/36890");
309     store.register_removed("illegal_struct_or_enum_constant_pattern",
310         "converted into hard error, see https://github.com/rust-lang/rust/issues/36891");
311     store.register_removed("lifetime_underscore",
312         "converted into hard error, see https://github.com/rust-lang/rust/issues/36892");
313     store.register_removed("extra_requirement_in_impl",
314         "converted into hard error, see https://github.com/rust-lang/rust/issues/37166");
315 }