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