]> git.proxmox.com Git - rustc.git/blob - src/librustc_lint/lib.rs
New upstream version 1.28.0~beta.14+dfsg1
[rustc.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 pub mod builtin;
55 mod types;
56 mod unused;
57
58 use bad_style::*;
59 use builtin::*;
60 use types::*;
61 use unused::*;
62
63 /// Useful for other parts of the compiler.
64 pub use builtin::SoftLints;
65
66 /// Tell the `LintStore` about all the built-in lints (the ones
67 /// defined in this crate and the ones defined in
68 /// `rustc::lint::builtin`).
69 pub fn register_builtins(store: &mut lint::LintStore, sess: Option<&Session>) {
70 macro_rules! add_builtin {
71 ($sess:ident, $($name:ident),*,) => (
72 {$(
73 store.register_late_pass($sess, false, box $name);
74 )*}
75 )
76 }
77
78 macro_rules! add_early_builtin {
79 ($sess:ident, $($name:ident),*,) => (
80 {$(
81 store.register_early_pass($sess, false, box $name);
82 )*}
83 )
84 }
85
86 macro_rules! add_builtin_with_new {
87 ($sess:ident, $($name:ident),*,) => (
88 {$(
89 store.register_late_pass($sess, false, box $name::new());
90 )*}
91 )
92 }
93
94 macro_rules! add_early_builtin_with_new {
95 ($sess:ident, $($name:ident),*,) => (
96 {$(
97 store.register_early_pass($sess, false, box $name::new());
98 )*}
99 )
100 }
101
102 macro_rules! add_lint_group {
103 ($sess:ident, $name:expr, $($lint:ident),*) => (
104 store.register_group($sess, false, $name, vec![$(LintId::of($lint)),*]);
105 )
106 }
107
108 add_early_builtin!(sess,
109 UnusedParens,
110 UnusedImportBraces,
111 AnonymousParameters,
112 UnusedDocComment,
113 BadRepr,
114 );
115
116 add_early_builtin_with_new!(sess,
117 DeprecatedAttr,
118 );
119
120 add_builtin!(sess,
121 HardwiredLints,
122 WhileTrue,
123 ImproperCTypes,
124 VariantSizeDifferences,
125 BoxPointers,
126 UnusedAttributes,
127 PathStatements,
128 UnusedResults,
129 NonCamelCaseTypes,
130 NonSnakeCase,
131 NonUpperCaseGlobals,
132 NonShorthandFieldPatterns,
133 UnsafeCode,
134 UnusedAllocation,
135 MissingCopyImplementations,
136 UnstableFeatures,
137 UnconditionalRecursion,
138 InvalidNoMangleItems,
139 PluginAsLibrary,
140 MutableTransmutes,
141 UnionsWithDropFields,
142 UnreachablePub,
143 TypeAliasBounds,
144 UnusedBrokenConst,
145 TrivialConstraints,
146 );
147
148 add_builtin_with_new!(sess,
149 TypeLimits,
150 MissingDoc,
151 MissingDebugImplementations,
152 );
153
154 add_lint_group!(sess,
155 "bad_style",
156 NON_CAMEL_CASE_TYPES,
157 NON_SNAKE_CASE,
158 NON_UPPER_CASE_GLOBALS);
159
160 add_lint_group!(sess,
161 "nonstandard_style",
162 NON_CAMEL_CASE_TYPES,
163 NON_SNAKE_CASE,
164 NON_UPPER_CASE_GLOBALS);
165
166 add_lint_group!(sess,
167 "unused",
168 UNUSED_IMPORTS,
169 UNUSED_VARIABLES,
170 UNUSED_ASSIGNMENTS,
171 DEAD_CODE,
172 UNUSED_MUT,
173 UNREACHABLE_CODE,
174 UNREACHABLE_PATTERNS,
175 UNUSED_MUST_USE,
176 UNUSED_UNSAFE,
177 PATH_STATEMENTS,
178 UNUSED_ATTRIBUTES,
179 UNUSED_MACROS,
180 UNUSED_ALLOCATION,
181 UNUSED_DOC_COMMENTS,
182 UNUSED_EXTERN_CRATES,
183 UNUSED_FEATURES,
184 UNUSED_LABELS,
185 UNUSED_PARENS);
186
187 add_lint_group!(sess,
188 "rust_2018_idioms",
189 BARE_TRAIT_OBJECTS,
190 UNREACHABLE_PUB,
191 UNUSED_EXTERN_CRATES);
192
193 // Guidelines for creating a future incompatibility lint:
194 //
195 // - Create a lint defaulting to warn as normal, with ideally the same error
196 // message you would normally give
197 // - Add a suitable reference, typically an RFC or tracking issue. Go ahead
198 // and include the full URL, sort items in ascending order of issue numbers.
199 // - Later, change lint to error
200 // - Eventually, remove lint
201 store.register_future_incompatible(sess,
202 vec![
203 FutureIncompatibleInfo {
204 id: LintId::of(PRIVATE_IN_PUBLIC),
205 reference: "issue #34537 <https://github.com/rust-lang/rust/issues/34537>",
206 edition: None,
207 },
208 FutureIncompatibleInfo {
209 id: LintId::of(PUB_USE_OF_PRIVATE_EXTERN_CRATE),
210 reference: "issue #34537 <https://github.com/rust-lang/rust/issues/34537>",
211 edition: None,
212 },
213 FutureIncompatibleInfo {
214 id: LintId::of(PATTERNS_IN_FNS_WITHOUT_BODY),
215 reference: "issue #35203 <https://github.com/rust-lang/rust/issues/35203>",
216 edition: None,
217 },
218 FutureIncompatibleInfo {
219 id: LintId::of(DUPLICATE_MACRO_EXPORTS),
220 reference: "issue #35896 <https://github.com/rust-lang/rust/issues/35896>",
221 edition: Some(Edition::Edition2018),
222 },
223 FutureIncompatibleInfo {
224 id: LintId::of(SAFE_EXTERN_STATICS),
225 reference: "issue #36247 <https://github.com/rust-lang/rust/issues/36247>",
226 edition: None,
227 },
228 FutureIncompatibleInfo {
229 id: LintId::of(INVALID_TYPE_PARAM_DEFAULT),
230 reference: "issue #36887 <https://github.com/rust-lang/rust/issues/36887>",
231 edition: None,
232 },
233 FutureIncompatibleInfo {
234 id: LintId::of(LEGACY_DIRECTORY_OWNERSHIP),
235 reference: "issue #37872 <https://github.com/rust-lang/rust/issues/37872>",
236 edition: None,
237 },
238 FutureIncompatibleInfo {
239 id: LintId::of(LEGACY_CONSTRUCTOR_VISIBILITY),
240 reference: "issue #39207 <https://github.com/rust-lang/rust/issues/39207>",
241 edition: None,
242 },
243 FutureIncompatibleInfo {
244 id: LintId::of(MISSING_FRAGMENT_SPECIFIER),
245 reference: "issue #40107 <https://github.com/rust-lang/rust/issues/40107>",
246 edition: None,
247 },
248 FutureIncompatibleInfo {
249 id: LintId::of(ILLEGAL_FLOATING_POINT_LITERAL_PATTERN),
250 reference: "issue #41620 <https://github.com/rust-lang/rust/issues/41620>",
251 edition: None,
252 },
253 FutureIncompatibleInfo {
254 id: LintId::of(ANONYMOUS_PARAMETERS),
255 reference: "issue #41686 <https://github.com/rust-lang/rust/issues/41686>",
256 edition: None,
257 },
258 FutureIncompatibleInfo {
259 id: LintId::of(PARENTHESIZED_PARAMS_IN_TYPES_AND_MODULES),
260 reference: "issue #42238 <https://github.com/rust-lang/rust/issues/42238>",
261 edition: None,
262 },
263 FutureIncompatibleInfo {
264 id: LintId::of(LATE_BOUND_LIFETIME_ARGUMENTS),
265 reference: "issue #42868 <https://github.com/rust-lang/rust/issues/42868>",
266 edition: None,
267 },
268 FutureIncompatibleInfo {
269 id: LintId::of(SAFE_PACKED_BORROWS),
270 reference: "issue #46043 <https://github.com/rust-lang/rust/issues/46043>",
271 edition: None,
272 },
273 FutureIncompatibleInfo {
274 id: LintId::of(INCOHERENT_FUNDAMENTAL_IMPLS),
275 reference: "issue #46205 <https://github.com/rust-lang/rust/issues/46205>",
276 edition: None,
277 },
278 FutureIncompatibleInfo {
279 id: LintId::of(TYVAR_BEHIND_RAW_POINTER),
280 reference: "issue #46906 <https://github.com/rust-lang/rust/issues/46906>",
281 edition: Some(Edition::Edition2018),
282 },
283 FutureIncompatibleInfo {
284 id: LintId::of(UNSTABLE_NAME_COLLISIONS),
285 reference: "issue #48919 <https://github.com/rust-lang/rust/issues/48919>",
286 edition: None,
287 // Note: this item represents future incompatibility of all unstable functions in the
288 // standard library, and thus should never be removed or changed to an error.
289 },
290 FutureIncompatibleInfo {
291 id: LintId::of(ABSOLUTE_PATHS_NOT_STARTING_WITH_CRATE),
292 reference: "issue TBD",
293 edition: Some(Edition::Edition2018),
294 },
295 FutureIncompatibleInfo {
296 id: LintId::of(DUPLICATE_ASSOCIATED_TYPE_BINDINGS),
297 reference: "issue #50589 <https://github.com/rust-lang/rust/issues/50589>",
298 edition: None,
299 },
300 ]);
301
302 // Register renamed and removed lints
303 store.register_renamed("single_use_lifetime", "single_use_lifetimes");
304 store.register_renamed("elided_lifetime_in_path", "elided_lifetimes_in_paths");
305 store.register_renamed("bare_trait_object", "bare_trait_objects");
306 store.register_renamed("unstable_name_collision", "unstable_name_collisions");
307 store.register_renamed("unused_doc_comment", "unused_doc_comments");
308 store.register_renamed("unknown_features", "unused_features");
309 store.register_removed("unsigned_negation", "replaced by negate_unsigned feature gate");
310 store.register_removed("negate_unsigned", "cast a signed value instead");
311 store.register_removed("raw_pointer_derive", "using derive with raw pointers is ok");
312 // This was renamed to raw_pointer_derive, which was then removed,
313 // so it is also considered removed
314 store.register_removed("raw_pointer_deriving", "using derive with raw pointers is ok");
315 store.register_removed("drop_with_repr_extern", "drop flags have been removed");
316 store.register_removed("fat_ptr_transmutes", "was accidentally removed back in 2014");
317 store.register_removed("deprecated_attr", "use `deprecated` instead");
318 store.register_removed("transmute_from_fn_item_types",
319 "always cast functions before transmuting them");
320 store.register_removed("hr_lifetime_in_assoc_type",
321 "converted into hard error, see https://github.com/rust-lang/rust/issues/33685");
322 store.register_removed("inaccessible_extern_crate",
323 "converted into hard error, see https://github.com/rust-lang/rust/issues/36886");
324 store.register_removed("super_or_self_in_global_path",
325 "converted into hard error, see https://github.com/rust-lang/rust/issues/36888");
326 store.register_removed("overlapping_inherent_impls",
327 "converted into hard error, see https://github.com/rust-lang/rust/issues/36889");
328 store.register_removed("illegal_floating_point_constant_pattern",
329 "converted into hard error, see https://github.com/rust-lang/rust/issues/36890");
330 store.register_removed("illegal_struct_or_enum_constant_pattern",
331 "converted into hard error, see https://github.com/rust-lang/rust/issues/36891");
332 store.register_removed("lifetime_underscore",
333 "converted into hard error, see https://github.com/rust-lang/rust/issues/36892");
334 store.register_removed("extra_requirement_in_impl",
335 "converted into hard error, see https://github.com/rust-lang/rust/issues/37166");
336 store.register_removed("legacy_imports",
337 "converted into hard error, see https://github.com/rust-lang/rust/issues/38260");
338 store.register_removed("coerce_never",
339 "converted into hard error, see https://github.com/rust-lang/rust/issues/48950");
340 store.register_removed("resolve_trait_on_defaulted_unit",
341 "converted into hard error, see https://github.com/rust-lang/rust/issues/48950");
342 }