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