]> git.lizzy.rs Git - rust.git/blob - src/librustc_lint/lib.rs
Rollup merge of #47277 - tspiteri:log-correctness, r=frewsxcv
[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_const_eval;
43 extern crate syntax_pos;
44
45 use rustc::lint;
46 use rustc::middle;
47 use rustc::session;
48 use rustc::util;
49
50 use session::Session;
51 use lint::LintId;
52 use lint::FutureIncompatibleInfo;
53
54 mod bad_style;
55 mod builtin;
56 mod types;
57 mod unused;
58
59 use bad_style::*;
60 use builtin::*;
61 use types::*;
62 use unused::*;
63
64 /// Tell the `LintStore` about all the built-in lints (the ones
65 /// defined in this crate and the ones defined in
66 /// `rustc::lint::builtin`).
67 pub fn register_builtins(store: &mut lint::LintStore, sess: Option<&Session>) {
68     macro_rules! add_builtin {
69         ($sess:ident, $($name:ident),*,) => (
70             {$(
71                 store.register_late_pass($sess, false, box $name);
72                 )*}
73             )
74     }
75
76     macro_rules! add_early_builtin {
77         ($sess:ident, $($name:ident),*,) => (
78             {$(
79                 store.register_early_pass($sess, false, box $name);
80                 )*}
81             )
82     }
83
84     macro_rules! add_builtin_with_new {
85         ($sess:ident, $($name:ident),*,) => (
86             {$(
87                 store.register_late_pass($sess, false, box $name::new());
88                 )*}
89             )
90     }
91
92     macro_rules! add_early_builtin_with_new {
93         ($sess:ident, $($name:ident),*,) => (
94             {$(
95                 store.register_early_pass($sess, false, box $name::new());
96                 )*}
97             )
98     }
99
100     macro_rules! add_lint_group {
101         ($sess:ident, $name:expr, $($lint:ident),*) => (
102             store.register_group($sess, false, $name, vec![$(LintId::of($lint)),*]);
103             )
104     }
105
106     add_early_builtin!(sess,
107                        UnusedParens,
108                        UnusedImportBraces,
109                        AnonymousParameters,
110                        IllegalFloatLiteralPattern,
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                  );
142
143     add_builtin_with_new!(sess,
144                           TypeLimits,
145                           MissingDoc,
146                           MissingDebugImplementations,
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                     "unused",
157                     UNUSED_IMPORTS,
158                     UNUSED_VARIABLES,
159                     UNUSED_ASSIGNMENTS,
160                     DEAD_CODE,
161                     UNUSED_MUT,
162                     UNREACHABLE_CODE,
163                     UNREACHABLE_PATTERNS,
164                     UNUSED_MUST_USE,
165                     UNUSED_UNSAFE,
166                     PATH_STATEMENTS,
167                     UNUSED_ATTRIBUTES,
168                     UNUSED_MACROS,
169                     UNUSED_ALLOCATION,
170                     UNUSED_DOC_COMMENT,
171                     UNUSED_EXTERN_CRATES,
172                     UNUSED_FEATURES,
173                     UNUSED_PARENS);
174
175     // Guidelines for creating a future incompatibility lint:
176     //
177     // - Create a lint defaulting to warn as normal, with ideally the same error
178     //   message you would normally give
179     // - Add a suitable reference, typically an RFC or tracking issue. Go ahead
180     //   and include the full URL, sort items in ascending order of issue numbers.
181     // - Later, change lint to error
182     // - Eventually, remove lint
183     store.register_future_incompatible(sess,
184                                        vec![
185         FutureIncompatibleInfo {
186             id: LintId::of(PRIVATE_IN_PUBLIC),
187             reference: "issue #34537 <https://github.com/rust-lang/rust/issues/34537>",
188         },
189         FutureIncompatibleInfo {
190             id: LintId::of(PUB_USE_OF_PRIVATE_EXTERN_CRATE),
191             reference: "issue #34537 <https://github.com/rust-lang/rust/issues/34537>",
192         },
193         FutureIncompatibleInfo {
194             id: LintId::of(PATTERNS_IN_FNS_WITHOUT_BODY),
195             reference: "issue #35203 <https://github.com/rust-lang/rust/issues/35203>",
196         },
197         FutureIncompatibleInfo {
198             id: LintId::of(SAFE_EXTERN_STATICS),
199             reference: "issue #36247 <https://github.com/rust-lang/rust/issues/36247>",
200         },
201         FutureIncompatibleInfo {
202             id: LintId::of(INVALID_TYPE_PARAM_DEFAULT),
203             reference: "issue #36887 <https://github.com/rust-lang/rust/issues/36887>",
204         },
205         FutureIncompatibleInfo {
206             id: LintId::of(LEGACY_DIRECTORY_OWNERSHIP),
207             reference: "issue #37872 <https://github.com/rust-lang/rust/issues/37872>",
208         },
209         FutureIncompatibleInfo {
210             id: LintId::of(LEGACY_IMPORTS),
211             reference: "issue #38260 <https://github.com/rust-lang/rust/issues/38260>",
212         },
213         FutureIncompatibleInfo {
214             id: LintId::of(LEGACY_CONSTRUCTOR_VISIBILITY),
215             reference: "issue #39207 <https://github.com/rust-lang/rust/issues/39207>",
216         },
217         FutureIncompatibleInfo {
218             id: LintId::of(RESOLVE_TRAIT_ON_DEFAULTED_UNIT),
219             reference: "issue #39216 <https://github.com/rust-lang/rust/issues/39216>",
220         },
221         FutureIncompatibleInfo {
222             id: LintId::of(MISSING_FRAGMENT_SPECIFIER),
223             reference: "issue #40107 <https://github.com/rust-lang/rust/issues/40107>",
224         },
225         FutureIncompatibleInfo {
226             id: LintId::of(ILLEGAL_FLOATING_POINT_LITERAL_PATTERN),
227             reference: "issue #41620 <https://github.com/rust-lang/rust/issues/41620>",
228         },
229         FutureIncompatibleInfo {
230             id: LintId::of(ANONYMOUS_PARAMETERS),
231             reference: "issue #41686 <https://github.com/rust-lang/rust/issues/41686>",
232         },
233         FutureIncompatibleInfo {
234             id: LintId::of(PARENTHESIZED_PARAMS_IN_TYPES_AND_MODULES),
235             reference: "issue #42238 <https://github.com/rust-lang/rust/issues/42238>",
236         },
237         FutureIncompatibleInfo {
238             id: LintId::of(LATE_BOUND_LIFETIME_ARGUMENTS),
239             reference: "issue #42868 <https://github.com/rust-lang/rust/issues/42868>",
240         },
241         FutureIncompatibleInfo {
242             id: LintId::of(SAFE_PACKED_BORROWS),
243             reference: "issue #46043 <https://github.com/rust-lang/rust/issues/46043>",
244         },
245         FutureIncompatibleInfo {
246             id: LintId::of(INCOHERENT_FUNDAMENTAL_IMPLS),
247             reference: "issue #46205 <https://github.com/rust-lang/rust/issues/46205>",
248         },
249         FutureIncompatibleInfo {
250             id: LintId::of(COERCE_NEVER),
251             reference: "issue #46325 <https://github.com/rust-lang/rust/issues/46325>",
252         },
253         FutureIncompatibleInfo {
254             id: LintId::of(TYVAR_BEHIND_RAW_POINTER),
255             reference: "issue #46906 <https://github.com/rust-lang/rust/issues/46906>",
256         },
257         ]);
258
259     // Register renamed and removed lints
260     store.register_renamed("unknown_features", "unused_features");
261     store.register_removed("unsigned_negation", "replaced by negate_unsigned feature gate");
262     store.register_removed("negate_unsigned", "cast a signed value instead");
263     store.register_removed("raw_pointer_derive", "using derive with raw pointers is ok");
264     // This was renamed to raw_pointer_derive, which was then removed,
265     // so it is also considered removed
266     store.register_removed("raw_pointer_deriving", "using derive with raw pointers is ok");
267     store.register_removed("drop_with_repr_extern", "drop flags have been removed");
268     store.register_removed("fat_ptr_transmutes", "was accidentally removed back in 2014");
269     store.register_removed("deprecated_attr", "use `deprecated` instead");
270     store.register_removed("transmute_from_fn_item_types",
271         "always cast functions before transmuting them");
272     store.register_removed("hr_lifetime_in_assoc_type",
273         "converted into hard error, see https://github.com/rust-lang/rust/issues/33685");
274     store.register_removed("inaccessible_extern_crate",
275         "converted into hard error, see https://github.com/rust-lang/rust/issues/36886");
276     store.register_removed("super_or_self_in_global_path",
277         "converted into hard error, see https://github.com/rust-lang/rust/issues/36888");
278     store.register_removed("overlapping_inherent_impls",
279         "converted into hard error, see https://github.com/rust-lang/rust/issues/36889");
280     store.register_removed("illegal_floating_point_constant_pattern",
281         "converted into hard error, see https://github.com/rust-lang/rust/issues/36890");
282     store.register_removed("illegal_struct_or_enum_constant_pattern",
283         "converted into hard error, see https://github.com/rust-lang/rust/issues/36891");
284     store.register_removed("lifetime_underscore",
285         "converted into hard error, see https://github.com/rust-lang/rust/issues/36892");
286     store.register_removed("extra_requirement_in_impl",
287         "converted into hard error, see https://github.com/rust-lang/rust/issues/37166");
288 }