Skip to content

Commit d1c89d6

Browse files
committed
Test for printing attrs on formal params.
1 parent dd98727 commit d1c89d6

File tree

2 files changed

+90
-0
lines changed

2 files changed

+90
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// force-host
2+
// no-prefer-dynamic
3+
4+
#![crate_type = "proc-macro"]
5+
6+
extern crate proc_macro;
7+
8+
use proc_macro::TokenStream;
9+
10+
macro_rules! checker {
11+
($attr_name:ident, $expected:literal) => {
12+
#[proc_macro_attribute]
13+
pub fn $attr_name(attr: TokenStream, input: TokenStream) -> TokenStream {
14+
assert!(attr.to_string().is_empty());
15+
assert_eq!(input.to_string(), $expected);
16+
TokenStream::new()
17+
}
18+
}
19+
}
20+
21+
checker!(attr_extern, r#"extern "C" {
22+
fn ffi(#[a1] arg1: i32, #[a2] ...);
23+
}"#);
24+
checker!(attr_extern_cvar, r#"unsafe extern "C" fn cvar(arg1: i32, #[a1] mut args: ...) { }"#);
25+
checker!(attr_alias, "type Alias = fn(#[a1] u8, #[a2] ...);");
26+
checker!(attr_free, "fn free(#[a1] arg1: u8) { let lam = |#[a2] W(x), #[a3] y| (); }");
27+
checker!(attr_inherent_1, "fn inherent1(#[a1] self, #[a2] arg1: u8) { }");
28+
checker!(attr_inherent_2, "fn inherent2(#[a1] &self, #[a2] arg1: u8) { }");
29+
checker!(attr_inherent_3, "fn inherent3<'a>(#[a1] &'a mut self, #[a2] arg1: u8) { }");
30+
checker!(attr_inherent_4, "fn inherent4<'a>(#[a1] self: Box<Self>, #[a2] arg1: u8) { }");
31+
checker!(attr_trait_1, "fn trait1(#[a1] self, #[a2] arg1: u8);");
32+
checker!(attr_trait_2, "fn trait2(#[a1] &self, #[a2] arg1: u8);");
33+
checker!(attr_trait_3, "fn trait3<'a>(#[a1] &'a mut self, #[a2] arg1: u8);");
34+
checker!(attr_trait_4, "fn trait4<'a>(#[a1] self: Box<Self>, #[a2] arg1: u8, #[a3] Vec<u8>);");
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
// aux-build:param-attrs.rs
2+
3+
// check-pass
4+
5+
#![feature(param_attrs)]
6+
#![feature(c_variadic)]
7+
8+
extern crate param_attrs;
9+
10+
use param_attrs::*;
11+
12+
struct W(u8);
13+
14+
#[attr_extern]
15+
extern "C" { fn ffi(#[a1] arg1: i32, #[a2] ...); }
16+
17+
#[attr_extern_cvar]
18+
unsafe extern "C" fn cvar(arg1: i32, #[a1] mut args: ...) {}
19+
20+
#[attr_alias]
21+
type Alias = fn(#[a1] u8, #[a2] ...);
22+
23+
#[attr_free]
24+
fn free(#[a1] arg1: u8) {
25+
let lam = |#[a2] W(x), #[a3] y| ();
26+
}
27+
28+
impl W {
29+
#[attr_inherent_1]
30+
fn inherent1(#[a1] self, #[a2] arg1: u8) {}
31+
32+
#[attr_inherent_2]
33+
fn inherent2(#[a1] &self, #[a2] arg1: u8) {}
34+
35+
#[attr_inherent_3]
36+
fn inherent3<'a>(#[a1] &'a mut self, #[a2] arg1: u8) {}
37+
38+
#[attr_inherent_4]
39+
fn inherent4<'a>(#[a1] self: Box<Self>, #[a2] arg1: u8) {}
40+
}
41+
42+
trait A {
43+
#[attr_trait_1]
44+
fn trait1(#[a1] self, #[a2] arg1: u8);
45+
46+
#[attr_trait_2]
47+
fn trait2(#[a1] &self, #[a2] arg1: u8);
48+
49+
#[attr_trait_3]
50+
fn trait3<'a>(#[a1] &'a mut self, #[a2] arg1: u8);
51+
52+
#[attr_trait_4]
53+
fn trait4<'a>(#[a1] self: Box<Self>, #[a2] arg1: u8, #[a3] Vec<u8>);
54+
}
55+
56+
fn main() {}

0 commit comments

Comments
 (0)