diff options
| author | F001 <changchun.fan@qq.com> | 2018-08-28 12:51:43 +0800 |
|---|---|---|
| committer | F001 <changchun.fan@qq.com> | 2018-09-13 10:57:28 +0800 |
| commit | a4891699125fa12d46217890e4eb68b35e9ff6d5 (patch) | |
| tree | be5ca3676bccdcaeeb465f862d0e0195bb3f0c11 /src/test | |
| parent | f2302daef3608c09e2b50193a64611b18ced86f3 (diff) | |
implement feature tuple_struct_self_ctor
Diffstat (limited to 'src/test')
5 files changed, 144 insertions, 28 deletions
diff --git a/src/test/run-pass/tuple-struct-self-ctor.rs b/src/test/run-pass/tuple-struct-self-ctor.rs new file mode 100644 index 00000000000..7392003bb23 --- /dev/null +++ b/src/test/run-pass/tuple-struct-self-ctor.rs @@ -0,0 +1,102 @@ +// Copyright 2018 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(tuple_struct_self_ctor)] + +#![allow(dead_code)] + +use std::fmt::Display; + +struct ST1(i32, i32); + +impl ST1 { + fn new() -> Self { + ST1(0, 1) + } + + fn ctor() -> Self { + Self(1,2) // Self as a constructor + } + + fn pattern(self) { + match self { + Self(x, y) => println!("{} {}", x, y), // Self as a pattern + } + } +} + +struct ST2<T>(T); // With type parameter + +impl<T> ST2<T> where T: Display { + + fn ctor(v: T) -> Self { + Self(v) + } + + fn pattern(&self) { + match self { + Self(ref v) => println!("{}", v), + } + } +} + +struct ST3<'a>(&'a i32); // With lifetime parameter + +impl<'a> ST3<'a> { + + fn ctor(v: &'a i32) -> Self { + Self(v) + } + + fn pattern(self) { + let Self(ref v) = self; + println!("{}", v); + } +} + +struct ST4(usize); + +impl ST4 { + fn map(opt: Option<usize>) -> Option<Self> { + opt.map(Self) // use `Self` as a function passed somewhere + } +} + +struct ST5; // unit struct + +impl ST5 { + fn ctor() -> Self { + Self // `Self` as a unit struct value + } + + fn pattern(self) -> Self { + match self { + Self => Self, // `Self` as a unit struct value for matching + } + } +} + +fn main() { + let v1 = ST1::ctor(); + v1.pattern(); + + let v2 = ST2::ctor(10); + v2.pattern(); + + let local = 42; + let v3 = ST3::ctor(&local); + v3.pattern(); + + let v4 = Some(1usize); + let _ = ST4::map(v4); + + let v5 = ST5::ctor(); + v5.pattern(); +} diff --git a/src/test/ui/feature-gates/feature-gate-tuple-struct-self-ctor.rs b/src/test/ui/feature-gates/feature-gate-tuple-struct-self-ctor.rs new file mode 100644 index 00000000000..aa907e813ed --- /dev/null +++ b/src/test/ui/feature-gates/feature-gate-tuple-struct-self-ctor.rs @@ -0,0 +1,19 @@ +// Copyright 2018 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. + +struct ST(i32, i32); + +impl ST { + fn ctor() -> Self { + Self(1,2) + //~^ ERROR: expected function, found self type `Self` [E0423] + //~^^ ERROR: tuple struct Self constructors are unstable (see issue #51994) [E0658] + } +} diff --git a/src/test/ui/feature-gates/feature-gate-tuple-struct-self-ctor.stderr b/src/test/ui/feature-gates/feature-gate-tuple-struct-self-ctor.stderr new file mode 100644 index 00000000000..e92924e9602 --- /dev/null +++ b/src/test/ui/feature-gates/feature-gate-tuple-struct-self-ctor.stderr @@ -0,0 +1,20 @@ +error[E0423]: expected function, found self type `Self` + --> $DIR/feature-gate-tuple-struct-self-ctor.rs:15:9 + | +LL | Self(1,2) + | ^^^^ not a function + | + = note: can't use `Self` as a constructor, you must use the implemented struct + +error[E0658]: tuple struct Self constructors are unstable (see issue #51994) + --> $DIR/feature-gate-tuple-struct-self-ctor.rs:15:9 + | +LL | Self(1,2) + | ^^^^^^^^^ + | + = help: add #![feature(tuple_struct_self_ctor)] to the crate attributes to enable + +error: aborting due to 2 previous errors + +Some errors occurred: E0423, E0658. +For more information about an error, try `rustc --explain E0423`. diff --git a/src/test/ui/resolve/tuple-struct-alias.rs b/src/test/ui/resolve/tuple-struct-alias.rs index 0dbca07b771..1f3588dd3ca 100644 --- a/src/test/ui/resolve/tuple-struct-alias.rs +++ b/src/test/ui/resolve/tuple-struct-alias.rs @@ -11,15 +11,6 @@ struct S(u8, u16); type A = S; -impl S { - fn f() { - let s = Self(0, 1); //~ ERROR expected function - match s { - Self(..) => {} //~ ERROR expected tuple struct/variant - } - } -} - fn main() { let s = A(0, 1); //~ ERROR expected function match s { diff --git a/src/test/ui/resolve/tuple-struct-alias.stderr b/src/test/ui/resolve/tuple-struct-alias.stderr index cdac6277bcf..ad2ae4acb8b 100644 --- a/src/test/ui/resolve/tuple-struct-alias.stderr +++ b/src/test/ui/resolve/tuple-struct-alias.stderr @@ -1,21 +1,5 @@ -error[E0423]: expected function, found self type `Self` - --> $DIR/tuple-struct-alias.rs:16:17 - | -LL | let s = Self(0, 1); //~ ERROR expected function - | ^^^^ not a function - | - = note: can't use `Self` as a constructor, you must use the implemented struct - -error[E0532]: expected tuple struct/variant, found self type `Self` - --> $DIR/tuple-struct-alias.rs:18:13 - | -LL | Self(..) => {} //~ ERROR expected tuple struct/variant - | ^^^^ not a tuple struct/variant - | - = note: can't use `Self` as a constructor, you must use the implemented struct - error[E0423]: expected function, found type alias `A` - --> $DIR/tuple-struct-alias.rs:24:13 + --> $DIR/tuple-struct-alias.rs:15:13 | LL | let s = A(0, 1); //~ ERROR expected function | ^ did you mean `S`? @@ -23,14 +7,14 @@ LL | let s = A(0, 1); //~ ERROR expected function = note: can't use a type alias as a constructor error[E0532]: expected tuple struct/variant, found type alias `A` - --> $DIR/tuple-struct-alias.rs:26:9 + --> $DIR/tuple-struct-alias.rs:17:9 | LL | A(..) => {} //~ ERROR expected tuple struct/variant | ^ did you mean `S`? | = note: can't use a type alias as a constructor -error: aborting due to 4 previous errors +error: aborting due to 2 previous errors Some errors occurred: E0423, E0532. For more information about an error, try `rustc --explain E0423`. |
