]>
Commit | Line | Data |
---|---|---|
c34b1796 AL |
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 | |
92a42be0 | 16 | //! available in `rustc::lint` and `rustc_plugin` respectively. |
c34b1796 AL |
17 | //! |
18 | //! # Note | |
19 | //! | |
20 | //! This API is completely unstable and subject to change. | |
21 | ||
e9174d1e | 22 | #![doc(html_logo_url = "https://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png", |
62682a34 | 23 | html_favicon_url = "https://doc.rust-lang.org/favicon.ico", |
e9174d1e | 24 | html_root_url = "https://doc.rust-lang.org/nightly/")] |
32a655c1 | 25 | #![deny(warnings)] |
c34b1796 | 26 | |
62682a34 | 27 | #![cfg_attr(test, feature(test))] |
c34b1796 AL |
28 | #![feature(box_patterns)] |
29 | #![feature(box_syntax)] | |
8bb4bdeb | 30 | #![feature(i128_type)] |
abe05a73 | 31 | #![feature(macro_vis_matcher)] |
c34b1796 AL |
32 | #![feature(quote)] |
33 | #![feature(rustc_diagnostic_macros)] | |
c1a9b12d | 34 | #![feature(slice_patterns)] |
7cac9316 | 35 | |
cc61c64b | 36 | #[macro_use] |
c34b1796 AL |
37 | extern crate syntax; |
38 | #[macro_use] | |
39 | extern crate rustc; | |
40 | #[macro_use] | |
41 | extern crate log; | |
54a0048b | 42 | extern crate rustc_const_eval; |
3157f602 | 43 | extern crate syntax_pos; |
c34b1796 | 44 | |
3b2f2976 XL |
45 | use rustc::lint; |
46 | use rustc::middle; | |
47 | use rustc::session; | |
48 | use rustc::util; | |
c34b1796 AL |
49 | |
50 | use session::Session; | |
51 | use lint::LintId; | |
9cc50fc6 | 52 | use lint::FutureIncompatibleInfo; |
c34b1796 | 53 | |
b039eaaf | 54 | mod bad_style; |
c34b1796 | 55 | mod builtin; |
b039eaaf SL |
56 | mod types; |
57 | mod unused; | |
58 | ||
59 | use bad_style::*; | |
60 | use builtin::*; | |
61 | use types::*; | |
62 | use unused::*; | |
c34b1796 AL |
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 | {$( | |
b039eaaf SL |
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); | |
c34b1796 AL |
80 | )*} |
81 | ) | |
82 | } | |
83 | ||
84 | macro_rules! add_builtin_with_new { | |
85 | ($sess:ident, $($name:ident),*,) => ( | |
86 | {$( | |
b039eaaf | 87 | store.register_late_pass($sess, false, box $name::new()); |
c34b1796 AL |
88 | )*} |
89 | ) | |
90 | } | |
91 | ||
c30ab7b3 SL |
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 | ||
c34b1796 AL |
100 | macro_rules! add_lint_group { |
101 | ($sess:ident, $name:expr, $($lint:ident),*) => ( | |
b039eaaf | 102 | store.register_group($sess, false, $name, vec![$(LintId::of($lint)),*]); |
c34b1796 AL |
103 | ) |
104 | } | |
105 | ||
b039eaaf SL |
106 | add_early_builtin!(sess, |
107 | UnusedParens, | |
476ff2be | 108 | UnusedImportBraces, |
7cac9316 XL |
109 | AnonymousParameters, |
110 | IllegalFloatLiteralPattern, | |
3b2f2976 | 111 | UnusedDocComment, |
abe05a73 | 112 | AutoImpl, |
b039eaaf SL |
113 | ); |
114 | ||
c30ab7b3 SL |
115 | add_early_builtin_with_new!(sess, |
116 | DeprecatedAttr, | |
117 | ); | |
118 | ||
c34b1796 AL |
119 | add_builtin!(sess, |
120 | HardwiredLints, | |
121 | WhileTrue, | |
122 | ImproperCTypes, | |
5bcae85e | 123 | VariantSizeDifferences, |
c34b1796 AL |
124 | BoxPointers, |
125 | UnusedAttributes, | |
126 | PathStatements, | |
127 | UnusedResults, | |
128 | NonCamelCaseTypes, | |
129 | NonSnakeCase, | |
130 | NonUpperCaseGlobals, | |
c34b1796 | 131 | NonShorthandFieldPatterns, |
c34b1796 | 132 | UnsafeCode, |
c34b1796 AL |
133 | UnusedAllocation, |
134 | MissingCopyImplementations, | |
135 | UnstableFeatures, | |
c34b1796 AL |
136 | UnconditionalRecursion, |
137 | InvalidNoMangleItems, | |
138 | PluginAsLibrary, | |
bd371182 | 139 | MutableTransmutes, |
9e0c209e | 140 | UnionsWithDropFields, |
abe05a73 | 141 | UnreachablePub, |
c34b1796 AL |
142 | ); |
143 | ||
144 | add_builtin_with_new!(sess, | |
145 | TypeLimits, | |
c34b1796 AL |
146 | MissingDoc, |
147 | MissingDebugImplementations, | |
148 | ); | |
149 | ||
c30ab7b3 SL |
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, | |
32a655c1 | 164 | UNREACHABLE_PATTERNS, |
c30ab7b3 SL |
165 | UNUSED_MUST_USE, |
166 | UNUSED_UNSAFE, | |
167 | PATH_STATEMENTS, | |
7cac9316 | 168 | UNUSED_ATTRIBUTES, |
abe05a73 XL |
169 | UNUSED_MACROS, |
170 | UNUSED_ALLOCATION, | |
171 | UNUSED_DOC_COMMENT, | |
172 | UNUSED_EXTERN_CRATES, | |
173 | UNUSED_FEATURES, | |
174 | UNUSED_PARENS); | |
c34b1796 | 175 | |
9cc50fc6 SL |
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 | |
7cac9316 | 181 | // and include the full URL, sort items in ascending order of issue numbers. |
9cc50fc6 SL |
182 | // - Later, change lint to error |
183 | // - Eventually, remove lint | |
c30ab7b3 SL |
184 | store.register_future_incompatible(sess, |
185 | vec![ | |
abe05a73 XL |
186 | FutureIncompatibleInfo { |
187 | id: LintId::of(AUTO_IMPL), | |
188 | reference: "issue #13231 <https://github.com/rust-lang/rust/issues/13231>", | |
189 | }, | |
9cc50fc6 SL |
190 | FutureIncompatibleInfo { |
191 | id: LintId::of(PRIVATE_IN_PUBLIC), | |
5bcae85e | 192 | reference: "issue #34537 <https://github.com/rust-lang/rust/issues/34537>", |
9cc50fc6 | 193 | }, |
041b39d2 XL |
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 | }, | |
7453a54e | 198 | FutureIncompatibleInfo { |
7cac9316 XL |
199 | id: LintId::of(PATTERNS_IN_FNS_WITHOUT_BODY), |
200 | reference: "issue #35203 <https://github.com/rust-lang/rust/issues/35203>", | |
8bb4bdeb | 201 | }, |
9e0c209e SL |
202 | FutureIncompatibleInfo { |
203 | id: LintId::of(SAFE_EXTERN_STATICS), | |
7cac9316 | 204 | reference: "issue #36247 <https://github.com/rust-lang/rust/issues/36247>", |
c30ab7b3 SL |
205 | }, |
206 | FutureIncompatibleInfo { | |
7cac9316 XL |
207 | id: LintId::of(INVALID_TYPE_PARAM_DEFAULT), |
208 | reference: "issue #36887 <https://github.com/rust-lang/rust/issues/36887>", | |
c30ab7b3 | 209 | }, |
476ff2be SL |
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 | }, | |
8bb4bdeb XL |
218 | FutureIncompatibleInfo { |
219 | id: LintId::of(LEGACY_CONSTRUCTOR_VISIBILITY), | |
220 | reference: "issue #39207 <https://github.com/rust-lang/rust/issues/39207>", | |
221 | }, | |
7cac9316 XL |
222 | FutureIncompatibleInfo { |
223 | id: LintId::of(RESOLVE_TRAIT_ON_DEFAULTED_UNIT), | |
224 | reference: "issue #39216 <https://github.com/rust-lang/rust/issues/39216>", | |
225 | }, | |
8bb4bdeb XL |
226 | FutureIncompatibleInfo { |
227 | id: LintId::of(MISSING_FRAGMENT_SPECIFIER), | |
228 | reference: "issue #40107 <https://github.com/rust-lang/rust/issues/40107>", | |
229 | }, | |
7cac9316 XL |
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>", | |
3b2f2976 XL |
241 | }, |
242 | FutureIncompatibleInfo { | |
243 | id: LintId::of(LATE_BOUND_LIFETIME_ARGUMENTS), | |
244 | reference: "issue #42868 <https://github.com/rust-lang/rust/issues/42868>", | |
245 | }, | |
9cc50fc6 | 246 | ]); |
92a42be0 | 247 | |
92a42be0 | 248 | // Register renamed and removed lints |
c34b1796 | 249 | store.register_renamed("unknown_features", "unused_features"); |
abe05a73 | 250 | store.register_removed("unsigned_negation", "replaced by negate_unsigned feature gate"); |
9cc50fc6 | 251 | store.register_removed("negate_unsigned", "cast a signed value instead"); |
92a42be0 SL |
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 | |
abe05a73 | 255 | store.register_removed("raw_pointer_deriving", "using derive with raw pointers is ok"); |
9e0c209e | 256 | store.register_removed("drop_with_repr_extern", "drop flags have been removed"); |
abe05a73 XL |
257 | store.register_removed("fat_ptr_transmutes", "was accidentally removed back in 2014"); |
258 | store.register_removed("deprecated_attr", "use `deprecated` instead"); | |
8bb4bdeb XL |
259 | store.register_removed("transmute_from_fn_item_types", |
260 | "always cast functions before transmuting them"); | |
7cac9316 XL |
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"); | |
abe05a73 XL |
275 | store.register_removed("extra_requirement_in_impl", |
276 | "converted into hard error, see https://github.com/rust-lang/rust/issues/37166"); | |
c34b1796 | 277 | } |