//@ aux-build:parent-source-spans.rs #![feature(decl_macro)] extern crate parent_source_spans; use parent_source_spans::parent_source_spans; macro one($a:expr, $b:expr) { two!($a, $b); //~^ ERROR first parent: "hello" //~| ERROR second parent: "world" } macro two($a:expr, $b:expr) { three!($a, $b); //~^ ERROR first final: "hello" //~| ERROR second final: "world" //~| ERROR first final: "yay" //~| ERROR second final: "rust" } // forwarding tokens directly doesn't create a new source chain macro three($($tokens:tt)*) { four!($($tokens)*); } macro four($($tokens:tt)*) { parent_source_spans!($($tokens)*); //~^ ERROR cannot find value `ok` in this scope //~| ERROR cannot find value `ok` in this scope //~| ERROR cannot find value `ok` in this scope } fn main() { one!("hello", "world"); //~^ ERROR first grandparent: "hello" //~| ERROR second grandparent: "world" //~| ERROR first source: "hello" //~| ERROR second source: "world" two!("yay", "rust"); //~^ ERROR first parent: "yay" //~| ERROR second parent: "rust" //~| ERROR first source: "yay" //~| ERROR second source: "rust" three!("hip", "hop"); //~^ ERROR first final: "hip" //~| ERROR second final: "hop" //~| ERROR first source: "hip" //~| ERROR second source: "hop" }