| 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 | |
| 55 | pub mod basic { |
| 56 | include!("include/basic.rs" ); |
| 57 | } |
| 58 | |
| 59 | pub 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 | |
| 87 | pub 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 | |
| 123 | pub 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 | |
| 140 | pub 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)] |
| 169 | mod 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)] |
| 198 | pub 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)] |
| 233 | pub 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 | |
| 258 | pub 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 | |