rust/tests/ui/rfcs/rfc-2008-non-exhaustive/enum.rs

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

70 lines
1.8 KiB
Rust
Raw Normal View History

2017-11-03 14:15:15 -05:00
// aux-build:enums.rs
extern crate enums;
2019-11-30 09:51:26 -06:00
use enums::{EmptyNonExhaustiveEnum, NonExhaustiveEnum};
fn empty(x: EmptyNonExhaustiveEnum) {
match x {} //~ ERROR type `EmptyNonExhaustiveEnum` is non-empty
2019-11-30 09:51:26 -06:00
match x {
_ => {}, // ok
}
}
2017-11-03 14:15:15 -05:00
fn main() {
let enum_unit = NonExhaustiveEnum::Unit;
match enum_unit {
//~^ ERROR non-exhaustive patterns: `_` not covered [E0004]
NonExhaustiveEnum::Unit => "first",
NonExhaustiveEnum::Tuple(_) => "second",
NonExhaustiveEnum::Struct { .. } => "third"
};
2019-11-30 09:51:26 -06:00
match enum_unit {};
2019-12-04 10:04:44 -06:00
//~^ ERROR non-exhaustive patterns: `_` not covered [E0004]
2019-11-30 09:51:26 -06:00
// Everything below this is expected to compile successfully.
let enum_unit = NonExhaustiveEnum::Unit;
match enum_unit {
NonExhaustiveEnum::Unit => 1,
NonExhaustiveEnum::Tuple(_) => 2,
2021-08-22 07:46:15 -05:00
// This particular arm tests that an enum marked as non-exhaustive
// will not error if its variants are matched exhaustively.
NonExhaustiveEnum::Struct { field } => field,
_ => 0 // no error with wildcard
};
match enum_unit {
_ => "no error with only wildcard"
};
// #53549: Check that variant constructors can still be called normally.
match NonExhaustiveEnum::Unit {
NonExhaustiveEnum::Unit => {},
_ => {}
};
match NonExhaustiveEnum::Tuple(2) {
NonExhaustiveEnum::Tuple(2) => {},
_ => {}
};
match (NonExhaustiveEnum::Unit {}) {
NonExhaustiveEnum::Unit {} => {},
_ => {}
};
match (NonExhaustiveEnum::Tuple { 0: 2 }) {
NonExhaustiveEnum::Tuple { 0: 2 } => {},
_ => {}
};
match (NonExhaustiveEnum::Struct { field: 2 }) {
NonExhaustiveEnum::Struct { field: 2 } => {},
_ => {}
};
2017-11-03 14:15:15 -05:00
}