--- /dev/null
+// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// aux-build:two_macros.rs
+
+#![feature(use_extern_macros)]
+
+extern crate two_macros;
+
+mod foo {
+ pub mod bar {
+ pub use two_macros::m;
+ }
+}
+
+fn f() {
+ use foo::*; //~ NOTE could also resolve to the name imported here
+ bar::m! { //~ ERROR ambiguous
+ //~| NOTE macro-expanded items do not shadow when used in a macro invocation path
+ mod bar { pub use two_macros::m; } //~ NOTE could resolve to the name defined here
+ //~^^^ NOTE in this expansion
+ }
+}
+
+pub mod baz { //~ NOTE could also resolve to the name defined here
+ pub use two_macros::m;
+}
+
+fn g() {
+ baz::m! { //~ ERROR ambiguous
+ //~| NOTE macro-expanded items do not shadow when used in a macro invocation path
+ mod baz { pub use two_macros::m; } //~ NOTE could resolve to the name defined here
+ //~^^^ NOTE in this expansion
+ }
+}
// except according to those terms.
fn main() {
- globnar::brotz!(); //~ ERROR expected macro name without module separators
- ::foo!(); //~ ERROR expected macro name without module separators
- foo::<T>!(); //~ ERROR expected macro name without module separators
+ globnar::brotz!(); //~ ERROR non-ident macro paths are experimental
+ ::foo!(); //~ ERROR non-ident macro paths are experimental
+ foo::<T>!(); //~ ERROR type parameters are not allowed on macros
}
+++ /dev/null
-// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-::foo::bar!(); //~ ERROR expected macro name without module separators
-foo::bar!(); //~ ERROR expected macro name without module separators
-
-trait T {
- foo::bar!(); //~ ERROR expected macro name without module separators
- ::foo::bar!(); //~ ERROR expected macro name without module separators
-}
-
-struct S {
- x: foo::bar!(), //~ ERROR expected macro name without module separators
- y: ::foo::bar!(), //~ ERROR expected macro name without module separators
-}
-
-impl S {
- foo::bar!(); //~ ERROR expected macro name without module separators
- ::foo::bar!(); //~ ERROR expected macro name without module separators
-}
-
-fn main() {
- foo::bar!(); //~ ERROR expected macro name without module separators
- ::foo::bar!(); //~ ERROR expected macro name without module separators
-
- let _ = foo::bar!(); //~ ERROR expected macro name without module separators
- let _ = ::foo::bar!(); //~ ERROR expected macro name without module separators
-
- let foo::bar!() = 0; //~ ERROR expected macro name without module separators
- let ::foo::bar!() = 0; //~ ERROR expected macro name without module separators
-}
// except according to those terms.
#[macro_export]
-macro_rules! macro_one { () => ("one") }
+macro_rules! macro_one { ($($t:tt)*) => ($($t)*) }
#[macro_export]
-macro_rules! macro_two { () => ("two") }
+macro_rules! macro_two { ($($t:tt)*) => ($($t)*) }
--- /dev/null
+// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// aux-build:two_macros.rs
+
+#![feature(use_extern_macros)]
+
+extern crate two_macros;
+
+::two_macros::macro_one!();
+two_macros::macro_one!();
+
+mod foo { pub use two_macros::macro_one as bar; }
+
+trait T {
+ foo::bar!();
+ ::foo::bar!();
+}
+
+struct S {
+ x: foo::bar!(i32),
+ y: ::foo::bar!(i32),
+}
+
+impl S {
+ foo::bar!();
+ ::foo::bar!();
+}
+
+fn main() {
+ foo::bar!();
+ ::foo::bar!();
+
+ let _ = foo::bar!(0);
+ let _ = ::foo::bar!(0);
+
+ let foo::bar!(_) = 0;
+ let ::foo::bar!(_) = 0;
+}