|  | // Test the enum_intrinsics_non_enums lint. | 
|  |  | 
|  | #![feature(variant_count)] | 
|  |  | 
|  | use std::mem::{discriminant, variant_count}; | 
|  |  | 
|  | enum SomeEnum { | 
|  | A, | 
|  | B, | 
|  | } | 
|  |  | 
|  | struct SomeStruct; | 
|  |  | 
|  | fn generic_discriminant<T>(v: &T) { | 
|  | discriminant::<T>(v); | 
|  | } | 
|  |  | 
|  | fn generic_variant_count<T>() -> usize { | 
|  | variant_count::<T>() | 
|  | } | 
|  |  | 
|  | fn test_discriminant() { | 
|  | discriminant(&SomeEnum::A); | 
|  | generic_discriminant(&SomeEnum::B); | 
|  |  | 
|  | discriminant(&()); | 
|  | //~^ error: the return value of `mem::discriminant` is unspecified when called with a non-enum type | 
|  |  | 
|  | discriminant(&&SomeEnum::B); | 
|  | //~^ error: the return value of `mem::discriminant` is unspecified when called with a non-enum type | 
|  |  | 
|  | discriminant(&SomeStruct); | 
|  | //~^ error: the return value of `mem::discriminant` is unspecified when called with a non-enum type | 
|  |  | 
|  | discriminant(&123u32); | 
|  | //~^ error: the return value of `mem::discriminant` is unspecified when called with a non-enum type | 
|  |  | 
|  | discriminant(&&123i8); | 
|  | //~^ error: the return value of `mem::discriminant` is unspecified when called with a non-enum type | 
|  | } | 
|  |  | 
|  | fn test_variant_count() { | 
|  | variant_count::<SomeEnum>(); | 
|  | generic_variant_count::<SomeEnum>(); | 
|  |  | 
|  | variant_count::<&str>(); | 
|  | //~^ error: the return value of `mem::variant_count` is unspecified when called with a non-enum type | 
|  |  | 
|  | variant_count::<*const u8>(); | 
|  | //~^ error: the return value of `mem::variant_count` is unspecified when called with a non-enum type | 
|  |  | 
|  | variant_count::<()>(); | 
|  | //~^ error: the return value of `mem::variant_count` is unspecified when called with a non-enum type | 
|  |  | 
|  | variant_count::<&SomeEnum>(); | 
|  | //~^ error: the return value of `mem::variant_count` is unspecified when called with a non-enum type | 
|  | } | 
|  |  | 
|  | fn main() { | 
|  | test_discriminant(); | 
|  | test_variant_count(); | 
|  |  | 
|  | // The lint ignores cases where the type is generic, so these should be | 
|  | // allowed even though their return values are unspecified | 
|  | generic_variant_count::<SomeStruct>(); | 
|  | generic_discriminant::<SomeStruct>(&SomeStruct); | 
|  | } |