mirror of
https://github.com/rust-lang/rust.git
synced 2026-06-01 14:10:03 +03:00
ba107fcffb
This reverts commit1eeb8e8b15, reversing changes made to324bf2b9fd. Unfortunately the assert desugaring change is not backwards compatible, see RUST-145770. Code such as ```rust #[derive(Debug)] struct F { data: bool } impl std::ops::Not for F { type Output = bool; fn not(self) -> Self::Output { !self.data } } fn main() { let f = F { data: true }; assert!(f); } ``` would be broken by the assert desugaring change. We may need to land the change over an edition boundary, or limit the editions that the desugaring change impacts.
206 lines
4.3 KiB
Rust
206 lines
4.3 KiB
Rust
#![warn(clippy::const_is_empty)]
|
|
#![allow(clippy::needless_late_init, unused_must_use)]
|
|
|
|
fn test_literal() {
|
|
if "".is_empty() {
|
|
//~^ const_is_empty
|
|
}
|
|
if "foobar".is_empty() {
|
|
//~^ const_is_empty
|
|
}
|
|
}
|
|
|
|
fn test_byte_literal() {
|
|
if b"".is_empty() {
|
|
//~^ const_is_empty
|
|
}
|
|
if b"foobar".is_empty() {
|
|
//~^ const_is_empty
|
|
}
|
|
}
|
|
|
|
fn test_no_mut() {
|
|
let mut empty = "";
|
|
if empty.is_empty() {
|
|
// No lint because it is mutable
|
|
}
|
|
}
|
|
|
|
fn test_propagated() {
|
|
let empty = "";
|
|
let non_empty = "foobar";
|
|
let empty2 = empty;
|
|
let non_empty2 = non_empty;
|
|
if empty2.is_empty() {
|
|
//~^ const_is_empty
|
|
}
|
|
if non_empty2.is_empty() {
|
|
//~^ const_is_empty
|
|
}
|
|
}
|
|
|
|
const EMPTY_STR: &str = "";
|
|
const NON_EMPTY_STR: &str = "foo";
|
|
const EMPTY_BSTR: &[u8] = b"";
|
|
const NON_EMPTY_BSTR: &[u8] = b"foo";
|
|
const EMPTY_U8_SLICE: &[u8] = &[];
|
|
const NON_EMPTY_U8_SLICE: &[u8] = &[1, 2];
|
|
const EMPTY_SLICE: &[u32] = &[];
|
|
const NON_EMPTY_SLICE: &[u32] = &[1, 2];
|
|
const NON_EMPTY_SLICE_REPEAT: &[u32] = &[1; 2];
|
|
const EMPTY_ARRAY: [u32; 0] = [];
|
|
const EMPTY_ARRAY_REPEAT: [u32; 0] = [1; 0];
|
|
const NON_EMPTY_ARRAY: [u32; 2] = [1, 2];
|
|
const NON_EMPTY_ARRAY_REPEAT: [u32; 2] = [1; 2];
|
|
const EMPTY_REF_ARRAY: &[u32; 0] = &[];
|
|
const NON_EMPTY_REF_ARRAY: &[u32; 3] = &[1, 2, 3];
|
|
|
|
fn test_from_const() {
|
|
let _ = EMPTY_STR.is_empty();
|
|
//~^ const_is_empty
|
|
|
|
let _ = NON_EMPTY_STR.is_empty();
|
|
//~^ const_is_empty
|
|
|
|
let _ = EMPTY_BSTR.is_empty();
|
|
//~^ const_is_empty
|
|
|
|
let _ = NON_EMPTY_BSTR.is_empty();
|
|
//~^ const_is_empty
|
|
|
|
let _ = EMPTY_ARRAY.is_empty();
|
|
//~^ const_is_empty
|
|
|
|
let _ = EMPTY_ARRAY_REPEAT.is_empty();
|
|
//~^ const_is_empty
|
|
|
|
let _ = EMPTY_U8_SLICE.is_empty();
|
|
//~^ const_is_empty
|
|
|
|
let _ = NON_EMPTY_U8_SLICE.is_empty();
|
|
//~^ const_is_empty
|
|
|
|
let _ = NON_EMPTY_ARRAY.is_empty();
|
|
//~^ const_is_empty
|
|
|
|
let _ = NON_EMPTY_ARRAY_REPEAT.is_empty();
|
|
//~^ const_is_empty
|
|
|
|
let _ = EMPTY_REF_ARRAY.is_empty();
|
|
//~^ const_is_empty
|
|
|
|
let _ = NON_EMPTY_REF_ARRAY.is_empty();
|
|
//~^ const_is_empty
|
|
|
|
let _ = EMPTY_SLICE.is_empty();
|
|
//~^ const_is_empty
|
|
|
|
let _ = NON_EMPTY_SLICE.is_empty();
|
|
//~^ const_is_empty
|
|
|
|
let _ = NON_EMPTY_SLICE_REPEAT.is_empty();
|
|
//~^ const_is_empty
|
|
}
|
|
|
|
fn main() {
|
|
let value = "foobar";
|
|
let _ = value.is_empty();
|
|
//~^ const_is_empty
|
|
|
|
let x = value;
|
|
let _ = x.is_empty();
|
|
//~^ const_is_empty
|
|
|
|
let _ = "".is_empty();
|
|
//~^ const_is_empty
|
|
|
|
let _ = b"".is_empty();
|
|
//~^ const_is_empty
|
|
}
|
|
|
|
fn str_from_arg(var: &str) {
|
|
var.is_empty();
|
|
// Do not lint, we know nothiny about var
|
|
}
|
|
|
|
fn update_str() {
|
|
let mut value = "duck";
|
|
value = "penguin";
|
|
|
|
let _ = value.is_empty();
|
|
// Do not lint since value is mutable
|
|
}
|
|
|
|
fn macros() {
|
|
// Content from Macro
|
|
let file = include_str!("const_is_empty.rs");
|
|
let _ = file.is_empty();
|
|
// No lint because initializer comes from a macro result
|
|
|
|
let var = env!("PATH");
|
|
let _ = var.is_empty();
|
|
// No lint because initializer comes from a macro result
|
|
}
|
|
|
|
fn conditional_value() {
|
|
let value;
|
|
|
|
if true {
|
|
value = "hey";
|
|
} else {
|
|
value = "hej";
|
|
}
|
|
|
|
let _ = value.is_empty();
|
|
// Do not lint, current constant folding is too simple to detect this
|
|
}
|
|
|
|
fn cfg_conditioned() {
|
|
#[cfg(test)]
|
|
let val = "";
|
|
#[cfg(not(test))]
|
|
let val = "foo";
|
|
|
|
let _ = val.is_empty();
|
|
// Do not lint, value depend on a #[cfg(…)] directive
|
|
}
|
|
|
|
fn not_cfg_conditioned() {
|
|
let val = "";
|
|
#[cfg(not(target_os = "inexistent"))]
|
|
let _ = val.is_empty();
|
|
//~^ const_is_empty
|
|
}
|
|
|
|
const fn const_rand() -> &'static str {
|
|
"17"
|
|
}
|
|
|
|
fn const_expressions() {
|
|
let _ = const { if true { "1" } else { "2" } }.is_empty();
|
|
// Do not lint, we do not recurse into boolean expressions
|
|
|
|
let _ = const_rand().is_empty();
|
|
// Do not lint, we do not recurse into functions
|
|
}
|
|
|
|
fn constant_from_external_crate() {
|
|
let _ = std::env::consts::EXE_EXTENSION.is_empty();
|
|
// Do not lint, `exe_ext` comes from the `std` crate
|
|
}
|
|
|
|
fn issue_13106() {
|
|
const {
|
|
assert!(!NON_EMPTY_STR.is_empty());
|
|
}
|
|
|
|
const {
|
|
assert!(EMPTY_STR.is_empty());
|
|
}
|
|
|
|
const {
|
|
EMPTY_STR.is_empty();
|
|
//~^ const_is_empty
|
|
}
|
|
}
|