1 // Legend: 2 // `N` - number of combination, from 0 to 4*4*4=64 3 // `Outer < Invoc` means that expansion that produced macro definition `Outer` 4 // is a strict ancestor of expansion that produced macro definition `Inner`. 5 // `>`, `=` and `Unordered` mean "strict descendant", "same" and 6 // "not in ordering relation" for parent expansions. 7 // `+` - possible configuration 8 // `-` - configuration impossible due to properties of partial ordering 9 // `-?` - configuration impossible due to block/scope syntax 10 // `+?` - configuration possible only with legacy scoping 11 12 // N | Outer ~ Invoc | Invoc ~ Inner | Outer ~ Inner | Possible | 13 // 1 | < | < | < | + | 14 // 2 | < | < | = | - | 15 // 3 | < | < | > | - | 16 // 4 | < | < | Unordered | - | 17 // 5 | < | = | < | + | 18 // 6 | < | = | = | - | 19 // 7 | < | = | > | - | 20 // 8 | < | = | Unordered | - | 21 // 9 | < | > | < | + | 22 // 10 | < | > | = | + | 23 // 11 | < | > | > | -? | 24 // 12 | < | > | Unordered | -? | 25 // 13 | < | Unordered | < | + | 26 // 14 | < | Unordered | = | - | 27 // 15 | < | Unordered | > | - | 28 // 16 | < | Unordered | Unordered | -? | 29 // 17 | = | < | < | + | 30 // 18 | = | < | = | - | 31 // 19 | = | < | > | - | 32 // 20 | = | < | Unordered | - | 33 // 21 | = | = | < | - | 34 // 22 | = | = | = | + | 35 // 23 | = | = | > | - | 36 // 24 | = | = | Unordered | - | 37 // 25 | = | > | < | - | 38 // 26 | = | > | = | - | 39 // 27 | = | > | > | -? | 40 // 28 | = | > | Unordered | - | 41 // 29 | = | Unordered | < | - | 42 // 30 | = | Unordered | = | - | 43 // 31 | = | Unordered | > | - | 44 // 32 | = | Unordered | Unordered | -? | 45 // 33 | > | < | < | -? | 46 // 34 | > | < | = | -? | 47 // 35 | > | < | > | -? | 48 // 36 | > | < | Unordered | + | 49 // 37 | > | = | < | - | 50 // 38 | > | = | = | - | 51 // 39 | > | = | > | + | 52 // 40 | > | = | Unordered | - | 53 // 41 | > | > | < | - | 54 // 42 | > | > | = | - | 55 // 43 | > | > | > | -? | 56 // 44 | > | > | Unordered | - | 57 // 45 | > | Unordered | < | - | 58 // 46 | > | Unordered | = | - | 59 // 47 | > | Unordered | > | -? | 60 // 48 | > | Unordered | Unordered | -? | 61 // 49 | Unordered | < | < | -? | 62 // 50 | Unordered | < | = | - | 63 // 51 | Unordered | < | > | - | 64 // 52 | Unordered | < | Unordered | + | 65 // 53 | Unordered | = | < | - | 66 // 54 | Unordered | = | = | - | 67 // 55 | Unordered | = | > | - | 68 // 56 | Unordered | = | Unordered | + | 69 // 57 | Unordered | > | < | - | 70 // 58 | Unordered | > | = | - | 71 // 59 | Unordered | > | > | + | 72 // 60 | Unordered | > | Unordered | + | 73 // 61 | Unordered | Unordered | < | -? | 74 // 62 | Unordered | Unordered | = | -? | 75 // 63 | Unordered | Unordered | > | -? | 76 // 64 | Unordered | Unordered | Unordered | + | 77 78 #![feature(decl_macro, rustc_attrs)] 79 80 struct Right; 81 // struct Wrong; // not defined 82 83 #[rustc_macro_transparency = "transparent"] 84 macro include() { 85 #[rustc_macro_transparency = "transparent"] 86 macro gen_outer() { 87 macro m() { Wrong } 88 } 89 #[rustc_macro_transparency = "transparent"] 90 macro gen_inner() { 91 macro m() { Right } 92 } 93 #[rustc_macro_transparency = "transparent"] 94 macro gen_invoc() { 95 m!() 96 } 97 check1()98 fn check1() { 99 macro m() {} 100 { 101 #[rustc_macro_transparency = "transparent"] 102 macro gen_gen_inner_invoc() { 103 gen_inner!(); 104 m!(); //~ ERROR `m` is ambiguous 105 } 106 gen_gen_inner_invoc!(); 107 } 108 } 109 check5()110 fn check5() { 111 macro m() { Wrong } 112 { 113 #[rustc_macro_transparency = "transparent"] 114 macro gen_inner_invoc() { 115 macro m() { Right } 116 m!(); // OK 117 } 118 gen_inner_invoc!(); 119 } 120 } 121 check9()122 fn check9() { 123 macro m() { Wrong } 124 { 125 #[rustc_macro_transparency = "transparent"] 126 macro gen_inner_gen_invoc() { 127 macro m() { Right } 128 gen_invoc!(); // OK 129 } 130 gen_inner_gen_invoc!(); 131 } 132 } 133 check10()134 fn check10() { 135 macro m() { Wrong } 136 { 137 macro m() { Right } 138 gen_invoc!(); // OK 139 } 140 } 141 check13()142 fn check13() { 143 macro m() {} 144 { 145 gen_inner!(); 146 #[rustc_macro_transparency = "transparent"] 147 macro gen_invoc() { m!() } //~ ERROR `m` is ambiguous 148 gen_invoc!(); 149 } 150 } 151 check17()152 fn check17() { 153 macro m() {} 154 { 155 gen_inner!(); 156 m!(); //~ ERROR `m` is ambiguous 157 } 158 } 159 check22()160 fn check22() { 161 macro m() { Wrong } 162 { 163 macro m() { Right } 164 m!(); // OK 165 } 166 } 167 check36()168 fn check36() { 169 gen_outer!(); 170 { 171 gen_inner!(); 172 m!(); //~ ERROR `m` is ambiguous 173 } 174 } 175 check39()176 fn check39() { 177 gen_outer!(); 178 { 179 macro m() { Right } 180 m!(); // OK 181 } 182 } 183 check52()184 fn check52() { 185 gen_outer!(); 186 { 187 #[rustc_macro_transparency = "transparent"] 188 macro gen_gen_inner_invoc() { 189 gen_inner!(); 190 m!(); //~ ERROR `m` is ambiguous 191 } 192 gen_gen_inner_invoc!(); 193 } 194 } 195 check56()196 fn check56() { 197 gen_outer!(); 198 { 199 #[rustc_macro_transparency = "transparent"] 200 macro gen_inner_invoc() { 201 macro m() { Right } 202 m!(); // OK 203 } 204 gen_inner_invoc!(); 205 } 206 } 207 check59()208 fn check59() { 209 gen_outer!(); 210 { 211 macro m() { Right } 212 gen_invoc!(); // OK 213 } 214 } 215 check60()216 fn check60() { 217 gen_outer!(); 218 { 219 #[rustc_macro_transparency = "transparent"] 220 macro gen_inner_gen_invoc() { 221 macro m() { Right } 222 gen_invoc!(); // OK 223 } 224 gen_inner_gen_invoc!(); 225 } 226 } 227 check64()228 fn check64() { 229 gen_outer!(); 230 { 231 gen_inner!(); 232 #[rustc_macro_transparency = "transparent"] 233 macro gen_invoc() { m!() } //~ ERROR `m` is ambiguous 234 gen_invoc!(); 235 } 236 } 237 } 238 239 include!(); 240 main()241fn main() {} 242