1 // Some non-controversial subset of ambiguities "modern macro name" vs "macro_rules"
2 // is disambiguated to mitigate regressions from macro modularization.
3 // Scoping for `macro_rules` behaves like scoping for `let` at module level, in general.
4 
5 #![feature(decl_macro)]
6 
same_unnamed_mod()7 fn same_unnamed_mod() {
8     macro m() { 0 }
9 
10     macro_rules! m { () => (()) }
11 
12     m!() // OK
13 }
14 
nested_unnamed_mod()15 fn nested_unnamed_mod() {
16     macro m() { 0 }
17 
18     {
19         macro_rules! m { () => (()) }
20 
21         m!() // OK
22     }
23 }
24 
nested_unnamed_mod_fail()25 fn nested_unnamed_mod_fail() {
26     macro_rules! m { () => (()) }
27 
28     {
29         macro m() { 0 }
30 
31         m!() //~ ERROR `m` is ambiguous
32     }
33 }
34 
nexted_named_mod_fail()35 fn nexted_named_mod_fail() {
36     macro m() { 0 }
37 
38     #[macro_use]
39     mod inner {
40         macro_rules! m { () => (()) }
41     }
42 
43     m!() //~ ERROR `m` is ambiguous
44 }
45 
main()46 fn main() {}
47