|  | // 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>) {} // dyn_drop | 
|  | fn verify_no_warnings() { | 
|  | discriminant::<i32>(&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<dyn Drop>) {} // 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<dyn Drop>) {} //~ ERROR types that do not implement `Drop` | 
|  |  | 
|  | #[deny(enum_intrinsics_non_enums)] | 
|  | fn assoc_fn() { discriminant::<i32>(&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::<i32>(&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::<i32>(&123); //~ ERROR the return value of | 
|  | } | 
|  | } | 
|  | match f { | 
|  | #[deny(enum_intrinsics_non_enums)] | 
|  | Match{f1} => { | 
|  | discriminant::<i32>(&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::<i32>(&123); //~ ERROR the return value of | 
|  | } | 
|  | let block_tail: () = { | 
|  | #[deny(enum_intrinsics_non_enums)] | 
|  | discriminant::<i32>(&123); //~ ERROR the return value of | 
|  | }; | 
|  |  | 
|  | // Before expression as a statement. | 
|  | #[deny(enum_intrinsics_non_enums)] | 
|  | discriminant::<i32>(&123); //~ ERROR the return value of | 
|  |  | 
|  | [#[deny(enum_intrinsics_non_enums)] discriminant::<i32>(&123)]; //~ ERROR the return value of | 
|  | (#[deny(enum_intrinsics_non_enums)] discriminant::<i32>(&123),); //~ ERROR the return value of | 
|  | fn call(p: Discriminant<i32>) {} | 
|  | call(#[deny(enum_intrinsics_non_enums)] discriminant::<i32>(&123)); //~ ERROR the return value of | 
|  | struct TupleStruct(Discriminant<i32>); | 
|  | TupleStruct(#[deny(enum_intrinsics_non_enums)] discriminant::<i32>(&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() {} |