]> git.lizzy.rs Git - rust.git/blob - tests/ui/lint/lint-enum-intrinsics-non-enums.rs
Rollup merge of #106321 - compiler-errors:delayed-bug-backtrace, r=Nilstrieb
[rust.git] / tests / ui / lint / lint-enum-intrinsics-non-enums.rs
1 // Test the enum_intrinsics_non_enums lint.
2
3 #![feature(variant_count)]
4
5 use std::mem::{discriminant, variant_count};
6
7 enum SomeEnum {
8     A,
9     B,
10 }
11
12 struct SomeStruct;
13
14 fn generic_discriminant<T>(v: &T) {
15     discriminant::<T>(v);
16 }
17
18 fn generic_variant_count<T>() -> usize {
19     variant_count::<T>()
20 }
21
22 fn test_discriminant() {
23     discriminant(&SomeEnum::A);
24     generic_discriminant(&SomeEnum::B);
25
26     discriminant(&());
27     //~^ error: the return value of `mem::discriminant` is unspecified when called with a non-enum type
28
29     discriminant(&&SomeEnum::B);
30     //~^ error: the return value of `mem::discriminant` is unspecified when called with a non-enum type
31
32     discriminant(&SomeStruct);
33     //~^ error: the return value of `mem::discriminant` is unspecified when called with a non-enum type
34
35     discriminant(&123u32);
36     //~^ error: the return value of `mem::discriminant` is unspecified when called with a non-enum type
37
38     discriminant(&&123i8);
39     //~^ error: the return value of `mem::discriminant` is unspecified when called with a non-enum type
40 }
41
42 fn test_variant_count() {
43     variant_count::<SomeEnum>();
44     generic_variant_count::<SomeEnum>();
45
46     variant_count::<&str>();
47     //~^ error: the return value of `mem::variant_count` is unspecified when called with a non-enum type
48
49     variant_count::<*const u8>();
50     //~^ error: the return value of `mem::variant_count` is unspecified when called with a non-enum type
51
52     variant_count::<()>();
53     //~^ error: the return value of `mem::variant_count` is unspecified when called with a non-enum type
54
55     variant_count::<&SomeEnum>();
56     //~^ error: the return value of `mem::variant_count` is unspecified when called with a non-enum type
57 }
58
59 fn main() {
60     test_discriminant();
61     test_variant_count();
62
63     // The lint ignores cases where the type is generic, so these should be
64     // allowed even though their return values are unspecified
65     generic_variant_count::<SomeStruct>();
66     generic_discriminant::<SomeStruct>(&SomeStruct);
67 }