1 // Check interoperability with rustc and clippy lints.
2 
3 // for old compilers
4 #![allow(unknown_lints)]
5 #![warn(nonstandard_style, rust_2018_idioms, unused)]
6 // Note: This does not guarantee compatibility with forbidding these lints in the future.
7 // If rustc adds a new lint, we may not be able to keep this.
8 #![forbid(future_incompatible, rust_2018_compatibility, rust_2021_compatibility)]
9 // lints forbidden as a part of future_incompatible, rust_2018_compatibility, and rust_2021_compatibility are not included in the list below.
10 // elided_lifetimes_in_paths, explicit_outlives_requirements, unused_extern_crates:  as a part of rust_2018_idioms
11 // unsafe_op_in_unsafe_fn: requires Rust 1.52. and, we don't generate unsafe fn.
12 // non_exhaustive_omitted_patterns, multiple_supertrait_upcastable: unstable
13 // 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
14 // unused_crate_dependencies, must_not_suspend: unrelated
15 // unsafe_code: checked in forbid_unsafe module
16 #![warn(
17     box_pointers,
18     deprecated_in_future,
19     fuzzy_provenance_casts,
20     invalid_reference_casting,
21     let_underscore_drop,
22     lossy_provenance_casts,
23     macro_use_extern_crate,
24     meta_variable_misuse,
25     missing_abi,
26     missing_copy_implementations,
27     missing_debug_implementations,
28     missing_docs,
29     non_ascii_idents,
30     noop_method_call,
31     private_bounds,
32     private_interfaces,
33     single_use_lifetimes,
34     trivial_casts,
35     trivial_numeric_casts,
36     // unnameable_types, // TODO
37     unreachable_pub,
38     unused_import_braces,
39     unused_lifetimes,
40     unused_qualifications,
41     unused_results,
42     unused_tuple_struct_fields,
43     variant_size_differences
44 )]
45 #![warn(clippy::all, clippy::pedantic, clippy::nursery, clippy::restriction)]
46 #![allow(clippy::blanket_clippy_restriction_lints)] // this is a test, so enable all restriction lints intentionally.
47 #![allow(
48     clippy::absolute_paths,
49     clippy::exhaustive_enums,
50     clippy::exhaustive_structs,
51     clippy::min_ident_chars,
52     clippy::pub_with_shorthand,
53     clippy::single_call_fn,
54     clippy::single_char_lifetime_names
55 )] // TODO
56 
57 pub mod basic {
58     include!("include/basic.rs");
59 
60     pub mod inside_macro {
61         #[rustfmt::skip]
62         macro_rules! mac {
63             () => {
64                 #[::pin_project::pin_project]
65                 #[derive(Debug)]
66                 pub struct DefaultStruct<T, U> {
67                     #[pin]
68                     pub pinned: T,
69                     pub unpinned: U,
70                 }
71 
72                 #[::pin_project::pin_project(
73                     project = DefaultStructNamedProj,
74                     project_ref = DefaultStructNamedProjRef,
75                 )]
76                 #[derive(Debug)]
77                 pub struct DefaultStructNamed<T, U> {
78                     #[pin]
79                     pub pinned: T,
80                     pub unpinned: U,
81                 }
82 
83                 #[::pin_project::pin_project]
84                 #[derive(Debug)]
85                 pub struct DefaultTupleStruct<T, U>(#[pin] pub T, pub U);
86 
87                 #[::pin_project::pin_project(
88                     project = DefaultTupleStructNamedProj,
89                     project_ref = DefaultTupleStructNamedProjRef,
90                 )]
91                 #[derive(Debug)]
92                 pub struct DefaultTupleStructNamed<T, U>(#[pin] pub T, pub U);
93 
94                 #[::pin_project::pin_project(
95                     project = DefaultEnumProj,
96                     project_ref = DefaultEnumProjRef,
97                 )]
98                 #[derive(Debug)]
99                 pub enum DefaultEnum<T, U> {
100                     Struct {
101                         #[pin]
102                         pinned: T,
103                         unpinned: U,
104                     },
105                     Tuple(#[pin] T, U),
106                     Unit,
107                 }
108 
109                 #[::pin_project::pin_project(PinnedDrop)]
110                 #[derive(Debug)]
111                 pub struct PinnedDropStruct<T, U> {
112                     #[pin]
113                     pub pinned: T,
114                     pub unpinned: U,
115                 }
116 
117                 #[::pin_project::pinned_drop]
118                 impl<T, U> PinnedDrop for PinnedDropStruct<T, U> {
119                     fn drop(self: ::pin_project::__private::Pin<&mut Self>) {}
120                 }
121 
122                 #[::pin_project::pin_project(PinnedDrop)]
123                 #[derive(Debug)]
124                 pub struct PinnedDropTupleStruct<T, U>(#[pin] pub T, pub U);
125 
126                 #[::pin_project::pinned_drop]
127                 impl<T, U> PinnedDrop for PinnedDropTupleStruct<T, U> {
128                     fn drop(self: ::pin_project::__private::Pin<&mut Self>) {}
129                 }
130 
131                 #[::pin_project::pin_project(
132                     PinnedDrop,
133                     project = PinnedDropEnumProj,
134                     project_ref = PinnedDropEnumProjRef,
135                 )]
136                 #[derive(Debug)]
137                 pub enum PinnedDropEnum<T, U> {
138                     Struct {
139                         #[pin]
140                         pinned: T,
141                         unpinned: U,
142                     },
143                     Tuple(#[pin] T, U),
144                     Unit,
145                 }
146 
147                 #[::pin_project::pinned_drop]
148                 impl<T, U> PinnedDrop for PinnedDropEnum<T, U> {
149                     fn drop(self: ::pin_project::__private::Pin<&mut Self>) {}
150                 }
151 
152                 #[::pin_project::pin_project(project_replace)]
153                 #[derive(Debug)]
154                 pub struct ReplaceStruct<T, U> {
155                     #[pin]
156                     pub pinned: T,
157                     pub unpinned: U,
158                 }
159 
160                 #[::pin_project::pin_project(
161                     project = ReplaceStructNamedProj,
162                     project_ref = ReplaceStructNamedProjRef,
163                     project_replace = ReplaceStructNamedProjOwn,
164                 )]
165                 #[derive(Debug)]
166                 pub struct ReplaceStructNamed<T, U> {
167                     #[pin]
168                     pub pinned: T,
169                     pub unpinned: U,
170                 }
171 
172                 #[::pin_project::pin_project(project_replace)]
173                 #[derive(Debug)]
174                 pub struct ReplaceTupleStruct<T, U>(#[pin] pub T, pub U);
175 
176                 #[::pin_project::pin_project(
177                     project = ReplaceTupleStructNamedProj,
178                     project_ref = ReplaceTupleStructNamedProjRef,
179                     project_replace = ReplaceTupleStructNamedProjOwn,
180                 )]
181                 #[derive(Debug)]
182                 pub struct ReplaceTupleStructNamed<T, U>(#[pin] pub T, pub U);
183 
184                 #[::pin_project::pin_project(
185                     project = ReplaceEnumProj,
186                     project_ref = ReplaceEnumProjRef,
187                     project_replace = ReplaceEnumProjOwn,
188                 )]
189                 #[derive(Debug)]
190                 pub enum ReplaceEnum<T, U> {
191                     Struct {
192                         #[pin]
193                         pinned: T,
194                         unpinned: U,
195                     },
196                     Tuple(#[pin] T, U),
197                     Unit,
198                 }
199 
200                 #[::pin_project::pin_project(UnsafeUnpin)]
201                 #[derive(Debug)]
202                 pub struct UnsafeUnpinStruct<T, U> {
203                     #[pin]
204                     pub pinned: T,
205                     pub unpinned: U,
206                 }
207 
208                 #[::pin_project::pin_project(UnsafeUnpin)]
209                 #[derive(Debug)]
210                 pub struct UnsafeUnpinTupleStruct<T, U>(#[pin] pub T, pub U);
211 
212                 #[::pin_project::pin_project(
213                     UnsafeUnpin,
214                     project = UnsafeUnpinEnumProj,
215                     project_ref = UnsafeUnpinEnumProjRef,
216                 )]
217                 #[derive(Debug)]
218                 pub enum UnsafeUnpinEnum<T, U> {
219                     Struct {
220                         #[pin]
221                         pinned: T,
222                         unpinned: U,
223                     },
224                     Tuple(#[pin] T, U),
225                     Unit,
226                 }
227 
228                 #[::pin_project::pin_project(!Unpin)]
229                 #[derive(Debug)]
230                 pub struct NotUnpinStruct<T, U> {
231                     #[pin]
232                     pub pinned: T,
233                     pub unpinned: U,
234                 }
235 
236                 #[::pin_project::pin_project(!Unpin)]
237                 #[derive(Debug)]
238                 pub struct NotUnpinTupleStruct<T, U>(#[pin] pub T, pub U);
239 
240                 #[::pin_project::pin_project(
241                     !Unpin,
242                     project = NotUnpinEnumProj,
243                     project_ref = NotUnpinEnumProjRef,
244                 )]
245                 #[derive(Debug)]
246                 pub enum NotUnpinEnum<T, U> {
247                     Struct {
248                         #[pin]
249                         pinned: T,
250                         unpinned: U,
251                     },
252                     Tuple(#[pin] T, U),
253                     Unit,
254                 }
255 
256                 #[allow(clippy::undocumented_unsafe_blocks)]
257                 unsafe impl<T: ::pin_project::__private::Unpin, U: ::pin_project::__private::Unpin>
258                     ::pin_project::UnsafeUnpin for UnsafeUnpinStruct<T, U>
259                 {
260                 }
261                 #[allow(clippy::undocumented_unsafe_blocks)]
262                 unsafe impl<T: ::pin_project::__private::Unpin, U: ::pin_project::__private::Unpin>
263                     ::pin_project::UnsafeUnpin for UnsafeUnpinTupleStruct<T, U>
264                 {
265                 }
266                 #[allow(clippy::undocumented_unsafe_blocks)]
267                 unsafe impl<T: ::pin_project::__private::Unpin, U: ::pin_project::__private::Unpin>
268                     ::pin_project::UnsafeUnpin for UnsafeUnpinEnum<T, U>
269                 {
270                 }
271             };
272         }
273 
274         mac!();
275     }
276 }
277 
278 pub mod forbid_unsafe {
279     #![forbid(unsafe_code)]
280 
281     include!("include/basic-safe-part.rs");
282 
283     pub mod inside_macro {
284         #[rustfmt::skip]
285         macro_rules! mac {
286             () => {
287                 #[::pin_project::pin_project]
288                 #[derive(Debug)]
289                 pub struct DefaultStruct<T, U> {
290                     #[pin]
291                     pub pinned: T,
292                     pub unpinned: U,
293                 }
294 
295                 #[::pin_project::pin_project(
296                     project = DefaultStructNamedProj,
297                     project_ref = DefaultStructNamedProjRef,
298                 )]
299                 #[derive(Debug)]
300                 pub struct DefaultStructNamed<T, U> {
301                     #[pin]
302                     pub pinned: T,
303                     pub unpinned: U,
304                 }
305 
306                 #[::pin_project::pin_project]
307                 #[derive(Debug)]
308                 pub struct DefaultTupleStruct<T, U>(#[pin] pub T, pub U);
309 
310                 #[::pin_project::pin_project(
311                     project = DefaultTupleStructNamedProj,
312                     project_ref = DefaultTupleStructNamedProjRef,
313                 )]
314                 #[derive(Debug)]
315                 pub struct DefaultTupleStructNamed<T, U>(#[pin] pub T, pub U);
316 
317                 #[::pin_project::pin_project(
318                     project = DefaultEnumProj,
319                     project_ref = DefaultEnumProjRef,
320                 )]
321                 #[derive(Debug)]
322                 pub enum DefaultEnum<T, U> {
323                     Struct {
324                         #[pin]
325                         pinned: T,
326                         unpinned: U,
327                     },
328                     Tuple(#[pin] T, U),
329                     Unit,
330                 }
331 
332                 #[::pin_project::pin_project(PinnedDrop)]
333                 #[derive(Debug)]
334                 pub struct PinnedDropStruct<T, U> {
335                     #[pin]
336                     pub pinned: T,
337                     pub unpinned: U,
338                 }
339 
340                 #[::pin_project::pinned_drop]
341                 impl<T, U> PinnedDrop for PinnedDropStruct<T, U> {
342                     fn drop(self: ::pin_project::__private::Pin<&mut Self>) {}
343                 }
344 
345                 #[::pin_project::pin_project(PinnedDrop)]
346                 #[derive(Debug)]
347                 pub struct PinnedDropTupleStruct<T, U>(#[pin] pub T, pub U);
348 
349                 #[::pin_project::pinned_drop]
350                 impl<T, U> PinnedDrop for PinnedDropTupleStruct<T, U> {
351                     fn drop(self: ::pin_project::__private::Pin<&mut Self>) {}
352                 }
353 
354                 #[::pin_project::pin_project(
355                     PinnedDrop,
356                     project = PinnedDropEnumProj,
357                     project_ref = PinnedDropEnumProjRef,
358                 )]
359                 #[derive(Debug)]
360                 pub enum PinnedDropEnum<T, U> {
361                     Struct {
362                         #[pin]
363                         pinned: T,
364                         unpinned: U,
365                     },
366                     Tuple(#[pin] T, U),
367                     Unit,
368                 }
369 
370                 #[::pin_project::pinned_drop]
371                 impl<T, U> PinnedDrop for PinnedDropEnum<T, U> {
372                     fn drop(self: ::pin_project::__private::Pin<&mut Self>) {}
373                 }
374 
375                 #[::pin_project::pin_project(project_replace)]
376                 #[derive(Debug)]
377                 pub struct ReplaceStruct<T, U> {
378                     #[pin]
379                     pub pinned: T,
380                     pub unpinned: U,
381                 }
382 
383                 #[::pin_project::pin_project(
384                     project = ReplaceStructNamedProj,
385                     project_ref = ReplaceStructNamedProjRef,
386                     project_replace = ReplaceStructNamedProjOwn,
387                 )]
388                 #[derive(Debug)]
389                 pub struct ReplaceStructNamed<T, U> {
390                     #[pin]
391                     pub pinned: T,
392                     pub unpinned: U,
393                 }
394 
395                 #[::pin_project::pin_project(project_replace)]
396                 #[derive(Debug)]
397                 pub struct ReplaceTupleStruct<T, U>(#[pin] pub T, pub U);
398 
399                 #[::pin_project::pin_project(
400                     project = ReplaceTupleStructNamedProj,
401                     project_ref = ReplaceTupleStructNamedProjRef,
402                     project_replace = ReplaceTupleStructNamedProjOwn,
403                 )]
404                 #[derive(Debug)]
405                 pub struct ReplaceTupleStructNamed<T, U>(#[pin] pub T, pub U);
406 
407                 #[::pin_project::pin_project(
408                     project = ReplaceEnumProj,
409                     project_ref = ReplaceEnumProjRef,
410                     project_replace = ReplaceEnumProjOwn,
411                 )]
412                 #[derive(Debug)]
413                 pub enum ReplaceEnum<T, U> {
414                     Struct {
415                         #[pin]
416                         pinned: T,
417                         unpinned: U,
418                     },
419                     Tuple(#[pin] T, U),
420                     Unit,
421                 }
422 
423                 #[::pin_project::pin_project(UnsafeUnpin)]
424                 #[derive(Debug)]
425                 pub struct UnsafeUnpinStruct<T, U> {
426                     #[pin]
427                     pub pinned: T,
428                     pub unpinned: U,
429                 }
430 
431                 #[::pin_project::pin_project(UnsafeUnpin)]
432                 #[derive(Debug)]
433                 pub struct UnsafeUnpinTupleStruct<T, U>(#[pin] pub T, pub U);
434 
435                 #[::pin_project::pin_project(
436                     UnsafeUnpin,
437                     project = UnsafeUnpinEnumProj,
438                     project_ref = UnsafeUnpinEnumProjRef,
439                 )]
440                 #[derive(Debug)]
441                 pub enum UnsafeUnpinEnum<T, U> {
442                     Struct {
443                         #[pin]
444                         pinned: T,
445                         unpinned: U,
446                     },
447                     Tuple(#[pin] T, U),
448                     Unit,
449                 }
450 
451                 #[::pin_project::pin_project(!Unpin)]
452                 #[derive(Debug)]
453                 pub struct NotUnpinStruct<T, U> {
454                     #[pin]
455                     pub pinned: T,
456                     pub unpinned: U,
457                 }
458 
459                 #[::pin_project::pin_project(!Unpin)]
460                 #[derive(Debug)]
461                 pub struct NotUnpinTupleStruct<T, U>(#[pin] pub T, pub U);
462 
463                 #[::pin_project::pin_project(
464                     !Unpin,
465                     project = NotUnpinEnumProj,
466                     project_ref = NotUnpinEnumProjRef,
467                 )]
468                 #[derive(Debug)]
469                 pub enum NotUnpinEnum<T, U> {
470                     Struct {
471                         #[pin]
472                         pinned: T,
473                         unpinned: U,
474                     },
475                     Tuple(#[pin] T, U),
476                     Unit,
477                 }
478             };
479         }
480 
481         mac!();
482     }
483 }
484 
485 pub mod box_pointers {
486     use pin_project::pin_project;
487 
488     #[allow(box_pointers)] // for the type itself
489     #[pin_project(project_replace)]
490     #[derive(Debug)]
491     pub struct Struct {
492         #[pin]
493         pub p: Box<isize>,
494         pub u: Box<isize>,
495     }
496 
497     #[allow(box_pointers)] // for the type itself
498     #[pin_project(project_replace)]
499     #[derive(Debug)]
500     pub struct TupleStruct(#[pin] pub Box<isize>, pub Box<isize>);
501 
502     #[allow(box_pointers)] // for the type itself
503     #[pin_project(
504         project = EnumProj,
505         project_ref = EnumProjRef,
506         project_replace = EnumProjOwn,
507     )]
508     #[derive(Debug)]
509     pub enum Enum {
510         Struct {
511             #[pin]
512             p: Box<isize>,
513             u: Box<isize>,
514         },
515         Tuple(#[pin] Box<isize>, Box<isize>),
516         Unit,
517     }
518 
519     pub mod inside_macro {
520         use pin_project::pin_project;
521 
522         #[rustfmt::skip]
523         macro_rules! mac {
524             () => {
525                 #[allow(box_pointers)] // for the type itself
526                 #[pin_project(project_replace)]
527                 #[derive(Debug)]
528                 pub struct Struct {
529                     #[pin]
530                     pub p: Box<isize>,
531                     pub u: Box<isize>,
532                 }
533 
534                 #[allow(box_pointers)] // for the type itself
535                 #[pin_project(project_replace)]
536                 #[derive(Debug)]
537                 pub struct TupleStruct(#[pin] pub Box<isize>, pub Box<isize>);
538 
539                 #[allow(box_pointers)] // for the type itself
540                 #[pin_project(
541                     project = EnumProj,
542                     project_ref = EnumProjRef,
543                     project_replace = EnumProjOwn,
544                 )]
545                 #[derive(Debug)]
546                 pub enum Enum {
547                     Struct {
548                         #[pin]
549                         p: Box<isize>,
550                         u: Box<isize>,
551                     },
552                     Tuple(#[pin] Box<isize>, Box<isize>),
553                     Unit,
554                 }
555             };
556         }
557 
558         mac!();
559     }
560 }
561 
562 pub mod deprecated {
563     use pin_project::pin_project;
564 
565     #[allow(deprecated)] // for the type itself
566     #[pin_project(project_replace)]
567     #[derive(Debug, Clone, Copy)]
568     #[deprecated]
569     pub struct Struct {
570         #[deprecated]
571         #[pin]
572         pub p: (),
573         #[deprecated]
574         pub u: (),
575     }
576 
577     #[allow(deprecated)] // for the type itself
578     #[pin_project(project_replace)]
579     #[derive(Debug, Clone, Copy)]
580     #[deprecated]
581     pub struct TupleStruct(
582         #[deprecated]
583         #[pin]
584         pub (),
585         #[deprecated] pub (),
586     );
587 
588     #[allow(deprecated)] // for the type itself
589     #[pin_project(
590         project = EnumProj,
591         project_ref = EnumProjRef,
592         project_replace = EnumProjOwn,
593     )]
594     #[derive(Debug, Clone, Copy)]
595     #[deprecated]
596     pub enum Enum {
597         #[deprecated]
598         Struct {
599             #[deprecated]
600             #[pin]
601             p: (),
602             #[deprecated]
603             u: (),
604         },
605         #[deprecated]
606         Tuple(
607             #[deprecated]
608             #[pin]
609             (),
610             #[deprecated] (),
611         ),
612         #[deprecated]
613         Unit,
614     }
615 
616     pub mod inside_macro {
617         use pin_project::pin_project;
618 
619         #[rustfmt::skip]
620         macro_rules! mac {
621             () => {
622                 #[allow(deprecated)] // for the type itself
623                 #[pin_project(project_replace)]
624                 #[derive(Debug, Clone, Copy)]
625                 #[deprecated]
626                 pub struct Struct {
627                     #[deprecated]
628                     #[pin]
629                     pub p: (),
630                     #[deprecated]
631                     pub u: (),
632                 }
633 
634                 #[allow(deprecated)] // for the type itself
635                 #[pin_project(project_replace)]
636                 #[derive(Debug, Clone, Copy)]
637                 #[deprecated]
638                 pub struct TupleStruct(
639                     #[deprecated]
640                     #[pin]
641                     pub (),
642                     #[deprecated] pub (),
643                 );
644 
645                 #[allow(deprecated)] // for the type itself
646                 #[pin_project(
647                     project = EnumProj,
648                     project_ref = EnumProjRef,
649                     project_replace = EnumProjOwn,
650                 )]
651                 #[derive(Debug, Clone, Copy)]
652                 #[deprecated]
653                 pub enum Enum {
654                     #[deprecated]
655                     Struct {
656                         #[deprecated]
657                         #[pin]
658                         p: (),
659                         #[deprecated]
660                         u: (),
661                     },
662                     #[deprecated]
663                     Tuple(
664                         #[deprecated]
665                         #[pin]
666                         (),
667                         #[deprecated] (),
668                     ),
669                     #[deprecated]
670                     Unit,
671                 }
672             };
673         }
674 
675         mac!();
676     }
677 }
678 
679 pub mod explicit_outlives_requirements {
680     use pin_project::pin_project;
681 
682     #[allow(explicit_outlives_requirements)] // for the type itself: https://github.com/rust-lang/rust/issues/60993
683     #[pin_project(project_replace)]
684     #[derive(Debug)]
685     pub struct Struct<'a, T, U>
686     where
687         T: ?Sized,
688         U: ?Sized,
689     {
690         #[pin]
691         pub pinned: &'a mut T,
692         pub unpinned: &'a mut U,
693     }
694 
695     #[allow(explicit_outlives_requirements)] // for the type itself: https://github.com/rust-lang/rust/issues/60993
696     #[pin_project(project_replace)]
697     #[derive(Debug)]
698     pub struct TupleStruct<'a, T, U>(#[pin] pub &'a mut T, pub &'a mut U)
699     where
700         T: ?Sized,
701         U: ?Sized;
702 
703     #[allow(explicit_outlives_requirements)] // for the type itself: https://github.com/rust-lang/rust/issues/60993
704     #[pin_project(
705         project = EnumProj,
706         project_ref = EnumProjRef,
707         project_replace = EnumProjOwn,
708     )]
709     #[derive(Debug)]
710     pub enum Enum<'a, T, U>
711     where
712         T: ?Sized,
713         U: ?Sized,
714     {
715         Struct {
716             #[pin]
717             pinned: &'a mut T,
718             unpinned: &'a mut U,
719         },
720         Tuple(#[pin] &'a mut T, &'a mut U),
721         Unit,
722     }
723 
724     pub mod inside_macro {
725         use pin_project::pin_project;
726 
727         #[rustfmt::skip]
728         macro_rules! mac {
729             () => {
730                 #[allow(explicit_outlives_requirements)] // for the type itself: https://github.com/rust-lang/rust/issues/60993
731                 #[pin_project(project_replace)]
732                 #[derive(Debug)]
733                 pub struct Struct<'a, T, U>
734                 where
735                     T: ?Sized,
736                     U: ?Sized,
737                 {
738                     #[pin]
739                     pub pinned: &'a mut T,
740                     pub unpinned: &'a mut U,
741                 }
742 
743                 #[allow(explicit_outlives_requirements)] // for the type itself: https://github.com/rust-lang/rust/issues/60993
744                 #[pin_project(project_replace)]
745                 #[derive(Debug)]
746                 pub struct TupleStruct<'a, T, U>(#[pin] pub &'a mut T, pub &'a mut U)
747                 where
748                     T: ?Sized,
749                     U: ?Sized;
750 
751                 #[allow(explicit_outlives_requirements)] // for the type itself: https://github.com/rust-lang/rust/issues/60993
752                 #[pin_project(
753                     project = EnumProj,
754                     project_ref = EnumProjRef,
755                     project_replace = EnumProjOwn,
756                 )]
757                 #[derive(Debug)]
758                 pub enum Enum<'a, T, U>
759                 where
760                     T: ?Sized,
761                     U: ?Sized,
762                 {
763                     Struct {
764                         #[pin]
765                         pinned: &'a mut T,
766                         unpinned: &'a mut U,
767                     },
768                     Tuple(#[pin] &'a mut T, &'a mut U),
769                     Unit,
770                 }
771             };
772         }
773 
774         mac!();
775     }
776 }
777 
778 #[allow(missing_debug_implementations)]
779 pub mod single_use_lifetimes {
780     use pin_project::pin_project;
781 
782     #[allow(unused_lifetimes)]
783     pub trait Trait<'a> {}
784 
785     #[allow(unused_lifetimes)] // for the type itself
786     #[allow(single_use_lifetimes)] // for the type itself: https://github.com/rust-lang/rust/issues/55058
787     #[pin_project(project_replace)]
788     pub struct Hrtb<'pin___, T>
789     where
790         for<'pin> &'pin T: Unpin,
791         T: for<'pin> Trait<'pin>,
792         for<'pin, 'pin_, 'pin__> &'pin &'pin_ &'pin__ T: Unpin,
793     {
794         #[pin]
795         _f: &'pin___ mut T,
796     }
797 
798     pub mod inside_macro {
799         use pin_project::pin_project;
800 
801         #[rustfmt::skip]
802         macro_rules! mac {
803             () => {
804                 #[allow(unused_lifetimes)]
805                 pub trait Trait<'a> {}
806 
807                 #[allow(unused_lifetimes)] // for the type itself
808                 #[allow(single_use_lifetimes)] // for the type itself: https://github.com/rust-lang/rust/issues/55058
809                 #[pin_project(project_replace)]
810                 pub struct Hrtb<'pin___, T>
811                 where
812                     for<'pin> &'pin T: Unpin,
813                     T: for<'pin> Trait<'pin>,
814                     for<'pin, 'pin_, 'pin__> &'pin &'pin_ &'pin__ T: Unpin,
815                 {
816                     #[pin]
817                     _f: &'pin___ mut T,
818                 }
819             };
820         }
821 
822         mac!();
823     }
824 }
825 
826 pub mod variant_size_differences {
827     use pin_project::pin_project;
828 
829     #[allow(missing_debug_implementations, missing_copy_implementations)] // https://github.com/rust-lang/rust/pull/74060
830     #[allow(variant_size_differences)] // for the type itself
831     #[allow(clippy::large_enum_variant)] // for the type itself
832     #[pin_project(
833         project = EnumProj,
834         project_ref = EnumProjRef,
835         project_replace = EnumProjOwn,
836     )]
837     pub enum Enum {
838         V1(u8),
839         V2([u8; 1024]),
840     }
841 
842     pub mod inside_macro {
843         use pin_project::pin_project;
844 
845         #[rustfmt::skip]
846         macro_rules! mac {
847             () => {
848                 #[allow(missing_debug_implementations, missing_copy_implementations)] // https://github.com/rust-lang/rust/pull/74060
849                 #[allow(variant_size_differences)] // for the type itself
850                 #[allow(clippy::large_enum_variant)] // for the type itself
851                 #[pin_project(
852                     project = EnumProj,
853                     project_ref = EnumProjRef,
854                     project_replace = EnumProjOwn,
855                 )]
856                 pub enum Enum {
857                     V1(u8),
858                     V2([u8; 1024]),
859                 }
860             };
861         }
862 
863         mac!();
864     }
865 }
866 
867 pub mod clippy_mut_mut {
868     use pin_project::pin_project;
869 
870     #[pin_project(project_replace)]
871     #[derive(Debug)]
872     pub struct Struct<'a, T, U> {
873         #[pin]
874         pub pinned: &'a mut T,
875         pub unpinned: &'a mut U,
876     }
877 
878     #[pin_project(project_replace)]
879     #[derive(Debug)]
880     pub struct TupleStruct<'a, T, U>(#[pin] &'a mut T, &'a mut U);
881 
882     #[pin_project(
883         project = EnumProj,
884         project_ref = EnumProjRef,
885         project_replace = EnumProjOwn,
886     )]
887     #[derive(Debug)]
888     pub enum Enum<'a, T, U> {
889         Struct {
890             #[pin]
891             pinned: &'a mut T,
892             unpinned: &'a mut U,
893         },
894         Tuple(#[pin] &'a mut T, &'a mut U),
895         Unit,
896     }
897 
898     pub mod inside_macro {
899         use pin_project::pin_project;
900 
901         #[rustfmt::skip]
902         macro_rules! mac {
903             () => {
904                 #[pin_project(project_replace)]
905                 #[derive(Debug)]
906                 pub struct Struct<'a, T, U> {
907                     #[pin]
908                     pub pinned: &'a mut T,
909                     pub unpinned: &'a mut U,
910                 }
911 
912                 #[pin_project(project_replace)]
913                 #[derive(Debug)]
914                 pub struct TupleStruct<'a, T, U>(#[pin] &'a mut T, &'a mut U);
915 
916                 #[pin_project(
917                     project = EnumProj,
918                     project_ref = EnumProjRef,
919                     project_replace = EnumProjOwn,
920                 )]
921                 #[derive(Debug)]
922                 pub enum Enum<'a, T, U> {
923                     Struct {
924                         #[pin]
925                         pinned: &'a mut T,
926                         unpinned: &'a mut U,
927                     },
928                     Tuple(#[pin] &'a mut T, &'a mut U),
929                     Unit,
930                 }
931             };
932         }
933 
934         mac!();
935     }
936 }
937 
938 #[allow(missing_debug_implementations)]
939 #[allow(unreachable_pub)]
940 mod clippy_redundant_pub_crate {
941     use pin_project::pin_project;
942 
943     #[pin_project(project_replace)]
944     pub struct Struct<T, U> {
945         #[pin]
946         pub pinned: T,
947         pub unpinned: U,
948     }
949 
950     #[pin_project(project_replace)]
951     pub struct TupleStruct<T, U>(#[pin] pub T, pub U);
952 
953     #[allow(dead_code)]
954     #[pin_project(
955         project = EnumProj,
956         project_ref = EnumProjRef,
957         project_replace = EnumProjOwn,
958     )]
959     pub enum Enum<T, U> {
960         Struct {
961             #[pin]
962             pinned: T,
963             unpinned: U,
964         },
965         Tuple(#[pin] T, U),
966         Unit,
967     }
968 
969     pub mod inside_macro {
970         use pin_project::pin_project;
971 
972         #[allow(clippy::redundant_pub_crate)]
973         #[rustfmt::skip]
974         macro_rules! mac {
975             () => {
976                 #[pin_project(project_replace)]
977                 pub struct Struct<T, U> {
978                     #[pin]
979                     pub pinned: T,
980                     pub unpinned: U,
981                 }
982 
983                 #[pin_project(project_replace)]
984                 pub struct TupleStruct<T, U>(#[pin] pub T, pub U);
985 
986                 #[allow(dead_code)]
987                 #[pin_project(
988                     project = EnumProj,
989                     project_ref = EnumProjRef,
990                     project_replace = EnumProjOwn,
991                 )]
992                 pub enum Enum<T, U> {
993                     Struct {
994                         #[pin]
995                         pinned: T,
996                         unpinned: U,
997                     },
998                     Tuple(#[pin] T, U),
999                     Unit,
1000                 }
1001             };
1002         }
1003 
1004         mac!();
1005     }
1006 }
1007 
1008 #[allow(missing_debug_implementations)]
1009 pub mod clippy_type_repetition_in_bounds {
1010     use pin_project::pin_project;
1011 
1012     #[pin_project(project_replace)]
1013     pub struct Struct<T, U>
1014     where
1015         Self: Sized,
1016     {
1017         #[pin]
1018         pub pinned: T,
1019         pub unpinned: U,
1020     }
1021 
1022     #[pin_project(project_replace)]
1023     pub struct TupleStruct<T, U>(#[pin] T, U)
1024     where
1025         Self: Sized;
1026 
1027     #[pin_project(
1028         project = EnumProj,
1029         project_ref = EnumProjRef,
1030         project_replace = EnumProjOwn,
1031     )]
1032     pub enum Enum<T, U>
1033     where
1034         Self: Sized,
1035     {
1036         Struct {
1037             #[pin]
1038             pinned: T,
1039             unpinned: U,
1040         },
1041         Tuple(#[pin] T, U),
1042         Unit,
1043     }
1044 
1045     pub mod inside_macro {
1046         use pin_project::pin_project;
1047 
1048         #[rustfmt::skip]
1049         macro_rules! mac {
1050             () => {
1051                 #[pin_project(project_replace)]
1052                 pub struct Struct<T, U>
1053                 where
1054                     Self: Sized,
1055                 {
1056                     #[pin]
1057                     pub pinned: T,
1058                     pub unpinned: U,
1059                 }
1060 
1061                 #[pin_project(project_replace)]
1062                 pub struct TupleStruct<T, U>(#[pin] T, U)
1063                 where
1064                     Self: Sized;
1065 
1066                 #[pin_project(
1067                     project = EnumProj,
1068                     project_ref = EnumProjRef,
1069                     project_replace = EnumProjOwn,
1070                 )]
1071                 pub enum Enum<T, U>
1072                 where
1073                     Self: Sized,
1074                 {
1075                     Struct {
1076                         #[pin]
1077                         pinned: T,
1078                         unpinned: U,
1079                     },
1080                     Tuple(#[pin] T, U),
1081                     Unit,
1082                 }
1083             };
1084         }
1085 
1086         mac!();
1087     }
1088 }
1089 
1090 #[allow(missing_debug_implementations)]
1091 pub mod clippy_use_self {
1092     use pin_project::pin_project;
1093 
1094     pub trait Trait {
1095         type Assoc;
1096     }
1097 
1098     #[pin_project(project_replace)]
1099     pub struct Generics<T: Trait<Assoc = Self>>
1100     where
1101         Self: Trait<Assoc = Self>,
1102     {
1103         _f: T,
1104     }
1105 
1106     pub mod inside_macro {
1107         use pin_project::pin_project;
1108 
1109         use super::Trait;
1110 
1111         #[rustfmt::skip]
1112         macro_rules! mac {
1113             () => {
1114                 #[pin_project(project_replace)]
1115                 pub struct Generics<T: Trait<Assoc = Self>>
1116                 where
1117                     Self: Trait<Assoc = Self>,
1118                 {
1119                     _f: T,
1120                 }
1121             };
1122         }
1123 
1124         mac!();
1125     }
1126 }
1127 
1128 #[allow(missing_debug_implementations)]
1129 pub mod clippy_used_underscore_binding {
1130     use pin_project::pin_project;
1131 
1132     #[pin_project(project_replace)]
1133     pub struct Struct<T, U> {
1134         #[pin]
1135         pub _pinned: T,
1136         pub _unpinned: U,
1137     }
1138 
1139     #[pin_project(
1140         project = EnumProj,
1141         project_ref = EnumProjRef,
1142         project_replace = EnumProjOwn,
1143     )]
1144     pub enum Enum<T, U> {
1145         Struct {
1146             #[pin]
1147             _pinned: T,
1148             _unpinned: U,
1149         },
1150     }
1151 
1152     pub mod inside_macro {
1153         use pin_project::pin_project;
1154 
1155         #[rustfmt::skip]
1156         macro_rules! mac {
1157             () => {
1158                 #[pin_project(project_replace)]
1159                 pub struct Struct<T, U> {
1160                     #[pin]
1161                     pub _pinned: T,
1162                     pub _unpinned: U,
1163                 }
1164 
1165                 #[pin_project(
1166                     project = EnumProj,
1167                     project_ref = EnumProjRef,
1168                     project_replace = EnumProjOwn,
1169                 )]
1170                 pub enum Enum<T, U> {
1171                     Struct {
1172                         #[pin]
1173                         _pinned: T,
1174                         _unpinned: U,
1175                     },
1176                 }
1177             };
1178         }
1179 
1180         mac!();
1181     }
1182 }
1183 
1184 #[allow(missing_debug_implementations)]
1185 pub mod clippy_ref_option_ref {
1186     use pin_project::pin_project;
1187 
1188     #[pin_project]
1189     pub struct Struct<'a> {
1190         #[pin]
1191         pub _pinned: Option<&'a ()>,
1192         pub _unpinned: Option<&'a ()>,
1193     }
1194 
1195     #[pin_project(project = EnumProj, project_ref = EnumProjRef)]
1196     pub enum Enum<'a> {
1197         Struct {
1198             #[pin]
1199             _pinned: Option<&'a ()>,
1200             _unpinned: Option<&'a ()>,
1201         },
1202     }
1203 }
1204