]> git.proxmox.com Git - rustc.git/blame - src/tools/clippy/tests/ui/auxiliary/proc_macro_derive.rs
bump version to 1.79.0+dfsg1-1~bpo12+pve2
[rustc.git] / src / tools / clippy / tests / ui / auxiliary / proc_macro_derive.rs
CommitLineData
f20569fa
XL
1#![feature(repr128, proc_macro_quote)]
2#![allow(incomplete_features)]
3#![allow(clippy::field_reassign_with_default)]
4#![allow(clippy::eq_op)]
5
6extern crate proc_macro;
7
49aad941 8use proc_macro::{quote, Delimiter, Group, Ident, Literal, Punct, Spacing, Span, TokenStream, TokenTree};
f20569fa
XL
9
10#[proc_macro_derive(DeriveSomething)]
11pub fn derive(_: TokenStream) -> TokenStream {
04454e1e 12 // Should not trigger `used_underscore_binding`
f20569fa
XL
13 let _inside_derive = 1;
14 assert_eq!(_inside_derive, _inside_derive);
15
16 let output = quote! {
17 // Should not trigger `useless_attribute`
18 #[allow(dead_code)]
19 extern crate rustc_middle;
20 };
21 output
22}
23
ed00b5ec
FG
24#[proc_macro_derive(ImplStructWithStdDisplay)]
25pub fn derive_std(_: TokenStream) -> TokenStream {
26 quote! {
27 struct A {}
28 impl ::std::fmt::Display for A {
29 fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
30 write!(f, "A")
31 }
32 }
33 }
34}
35
f20569fa
XL
36#[proc_macro_derive(FieldReassignWithDefault)]
37pub fn derive_foo(_input: TokenStream) -> TokenStream {
38 quote! {
39 #[derive(Default)]
40 struct A {
41 pub i: i32,
42 pub j: i64,
43 }
44 #[automatically_derived]
45 fn lint() {
46 let mut a: A = Default::default();
47 a.i = 42;
48 a;
49 }
50 }
51}
52
53#[proc_macro_derive(StructAUseSelf)]
54pub fn derive_use_self(_input: TokenStream) -> proc_macro::TokenStream {
55 quote! {
56 struct A;
57 impl A {
58 fn new() -> A {
59 A
60 }
61 }
62 }
63}
17df50a5
XL
64
65#[proc_macro_derive(ClippyMiniMacroTest)]
66pub fn mini_macro(_: TokenStream) -> TokenStream {
67 quote!(
68 #[allow(unused)]
69 fn needless_take_by_value(s: String) {
70 println!("{}", s.len());
71 }
72 #[allow(unused)]
73 fn needless_loop(items: &[u8]) {
74 for i in 0..items.len() {
75 println!("{}", items[i]);
76 }
77 }
78 fn line_wrapper() {
79 println!("{}", line!());
80 }
81 )
82}
064997fb
FG
83
84#[proc_macro_derive(ExtraLifetimeDerive)]
85#[allow(unused)]
86pub fn extra_lifetime(_input: TokenStream) -> TokenStream {
87 quote!(
88 pub struct ExtraLifetime;
89
90 impl<'b> ExtraLifetime {
91 pub fn something<'c>() -> Self {
92 Self
93 }
94 }
95 )
96}
49aad941
FG
97
98#[allow(unused)]
99#[proc_macro_derive(ArithmeticDerive)]
100pub fn arithmetic_derive(_: TokenStream) -> TokenStream {
fe692bf9
FG
101 <TokenStream as FromIterator<TokenTree>>::from_iter([
102 Ident::new("fn", Span::call_site()).into(),
103 Ident::new("_foo", Span::call_site()).into(),
104 Group::new(Delimiter::Parenthesis, TokenStream::new()).into(),
105 Group::new(
106 Delimiter::Brace,
107 <TokenStream as FromIterator<TokenTree>>::from_iter([
108 Ident::new("let", Span::call_site()).into(),
109 Ident::new("mut", Span::call_site()).into(),
110 Ident::new("_n", Span::call_site()).into(),
111 Punct::new('=', Spacing::Alone).into(),
112 Literal::i32_unsuffixed(9).into(),
113 Punct::new(';', Spacing::Alone).into(),
114 Ident::new("_n", Span::call_site()).into(),
115 Punct::new('=', Spacing::Alone).into(),
116 Literal::i32_unsuffixed(9).into(),
117 Punct::new('/', Spacing::Alone).into(),
118 Literal::i32_unsuffixed(2).into(),
119 Punct::new(';', Spacing::Alone).into(),
120 Ident::new("_n", Span::call_site()).into(),
121 Punct::new('=', Spacing::Alone).into(),
122 Punct::new('-', Spacing::Alone).into(),
123 Ident::new("_n", Span::call_site()).into(),
124 Punct::new(';', Spacing::Alone).into(),
125 ]),
126 )
127 .into(),
128 ])
49aad941
FG
129}
130
131#[allow(unused)]
132#[proc_macro_derive(ShadowDerive)]
133pub fn shadow_derive(_: TokenStream) -> TokenStream {
fe692bf9
FG
134 <TokenStream as FromIterator<TokenTree>>::from_iter([
135 Ident::new("fn", Span::call_site()).into(),
136 Ident::new("_foo", Span::call_site()).into(),
137 Group::new(Delimiter::Parenthesis, TokenStream::new()).into(),
138 Group::new(
139 Delimiter::Brace,
140 <TokenStream as FromIterator<TokenTree>>::from_iter([
141 Ident::new("let", Span::call_site()).into(),
142 Ident::new("_x", Span::call_site()).into(),
143 Punct::new('=', Spacing::Alone).into(),
144 Literal::i32_unsuffixed(2).into(),
145 Punct::new(';', Spacing::Alone).into(),
146 Ident::new("let", Span::call_site()).into(),
147 Ident::new("_x", Span::call_site()).into(),
148 Punct::new('=', Spacing::Alone).into(),
149 Ident::new("_x", Span::call_site()).into(),
150 Punct::new(';', Spacing::Alone).into(),
151 ]),
152 )
153 .into(),
154 ])
49aad941 155}
ed00b5ec
FG
156
157#[proc_macro_derive(StructIgnoredUnitPattern)]
158pub fn derive_ignored_unit_pattern(_: TokenStream) -> TokenStream {
159 quote! {
160 struct A;
161 impl A {
162 fn a(&self) -> Result<(), ()> {
163 unimplemented!()
164 }
165
166 pub fn b(&self) {
167 let _ = self.a().unwrap();
168 }
169 }
170 }
171}