Deny-by-default lints

These lints are all set to the 'deny' level by default.

exceeding-bitshifts

This lint detects that a shift exceeds the type's number of bits. Some example code that triggers this lint:

1_i32 << 32;

This will produce:

error: bitshift exceeds the type's number of bits --> src/main.rs:2:5 | 2 | 1_i32 << 32; | ^^^^^^^^^^^ |

invalid-type-param-default

This lint detects type parameter default erroneously allowed in invalid location. Some example code that triggers this lint:

fn foo<T=i32>(t: T) {}

This will produce:

error: defaults for type parameters are only allowed in `struct`, `enum`, `type`, or `trait` definitions. --> src/main.rs:4:8 | 4 | fn foo<T=i32>(t: T) {} | ^ | = note: #[deny(invalid_type_param_default)] on by default = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see issue #36887 <https://github.com/rust-lang/rust/issues/36887>

legacy-constructor-visibility

RFC 1506 modified some visibility rules, and changed the visibility of struct constructors. Some example code that triggers this lint:

mod m { pub struct S(u8); fn f() { // this is trying to use S from the 'use' line, but because the `u8` is // not pub, it is private ::S; } } use m::S;

This will produce:

error: private struct constructors are not usable through re-exports in outer modules --> src/main.rs:5:9 | 5 | ::S; | ^^^ | = note: #[deny(legacy_constructor_visibility)] on by default = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see issue #39207 <https://github.com/rust-lang/rust/issues/39207>

legacy-directory-ownership

The legacy_directory_ownership warning is issued when

  • There is a non-inline module with a #[path] attribute (e.g. #[path = "foo.rs"] mod bar;),
  • The module's file ("foo.rs" in the above example) is not named "mod.rs", and
  • The module's file contains a non-inline child module without a #[path] attribute.

The warning can be fixed by renaming the parent module to "mod.rs" and moving it into its own directory if appropriate.

missing-fragment-specifier

The missing_fragment_specifier warning is issued when an unused pattern in a macro_rules! macro definition has a meta-variable (e.g. $e) that is not followed by a fragment specifier (e.g. :expr).

This warning can always be fixed by removing the unused pattern in the macro_rules! macro definition.

mutable-transmutes

This lint catches transmuting from &T to &mut T because it is undefined behavior. Some example code that triggers this lint:

unsafe { let y = std::mem::transmute::<&i32, &mut i32>(&5); }

This will produce:

error: mutating transmuted &mut T from &T may cause undefined behavior, consider instead using an UnsafeCell --> src/main.rs:3:17 | 3 | let y = std::mem::transmute::<&i32, &mut i32>(&5); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |

no-mangle-const-items

This lint detects any const items with the #[no_mangle] attribute. Constants do not have their symbols exported, and therefore, this probably means you meant to use a static, not a const. Some example code that triggers this lint:

#[no_mangle] const FOO: i32 = 5;

This will produce:

error: const items should never be #[no_mangle] --> src/main.rs:3:1 | 3 | const FOO: i32 = 5; | -----^^^^^^^^^^^^^^ | | | help: try a static value: `pub static` |

overflowing-literals

This lint detects literal out of range for its type. Some example code that triggers this lint:

let x: u8 = 1000;

This will produce:

error: literal out of range for u8 --> src/main.rs:2:17 | 2 | let x: u8 = 1000; | ^^^^ |

parenthesized-params-in-types-and-modules

This lint detects incorrect parentheses. Some example code that triggers this lint:

let x = 5 as usize();

This will produce:

error: parenthesized parameters may only be used with a trait --> src/main.rs:2:21 | 2 | let x = 5 as usize(); | ^^ | = note: #[deny(parenthesized_params_in_types_and_modules)] on by default = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = note: for more information, see issue #42238 <https://github.com/rust-lang/rust/issues/42238>

To fix it, remove the ()s.

pub-use-of-private-extern-crate

This lint detects a specific situation of re-exporting a private extern crate;

safe-extern-statics

In older versions of Rust, there was a soundness issue where extern statics were allowed to be accessed in safe code. This lint now catches and denies this kind of code.

unknown-crate-types

This lint detects an unknown crate type found in a #[crate_type] directive. Some example code that triggers this lint:

#![crate_type="lol"]

This will produce:

error: invalid `crate_type` value --> src/lib.rs:1:1 | 1 | #![crate_type="lol"] | ^^^^^^^^^^^^^^^^^^^^ |