]> git.lizzy.rs Git - rust.git/blob - src/librustc_lint/lib.rs
Auto merge of #38932 - petrochenkov:privctor, r=jseyfried
[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 #![crate_name = "rustc_lint"]
23 #![unstable(feature = "rustc_private", issue = "27812")]
24 #![crate_type = "dylib"]
25 #![crate_type = "rlib"]
26 #![doc(html_logo_url = "https://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png",
27       html_favicon_url = "https://doc.rust-lang.org/favicon.ico",
28       html_root_url = "https://doc.rust-lang.org/nightly/")]
29 #![deny(warnings)]
30
31 #![cfg_attr(test, feature(test))]
32 #![feature(box_patterns)]
33 #![feature(box_syntax)]
34 #![feature(quote)]
35 #![feature(rustc_diagnostic_macros)]
36 #![feature(rustc_private)]
37 #![feature(slice_patterns)]
38 #![feature(staged_api)]
39
40 extern crate syntax;
41 #[macro_use]
42 extern crate rustc;
43 #[macro_use]
44 extern crate log;
45 extern crate rustc_back;
46 extern crate rustc_const_eval;
47 extern crate syntax_pos;
48
49 extern crate rustc_i128;
50
51 pub use rustc::lint;
52 pub use rustc::middle;
53 pub use rustc::session;
54 pub use rustc::util;
55
56 use session::Session;
57 use lint::LintId;
58 use lint::FutureIncompatibleInfo;
59
60 mod bad_style;
61 mod builtin;
62 mod types;
63 mod unused;
64
65 use bad_style::*;
66 use builtin::*;
67 use types::*;
68 use unused::*;
69
70 /// Tell the `LintStore` about all the built-in lints (the ones
71 /// defined in this crate and the ones defined in
72 /// `rustc::lint::builtin`).
73 pub fn register_builtins(store: &mut lint::LintStore, sess: Option<&Session>) {
74     macro_rules! add_builtin {
75         ($sess:ident, $($name:ident),*,) => (
76             {$(
77                 store.register_late_pass($sess, false, box $name);
78                 )*}
79             )
80     }
81
82     macro_rules! add_early_builtin {
83         ($sess:ident, $($name:ident),*,) => (
84             {$(
85                 store.register_early_pass($sess, false, box $name);
86                 )*}
87             )
88     }
89
90     macro_rules! add_builtin_with_new {
91         ($sess:ident, $($name:ident),*,) => (
92             {$(
93                 store.register_late_pass($sess, false, box $name::new());
94                 )*}
95             )
96     }
97
98     macro_rules! add_early_builtin_with_new {
99         ($sess:ident, $($name:ident),*,) => (
100             {$(
101                 store.register_early_pass($sess, false, box $name::new());
102                 )*}
103             )
104     }
105
106     macro_rules! add_lint_group {
107         ($sess:ident, $name:expr, $($lint:ident),*) => (
108             store.register_group($sess, false, $name, vec![$(LintId::of($lint)),*]);
109             )
110     }
111
112     add_early_builtin!(sess,
113                        UnusedParens,
114                        UnusedImportBraces,
115                        );
116
117     add_early_builtin_with_new!(sess,
118                                 DeprecatedAttr,
119                                 );
120
121     add_builtin!(sess,
122                  HardwiredLints,
123                  WhileTrue,
124                  ImproperCTypes,
125                  VariantSizeDifferences,
126                  BoxPointers,
127                  UnusedAttributes,
128                  PathStatements,
129                  UnusedResults,
130                  NonCamelCaseTypes,
131                  NonSnakeCase,
132                  NonUpperCaseGlobals,
133                  NonShorthandFieldPatterns,
134                  UnusedUnsafe,
135                  UnsafeCode,
136                  UnusedMut,
137                  UnusedAllocation,
138                  MissingCopyImplementations,
139                  UnstableFeatures,
140                  UnconditionalRecursion,
141                  InvalidNoMangleItems,
142                  PluginAsLibrary,
143                  MutableTransmutes,
144                  UnionsWithDropFields,
145                  );
146
147     add_builtin_with_new!(sess,
148                           TypeLimits,
149                           MissingDoc,
150                           MissingDebugImplementations,
151                           );
152
153     add_lint_group!(sess,
154                     "bad_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
173     // Guidelines for creating a future incompatibility lint:
174     //
175     // - Create a lint defaulting to warn as normal, with ideally the same error
176     //   message you would normally give
177     // - Add a suitable reference, typically an RFC or tracking issue. Go ahead
178     //   and include the full URL.
179     // - Later, change lint to error
180     // - Eventually, remove lint
181     store.register_future_incompatible(sess,
182                                        vec![
183         FutureIncompatibleInfo {
184             id: LintId::of(PRIVATE_IN_PUBLIC),
185             reference: "issue #34537 <https://github.com/rust-lang/rust/issues/34537>",
186         },
187         FutureIncompatibleInfo {
188             id: LintId::of(INACCESSIBLE_EXTERN_CRATE),
189             reference: "issue #36886 <https://github.com/rust-lang/rust/issues/36886>",
190         },
191         FutureIncompatibleInfo {
192             id: LintId::of(INVALID_TYPE_PARAM_DEFAULT),
193             reference: "issue #36887 <https://github.com/rust-lang/rust/issues/36887>",
194         },
195         FutureIncompatibleInfo {
196             id: LintId::of(SUPER_OR_SELF_IN_GLOBAL_PATH),
197             reference: "issue #36888 <https://github.com/rust-lang/rust/issues/36888>",
198         },
199         FutureIncompatibleInfo {
200             id: LintId::of(TRANSMUTE_FROM_FN_ITEM_TYPES),
201             reference: "issue #19925 <https://github.com/rust-lang/rust/issues/19925>",
202         },
203         FutureIncompatibleInfo {
204             id: LintId::of(OVERLAPPING_INHERENT_IMPLS),
205             reference: "issue #36889 <https://github.com/rust-lang/rust/issues/36889>",
206         },
207         FutureIncompatibleInfo {
208             id: LintId::of(ILLEGAL_FLOATING_POINT_CONSTANT_PATTERN),
209             reference: "issue #36890 <https://github.com/rust-lang/rust/issues/36890>",
210         },
211         FutureIncompatibleInfo {
212             id: LintId::of(ILLEGAL_STRUCT_OR_ENUM_CONSTANT_PATTERN),
213             reference: "issue #36891 <https://github.com/rust-lang/rust/issues/36891>",
214         },
215         FutureIncompatibleInfo {
216             id: LintId::of(HR_LIFETIME_IN_ASSOC_TYPE),
217             reference: "issue #33685 <https://github.com/rust-lang/rust/issues/33685>",
218         },
219         FutureIncompatibleInfo {
220             id: LintId::of(LIFETIME_UNDERSCORE),
221             reference: "issue #36892 <https://github.com/rust-lang/rust/issues/36892>",
222         },
223         FutureIncompatibleInfo {
224             id: LintId::of(SAFE_EXTERN_STATICS),
225             reference: "issue #36247 <https://github.com/rust-lang/rust/issues/35112>",
226         },
227         FutureIncompatibleInfo {
228             id: LintId::of(PATTERNS_IN_FNS_WITHOUT_BODY),
229             reference: "issue #35203 <https://github.com/rust-lang/rust/issues/35203>",
230         },
231         FutureIncompatibleInfo {
232             id: LintId::of(EXTRA_REQUIREMENT_IN_IMPL),
233             reference: "issue #37166 <https://github.com/rust-lang/rust/issues/37166>",
234         },
235         FutureIncompatibleInfo {
236             id: LintId::of(LEGACY_DIRECTORY_OWNERSHIP),
237             reference: "issue #37872 <https://github.com/rust-lang/rust/issues/37872>",
238         },
239         FutureIncompatibleInfo {
240             id: LintId::of(LEGACY_IMPORTS),
241             reference: "issue #38260 <https://github.com/rust-lang/rust/issues/38260>",
242         },
243         FutureIncompatibleInfo {
244             id: LintId::of(LEGACY_CONSTRUCTOR_VISIBILITY),
245             reference: "issue #39207 <https://github.com/rust-lang/rust/issues/39207>",
246         },
247         ]);
248
249     // Register renamed and removed lints
250     store.register_renamed("unknown_features", "unused_features");
251     store.register_removed("unsigned_negation",
252                            "replaced by negate_unsigned feature gate");
253     store.register_removed("negate_unsigned", "cast a signed value instead");
254     store.register_removed("raw_pointer_derive", "using derive with raw pointers is ok");
255     // This was renamed to raw_pointer_derive, which was then removed,
256     // so it is also considered removed
257     store.register_removed("raw_pointer_deriving",
258                            "using derive with raw pointers is ok");
259     store.register_removed("drop_with_repr_extern", "drop flags have been removed");
260 }