]> git.proxmox.com Git - rustc.git/blob - src/librustc_lint/lib.rs
New upstream version 1.23.0+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 #![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 AutoImpl,
113 );
114
115 add_early_builtin_with_new!(sess,
116 DeprecatedAttr,
117 );
118
119 add_builtin!(sess,
120 HardwiredLints,
121 WhileTrue,
122 ImproperCTypes,
123 VariantSizeDifferences,
124 BoxPointers,
125 UnusedAttributes,
126 PathStatements,
127 UnusedResults,
128 NonCamelCaseTypes,
129 NonSnakeCase,
130 NonUpperCaseGlobals,
131 NonShorthandFieldPatterns,
132 UnsafeCode,
133 UnusedAllocation,
134 MissingCopyImplementations,
135 UnstableFeatures,
136 UnconditionalRecursion,
137 InvalidNoMangleItems,
138 PluginAsLibrary,
139 MutableTransmutes,
140 UnionsWithDropFields,
141 UnreachablePub,
142 );
143
144 add_builtin_with_new!(sess,
145 TypeLimits,
146 MissingDoc,
147 MissingDebugImplementations,
148 );
149
150 add_lint_group!(sess,
151 "bad_style",
152 NON_CAMEL_CASE_TYPES,
153 NON_SNAKE_CASE,
154 NON_UPPER_CASE_GLOBALS);
155
156 add_lint_group!(sess,
157 "unused",
158 UNUSED_IMPORTS,
159 UNUSED_VARIABLES,
160 UNUSED_ASSIGNMENTS,
161 DEAD_CODE,
162 UNUSED_MUT,
163 UNREACHABLE_CODE,
164 UNREACHABLE_PATTERNS,
165 UNUSED_MUST_USE,
166 UNUSED_UNSAFE,
167 PATH_STATEMENTS,
168 UNUSED_ATTRIBUTES,
169 UNUSED_MACROS,
170 UNUSED_ALLOCATION,
171 UNUSED_DOC_COMMENT,
172 UNUSED_EXTERN_CRATES,
173 UNUSED_FEATURES,
174 UNUSED_PARENS);
175
176 // Guidelines for creating a future incompatibility lint:
177 //
178 // - Create a lint defaulting to warn as normal, with ideally the same error
179 // message you would normally give
180 // - Add a suitable reference, typically an RFC or tracking issue. Go ahead
181 // and include the full URL, sort items in ascending order of issue numbers.
182 // - Later, change lint to error
183 // - Eventually, remove lint
184 store.register_future_incompatible(sess,
185 vec![
186 FutureIncompatibleInfo {
187 id: LintId::of(AUTO_IMPL),
188 reference: "issue #13231 <https://github.com/rust-lang/rust/issues/13231>",
189 },
190 FutureIncompatibleInfo {
191 id: LintId::of(PRIVATE_IN_PUBLIC),
192 reference: "issue #34537 <https://github.com/rust-lang/rust/issues/34537>",
193 },
194 FutureIncompatibleInfo {
195 id: LintId::of(PUB_USE_OF_PRIVATE_EXTERN_CRATE),
196 reference: "issue #34537 <https://github.com/rust-lang/rust/issues/34537>",
197 },
198 FutureIncompatibleInfo {
199 id: LintId::of(PATTERNS_IN_FNS_WITHOUT_BODY),
200 reference: "issue #35203 <https://github.com/rust-lang/rust/issues/35203>",
201 },
202 FutureIncompatibleInfo {
203 id: LintId::of(SAFE_EXTERN_STATICS),
204 reference: "issue #36247 <https://github.com/rust-lang/rust/issues/36247>",
205 },
206 FutureIncompatibleInfo {
207 id: LintId::of(INVALID_TYPE_PARAM_DEFAULT),
208 reference: "issue #36887 <https://github.com/rust-lang/rust/issues/36887>",
209 },
210 FutureIncompatibleInfo {
211 id: LintId::of(LEGACY_DIRECTORY_OWNERSHIP),
212 reference: "issue #37872 <https://github.com/rust-lang/rust/issues/37872>",
213 },
214 FutureIncompatibleInfo {
215 id: LintId::of(LEGACY_IMPORTS),
216 reference: "issue #38260 <https://github.com/rust-lang/rust/issues/38260>",
217 },
218 FutureIncompatibleInfo {
219 id: LintId::of(LEGACY_CONSTRUCTOR_VISIBILITY),
220 reference: "issue #39207 <https://github.com/rust-lang/rust/issues/39207>",
221 },
222 FutureIncompatibleInfo {
223 id: LintId::of(RESOLVE_TRAIT_ON_DEFAULTED_UNIT),
224 reference: "issue #39216 <https://github.com/rust-lang/rust/issues/39216>",
225 },
226 FutureIncompatibleInfo {
227 id: LintId::of(MISSING_FRAGMENT_SPECIFIER),
228 reference: "issue #40107 <https://github.com/rust-lang/rust/issues/40107>",
229 },
230 FutureIncompatibleInfo {
231 id: LintId::of(ILLEGAL_FLOATING_POINT_LITERAL_PATTERN),
232 reference: "issue #41620 <https://github.com/rust-lang/rust/issues/41620>",
233 },
234 FutureIncompatibleInfo {
235 id: LintId::of(ANONYMOUS_PARAMETERS),
236 reference: "issue #41686 <https://github.com/rust-lang/rust/issues/41686>",
237 },
238 FutureIncompatibleInfo {
239 id: LintId::of(PARENTHESIZED_PARAMS_IN_TYPES_AND_MODULES),
240 reference: "issue #42238 <https://github.com/rust-lang/rust/issues/42238>",
241 },
242 FutureIncompatibleInfo {
243 id: LintId::of(LATE_BOUND_LIFETIME_ARGUMENTS),
244 reference: "issue #42868 <https://github.com/rust-lang/rust/issues/42868>",
245 },
246 ]);
247
248 // Register renamed and removed lints
249 store.register_renamed("unknown_features", "unused_features");
250 store.register_removed("unsigned_negation", "replaced by negate_unsigned feature gate");
251 store.register_removed("negate_unsigned", "cast a signed value instead");
252 store.register_removed("raw_pointer_derive", "using derive with raw pointers is ok");
253 // This was renamed to raw_pointer_derive, which was then removed,
254 // so it is also considered removed
255 store.register_removed("raw_pointer_deriving", "using derive with raw pointers is ok");
256 store.register_removed("drop_with_repr_extern", "drop flags have been removed");
257 store.register_removed("fat_ptr_transmutes", "was accidentally removed back in 2014");
258 store.register_removed("deprecated_attr", "use `deprecated` instead");
259 store.register_removed("transmute_from_fn_item_types",
260 "always cast functions before transmuting them");
261 store.register_removed("hr_lifetime_in_assoc_type",
262 "converted into hard error, see https://github.com/rust-lang/rust/issues/33685");
263 store.register_removed("inaccessible_extern_crate",
264 "converted into hard error, see https://github.com/rust-lang/rust/issues/36886");
265 store.register_removed("super_or_self_in_global_path",
266 "converted into hard error, see https://github.com/rust-lang/rust/issues/36888");
267 store.register_removed("overlapping_inherent_impls",
268 "converted into hard error, see https://github.com/rust-lang/rust/issues/36889");
269 store.register_removed("illegal_floating_point_constant_pattern",
270 "converted into hard error, see https://github.com/rust-lang/rust/issues/36890");
271 store.register_removed("illegal_struct_or_enum_constant_pattern",
272 "converted into hard error, see https://github.com/rust-lang/rust/issues/36891");
273 store.register_removed("lifetime_underscore",
274 "converted into hard error, see https://github.com/rust-lang/rust/issues/36892");
275 store.register_removed("extra_requirement_in_impl",
276 "converted into hard error, see https://github.com/rust-lang/rust/issues/37166");
277 }