#![warn(nonstandard_style, rust_2018_compatibility, rust_2018_idioms, unused)]
#![forbid(future_incompatible)]
#![forbid(unsafe_code)]
#![allow(unknown_lints)] #![warn(
absolute_paths_not_starting_with_crate,
anonymous_parameters,
box_pointers,
deprecated_in_future,
elided_lifetimes_in_paths,
explicit_outlives_requirements,
keyword_idents,
macro_use_extern_crate,
meta_variable_misuse,
missing_copy_implementations,
missing_crate_level_docs,
missing_debug_implementations,
missing_docs,
missing_doc_code_examples,
non_ascii_idents,
pointer_structural_match,
private_doc_tests,
single_use_lifetimes,
trivial_casts,
trivial_numeric_casts,
unaligned_references,
unreachable_pub,
unused_extern_crates,
unused_import_braces,
unused_lifetimes,
unused_qualifications,
unused_results,
variant_size_differences
)]
#![warn(clippy::all, clippy::pedantic, clippy::nursery)]
#![warn(clippy::restriction)]
#![allow(clippy::blanket_clippy_restriction_lints)]
pub mod basic {
include!("include/basic.rs");
}
pub mod box_pointers {
use pin_project_lite::pin_project;
pin_project! {
#[derive(Debug)]
pub struct Struct {
#[pin]
pub p: Box<isize>,
pub u: Box<isize>,
}
}
}
pub mod explicit_outlives_requirements {
use pin_project_lite::pin_project;
pin_project! {
#[derive(Debug)]
pub struct Struct<'a, T, U>
where
T: ?Sized,
U: ?Sized,
{
#[pin]
pub pinned: &'a mut T,
pub unpinned: &'a mut U,
}
}
}
pub mod clippy_mut_mut {
use pin_project_lite::pin_project;
pin_project! {
#[derive(Debug)]
pub struct Struct<'a, T, U> {
#[pin]
pub pinned: &'a mut T,
pub unpinned: &'a mut U,
}
}
}
pub mod clippy_type_repetition_in_bounds {
use pin_project_lite::pin_project;
pin_project! {
#[derive(Debug)]
pub struct Struct<T, U>
where
Struct<T, U>: Sized,
{
#[pin]
pub pinned: T,
pub unpinned: U,
}
}
}
pub mod clippy_used_underscore_binding {
use pin_project_lite::pin_project;
pin_project! {
#[derive(Debug)]
pub struct Struct<T, U> {
#[pin]
pub _pinned: T,
pub _unpinned: U,
}
}
}
#[allow(box_pointers)]
#[allow(clippy::restriction)]
#[rustversion::attr(not(nightly), ignore)]
#[test]
fn check_lint_list() {
use std::{env, fs, path::PathBuf, process::Command, str};
type Result<T, E = Box<dyn std::error::Error>> = std::result::Result<T, E>;
fn assert_eq(expected_path: &str, actual: &str) -> Result<()> {
let manifest_dir = env::var_os("CARGO_MANIFEST_DIR")
.map(PathBuf::from)
.expect("CARGO_MANIFEST_DIR not set");
let expected_path = manifest_dir.join(expected_path);
let expected = fs::read_to_string(&expected_path)?;
if expected != actual {
if env::var_os("CI").map_or(false, |v| v == "true") {
panic!(
"assertion failed:\n\nEXPECTED:\n{0}\n{1}\n{0}\n\nACTUAL:\n{0}\n{2}\n{0}\n",
"-".repeat(60),
expected,
actual,
);
} else {
fs::write(&expected_path, actual)?;
}
}
Ok(())
}
(|| -> Result<()> {
let rustc = env::var_os("RUSTC").unwrap_or_else(|| "rustc".into());
let output = Command::new(rustc).args(&["-W", "help"]).output()?;
let new = str::from_utf8(&output.stdout)?;
assert_eq("tests/lint.txt", new)
})()
.unwrap_or_else(|e| panic!("{}", e));
}