summaryrefslogtreecommitdiffstats
path: root/src/test/ui/auxiliary/pub-and-stability.rs
blob: ee05a07dbb29ad444c0f1c2cf4d150f0f9bd1adf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
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 }
    }
}