]> git.lizzy.rs Git - rust.git/blob - src/test/ui/macros/macro-pub-matcher.rs
Rollup merge of #94577 - RalfJung:simd-miri, r=scottmcm
[rust.git] / src / test / ui / macros / macro-pub-matcher.rs
1 // run-pass
2 #![allow(dead_code, unused_imports)]
3 #![feature(crate_visibility_modifier)]
4
5 /**
6 Ensure that `:vis` matches can be captured in existing positions, and passed
7 through without the need for reparse tricks.
8 */
9 macro_rules! vis_passthru {
10     ($vis:vis const $name:ident: $ty:ty = $e:expr;) => { $vis const $name: $ty = $e; };
11     ($vis:vis enum $name:ident {}) => { $vis struct $name {} };
12     ($vis:vis extern "C" fn $name:ident() {}) => { $vis extern "C" fn $name() {} };
13     ($vis:vis fn $name:ident() {}) => { $vis fn $name() {} };
14     ($vis:vis mod $name:ident {}) => { $vis mod $name {} };
15     ($vis:vis static $name:ident: $ty:ty = $e:expr;) => { $vis static $name: $ty = $e; };
16     ($vis:vis struct $name:ident;) => { $vis struct $name; };
17     ($vis:vis trait $name:ident {}) => { $vis trait $name {} };
18     ($vis:vis type $name:ident = $ty:ty;) => { $vis type $name = $ty; };
19     ($vis:vis use $path:ident as $name:ident;) => { $vis use self::$path as $name; };
20 }
21
22 mod with_pub {
23     vis_passthru! { pub const A: i32 = 0; }
24     vis_passthru! { pub enum B {} }
25     vis_passthru! { pub extern "C" fn c() {} }
26     vis_passthru! { pub mod d {} }
27     vis_passthru! { pub static E: i32 = 0; }
28     vis_passthru! { pub struct F; }
29     vis_passthru! { pub trait G {} }
30     vis_passthru! { pub type H = i32; }
31     vis_passthru! { pub use A as I; }
32 }
33
34 mod without_pub {
35     vis_passthru! { const A: i32 = 0; }
36     vis_passthru! { enum B {} }
37     vis_passthru! { extern "C" fn c() {} }
38     vis_passthru! { mod d {} }
39     vis_passthru! { static E: i32 = 0; }
40     vis_passthru! { struct F; }
41     vis_passthru! { trait G {} }
42     vis_passthru! { type H = i32; }
43     vis_passthru! { use A as I; }
44 }
45
46 mod with_pub_restricted {
47     vis_passthru! { pub(crate) const A: i32 = 0; }
48     vis_passthru! { pub(crate) enum B {} }
49     vis_passthru! { pub(crate) extern "C" fn c() {} }
50     vis_passthru! { pub(crate) mod d {} }
51     vis_passthru! { pub(crate) static E: i32 = 0; }
52     vis_passthru! { pub(crate) struct F; }
53     vis_passthru! { pub(crate) trait G {} }
54     vis_passthru! { pub(crate) type H = i32; }
55     vis_passthru! { pub(crate) use A as I; }
56 }
57
58 mod with_crate {
59     vis_passthru! { crate const A: i32 = 0; }
60     vis_passthru! { crate enum B {} }
61     vis_passthru! { crate extern "C" fn c() {} }
62     vis_passthru! { crate mod d {} }
63     vis_passthru! { crate static E: i32 = 0; }
64     vis_passthru! { crate struct F; }
65     vis_passthru! { crate trait G {} }
66     vis_passthru! { crate type H = i32; }
67     vis_passthru! { crate use A as I; }
68 }
69
70 mod garden {
71     mod with_pub_restricted_path {
72         vis_passthru! { pub(in garden) const A: i32 = 0; }
73         vis_passthru! { pub(in garden) enum B {} }
74         vis_passthru! { pub(in garden) extern "C" fn c() {} }
75         vis_passthru! { pub(in garden) mod d {} }
76         vis_passthru! { pub(in garden) static E: i32 = 0; }
77         vis_passthru! { pub(in garden) struct F; }
78         vis_passthru! { pub(in garden) trait G {} }
79         vis_passthru! { pub(in garden) type H = i32; }
80         vis_passthru! { pub(in garden) use A as I; }
81     }
82 }
83
84 /*
85 Ensure that the `:vis` matcher works in a more complex situation: parsing a
86 struct definition.
87 */
88 macro_rules! vis_parse_struct {
89     ($(#[$($attrs:tt)*])* $vis:vis struct $name:ident {$($body:tt)*}) => {
90         vis_parse_struct! { @parse_fields $(#[$($attrs)*])*, $vis, $name, $($body)* }
91     };
92
93     ($(#[$($attrs:tt)*])* $vis:vis struct $name:ident ($($body:tt)*);) => {
94         vis_parse_struct! { @parse_tuple $(#[$($attrs)*])*, $vis, $name, $($body)* }
95     };
96
97     (@parse_fields
98      $(#[$attrs:meta])*, $vis:vis, $name:ident, $($fvis:vis $fname:ident: $fty:ty),* $(,)*) => {
99         $(#[$attrs])* $vis struct $name { $($fvis $fname: $fty,)* }
100     };
101
102     (@parse_tuple
103      $(#[$attrs:meta])*, $vis:vis, $name:ident, $($fvis:vis $fty:ty),* $(,)*) => {
104         $(#[$attrs])* $vis struct $name ( $($fvis $fty,)* );
105     };
106 }
107
108 mod test_struct {
109     vis_parse_struct! { pub(crate) struct A { pub a: i32, b: i32, pub(crate) c: i32 } }
110     vis_parse_struct! { pub struct B { a: i32, pub(crate) b: i32, pub c: i32 } }
111     vis_parse_struct! { struct C { pub(crate) a: i32, pub b: i32, c: i32 } }
112
113     vis_parse_struct! { pub(crate) struct D (pub i32, i32, pub(crate) i32); }
114     vis_parse_struct! { pub struct E (i32, pub(crate) i32, pub i32); }
115     vis_parse_struct! { struct F (pub(crate) i32, pub i32, i32); }
116 }
117
118 fn main() {}