]> git.proxmox.com Git - rustc.git/blame - src/librustc_lint/lib.rs
New upstream version 1.23.0+dfsg1
[rustc.git] / src / librustc_lint / lib.rs
CommitLineData
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
37extern crate syntax;
38#[macro_use]
39extern crate rustc;
40#[macro_use]
41extern crate log;
54a0048b 42extern crate rustc_const_eval;
3157f602 43extern crate syntax_pos;
c34b1796 44
3b2f2976
XL
45use rustc::lint;
46use rustc::middle;
47use rustc::session;
48use rustc::util;
c34b1796
AL
49
50use session::Session;
51use lint::LintId;
9cc50fc6 52use lint::FutureIncompatibleInfo;
c34b1796 53
b039eaaf 54mod bad_style;
c34b1796 55mod builtin;
b039eaaf
SL
56mod types;
57mod unused;
58
59use bad_style::*;
60use builtin::*;
61use types::*;
62use 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`).
67pub 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}