]> git.lizzy.rs Git - rust.git/commitdiff
Add tests for associated item privacy
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>
Sat, 23 Sep 2017 17:48:08 +0000 (20:48 +0300)
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>
Thu, 21 Dec 2017 00:17:19 +0000 (03:17 +0300)
src/test/compile-fail/privacy/associated-item-privacy-inherent.rs [new file with mode: 0644]
src/test/compile-fail/privacy/associated-item-privacy-trait.rs [new file with mode: 0644]
src/test/compile-fail/privacy/associated-item-privacy-type-binding.rs [new file with mode: 0644]

diff --git a/src/test/compile-fail/privacy/associated-item-privacy-inherent.rs b/src/test/compile-fail/privacy/associated-item-privacy-inherent.rs
new file mode 100644 (file)
index 0000000..d742a3a
--- /dev/null
@@ -0,0 +1,122 @@
+// Copyright 2017 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(decl_macro, associated_type_defaults)]
+#![allow(unused, private_in_public)]
+
+mod priv_nominal {
+    pub struct Pub;
+    impl Pub {
+        fn method(&self) {}
+        const CONST: u8 = 0;
+        // type AssocTy = u8;
+    }
+
+    pub macro mac() {
+        let value = Pub::method;
+        //~^ ERROR type `for<'r> fn(&'r priv_nominal::Pub) {priv_nominal::Pub::method}` is private
+        value;
+        //~^ ERROR type `for<'r> fn(&'r priv_nominal::Pub) {priv_nominal::Pub::method}` is private
+        Pub.method();
+        //~^ ERROR type `for<'r> fn(&'r priv_nominal::Pub) {priv_nominal::Pub::method}` is private
+        Pub::CONST;
+        //FIXME ERROR associated constant `CONST` is private
+        // let _: Pub::AssocTy;
+        // pub type InSignatureTy = Pub::AssocTy;
+    }
+}
+fn priv_nominal() {
+    priv_nominal::mac!();
+}
+
+mod priv_signature {
+    struct Priv;
+    pub struct Pub;
+    impl Pub {
+        pub fn method(&self, arg: Priv) {}
+    }
+
+    pub macro mac() {
+        let value = Pub::method;
+        //~^ ERROR type `priv_signature::Priv` is private
+        value;
+        //~^ ERROR type `priv_signature::Priv` is private
+        Pub.method(loop {});
+        //~^ ERROR type `priv_signature::Priv` is private
+    }
+}
+fn priv_signature() {
+    priv_signature::mac!();
+}
+
+mod priv_substs {
+    struct Priv;
+    pub struct Pub;
+    impl Pub {
+        pub fn method<T>(&self) {}
+    }
+
+    pub macro mac() {
+        let value = Pub::method::<Priv>;
+        //~^ ERROR type `priv_substs::Priv` is private
+        value;
+        //~^ ERROR type `priv_substs::Priv` is private
+        Pub.method::<Priv>();
+        //~^ ERROR type `priv_substs::Priv` is private
+    }
+}
+fn priv_substs() {
+    priv_substs::mac!();
+}
+
+mod priv_parent_substs {
+    struct Priv;
+    pub struct Pub<T = Priv>(T);
+    impl Pub<Priv> {
+        pub fn method(&self) {}
+        pub fn static_method() {}
+        pub const CONST: u8 = 0;
+        // pub type AssocTy = u8;
+    }
+
+    pub macro mac() {
+        let value = <Pub>::method;
+        //~^ ERROR type `priv_parent_substs::Priv` is private
+        value;
+        //~^ ERROR type `priv_parent_substs::Priv` is private
+        let value = Pub::method;
+        //~^ ERROR type `priv_parent_substs::Priv` is private
+        value;
+        //~^ ERROR type `priv_parent_substs::Priv` is private
+        let value = <Pub>::static_method;
+        //~^ ERROR type `priv_parent_substs::Priv` is private
+        value;
+        //~^ ERROR type `priv_parent_substs::Priv` is private
+        let value = Pub::static_method;
+        //~^ ERROR type `priv_parent_substs::Priv` is private
+        value;
+        //~^ ERROR type `priv_parent_substs::Priv` is private
+        Pub(Priv).method();
+        //~^ ERROR type `priv_parent_substs::Priv` is private
+
+        <Pub>::CONST;
+        //~^ ERROR type `priv_parent_substs::Priv` is private
+        Pub::CONST;
+        //~^ ERROR type `priv_parent_substs::Priv` is private
+
+        // let _: Pub::AssocTy;
+        // pub type InSignatureTy = Pub::AssocTy;
+    }
+}
+fn priv_parent_substs() {
+    priv_parent_substs::mac!();
+}
+
+fn main() {}
diff --git a/src/test/compile-fail/privacy/associated-item-privacy-trait.rs b/src/test/compile-fail/privacy/associated-item-privacy-trait.rs
new file mode 100644 (file)
index 0000000..d68c502
--- /dev/null
@@ -0,0 +1,152 @@
+// Copyright 2017 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.
+
+// ignore-tidy-linelength
+
+#![feature(decl_macro, associated_type_defaults)]
+#![allow(unused, private_in_public)]
+
+mod priv_trait {
+    trait PrivTr {
+        fn method(&self) {}
+        const CONST: u8 = 0;
+        type AssocTy = u8;
+    }
+    pub struct Pub;
+    impl PrivTr for Pub {}
+    pub trait PubTr: PrivTr {}
+
+    pub macro mac() {
+        let value = <Pub as PrivTr>::method;
+        //~^ ERROR type `for<'r> fn(&'r priv_trait::Pub) {<priv_trait::Pub as priv_trait::PrivTr>::method}` is private
+        value;
+        //~^ ERROR type `for<'r> fn(&'r priv_trait::Pub) {<priv_trait::Pub as priv_trait::PrivTr>::method}` is private
+        Pub.method();
+        //~^ ERROR type `for<'r> fn(&'r Self) {<Self as priv_trait::PrivTr>::method}` is private
+        <Pub as PrivTr>::CONST;
+        //FIXME ERROR associated constant `path(PrivTr::CONST)` is private
+        let _: <Pub as PrivTr>::AssocTy;
+        //~^ ERROR trait `priv_trait::PrivTr` is private
+        //~| ERROR trait `priv_trait::PrivTr` is private
+        pub type InSignatureTy = <Pub as PrivTr>::AssocTy;
+        //~^ ERROR trait `priv_trait::PrivTr` is private
+        //~| ERROR trait `path(PrivTr)` is private
+        pub trait InSignatureTr: PrivTr {}
+        //FIXME ERROR trait `priv_trait::PrivTr` is private
+        impl PrivTr for u8 {}
+        //FIXME ERROR trait `priv_trait::PrivTr` is private
+    }
+}
+fn priv_trait() {
+    priv_trait::mac!();
+}
+
+mod priv_signature {
+    pub trait PubTr {
+        fn method(&self, arg: Priv) {}
+    }
+    struct Priv;
+    pub struct Pub;
+    impl PubTr for Pub {}
+
+    pub macro mac() {
+        let value = <Pub as PubTr>::method;
+        //~^ ERROR type `priv_signature::Priv` is private
+        value;
+        //~^ ERROR type `priv_signature::Priv` is private
+        Pub.method(loop {});
+        //~^ ERROR type `priv_signature::Priv` is private
+    }
+}
+fn priv_signature() {
+    priv_signature::mac!();
+}
+
+mod priv_substs {
+    pub trait PubTr {
+        fn method<T>(&self) {}
+    }
+    struct Priv;
+    pub struct Pub;
+    impl PubTr for Pub {}
+
+    pub macro mac() {
+        let value = <Pub as PubTr>::method::<Priv>;
+        //~^ ERROR type `priv_substs::Priv` is private
+        value;
+        //~^ ERROR type `priv_substs::Priv` is private
+        Pub.method::<Priv>();
+        //~^ ERROR type `priv_substs::Priv` is private
+    }
+}
+fn priv_substs() {
+    priv_substs::mac!();
+}
+
+mod priv_parent_substs {
+    pub trait PubTr<T = Priv> {
+        fn method(&self) {}
+        const CONST: u8 = 0;
+        type AssocTy = u8;
+    }
+    struct Priv;
+    pub struct Pub;
+    impl PubTr<Priv> for Pub {}
+    impl PubTr<Pub> for Priv {}
+
+    pub macro mac() {
+        let value = <Pub as PubTr>::method;
+        //~^ ERROR type `priv_parent_substs::Priv` is private
+        value;
+        //~^ ERROR type `priv_parent_substs::Priv` is private
+        let value = <Pub as PubTr<_>>::method;
+        //~^ ERROR type `priv_parent_substs::Priv` is private
+        value;
+        //~^ ERROR type `priv_parent_substs::Priv` is private
+        Pub.method();
+        //~^ ERROR type `priv_parent_substs::Priv` is private
+
+        let value = <Priv as PubTr<_>>::method;
+        //~^ ERROR type `priv_parent_substs::Priv` is private
+        value;
+        //~^ ERROR type `priv_parent_substs::Priv` is private
+        Priv.method();
+        //~^ ERROR type `priv_parent_substs::Priv` is private
+
+        <Pub as PubTr>::CONST;
+        //~^ ERROR type `priv_parent_substs::Priv` is private
+        <Pub as PubTr<_>>::CONST;
+        //~^ ERROR type `priv_parent_substs::Priv` is private
+        <Priv as PubTr<_>>::CONST;
+        //~^ ERROR type `priv_parent_substs::Priv` is private
+
+        let _: <Pub as PubTr>::AssocTy;
+        //~^ ERROR type `priv_parent_substs::Priv` is private
+        //~| ERROR type `priv_parent_substs::Priv` is private
+        let _: <Pub as PubTr<_>>::AssocTy;
+        //~^ ERROR type `priv_parent_substs::Priv` is private
+        //~| ERROR type `priv_parent_substs::Priv` is private
+        let _: <Priv as PubTr<_>>::AssocTy;
+        //~^ ERROR type `priv_parent_substs::Priv` is private
+        //~| ERROR type `priv_parent_substs::Priv` is private
+
+        pub type InSignatureTy1 = <Pub as PubTr>::AssocTy;
+        //~^ ERROR type `priv_parent_substs::Priv` is private
+        pub type InSignatureTy2 = <Priv as PubTr<Pub>>::AssocTy;
+        //~^ ERROR type `priv_parent_substs::Priv` is private
+        impl PubTr for u8 {}
+        //FIXME ERROR type `priv_parent_substs::Priv` is private
+    }
+}
+fn priv_parent_substs() {
+    priv_parent_substs::mac!();
+}
+
+fn main() {}
diff --git a/src/test/compile-fail/privacy/associated-item-privacy-type-binding.rs b/src/test/compile-fail/privacy/associated-item-privacy-type-binding.rs
new file mode 100644 (file)
index 0000000..f191ff1
--- /dev/null
@@ -0,0 +1,75 @@
+// Copyright 2017 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(decl_macro, associated_type_defaults)]
+#![allow(unused, private_in_public)]
+
+mod priv_trait {
+    trait PrivTr {
+        type AssocTy = u8;
+    }
+    pub trait PubTr: PrivTr {}
+
+    pub macro mac1() {
+        let _: Box<PubTr<AssocTy = u8>>;
+        //~^ ERROR type `priv_trait::PubTr<AssocTy=u8> + '<empty>` is private
+        //~| ERROR type `priv_trait::PubTr<AssocTy=u8> + '<empty>` is private
+        type InSignatureTy2 = Box<PubTr<AssocTy = u8>>;
+        //~^ ERROR type `priv_trait::PubTr<AssocTy=u8> + 'static` is private
+        trait InSignatureTr2: PubTr<AssocTy = u8> {}
+        //FIXME ERROR trait `priv_trait::PrivTr` is private
+    }
+    pub macro mac2() {
+        let _: Box<PrivTr<AssocTy = u8>>;
+        //~^ ERROR type `priv_trait::PrivTr<AssocTy=u8> + '<empty>` is private
+        //~| ERROR type `priv_trait::PrivTr<AssocTy=u8> + '<empty>` is private
+        type InSignatureTy1 = Box<PrivTr<AssocTy = u8>>;
+        //~^ ERROR type `priv_trait::PrivTr<AssocTy=u8> + 'static` is private
+        //~| ERROR trait `path(PrivTr<AssocTy = u8>)` is private
+        trait InSignatureTr1: PrivTr<AssocTy = u8> {}
+        //FIXME ERROR trait `priv_trait::PrivTr` is private
+    }
+}
+fn priv_trait1() {
+    priv_trait::mac1!();
+}
+fn priv_trait2() {
+    priv_trait::mac2!();
+}
+
+mod priv_parent_substs {
+    pub trait PubTrWithParam<T = Priv> {
+        type AssocTy = u8;
+    }
+    struct Priv;
+    pub trait PubTr: PubTrWithParam<Priv> {}
+
+    pub macro mac() {
+        let _: Box<PubTrWithParam<AssocTy = u8>>;
+        //~^ ERROR type `priv_parent_substs::Priv` is private
+        //~| ERROR type `priv_parent_substs::Priv` is private
+        let _: Box<PubTr<AssocTy = u8>>;
+        //~^ ERROR type `priv_parent_substs::Priv` is private
+        //~| ERROR type `priv_parent_substs::Priv` is private
+        pub type InSignatureTy1 = Box<PubTrWithParam<AssocTy = u8>>;
+        //~^ ERROR type `priv_parent_substs::Priv` is private
+        pub type InSignatureTy2 = Box<PubTr<AssocTy = u8>>;
+        //~^ ERROR type `priv_parent_substs::Priv` is private
+        trait InSignatureTr1: PubTrWithParam<AssocTy = u8> {}
+        //FIXME ERROR type `priv_parent_substs::Priv` is private
+        trait InSignatureTr2: PubTr<AssocTy = u8> {}
+        //FIXME ERROR type `priv_parent_substs::Priv` is private
+    }
+}
+fn priv_parent_substs() {
+    priv_parent_substs::mac!();
+}
+
+fn main() {}