| //! Regression test for issue #38412: interaction between stability attributes and privacy |
| //! |
| //! Tests that the compiler correctly handles the interaction between feature gates |
| //! and privacy/visibility rules. Specifically verifies that enabled unstable features |
| //! are accessible while disabled ones are properly rejected. |
| |
| //@ aux-build:pub-and-stability.rs |
| |
| // Enable `unstable_declared` but not `unstable_undeclared` to test |
| // that the compiler allows enabled features but rejects disabled ones |
| #![feature(unstable_declared)] |
| |
| extern crate pub_and_stability; |
| use pub_and_stability::{Record, Trait, Tuple}; |
| |
| fn main() { |
| // Test struct field access patterns |
| let Record { .. } = Record::new(); |
| |
| let Record { |
| a_stable_pub: _, |
| a_unstable_declared_pub: _, |
| .. |
| } = Record::new(); |
| |
| let Record { |
| a_stable_pub: _, |
| a_unstable_declared_pub: _, |
| a_unstable_undeclared_pub: _, //~ ERROR use of unstable library feature `unstable_undeclared` |
| .. |
| } = Record::new(); |
| |
| let r = Record::new(); |
| let t = Tuple::new(); |
| |
| // Test field access with different stability/privacy combinations |
| r.a_stable_pub; |
| r.a_unstable_declared_pub; |
| r.a_unstable_undeclared_pub; //~ ERROR use of unstable library feature |
| r.b_crate; //~ ERROR is private |
| r.c_mod; //~ ERROR is private |
| r.d_priv; //~ ERROR is private |
| |
| t.0; |
| t.1; |
| t.2; //~ ERROR use of unstable library feature |
| t.3; //~ ERROR is private |
| t.4; //~ ERROR is private |
| t.5; //~ ERROR is private |
| |
| // Test trait method access |
| r.stable_trait_method(); |
| r.unstable_declared_trait_method(); |
| r.unstable_undeclared_trait_method(); //~ ERROR use of unstable library feature |
| |
| // Test inherent method access |
| r.stable(); |
| r.unstable_declared(); |
| r.unstable_undeclared(); //~ ERROR use of unstable library feature |
| |
| r.pub_crate(); //~ ERROR `pub_crate` is private |
| r.pub_mod(); //~ ERROR `pub_mod` is private |
| r.private(); //~ ERROR `private` is private |
| |
| // Repeat tests for tuple struct |
| let t = Tuple::new(); |
| t.stable_trait_method(); |
| t.unstable_declared_trait_method(); |
| t.unstable_undeclared_trait_method(); //~ ERROR use of unstable library feature |
| |
| t.stable(); |
| t.unstable_declared(); |
| t.unstable_undeclared(); //~ ERROR use of unstable library feature |
| |
| t.pub_crate(); //~ ERROR `pub_crate` is private |
| t.pub_mod(); //~ ERROR `pub_mod` is private |
| t.private(); //~ ERROR `private` is private |
| } |