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