]> git.lizzy.rs Git - rust.git/blob - src/librustc_lint/lib.rs
Auto merge of #50521 - gnzlbg:simd_float, r=alexcrichton
[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 #![feature(macro_at_most_once_rep)]
33
34 extern crate syntax;
35 #[macro_use]
36 extern crate rustc;
37 #[macro_use]
38 extern crate log;
39 extern crate rustc_mir;
40 extern crate rustc_target;
41 extern crate syntax_pos;
42
43 use rustc::lint;
44 use rustc::lint::builtin::{BARE_TRAIT_OBJECTS, ABSOLUTE_PATHS_NOT_STARTING_WITH_CRATE};
45 use rustc::session;
46 use rustc::util;
47
48 use session::Session;
49 use syntax::edition::Edition;
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                  TypeAliasBounds,
140                  UnusedBrokenConst,
141                  TrivialConstraints,
142                  );
143
144     add_builtin_with_new!(sess,
145                           TypeLimits,
146                           MissingDoc,
147                           MissingDebugImplementations,
148                           ExternCrate,
149                           );
150
151     add_lint_group!(sess,
152                     "bad_style",
153                     NON_CAMEL_CASE_TYPES,
154                     NON_SNAKE_CASE,
155                     NON_UPPER_CASE_GLOBALS);
156
157     add_lint_group!(sess,
158                     "nonstandard_style",
159                     NON_CAMEL_CASE_TYPES,
160                     NON_SNAKE_CASE,
161                     NON_UPPER_CASE_GLOBALS);
162
163     add_lint_group!(sess,
164                     "unused",
165                     UNUSED_IMPORTS,
166                     UNUSED_VARIABLES,
167                     UNUSED_ASSIGNMENTS,
168                     DEAD_CODE,
169                     UNUSED_MUT,
170                     UNREACHABLE_CODE,
171                     UNREACHABLE_PATTERNS,
172                     UNUSED_MUST_USE,
173                     UNUSED_UNSAFE,
174                     PATH_STATEMENTS,
175                     UNUSED_ATTRIBUTES,
176                     UNUSED_MACROS,
177                     UNUSED_ALLOCATION,
178                     UNUSED_DOC_COMMENTS,
179                     UNUSED_EXTERN_CRATES,
180                     UNUSED_FEATURES,
181                     UNUSED_LABELS,
182                     UNUSED_PARENS);
183
184     add_lint_group!(sess,
185                     "rust_2018_idioms",
186                     BARE_TRAIT_OBJECTS,
187                     UNREACHABLE_PUB,
188                     UNNECESSARY_EXTERN_CRATES);
189
190     // Guidelines for creating a future incompatibility lint:
191     //
192     // - Create a lint defaulting to warn as normal, with ideally the same error
193     //   message you would normally give
194     // - Add a suitable reference, typically an RFC or tracking issue. Go ahead
195     //   and include the full URL, sort items in ascending order of issue numbers.
196     // - Later, change lint to error
197     // - Eventually, remove lint
198     store.register_future_incompatible(sess,
199                                        vec![
200         FutureIncompatibleInfo {
201             id: LintId::of(PRIVATE_IN_PUBLIC),
202             reference: "issue #34537 <https://github.com/rust-lang/rust/issues/34537>",
203             edition: None,
204         },
205         FutureIncompatibleInfo {
206             id: LintId::of(PUB_USE_OF_PRIVATE_EXTERN_CRATE),
207             reference: "issue #34537 <https://github.com/rust-lang/rust/issues/34537>",
208             edition: None,
209         },
210         FutureIncompatibleInfo {
211             id: LintId::of(PATTERNS_IN_FNS_WITHOUT_BODY),
212             reference: "issue #35203 <https://github.com/rust-lang/rust/issues/35203>",
213             edition: None,
214         },
215         FutureIncompatibleInfo {
216             id: LintId::of(SAFE_EXTERN_STATICS),
217             reference: "issue #36247 <https://github.com/rust-lang/rust/issues/36247>",
218             edition: None,
219         },
220         FutureIncompatibleInfo {
221             id: LintId::of(INVALID_TYPE_PARAM_DEFAULT),
222             reference: "issue #36887 <https://github.com/rust-lang/rust/issues/36887>",
223             edition: None,
224         },
225         FutureIncompatibleInfo {
226             id: LintId::of(LEGACY_DIRECTORY_OWNERSHIP),
227             reference: "issue #37872 <https://github.com/rust-lang/rust/issues/37872>",
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_COLLISIONS),
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_PATHS_NOT_STARTING_WITH_CRATE),
284             reference: "issue TBD",
285             edition: Some(Edition::Edition2018),
286         },
287         FutureIncompatibleInfo {
288             id: LintId::of(DUPLICATE_ASSOCIATED_TYPE_BINDINGS),
289             reference: "issue #50589 <https://github.com/rust-lang/rust/issues/50589>",
290             edition: None,
291         },
292         ]);
293
294     // Register renamed and removed lints
295     store.register_renamed("single_use_lifetime", "single_use_lifetimes");
296     store.register_renamed("elided_lifetime_in_path", "elided_lifetimes_in_paths");
297     store.register_renamed("bare_trait_object", "bare_trait_objects");
298     store.register_renamed("unstable_name_collision", "unstable_name_collisions");
299     store.register_renamed("unused_doc_comment", "unused_doc_comments");
300     store.register_renamed("unknown_features", "unused_features");
301     store.register_removed("unsigned_negation", "replaced by negate_unsigned feature gate");
302     store.register_removed("negate_unsigned", "cast a signed value instead");
303     store.register_removed("raw_pointer_derive", "using derive with raw pointers is ok");
304     // This was renamed to raw_pointer_derive, which was then removed,
305     // so it is also considered removed
306     store.register_removed("raw_pointer_deriving", "using derive with raw pointers is ok");
307     store.register_removed("drop_with_repr_extern", "drop flags have been removed");
308     store.register_removed("fat_ptr_transmutes", "was accidentally removed back in 2014");
309     store.register_removed("deprecated_attr", "use `deprecated` instead");
310     store.register_removed("transmute_from_fn_item_types",
311         "always cast functions before transmuting them");
312     store.register_removed("hr_lifetime_in_assoc_type",
313         "converted into hard error, see https://github.com/rust-lang/rust/issues/33685");
314     store.register_removed("inaccessible_extern_crate",
315         "converted into hard error, see https://github.com/rust-lang/rust/issues/36886");
316     store.register_removed("super_or_self_in_global_path",
317         "converted into hard error, see https://github.com/rust-lang/rust/issues/36888");
318     store.register_removed("overlapping_inherent_impls",
319         "converted into hard error, see https://github.com/rust-lang/rust/issues/36889");
320     store.register_removed("illegal_floating_point_constant_pattern",
321         "converted into hard error, see https://github.com/rust-lang/rust/issues/36890");
322     store.register_removed("illegal_struct_or_enum_constant_pattern",
323         "converted into hard error, see https://github.com/rust-lang/rust/issues/36891");
324     store.register_removed("lifetime_underscore",
325         "converted into hard error, see https://github.com/rust-lang/rust/issues/36892");
326     store.register_removed("extra_requirement_in_impl",
327         "converted into hard error, see https://github.com/rust-lang/rust/issues/37166");
328     store.register_removed("legacy_imports",
329         "converted into hard error, see https://github.com/rust-lang/rust/issues/38260");
330     store.register_removed("coerce_never",
331         "converted into hard error, see https://github.com/rust-lang/rust/issues/48950");
332     store.register_removed("resolve_trait_on_defaulted_unit",
333         "converted into hard error, see https://github.com/rust-lang/rust/issues/48950");
334 }