| // 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<foo>() {} // 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() {} |