mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-11-03 22:49:17 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			67 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
// aux-build:attr-stmt-expr.rs
 | 
						|
// aux-build:test-macros.rs
 | 
						|
// compile-flags: -Z span-debug
 | 
						|
 | 
						|
#![feature(proc_macro_hygiene)]
 | 
						|
#![feature(rustc_attrs)]
 | 
						|
 | 
						|
#![no_std] // Don't load unnecessary hygiene information from std
 | 
						|
extern crate std;
 | 
						|
extern crate test_macros;
 | 
						|
extern crate attr_stmt_expr;
 | 
						|
 | 
						|
use test_macros::print_attr;
 | 
						|
use attr_stmt_expr::{expect_let, expect_my_macro_stmt, expect_expr, expect_my_macro_expr};
 | 
						|
 | 
						|
// We don't use `std::println` so that we avoid loading hygiene
 | 
						|
// information from libstd, which would affect the SyntaxContext ids
 | 
						|
macro_rules! my_macro {
 | 
						|
    ($($tt:tt)*) => { () }
 | 
						|
}
 | 
						|
 | 
						|
fn print_str(string: &'static str) {
 | 
						|
    // macros are handled a bit differently
 | 
						|
    #[expect_my_macro_expr]
 | 
						|
    //~^ ERROR attributes on expressions are experimental
 | 
						|
    //~| HELP add `#![feature(stmt_expr_attributes)]` to the crate attributes to enable
 | 
						|
    my_macro!("{}", string)
 | 
						|
}
 | 
						|
 | 
						|
macro_rules! make_stmt {
 | 
						|
    ($stmt:stmt) => {
 | 
						|
        #[print_attr]
 | 
						|
        #[rustc_dummy]
 | 
						|
        $stmt
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
macro_rules! second_make_stmt {
 | 
						|
    ($stmt:stmt) => {
 | 
						|
        make_stmt!($stmt);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
fn main() {
 | 
						|
    make_stmt!(struct Foo {});
 | 
						|
 | 
						|
    #[print_attr]
 | 
						|
    #[expect_let]
 | 
						|
    let string = "Hello, world!";
 | 
						|
 | 
						|
    #[print_attr]
 | 
						|
    #[expect_my_macro_stmt]
 | 
						|
    my_macro!("{}", string);
 | 
						|
 | 
						|
    #[print_attr]
 | 
						|
    second_make_stmt!(#[allow(dead_code)] struct Bar {});
 | 
						|
 | 
						|
    #[print_attr]
 | 
						|
    #[rustc_dummy]
 | 
						|
    struct Other {}
 | 
						|
 | 
						|
    #[expect_expr]
 | 
						|
    //~^ ERROR attributes on expressions are experimental
 | 
						|
    //~| HELP add `#![feature(stmt_expr_attributes)]` to the crate attributes to enable
 | 
						|
    print_str("string")
 | 
						|
}
 |