Added tests for RFC 2008.
This commit is contained in:
parent
d51ea538e4
commit
6c19ebe128
17 changed files with 480 additions and 0 deletions
20
src/test/compile-fail/feature-gate-non_exhaustive.rs
Normal file
20
src/test/compile-fail/feature-gate-non_exhaustive.rs
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
//#![feature(non_exhaustive)]
|
||||||
|
|
||||||
|
#[non_exhaustive] //~ERROR non exhaustive is an experimental feature (see issue #44109)
|
||||||
|
pub enum NonExhaustiveEnum {
|
||||||
|
Unit,
|
||||||
|
Tuple(u32),
|
||||||
|
Struct { field: u32 }
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() { }
|
|
@ -0,0 +1,19 @@
|
||||||
|
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
#![crate_type = "rlib"]
|
||||||
|
#![feature(non_exhaustive)]
|
||||||
|
|
||||||
|
#[non_exhaustive]
|
||||||
|
pub enum NonExhaustiveEnum {
|
||||||
|
Unit,
|
||||||
|
Tuple(u32),
|
||||||
|
Struct { field: u32 }
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
#![feature(non_exhaustive)]
|
||||||
|
|
||||||
|
#[non_exhaustive]
|
||||||
|
pub struct NormalStruct {
|
||||||
|
pub first_field: u16,
|
||||||
|
pub second_field: u16,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[non_exhaustive]
|
||||||
|
pub struct UnitStruct;
|
||||||
|
|
||||||
|
#[non_exhaustive]
|
||||||
|
pub struct TupleStruct(pub u16, pub u16);
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
#[non_exhaustive]
|
||||||
|
pub struct FunctionalRecord {
|
||||||
|
pub first_field: u16,
|
||||||
|
pub second_field: u16,
|
||||||
|
pub third_field: bool
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for FunctionalRecord {
|
||||||
|
fn default() -> FunctionalRecord {
|
||||||
|
FunctionalRecord { first_field: 640, second_field: 480, third_field: false }
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
#![crate_type = "rlib"]
|
||||||
|
#![feature(non_exhaustive)]
|
||||||
|
|
||||||
|
pub enum NonExhaustiveVariants {
|
||||||
|
#[non_exhaustive] Unit,
|
||||||
|
#[non_exhaustive] Tuple(u32),
|
||||||
|
#[non_exhaustive] Struct { field: u32 }
|
||||||
|
}
|
25
src/test/compile-fail/rfc-2008-non-exhaustive/enum.rs
Normal file
25
src/test/compile-fail/rfc-2008-non-exhaustive/enum.rs
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
// aux-build:enums.rs
|
||||||
|
extern crate enums;
|
||||||
|
|
||||||
|
use enums::NonExhaustiveEnum;
|
||||||
|
|
||||||
|
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"
|
||||||
|
};
|
||||||
|
}
|
47
src/test/compile-fail/rfc-2008-non-exhaustive/structs.rs
Normal file
47
src/test/compile-fail/rfc-2008-non-exhaustive/structs.rs
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
// aux-build:structs.rs
|
||||||
|
extern crate structs;
|
||||||
|
|
||||||
|
use structs::{NormalStruct, UnitStruct, TupleStruct, FunctionalRecord};
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let fr = FunctionalRecord {
|
||||||
|
//~^ ERROR cannot create non-exhaustive struct
|
||||||
|
first_field: 1920,
|
||||||
|
second_field: 1080,
|
||||||
|
..FunctionalRecord::default()
|
||||||
|
};
|
||||||
|
|
||||||
|
let ns = NormalStruct { first_field: 640, second_field: 480 };
|
||||||
|
//~^ ERROR cannot create non-exhaustive struct
|
||||||
|
|
||||||
|
let NormalStruct { first_field, second_field } = ns;
|
||||||
|
//~^ ERROR `..` required with struct marked as non-exhaustive
|
||||||
|
|
||||||
|
let ts = TupleStruct(640, 480);
|
||||||
|
//~^ ERROR expected function, found struct `TupleStruct` [E0423]
|
||||||
|
|
||||||
|
let ts_explicit = structs::TupleStruct(640, 480);
|
||||||
|
//~^ ERROR tuple struct `TupleStruct` is private [E0603]
|
||||||
|
|
||||||
|
let TupleStruct { 0: first_field, 1: second_field } = ts;
|
||||||
|
//~^ ERROR `..` required with struct marked as non-exhaustive
|
||||||
|
|
||||||
|
let us = UnitStruct;
|
||||||
|
//~^ ERROR expected value, found struct `UnitStruct` [E0423]
|
||||||
|
|
||||||
|
let us_explicit = structs::UnitStruct;
|
||||||
|
//~^ ERROR unit struct `UnitStruct` is private [E0603]
|
||||||
|
|
||||||
|
let UnitStruct { } = us;
|
||||||
|
//~^ ERROR `..` required with struct marked as non-exhaustive
|
||||||
|
}
|
36
src/test/compile-fail/rfc-2008-non-exhaustive/variants.rs
Normal file
36
src/test/compile-fail/rfc-2008-non-exhaustive/variants.rs
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
// aux-build:variants.rs
|
||||||
|
extern crate variants;
|
||||||
|
|
||||||
|
use variants::NonExhaustiveVariants;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The initial implementation of #[non_exhaustive] (RFC 2008) does not include support for
|
||||||
|
* variants. See issue #44109 and PR 45394.
|
||||||
|
*/
|
||||||
|
// ignore-test
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let variant_struct = NonExhaustiveVariants::Struct { field: 640 };
|
||||||
|
//~^ ERROR cannot create non-exhaustive variant
|
||||||
|
|
||||||
|
let variant_tuple = NonExhaustiveVariants::Tuple { 0: 640 };
|
||||||
|
//~^ ERROR cannot create non-exhaustive variant
|
||||||
|
|
||||||
|
match variant_struct {
|
||||||
|
NonExhaustiveVariants::Unit => "",
|
||||||
|
NonExhaustiveVariants::Tuple(fe_tpl) => "",
|
||||||
|
//~^ ERROR `..` required with variant marked as non-exhaustive
|
||||||
|
NonExhaustiveVariants::Struct { field } => ""
|
||||||
|
//~^ ERROR `..` required with variant marked as non-exhaustive
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
#![feature(non_exhaustive)]
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The initial implementation of #[non_exhaustive] (RFC 2008) does not include support for
|
||||||
|
* variants. See issue #44109 and PR 45394.
|
||||||
|
*/
|
||||||
|
|
||||||
|
pub enum NonExhaustiveVariants {
|
||||||
|
#[non_exhaustive] Unit,
|
||||||
|
//~^ ERROR #[non_exhaustive] is not yet supported on variants
|
||||||
|
#[non_exhaustive] Tuple(u32),
|
||||||
|
//~^ ERROR #[non_exhaustive] is not yet supported on variants
|
||||||
|
#[non_exhaustive] Struct { field: u32 }
|
||||||
|
//~^ ERROR #[non_exhaustive] is not yet supported on variants
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() { }
|
19
src/test/run-pass/rfc-2008-non-exhaustive/auxiliary/enums.rs
Normal file
19
src/test/run-pass/rfc-2008-non-exhaustive/auxiliary/enums.rs
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
#![crate_type = "rlib"]
|
||||||
|
#![feature(non_exhaustive)]
|
||||||
|
|
||||||
|
#[non_exhaustive]
|
||||||
|
pub enum NonExhaustiveEnum {
|
||||||
|
Unit,
|
||||||
|
Tuple(u32),
|
||||||
|
Struct { field: u32 }
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
#![feature(non_exhaustive)]
|
||||||
|
|
||||||
|
#[non_exhaustive]
|
||||||
|
pub struct NormalStruct {
|
||||||
|
pub first_field: u16,
|
||||||
|
pub second_field: u16,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[non_exhaustive]
|
||||||
|
pub struct UnitStruct;
|
||||||
|
|
||||||
|
#[non_exhaustive]
|
||||||
|
pub struct TupleStruct (pub u16, pub u16);
|
|
@ -0,0 +1,18 @@
|
||||||
|
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
#![crate_type = "rlib"]
|
||||||
|
#![feature(non_exhaustive)]
|
||||||
|
|
||||||
|
pub enum NonExhaustiveVariants {
|
||||||
|
#[non_exhaustive] Unit,
|
||||||
|
#[non_exhaustive] Tuple(u32),
|
||||||
|
#[non_exhaustive] Struct { field: u32 }
|
||||||
|
}
|
31
src/test/run-pass/rfc-2008-non-exhaustive/enums.rs
Normal file
31
src/test/run-pass/rfc-2008-non-exhaustive/enums.rs
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
// aux-build:enums.rs
|
||||||
|
extern crate enums;
|
||||||
|
|
||||||
|
use enums::NonExhaustiveEnum;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let enum_unit = NonExhaustiveEnum::Unit;
|
||||||
|
|
||||||
|
match enum_unit {
|
||||||
|
NonExhaustiveEnum::Unit => 1,
|
||||||
|
NonExhaustiveEnum::Tuple(_) => 2,
|
||||||
|
// This particular arm tests that a 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"
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
#![feature(non_exhaustive)]
|
||||||
|
|
||||||
|
#[non_exhaustive]
|
||||||
|
pub enum NonExhaustiveEnum {
|
||||||
|
Unit,
|
||||||
|
Tuple(u32),
|
||||||
|
Struct { field: u32 }
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let enum_unit = NonExhaustiveEnum::Unit;
|
||||||
|
|
||||||
|
match enum_unit {
|
||||||
|
NonExhaustiveEnum::Unit => "first",
|
||||||
|
NonExhaustiveEnum::Tuple(_) => "second",
|
||||||
|
NonExhaustiveEnum::Struct { .. } => "third",
|
||||||
|
};
|
||||||
|
}
|
27
src/test/run-pass/rfc-2008-non-exhaustive/structs.rs
Normal file
27
src/test/run-pass/rfc-2008-non-exhaustive/structs.rs
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
// aux-build:structs.rs
|
||||||
|
extern crate structs;
|
||||||
|
|
||||||
|
use structs::{NormalStruct, UnitStruct, TupleStruct};
|
||||||
|
|
||||||
|
// We only test matching here as we cannot create non-exhaustive
|
||||||
|
// structs from another crate. ie. they'll never pass in run-pass tests.
|
||||||
|
|
||||||
|
fn match_structs(ns: NormalStruct, ts: TupleStruct, us: UnitStruct) {
|
||||||
|
let NormalStruct { first_field, second_field, .. } = ns;
|
||||||
|
|
||||||
|
let TupleStruct { 0: first, 1: second, .. } = ts;
|
||||||
|
|
||||||
|
let UnitStruct { .. } = us;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() { }
|
|
@ -0,0 +1,40 @@
|
||||||
|
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
#![feature(non_exhaustive)]
|
||||||
|
|
||||||
|
#[non_exhaustive]
|
||||||
|
pub struct NormalStruct {
|
||||||
|
pub first_field: u16,
|
||||||
|
pub second_field: u16,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[non_exhaustive]
|
||||||
|
pub struct UnitStruct;
|
||||||
|
|
||||||
|
#[non_exhaustive]
|
||||||
|
pub struct TupleStruct (pub u16, pub u16);
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let ns = NormalStruct { first_field: 640, second_field: 480 };
|
||||||
|
|
||||||
|
let NormalStruct { first_field, second_field } = ns;
|
||||||
|
|
||||||
|
let ts = TupleStruct { 0: 340, 1: 480 };
|
||||||
|
let ts_constructor = TupleStruct(340, 480);
|
||||||
|
|
||||||
|
let TupleStruct { 0: first, 1: second } = ts;
|
||||||
|
let TupleStruct(first, second) = ts_constructor;
|
||||||
|
|
||||||
|
let us = UnitStruct {};
|
||||||
|
let us_constructor = UnitStruct;
|
||||||
|
|
||||||
|
let UnitStruct { } = us;
|
||||||
|
}
|
31
src/test/run-pass/rfc-2008-non-exhaustive/variants.rs
Normal file
31
src/test/run-pass/rfc-2008-non-exhaustive/variants.rs
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
// aux-build:variants.rs
|
||||||
|
extern crate variants;
|
||||||
|
|
||||||
|
use variants::NonExhaustiveVariants;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The initial implementation of #[non_exhaustive] (RFC 2008) does not include support for
|
||||||
|
* variants. See issue #44109 and PR 45394.
|
||||||
|
*/
|
||||||
|
// ignore-test
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let variant_tuple = NonExhaustiveVariants::Tuple { 0: 340 };
|
||||||
|
let variant_struct = NonExhaustiveVariants::Struct { field: 340 };
|
||||||
|
|
||||||
|
match variant_struct {
|
||||||
|
NonExhaustiveVariants::Unit => "",
|
||||||
|
NonExhaustiveVariants::Struct { field, .. } => "",
|
||||||
|
NonExhaustiveVariants::Tuple(fe_tpl, ..) => ""
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
#![feature(non_exhaustive)]
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The initial implementation of #[non_exhaustive] (RFC 2008) does not include support for
|
||||||
|
* variants. See issue #44109 and PR 45394.
|
||||||
|
*/
|
||||||
|
// ignore-test
|
||||||
|
|
||||||
|
pub enum NonExhaustiveVariants {
|
||||||
|
#[non_exhaustive] Unit,
|
||||||
|
#[non_exhaustive] Tuple(u32),
|
||||||
|
#[non_exhaustive] Struct { field: u32 }
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let variant_tuple = NonExhaustiveVariants::Tuple(340);
|
||||||
|
let variant_struct = NonExhaustiveVariants::Struct { field: 340 };
|
||||||
|
|
||||||
|
match variant_tuple {
|
||||||
|
NonExhaustiveVariants::Unit => "",
|
||||||
|
NonExhaustiveVariants::Tuple(fe_tpl) => "",
|
||||||
|
NonExhaustiveVariants::Struct { field } => ""
|
||||||
|
};
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue