// Tests that lint levels can be set for late lints. #![allow( non_snake_case, overflowing_literals, missing_docs, dyn_drop, enum_intrinsics_non_enums, clashing_extern_declarations )] extern crate core; use core::mem::{Discriminant, discriminant}; // The following is a check of the lints used here to verify they do not warn // when allowed. pub fn missing_docs_allowed() {} // missing_docs fn dyn_drop_allowed(_x: Box) {} // dyn_drop fn verify_no_warnings() { discriminant::(&123); // enum_intrinsics_non_enums let x: u8 = 1000; // overflowing_literals let NON_SNAKE_CASE = 1; // non_snake_case } mod clashing_extern_allowed { extern "C" { fn extern_allowed(); } } extern "C" { fn extern_allowed(_: i32); // clashing_extern_declarations } // ################## Types #[deny(missing_docs)] pub type MissingDocType = i32; //~ ERROR missing documentation for a type alias // There aren't any late lints that I can find that can be easily used with types. // type BareFnPtr = fn(#[deny()]i32); // type BareFnPtrVariadic = extern "C" fn(i32, #[deny()]...); // ################## Items #[deny(missing_docs)] pub struct ItemOuter; //~ ERROR missing documentation for a struct pub mod module_inner { //~ ERROR missing documentation for a module #![deny(missing_docs)] pub fn missing_inner() {} //~ ERROR missing documentation for a function } pub struct Associated; impl Associated { #![deny(missing_docs)] pub fn inherent_denied_from_inner() {} //~ ERROR missing documentation for an associated function } impl Associated { #[deny(missing_docs)] pub fn inherent_fn() {} //~ ERROR missing documentation for an associated function #[deny(missing_docs)] pub const INHERENT_CONST: i32 = 1; //~ ERROR missing documentation for an associated constant } pub trait TraitInner { //~ ERROR missing documentation for a trait #![deny(missing_docs)] } pub trait AssociatedTraitInner { //~ ERROR missing documentation for a trait #![deny(missing_docs)] fn denied_from_inner() {} //~ ERROR missing documentation for an associated function } pub trait AssociatedTrait { fn denied_from_inner(_x: Box) {} // Used below #[deny(missing_docs)] fn assoc_fn() {} //~ ERROR missing documentation for an associated function #[deny(missing_docs)] const ASSOC_CONST: u8 = 1; //~ ERROR missing documentation for an associated constant #[deny(missing_docs)] type AssocType; //~ ERROR missing documentation for an associated type } struct Foo; impl AssociatedTrait for Associated { #![deny(dyn_drop)] fn denied_from_inner(_x: Box) {} //~ ERROR types that do not implement `Drop` #[deny(enum_intrinsics_non_enums)] fn assoc_fn() { discriminant::(&123); } //~ ERROR the return value of #[deny(overflowing_literals)] const ASSOC_CONST: u8 = 1000; //~ ERROR literal out of range type AssocType = i32; } // There aren't any late lints that can apply to a field that I can find. // non_snake_case doesn't work on fields // struct StructFields { // #[deny()]f1: i32, // } // struct StructTuple(#[deny()]i32); pub enum Enum { #[deny(missing_docs)] Variant1, //~ ERROR missing documentation for a variant } mod clashing_extern { extern "C" { fn clashing1(); fn clashing2(); } } extern "C" { #![deny(clashing_extern_declarations)] fn clashing1(_: i32); //~ ERROR `clashing1` redeclared with a different signature } extern "C" { #[deny(clashing_extern_declarations)] fn clashing2(_: i32); //~ ERROR `clashing2` redeclared with a different signature } fn function(#[deny(non_snake_case)] PARAM: i32) {} //~ ERROR variable `PARAM` should have a snake case name // There aren't any late lints that can apply to generics that I can find. // fn generics<#[deny()]T>() {} // ################## Statements fn statements() { #[deny(enum_intrinsics_non_enums)] let _ = discriminant::(&123); //~ ERROR the return value of } // ################## Expressions fn expressions() { let closure = |#[deny(non_snake_case)] PARAM: i32| {}; //~ ERROR variable `PARAM` should have a snake case name struct Match{f1: i32} // I can't find any late lints for patterns. // let f = Match{#[deny()]f1: 123}; let f = Match{f1: 123}; match f { #![deny(enum_intrinsics_non_enums)] Match{f1} => { discriminant::(&123); //~ ERROR the return value of } } match f { #[deny(enum_intrinsics_non_enums)] Match{f1} => { discriminant::(&123); //~ ERROR the return value of } } match 123 { #[deny(non_snake_case)] ARM_VAR => {} //~ ERROR variable `ARM_VAR` should have a snake case name } // Statement Block { #![deny(enum_intrinsics_non_enums)] discriminant::(&123); //~ ERROR the return value of } let block_tail: () = { #[deny(enum_intrinsics_non_enums)] discriminant::(&123); //~ ERROR the return value of }; // Before expression as a statement. #[deny(enum_intrinsics_non_enums)] discriminant::(&123); //~ ERROR the return value of [#[deny(enum_intrinsics_non_enums)] discriminant::(&123)]; //~ ERROR the return value of (#[deny(enum_intrinsics_non_enums)] discriminant::(&123),); //~ ERROR the return value of fn call(p: Discriminant) {} call(#[deny(enum_intrinsics_non_enums)] discriminant::(&123)); //~ ERROR the return value of struct TupleStruct(Discriminant); TupleStruct(#[deny(enum_intrinsics_non_enums)] discriminant::(&123)); //~ ERROR the return value of } // ################## Patterns fn patterns() { // There aren't any late lints that I can find that apply to pattern fields. // // struct PatField{f1: i32, f2: i32}; // let f = PatField{f1: 1, f2: 2}; // let PatField{#[deny()]f1, #[deny()]..} = f; } fn main() {}