summaryrefslogtreecommitdiffstats
path: root/src/test/ui/auxiliary/pub-and-stability.rs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/test/ui/auxiliary/pub-and-stability.rs133
1 files changed, 133 insertions, 0 deletions
diff --git a/src/test/ui/auxiliary/pub-and-stability.rs b/src/test/ui/auxiliary/pub-and-stability.rs
new file mode 100644
index 000000000..ee05a07db
--- /dev/null
+++ b/src/test/ui/auxiliary/pub-and-stability.rs
@@ -0,0 +1,133 @@
+// This crate attempts to enumerate the various scenarios for how a
+// type can define fields and methods with various visibilities and
+// stabilities.
+//
+// The basic stability pattern in this file has four cases:
+// 1. no stability attribute at all
+// 2. a stable attribute (feature "unit_test")
+// 3. an unstable attribute that unit test declares (feature "unstable_declared")
+// 4. an unstable attribute that unit test fails to declare (feature "unstable_undeclared")
+//
+// This file also covers four kinds of visibility: private,
+// pub(module), pub(crate), and pub.
+//
+// However, since stability attributes can only be observed in
+// cross-crate linkage scenarios, there is little reason to take the
+// cross-product (4 stability cases * 4 visibility cases), because the
+// first three visibility cases cannot be accessed outside this crate,
+// and therefore stability is only relevant when the visibility is pub
+// to the whole universe.
+//
+// (The only reason to do so would be if one were worried about the
+// compiler having some subtle bug where adding a stability attribute
+// introduces a privacy violation. As a way to provide evidence that
+// this is not occurring, I have put stability attributes on some
+// non-pub fields, marked with SILLY below)
+
+#![feature(staged_api)]
+
+#![stable(feature = "unit_test", since = "1.0.0")]
+
+#[stable(feature = "unit_test", since = "1.0.0")]
+pub use m::{Record, Trait, Tuple};
+
+mod m {
+ #[derive(Default)]
+ #[stable(feature = "unit_test", since = "1.0.0")]
+ pub struct Record {
+ #[stable(feature = "unit_test", since = "1.0.0")]
+ pub a_stable_pub: i32,
+ #[unstable(feature = "unstable_declared", issue = "38412")]
+ pub a_unstable_declared_pub: i32,
+ #[unstable(feature = "unstable_undeclared", issue = "38412")]
+ pub a_unstable_undeclared_pub: i32,
+ #[unstable(feature = "unstable_undeclared", issue = "38412")] // SILLY
+ pub(crate) b_crate: i32,
+ #[unstable(feature = "unstable_declared", issue = "38412")] // SILLY
+ pub(in m) c_mod: i32,
+ #[stable(feature = "unit_test", since = "1.0.0")] // SILLY
+ d_priv: i32
+ }
+
+ #[derive(Default)]
+ #[stable(feature = "unit_test", since = "1.0.0")]
+ pub struct Tuple(
+ #[stable(feature = "unit_test", since = "1.0.0")]
+ pub i32,
+ #[unstable(feature = "unstable_declared", issue = "38412")]
+ pub i32,
+ #[unstable(feature = "unstable_undeclared", issue = "38412")]
+ pub i32,
+
+ pub(crate) i32,
+ pub(in m) i32,
+ i32);
+
+ impl Record {
+ #[stable(feature = "unit_test", since = "1.0.0")]
+ pub fn new() -> Self { Default::default() }
+ }
+
+ impl Tuple {
+ #[stable(feature = "unit_test", since = "1.0.0")]
+ pub fn new() -> Self { Default::default() }
+ }
+
+
+ #[stable(feature = "unit_test", since = "1.0.0")]
+ pub trait Trait {
+ #[stable(feature = "unit_test", since = "1.0.0")]
+ type Type;
+ #[stable(feature = "unit_test", since = "1.0.0")]
+ fn stable_trait_method(&self) -> Self::Type;
+ #[unstable(feature = "unstable_undeclared", issue = "38412")]
+ fn unstable_undeclared_trait_method(&self) -> Self::Type;
+ #[unstable(feature = "unstable_declared", issue = "38412")]
+ fn unstable_declared_trait_method(&self) -> Self::Type;
+ }
+
+ #[stable(feature = "unit_test", since = "1.0.0")]
+ impl Trait for Record {
+ type Type = i32;
+ fn stable_trait_method(&self) -> i32 { self.d_priv }
+ fn unstable_undeclared_trait_method(&self) -> i32 { self.d_priv }
+ fn unstable_declared_trait_method(&self) -> i32 { self.d_priv }
+ }
+
+ #[stable(feature = "unit_test", since = "1.0.0")]
+ impl Trait for Tuple {
+ type Type = i32;
+ fn stable_trait_method(&self) -> i32 { self.3 }
+ fn unstable_undeclared_trait_method(&self) -> i32 { self.3 }
+ fn unstable_declared_trait_method(&self) -> i32 { self.3 }
+ }
+
+ impl Record {
+ #[unstable(feature = "unstable_undeclared", issue = "38412")]
+ pub fn unstable_undeclared(&self) -> i32 { self.d_priv }
+ #[unstable(feature = "unstable_declared", issue = "38412")]
+ pub fn unstable_declared(&self) -> i32 { self.d_priv }
+ #[stable(feature = "unit_test", since = "1.0.0")]
+ pub fn stable(&self) -> i32 { self.d_priv }
+
+ #[unstable(feature = "unstable_undeclared", issue = "38412")] // SILLY
+ pub(crate) fn pub_crate(&self) -> i32 { self.d_priv }
+ #[unstable(feature = "unstable_declared", issue = "38412")] // SILLY
+ pub(in m) fn pub_mod(&self) -> i32 { self.d_priv }
+ #[stable(feature = "unit_test", since = "1.0.0")] // SILLY
+ fn private(&self) -> i32 { self.d_priv }
+ }
+
+ impl Tuple {
+ #[unstable(feature = "unstable_undeclared", issue = "38412")]
+ pub fn unstable_undeclared(&self) -> i32 { self.0 }
+ #[unstable(feature = "unstable_declared", issue = "38412")]
+ pub fn unstable_declared(&self) -> i32 { self.0 }
+ #[stable(feature = "unit_test", since = "1.0.0")]
+ pub fn stable(&self) -> i32 { self.0 }
+
+ pub(crate) fn pub_crate(&self) -> i32 { self.0 }
+ pub(in m) fn pub_mod(&self) -> i32 { self.0 }
+ fn private(&self) -> i32 { self.0 }
+ }
+}