// Tests that lint levels can be set for early lints. #![allow(non_camel_case_types, unsafe_code, while_true, unused_parens)] // The following is a check of the lints used here to verify they do not warn // when allowed. fn verify_no_warnings() { type non_camel_type = i32; // non_camel_case_types struct NON_CAMEL_IS_ALLOWED; // non_camel_case_types unsafe {} // unsafe_code enum Enum { VARIANT_CAMEL // non_camel_case_types } fn generics() {} // non_camel_case_types while true {} // while_true type T = (i32); // unused_parens } // ################## Types #[deny(non_camel_case_types)] type type_outer = i32; //~ ERROR type `type_outer` should have an upper camel case name type BareFnPtr = fn(#[deny(unused_parens)](i32)); //~ ERROR unnecessary parentheses around type // There aren't any early lints that currently apply to the variadic spot. // type BareFnPtrVariadic = extern "C" fn(i32, #[deny()]...); // ################## Items #[deny(non_camel_case_types)] struct ITEM_OUTER; //~ ERROR type `ITEM_OUTER` should have an upper camel case name mod module_inner { #![deny(unsafe_code)] fn f() { unsafe {} //~ ERROR usage of an `unsafe` block } } struct Associated; impl Associated { #![deny(unsafe_code)] fn inherent_denied_from_inner() { unsafe {} } //~ usage of an `unsafe` block #[deny(while_true)] fn inherent_fn() { while true {} } //~ ERROR denote infinite loops with #[deny(while_true)] const INHERENT_CONST: i32 = {while true {} 1}; //~ ERROR denote infinite loops with } trait trait_inner { //~ ERROR trait `trait_inner` should have an upper camel case name #![deny(non_camel_case_types)] } trait AssociatedTrait { #![deny(unsafe_code)] fn denied_from_inner() { unsafe {} } //~ ERROR usage of an `unsafe` block #[deny(while_true)] fn assoc_fn() { while true {} } //~ ERROR denote infinite loops with #[deny(while_true)] const ASSOC_CONST: i32 = {while true {} 1}; //~ ERROR denote infinite loops with #[deny(non_camel_case_types)] type assoc_type; //~ ERROR associated type `assoc_type` should have an upper camel case name } impl AssociatedTrait for Associated { #![deny(unsafe_code)] fn denied_from_inner() { unsafe {} } //~ ERROR usage of an `unsafe` block #[deny(while_true)] fn assoc_fn() { while true {} } //~ ERROR denote infinite loops with #[deny(while_true)] const ASSOC_CONST: i32 = {while true {} 1}; //~ ERROR denote infinite loops with #[deny(unused_parens)] type assoc_type = (i32); //~ ERROR unnecessary parentheses around type } struct StructFields { #[deny(unused_parens)]f1: (i32), //~ ERROR unnecessary parentheses around type } struct StructTuple(#[deny(unused_parens)](i32)); //~ ERROR unnecessary parentheses around type enum Enum { #[deny(non_camel_case_types)] VARIANT_CAMEL, //~ ERROR variant `VARIANT_CAMEL` should have an upper camel case name } extern "C" { #![deny(unused_parens)] fn foreign_denied_from_inner(x: (i32)); //~ ERROR unnecessary parentheses around type } extern "C" { #[deny(unused_parens)] fn foreign_denied_from_outer(x: (i32)); //~ ERROR unnecessary parentheses around type } fn function(#[deny(unused_parens)] param: (i32)) {} //~ ERROR unnecessary parentheses around type fn generics<#[deny(non_camel_case_types)]foo>() {} //~ ERROR type parameter `foo` should have an upper camel case name // ################## Statements fn statements() { #[deny(unused_parens)] let x = (1); //~ ERROR unnecessary parentheses around assigned value } // ################## Expressions fn expressions() { let closure = |#[deny(unused_parens)] param: (i32)| {}; //~ ERROR unnecessary parentheses around type struct Match{f1: i32} // Strangely unused_parens doesn't fire with {f1: (123)} let f = Match{#[deny(unused_parens)]f1: {(123)}}; //~ ERROR unnecessary parentheses around block return value match f { #![deny(unsafe_code)] #[deny(while_true)] Match{f1} => { unsafe {} //~ ERROR usage of an `unsafe` block while true {} //~ ERROR denote infinite loops with } } match f { #[deny(ellipsis_inclusive_range_patterns)] Match{f1: 0...100} => {} //~^ ERROR range patterns are deprecated //~| WARNING this is accepted in the current edition _ => {} } // Statement Block { #![deny(unsafe_code)] unsafe {} //~ ERROR usage of an `unsafe` block } let block_tail = { #[deny(unsafe_code)] unsafe {} //~ ERROR usage of an `unsafe` block }; // Before expression as a statement. #[deny(unsafe_code)] unsafe {}; //~ ERROR usage of an `unsafe` block [#[deny(unsafe_code)] unsafe {123}]; //~ ERROR usage of an `unsafe` block (#[deny(unsafe_code)] unsafe {123},); //~ ERROR usage of an `unsafe` block fn call(p: i32) {} call(#[deny(unsafe_code)] unsafe {123}); //~ ERROR usage of an `unsafe` block struct TupleStruct(i32); TupleStruct(#[deny(unsafe_code)] unsafe {123}); //~ ERROR usage of an `unsafe` block } // ################## Patterns fn patterns() { struct PatField{f1: i32, f2: i32}; let f = PatField{f1: 1, f2: 2}; match f { PatField { #[deny(ellipsis_inclusive_range_patterns)] f1: 0...100, //~^ ERROR range patterns are deprecated //~| WARNING this is accepted in the current edition .. } => {} _ => {} } } fn main() {}