1// Check interoperability with rustc and clippy lints.
2
3#![forbid(unsafe_code)]
4// for old compilers
5#![allow(unknown_lints)]
6#![warn(nonstandard_style, rust_2018_idioms, unused)]
7// Note: This does not guarantee compatibility with forbidding these lints in the future.
8// If rustc adds a new lint, we may not be able to keep this.
9#![forbid(future_incompatible, rust_2018_compatibility, rust_2021_compatibility)]
10// lints forbidden as a part of future_incompatible, rust_2018_compatibility, and rust_2021_compatibility are not included in the list below.
11// elided_lifetimes_in_paths, explicit_outlives_requirements, unused_extern_crates: as a part of rust_2018_idioms
12// unsafe_op_in_unsafe_fn: requires Rust 1.52. and, we don't generate unsafe fn.
13// non_exhaustive_omitted_patterns, multiple_supertrait_upcastable: unstable
14// unstable_features: no way to generate #![feature(..)] by macros, expect for unstable inner attribute. and this lint is deprecated: https://doc.rust-lang.org/rustc/lints/listing/allowed-by-default.html#unstable-features
15// unused_crate_dependencies, must_not_suspend: unrelated
16// unsafe_code: checked in forbid_unsafe module
17#![warn(
18 box_pointers,
19 deprecated_in_future,
20 fuzzy_provenance_casts,
21 invalid_reference_casting,
22 let_underscore_drop,
23 lossy_provenance_casts,
24 macro_use_extern_crate,
25 meta_variable_misuse,
26 missing_abi,
27 missing_copy_implementations,
28 missing_debug_implementations,
29 missing_docs,
30 non_ascii_idents,
31 noop_method_call,
32 private_bounds,
33 private_interfaces,
34 single_use_lifetimes,
35 trivial_casts,
36 trivial_numeric_casts,
37 unnameable_types,
38 unreachable_pub,
39 unused_import_braces,
40 unused_lifetimes,
41 unused_qualifications,
42 unused_results,
43 unused_tuple_struct_fields,
44 variant_size_differences
45)]
46#![warn(clippy::all, clippy::pedantic, clippy::nursery, clippy::restriction)]
47#![allow(clippy::blanket_clippy_restriction_lints)] // this is a test, so enable all restriction lints intentionally.
48#![allow(
49 clippy::exhaustive_enums,
50 clippy::exhaustive_structs,
51 clippy::min_ident_chars,
52 clippy::single_char_lifetime_names
53)] // TODO
54
55pub mod basic {
56 include!("include/basic.rs");
57}
58
59pub mod box_pointers {
60 use pin_project_lite::pin_project;
61
62 pin_project! {
63 #[derive(Debug)]
64 pub struct Struct {
65 #[pin]
66 pub p: Box<isize>,
67 pub u: Box<isize>,
68 }
69 }
70
71 pin_project! {
72 #[project = EnumProj]
73 #[project_ref = EnumProjRef]
74 #[project(!Unpin)]
75 #[derive(Debug)]
76 pub enum Enum {
77 Struct {
78 #[pin]
79 p: Box<isize>,
80 u: Box<isize>,
81 },
82 Unit,
83 }
84 }
85}
86
87pub mod explicit_outlives_requirements {
88 use pin_project_lite::pin_project;
89
90 pin_project! {
91 #[derive(Debug)]
92 pub struct Struct<'a, T, U>
93 where
94 T: ?Sized,
95 U: ?Sized,
96 {
97 #[pin]
98 pub pinned: &'a mut T,
99 pub unpinned: &'a mut U,
100 }
101 }
102
103 pin_project! {
104 #[project = EnumProj]
105 #[project_ref = EnumProjRef]
106 #[project(!Unpin)]
107 #[derive(Debug)]
108 pub enum Enum<'a, T, U>
109 where
110 T: ?Sized,
111 U: ?Sized,
112 {
113 Struct {
114 #[pin]
115 pinned: &'a mut T,
116 unpinned: &'a mut U,
117 },
118 Unit,
119 }
120 }
121}
122
123pub mod variant_size_differences {
124 use pin_project_lite::pin_project;
125
126 pin_project! {
127 #[project = EnumProj]
128 #[project_ref = EnumProjRef]
129 #[project(!Unpin)]
130 #[allow(missing_debug_implementations, missing_copy_implementations)] // https://github.com/rust-lang/rust/pull/74060
131 #[allow(variant_size_differences)] // for the type itself
132 #[allow(clippy::large_enum_variant)] // for the type itself
133 pub enum Enum {
134 V1 { f: u8 },
135 V2 { f: [u8; 1024] },
136 }
137 }
138}
139
140pub mod clippy_mut_mut {
141 use pin_project_lite::pin_project;
142
143 pin_project! {
144 #[derive(Debug)]
145 pub struct Struct<'a, T, U> {
146 #[pin]
147 pub pinned: &'a mut T,
148 pub unpinned: &'a mut U,
149 }
150 }
151
152 pin_project! {
153 #[project = EnumProj]
154 #[project_ref = EnumProjRef]
155 #[project(!Unpin)]
156 #[derive(Debug)]
157 pub enum Enum<'a, T, U> {
158 Struct {
159 #[pin]
160 pinned: &'a mut T,
161 unpinned: &'a mut U,
162 },
163 Unit,
164 }
165 }
166}
167
168#[allow(unreachable_pub)]
169mod clippy_redundant_pub_crate {
170 use pin_project_lite::pin_project;
171
172 pin_project! {
173 #[derive(Debug)]
174 pub struct Struct<T, U> {
175 #[pin]
176 pub pinned: T,
177 pub unpinned: U,
178 }
179 }
180
181 pin_project! {
182 #[project = EnumProj]
183 #[project_ref = EnumProjRef]
184 #[project(!Unpin)]
185 #[derive(Debug)]
186 pub enum Enum<T, U> {
187 Struct {
188 #[pin]
189 pinned: T,
190 unpinned: U,
191 },
192 Unit,
193 }
194 }
195}
196
197#[allow(clippy::use_self)]
198pub mod clippy_type_repetition_in_bounds {
199 use pin_project_lite::pin_project;
200
201 pin_project! {
202 #[derive(Debug)]
203 pub struct Struct<T, U>
204 where
205 Struct<T, U>: Sized,
206 {
207 #[pin]
208 pub pinned: T,
209 pub unpinned: U,
210 }
211 }
212
213 pin_project! {
214 #[project = EnumProj]
215 #[project_ref = EnumProjRef]
216 #[project(!Unpin)]
217 #[derive(Debug)]
218 pub enum Enum<T, U>
219 where
220 Enum<T, U>: Sized,
221 {
222 Struct {
223 #[pin]
224 pinned: T,
225 unpinned: U,
226 },
227 Unit,
228 }
229 }
230}
231
232#[allow(missing_debug_implementations)]
233pub mod clippy_used_underscore_binding {
234 use pin_project_lite::pin_project;
235
236 pin_project! {
237 pub struct Struct<T, U> {
238 #[pin]
239 pub _pinned: T,
240 pub _unpinned: U,
241 }
242 }
243
244 pin_project! {
245 #[project = EnumProj]
246 #[project_ref = EnumProjRef]
247 #[project(!Unpin)]
248 pub enum Enum<T, U> {
249 Struct {
250 #[pin]
251 _pinned: T,
252 _unpinned: U,
253 },
254 }
255 }
256}
257
258pub mod clippy_ref_option_ref {
259 use pin_project_lite::pin_project;
260
261 pin_project! {
262 pub struct Struct<'a> {
263 #[pin]
264 pub _pinned: Option<&'a ()>,
265 pub _unpinned: Option<&'a ()>,
266 }
267 }
268
269 pin_project! {
270 #[project = EnumProj]
271 #[project_ref = EnumProjRef]
272 #[project(!Unpin)]
273 pub enum Enum<'a> {
274 Struct {
275 #[pin]
276 _pinned: Option<&'a ()>,
277 _unpinned: Option<&'a ()>,
278 },
279 }
280 }
281}
282