Auto merge of #11249 - GuillaumeGomez:ui-tests-annotations, r=Centri3,llogiq

Add error annotations in UI tests

As discussed on [zulip](https://rust-lang.zulipchat.com/#narrow/stream/257328-clippy/topic/Improve.20UI.20error.20checks), this PR adds missing error annotations in UI tests.

I used this script to generate them:

<details>

```python
import os

def handle_err(line, stderr, elems, kind, i):
    msg = line.split("{}: ".format(kind), 1)[1]
    i += 1
    try:
        line_nb = int(stderr[i].split(":")[1])
    except Exception:
        return i
    in_macro = False
    note_found = False
    help_found = False
    elem = {"kind": kind, "msg": msg, "line": line_nb, "notes": [], "helps": []}
    while i < len(stderr):
        if len(stderr[i]) == 0:
            break
        elif stderr[i].startswith("note:"):
            note_found = True # error checker doesn't like multi-note apparently.
        elif stderr[i].startswith("   = note:"):
            if not note_found and not help_found and "this error originates in the macro" not in stderr[i]:
                elem["notes"].append(stderr[i].split("   = note:", 1)[1].strip())
            note_found = True # error checker doesn't like multi-note apparently.
        elif stderr[i].startswith("   = help:") or stderr[i].startswith("help:"):
            help_found = True
        # elif stderr[i].startswith("help:"):
        #     if not help_found:
        #         elem["helps"].append(stderr[i].split("help:", 1)[1].strip())
        #         help_found = True # error checker doesn't like multi-help apparently.
        elif "in this macro invocation" in stderr[i]:
            in_macro = True
        i += 1
    if not in_macro:
        elems.append(elem)
    return i

def show_kind(kind):
    if kind == "error":
        return "ERROR"
    elif kind == "warning":
        return "WARNING"
    elif kind == "note":
        return "NOTE"
    return "HELP"

def generate_code_err(indent, elem, up):
    content = "{}//~{} {}: {}".format(indent, up, show_kind(elem["kind"]), elem["msg"])
    if up == "^":
        up = "|"
    for note in elem["notes"]:
        content += "\n{}//~{} {}: {}".format(indent, up, show_kind("note"), note)
    for help_msg in elem["helps"]:
        content += "\n{}//~{} {}: {}".format(indent, up, show_kind("help"), help_msg)
    return content, up

def update_content(p, content):
    TO_IGNORE = [
        "needless_bool/simple.rs", # https://github.com/rust-lang/rust-clippy/issues/11248
        "crashes/ice-7868.rs", # Has errors but in another file.
        "trivially_copy_pass_by_ref.rs", # the `N` in the stderr needs to be replaced by the number
        "tests/ui/large_types_passed_by_value.rs", # the `N` in the stderr needs to be replaced by the number
    ]
    for to_ignore in TO_IGNORE:
        if p.endswith(to_ignore):
            return
    try:
        with open(p.replace(".rs", ".stderr"), "r", encoding="utf8") as f:
            stderr = f.read().split('\n')
    except Exception:
        return
    print("Updating `{}`".format(p))
    i = 0
    elems = []
    while i < len(stderr):
        line = stderr[i]
        if line.startswith("error: ") and not line.startswith("error: aborting due to"):
            i = handle_err(line, stderr, elems, "error", i)
        elif line.startswith("warning: ") and not line.endswith("warning emitted") and line.endswith("warnings emitted"):
            i = handle_err(line, stderr, elems, "warning", i)
        i += 1
    elems.sort(key=lambda e: e["line"], reverse=True)
    i = 0
    while i < len(elems):
        elem = elems[i]
        indent = ""
        c = 0
        line = content[elem["line"] - 1]
        while c < len(line) and line[c] == ' ':
            indent += " "
            c += 1
        new_content, up = generate_code_err(indent, elem, "^")
        i += 1
        while i < len(elems) and elems[i]["line"] == elem["line"]:
            elem = elems[i]
            ret = generate_code_err(indent, elem, up)
            new_content += "\n" + ret[0]
            up = ret[1]
            i += 1
        content.insert(elem["line"], new_content)
    with open(p, "w", encoding="utf8") as f:
        f.write("\n".join(content))

def check_if_contains_ui_test(p):
    if not p.endswith(".rs"):
        return
    with open(p, "r", encoding="utf8") as f:
        x = f.read()
    if "//~" not in x and "`@run-rustfix"` not in x and "`@aux-build"` not in x:
        update_content(p, x.split("\n"))

for path, subdirs, files in os.walk("tests/ui"):
    for name in files:
        check_if_contains_ui_test(os.path.join(path, name))
```

</details>

Then ran `cargo uibless`.

changelog: none
This commit is contained in:
bors 2023-08-22 15:52:08 +00:00
commit 4be90d0305
733 changed files with 7736 additions and 3498 deletions

View file

@ -12,27 +12,46 @@ fn main() {
const Z: u32 = 0;
let u: u32 = 42;
u <= 0;
//~^ ERROR: this comparison involving the minimum or maximum element for this type con
u <= Z;
//~^ ERROR: this comparison involving the minimum or maximum element for this type con
u < Z;
//~^ ERROR: this comparison involving the minimum or maximum element for this type con
Z >= u;
//~^ ERROR: this comparison involving the minimum or maximum element for this type con
Z > u;
//~^ ERROR: this comparison involving the minimum or maximum element for this type con
u > u32::MAX;
//~^ ERROR: this comparison involving the minimum or maximum element for this type con
u >= u32::MAX;
//~^ ERROR: this comparison involving the minimum or maximum element for this type con
u32::MAX < u;
//~^ ERROR: this comparison involving the minimum or maximum element for this type con
u32::MAX <= u;
//~^ ERROR: this comparison involving the minimum or maximum element for this type con
1-1 > u;
//~^ ERROR: this comparison involving the minimum or maximum element for this type con
u >= !0;
//~^ ERROR: this comparison involving the minimum or maximum element for this type con
u <= 12 - 2*6;
//~^ ERROR: this comparison involving the minimum or maximum element for this type con
let i: i8 = 0;
i < -127 - 1;
//~^ ERROR: this comparison involving the minimum or maximum element for this type con
i8::MAX >= i;
//~^ ERROR: this comparison involving the minimum or maximum element for this type con
3-7 < i32::MIN;
//~^ ERROR: this comparison involving the minimum or maximum element for this type con
let b = false;
b >= true;
//~^ ERROR: this comparison involving the minimum or maximum element for this type con
false > b;
//~^ ERROR: this comparison involving the minimum or maximum element for this type con
u > 0; // ok
// this is handled by clippy::unit_cmp
() < {};
//~^ ERROR: <-comparison of unit values detected. This will always be false
//~| NOTE: `#[deny(clippy::unit_cmp)]` on by default
}
use std::cmp::{Ordering, PartialEq, PartialOrd};

View file

@ -8,7 +8,7 @@ LL | u <= 0;
= note: `-D clippy::absurd-extreme-comparisons` implied by `-D warnings`
error: this comparison involving the minimum or maximum element for this type contains a case that is always true or always false
--> $DIR/absurd-extreme-comparisons.rs:15:5
--> $DIR/absurd-extreme-comparisons.rs:16:5
|
LL | u <= Z;
| ^^^^^^
@ -16,7 +16,7 @@ LL | u <= Z;
= help: because `Z` is the minimum value for this type, the case where the two sides are not equal never occurs, consider using `u == Z` instead
error: this comparison involving the minimum or maximum element for this type contains a case that is always true or always false
--> $DIR/absurd-extreme-comparisons.rs:16:5
--> $DIR/absurd-extreme-comparisons.rs:18:5
|
LL | u < Z;
| ^^^^^
@ -24,7 +24,7 @@ LL | u < Z;
= help: because `Z` is the minimum value for this type, this comparison is always false
error: this comparison involving the minimum or maximum element for this type contains a case that is always true or always false
--> $DIR/absurd-extreme-comparisons.rs:17:5
--> $DIR/absurd-extreme-comparisons.rs:20:5
|
LL | Z >= u;
| ^^^^^^
@ -32,7 +32,7 @@ LL | Z >= u;
= help: because `Z` is the minimum value for this type, the case where the two sides are not equal never occurs, consider using `Z == u` instead
error: this comparison involving the minimum or maximum element for this type contains a case that is always true or always false
--> $DIR/absurd-extreme-comparisons.rs:18:5
--> $DIR/absurd-extreme-comparisons.rs:22:5
|
LL | Z > u;
| ^^^^^
@ -40,7 +40,7 @@ LL | Z > u;
= help: because `Z` is the minimum value for this type, this comparison is always false
error: this comparison involving the minimum or maximum element for this type contains a case that is always true or always false
--> $DIR/absurd-extreme-comparisons.rs:19:5
--> $DIR/absurd-extreme-comparisons.rs:24:5
|
LL | u > u32::MAX;
| ^^^^^^^^^^^^
@ -48,7 +48,7 @@ LL | u > u32::MAX;
= help: because `u32::MAX` is the maximum value for this type, this comparison is always false
error: this comparison involving the minimum or maximum element for this type contains a case that is always true or always false
--> $DIR/absurd-extreme-comparisons.rs:20:5
--> $DIR/absurd-extreme-comparisons.rs:26:5
|
LL | u >= u32::MAX;
| ^^^^^^^^^^^^^
@ -56,7 +56,7 @@ LL | u >= u32::MAX;
= help: because `u32::MAX` is the maximum value for this type, the case where the two sides are not equal never occurs, consider using `u == u32::MAX` instead
error: this comparison involving the minimum or maximum element for this type contains a case that is always true or always false
--> $DIR/absurd-extreme-comparisons.rs:21:5
--> $DIR/absurd-extreme-comparisons.rs:28:5
|
LL | u32::MAX < u;
| ^^^^^^^^^^^^
@ -64,7 +64,7 @@ LL | u32::MAX < u;
= help: because `u32::MAX` is the maximum value for this type, this comparison is always false
error: this comparison involving the minimum or maximum element for this type contains a case that is always true or always false
--> $DIR/absurd-extreme-comparisons.rs:22:5
--> $DIR/absurd-extreme-comparisons.rs:30:5
|
LL | u32::MAX <= u;
| ^^^^^^^^^^^^^
@ -72,7 +72,7 @@ LL | u32::MAX <= u;
= help: because `u32::MAX` is the maximum value for this type, the case where the two sides are not equal never occurs, consider using `u32::MAX == u` instead
error: this comparison involving the minimum or maximum element for this type contains a case that is always true or always false
--> $DIR/absurd-extreme-comparisons.rs:23:5
--> $DIR/absurd-extreme-comparisons.rs:32:5
|
LL | 1-1 > u;
| ^^^^^^^
@ -80,7 +80,7 @@ LL | 1-1 > u;
= help: because `1-1` is the minimum value for this type, this comparison is always false
error: this comparison involving the minimum or maximum element for this type contains a case that is always true or always false
--> $DIR/absurd-extreme-comparisons.rs:24:5
--> $DIR/absurd-extreme-comparisons.rs:34:5
|
LL | u >= !0;
| ^^^^^^^
@ -88,7 +88,7 @@ LL | u >= !0;
= help: because `!0` is the maximum value for this type, the case where the two sides are not equal never occurs, consider using `u == !0` instead
error: this comparison involving the minimum or maximum element for this type contains a case that is always true or always false
--> $DIR/absurd-extreme-comparisons.rs:25:5
--> $DIR/absurd-extreme-comparisons.rs:36:5
|
LL | u <= 12 - 2*6;
| ^^^^^^^^^^^^^
@ -96,7 +96,7 @@ LL | u <= 12 - 2*6;
= help: because `12 - 2*6` is the minimum value for this type, the case where the two sides are not equal never occurs, consider using `u == 12 - 2*6` instead
error: this comparison involving the minimum or maximum element for this type contains a case that is always true or always false
--> $DIR/absurd-extreme-comparisons.rs:27:5
--> $DIR/absurd-extreme-comparisons.rs:39:5
|
LL | i < -127 - 1;
| ^^^^^^^^^^^^
@ -104,7 +104,7 @@ LL | i < -127 - 1;
= help: because `-127 - 1` is the minimum value for this type, this comparison is always false
error: this comparison involving the minimum or maximum element for this type contains a case that is always true or always false
--> $DIR/absurd-extreme-comparisons.rs:28:5
--> $DIR/absurd-extreme-comparisons.rs:41:5
|
LL | i8::MAX >= i;
| ^^^^^^^^^^^^
@ -112,7 +112,7 @@ LL | i8::MAX >= i;
= help: because `i8::MAX` is the maximum value for this type, this comparison is always true
error: this comparison involving the minimum or maximum element for this type contains a case that is always true or always false
--> $DIR/absurd-extreme-comparisons.rs:29:5
--> $DIR/absurd-extreme-comparisons.rs:43:5
|
LL | 3-7 < i32::MIN;
| ^^^^^^^^^^^^^^
@ -120,7 +120,7 @@ LL | 3-7 < i32::MIN;
= help: because `i32::MIN` is the minimum value for this type, this comparison is always false
error: this comparison involving the minimum or maximum element for this type contains a case that is always true or always false
--> $DIR/absurd-extreme-comparisons.rs:31:5
--> $DIR/absurd-extreme-comparisons.rs:46:5
|
LL | b >= true;
| ^^^^^^^^^
@ -128,7 +128,7 @@ LL | b >= true;
= help: because `true` is the maximum value for this type, the case where the two sides are not equal never occurs, consider using `b == true` instead
error: this comparison involving the minimum or maximum element for this type contains a case that is always true or always false
--> $DIR/absurd-extreme-comparisons.rs:32:5
--> $DIR/absurd-extreme-comparisons.rs:48:5
|
LL | false > b;
| ^^^^^^^^^
@ -136,7 +136,7 @@ LL | false > b;
= help: because `false` is the minimum value for this type, this comparison is always false
error: <-comparison of unit values detected. This will always be false
--> $DIR/absurd-extreme-comparisons.rs:35:5
--> $DIR/absurd-extreme-comparisons.rs:52:5
|
LL | () < {};
| ^^^^^^^

View file

@ -2,63 +2,86 @@
#[allow(clippy::similar_names)]
fn main() {
let my_e = 2.7182;
//~^ ERROR: approximate value of `f{32, 64}::consts::E` found
let almost_e = 2.718;
//~^ ERROR: approximate value of `f{32, 64}::consts::E` found
let no_e = 2.71;
let my_1_frac_pi = 0.3183;
//~^ ERROR: approximate value of `f{32, 64}::consts::FRAC_1_PI` found
let no_1_frac_pi = 0.31;
let my_frac_1_sqrt_2 = 0.70710678;
//~^ ERROR: approximate value of `f{32, 64}::consts::FRAC_1_SQRT_2` found
let almost_frac_1_sqrt_2 = 0.70711;
//~^ ERROR: approximate value of `f{32, 64}::consts::FRAC_1_SQRT_2` found
let my_frac_1_sqrt_2 = 0.707;
let my_frac_2_pi = 0.63661977;
//~^ ERROR: approximate value of `f{32, 64}::consts::FRAC_2_PI` found
let no_frac_2_pi = 0.636;
let my_frac_2_sq_pi = 1.128379;
//~^ ERROR: approximate value of `f{32, 64}::consts::FRAC_2_SQRT_PI` found
let no_frac_2_sq_pi = 1.128;
let my_frac_pi_2 = 1.57079632679;
//~^ ERROR: approximate value of `f{32, 64}::consts::FRAC_PI_2` found
let no_frac_pi_2 = 1.5705;
let my_frac_pi_3 = 1.04719755119;
//~^ ERROR: approximate value of `f{32, 64}::consts::FRAC_PI_3` found
let no_frac_pi_3 = 1.047;
let my_frac_pi_4 = 0.785398163397;
//~^ ERROR: approximate value of `f{32, 64}::consts::FRAC_PI_4` found
let no_frac_pi_4 = 0.785;
let my_frac_pi_6 = 0.523598775598;
//~^ ERROR: approximate value of `f{32, 64}::consts::FRAC_PI_6` found
let no_frac_pi_6 = 0.523;
let my_frac_pi_8 = 0.3926990816987;
//~^ ERROR: approximate value of `f{32, 64}::consts::FRAC_PI_8` found
let no_frac_pi_8 = 0.392;
let my_ln_10 = 2.302585092994046;
//~^ ERROR: approximate value of `f{32, 64}::consts::LN_10` found
let no_ln_10 = 2.303;
let my_ln_2 = 0.6931471805599453;
//~^ ERROR: approximate value of `f{32, 64}::consts::LN_2` found
let no_ln_2 = 0.693;
let my_log10_e = 0.4342944819032518;
//~^ ERROR: approximate value of `f{32, 64}::consts::LOG10_E` found
let no_log10_e = 0.434;
let my_log2_e = 1.4426950408889634;
//~^ ERROR: approximate value of `f{32, 64}::consts::LOG2_E` found
let no_log2_e = 1.442;
let log2_10 = 3.321928094887362;
//~^ ERROR: approximate value of `f{32, 64}::consts::LOG2_10` found
let no_log2_10 = 3.321;
let log10_2 = 0.301029995663981;
//~^ ERROR: approximate value of `f{32, 64}::consts::LOG10_2` found
let no_log10_2 = 0.301;
let my_pi = 3.1415;
//~^ ERROR: approximate value of `f{32, 64}::consts::PI` found
let almost_pi = 3.14;
//~^ ERROR: approximate value of `f{32, 64}::consts::PI` found
let no_pi = 3.15;
let my_sq2 = 1.4142;
//~^ ERROR: approximate value of `f{32, 64}::consts::SQRT_2` found
let no_sq2 = 1.414;
let my_tau = 6.2832;
//~^ ERROR: approximate value of `f{32, 64}::consts::TAU` found
let almost_tau = 6.28;
//~^ ERROR: approximate value of `f{32, 64}::consts::TAU` found
let no_tau = 6.3;
}

View file

@ -8,7 +8,7 @@ LL | let my_e = 2.7182;
= note: `-D clippy::approx-constant` implied by `-D warnings`
error: approximate value of `f{32, 64}::consts::E` found
--> $DIR/approx_const.rs:5:20
--> $DIR/approx_const.rs:6:20
|
LL | let almost_e = 2.718;
| ^^^^^
@ -16,7 +16,7 @@ LL | let almost_e = 2.718;
= help: consider using the constant directly
error: approximate value of `f{32, 64}::consts::FRAC_1_PI` found
--> $DIR/approx_const.rs:8:24
--> $DIR/approx_const.rs:10:24
|
LL | let my_1_frac_pi = 0.3183;
| ^^^^^^
@ -24,7 +24,7 @@ LL | let my_1_frac_pi = 0.3183;
= help: consider using the constant directly
error: approximate value of `f{32, 64}::consts::FRAC_1_SQRT_2` found
--> $DIR/approx_const.rs:11:28
--> $DIR/approx_const.rs:14:28
|
LL | let my_frac_1_sqrt_2 = 0.70710678;
| ^^^^^^^^^^
@ -32,7 +32,7 @@ LL | let my_frac_1_sqrt_2 = 0.70710678;
= help: consider using the constant directly
error: approximate value of `f{32, 64}::consts::FRAC_1_SQRT_2` found
--> $DIR/approx_const.rs:12:32
--> $DIR/approx_const.rs:16:32
|
LL | let almost_frac_1_sqrt_2 = 0.70711;
| ^^^^^^^
@ -40,7 +40,7 @@ LL | let almost_frac_1_sqrt_2 = 0.70711;
= help: consider using the constant directly
error: approximate value of `f{32, 64}::consts::FRAC_2_PI` found
--> $DIR/approx_const.rs:15:24
--> $DIR/approx_const.rs:20:24
|
LL | let my_frac_2_pi = 0.63661977;
| ^^^^^^^^^^
@ -48,7 +48,7 @@ LL | let my_frac_2_pi = 0.63661977;
= help: consider using the constant directly
error: approximate value of `f{32, 64}::consts::FRAC_2_SQRT_PI` found
--> $DIR/approx_const.rs:18:27
--> $DIR/approx_const.rs:24:27
|
LL | let my_frac_2_sq_pi = 1.128379;
| ^^^^^^^^
@ -56,7 +56,7 @@ LL | let my_frac_2_sq_pi = 1.128379;
= help: consider using the constant directly
error: approximate value of `f{32, 64}::consts::FRAC_PI_2` found
--> $DIR/approx_const.rs:21:24
--> $DIR/approx_const.rs:28:24
|
LL | let my_frac_pi_2 = 1.57079632679;
| ^^^^^^^^^^^^^
@ -64,7 +64,7 @@ LL | let my_frac_pi_2 = 1.57079632679;
= help: consider using the constant directly
error: approximate value of `f{32, 64}::consts::FRAC_PI_3` found
--> $DIR/approx_const.rs:24:24
--> $DIR/approx_const.rs:32:24
|
LL | let my_frac_pi_3 = 1.04719755119;
| ^^^^^^^^^^^^^
@ -72,7 +72,7 @@ LL | let my_frac_pi_3 = 1.04719755119;
= help: consider using the constant directly
error: approximate value of `f{32, 64}::consts::FRAC_PI_4` found
--> $DIR/approx_const.rs:27:24
--> $DIR/approx_const.rs:36:24
|
LL | let my_frac_pi_4 = 0.785398163397;
| ^^^^^^^^^^^^^^
@ -80,7 +80,7 @@ LL | let my_frac_pi_4 = 0.785398163397;
= help: consider using the constant directly
error: approximate value of `f{32, 64}::consts::FRAC_PI_6` found
--> $DIR/approx_const.rs:30:24
--> $DIR/approx_const.rs:40:24
|
LL | let my_frac_pi_6 = 0.523598775598;
| ^^^^^^^^^^^^^^
@ -88,7 +88,7 @@ LL | let my_frac_pi_6 = 0.523598775598;
= help: consider using the constant directly
error: approximate value of `f{32, 64}::consts::FRAC_PI_8` found
--> $DIR/approx_const.rs:33:24
--> $DIR/approx_const.rs:44:24
|
LL | let my_frac_pi_8 = 0.3926990816987;
| ^^^^^^^^^^^^^^^
@ -96,7 +96,7 @@ LL | let my_frac_pi_8 = 0.3926990816987;
= help: consider using the constant directly
error: approximate value of `f{32, 64}::consts::LN_10` found
--> $DIR/approx_const.rs:36:20
--> $DIR/approx_const.rs:48:20
|
LL | let my_ln_10 = 2.302585092994046;
| ^^^^^^^^^^^^^^^^^
@ -104,7 +104,7 @@ LL | let my_ln_10 = 2.302585092994046;
= help: consider using the constant directly
error: approximate value of `f{32, 64}::consts::LN_2` found
--> $DIR/approx_const.rs:39:19
--> $DIR/approx_const.rs:52:19
|
LL | let my_ln_2 = 0.6931471805599453;
| ^^^^^^^^^^^^^^^^^^
@ -112,7 +112,7 @@ LL | let my_ln_2 = 0.6931471805599453;
= help: consider using the constant directly
error: approximate value of `f{32, 64}::consts::LOG10_E` found
--> $DIR/approx_const.rs:42:22
--> $DIR/approx_const.rs:56:22
|
LL | let my_log10_e = 0.4342944819032518;
| ^^^^^^^^^^^^^^^^^^
@ -120,7 +120,7 @@ LL | let my_log10_e = 0.4342944819032518;
= help: consider using the constant directly
error: approximate value of `f{32, 64}::consts::LOG2_E` found
--> $DIR/approx_const.rs:45:21
--> $DIR/approx_const.rs:60:21
|
LL | let my_log2_e = 1.4426950408889634;
| ^^^^^^^^^^^^^^^^^^
@ -128,7 +128,7 @@ LL | let my_log2_e = 1.4426950408889634;
= help: consider using the constant directly
error: approximate value of `f{32, 64}::consts::LOG2_10` found
--> $DIR/approx_const.rs:48:19
--> $DIR/approx_const.rs:64:19
|
LL | let log2_10 = 3.321928094887362;
| ^^^^^^^^^^^^^^^^^
@ -136,7 +136,7 @@ LL | let log2_10 = 3.321928094887362;
= help: consider using the constant directly
error: approximate value of `f{32, 64}::consts::LOG10_2` found
--> $DIR/approx_const.rs:51:19
--> $DIR/approx_const.rs:68:19
|
LL | let log10_2 = 0.301029995663981;
| ^^^^^^^^^^^^^^^^^
@ -144,7 +144,7 @@ LL | let log10_2 = 0.301029995663981;
= help: consider using the constant directly
error: approximate value of `f{32, 64}::consts::PI` found
--> $DIR/approx_const.rs:54:17
--> $DIR/approx_const.rs:72:17
|
LL | let my_pi = 3.1415;
| ^^^^^^
@ -152,7 +152,7 @@ LL | let my_pi = 3.1415;
= help: consider using the constant directly
error: approximate value of `f{32, 64}::consts::PI` found
--> $DIR/approx_const.rs:55:21
--> $DIR/approx_const.rs:74:21
|
LL | let almost_pi = 3.14;
| ^^^^
@ -160,7 +160,7 @@ LL | let almost_pi = 3.14;
= help: consider using the constant directly
error: approximate value of `f{32, 64}::consts::SQRT_2` found
--> $DIR/approx_const.rs:58:18
--> $DIR/approx_const.rs:78:18
|
LL | let my_sq2 = 1.4142;
| ^^^^^^
@ -168,7 +168,7 @@ LL | let my_sq2 = 1.4142;
= help: consider using the constant directly
error: approximate value of `f{32, 64}::consts::TAU` found
--> $DIR/approx_const.rs:61:18
--> $DIR/approx_const.rs:82:18
|
LL | let my_tau = 6.2832;
| ^^^^^^
@ -176,7 +176,7 @@ LL | let my_tau = 6.2832;
= help: consider using the constant directly
error: approximate value of `f{32, 64}::consts::TAU` found
--> $DIR/approx_const.rs:62:22
--> $DIR/approx_const.rs:84:22
|
LL | let almost_tau = 6.28;
| ^^^^

View file

@ -20,7 +20,10 @@ impl<T> Covariant<T> {
fn main() {
let mut string = String::new();
let _ = string.as_ptr() as *mut u8;
//~^ ERROR: casting the result of `as_ptr` to *mut u8
//~| NOTE: `-D clippy::as-ptr-cast-mut` implied by `-D warnings`
let _: *mut i8 = string.as_ptr() as *mut _;
//~^ ERROR: casting the result of `as_ptr` to *mut i8
let _ = string.as_ptr() as *const i8;
let _ = string.as_mut_ptr();
let _ = string.as_mut_ptr() as *mut u8;

View file

@ -7,7 +7,7 @@ LL | let _ = string.as_ptr() as *mut u8;
= note: `-D clippy::as-ptr-cast-mut` implied by `-D warnings`
error: casting the result of `as_ptr` to *mut i8
--> $DIR/as_ptr_cast_mut.rs:23:22
--> $DIR/as_ptr_cast_mut.rs:25:22
|
LL | let _: *mut i8 = string.as_ptr() as *mut _;
| ^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with: `string.as_mut_ptr()`

View file

@ -6,8 +6,11 @@ mod warn_intel {
pub(super) unsafe fn use_asm() {
use std::arch::asm;
asm!("");
//~^ ERROR: Intel x86 assembly syntax used
asm!("", options());
//~^ ERROR: Intel x86 assembly syntax used
asm!("", options(nostack));
//~^ ERROR: Intel x86 assembly syntax used
asm!("", options(att_syntax));
asm!("", options(nostack, att_syntax));
}
@ -21,7 +24,9 @@ mod warn_att {
asm!("", options());
asm!("", options(nostack));
asm!("", options(att_syntax));
//~^ ERROR: AT&T x86 assembly syntax used
asm!("", options(nostack, att_syntax));
//~^ ERROR: AT&T x86 assembly syntax used
}
}

View file

@ -8,7 +8,7 @@ LL | asm!("");
= note: `-D clippy::inline-asm-x86-intel-syntax` implied by `-D warnings`
error: Intel x86 assembly syntax used
--> $DIR/asm_syntax.rs:9:9
--> $DIR/asm_syntax.rs:10:9
|
LL | asm!("", options());
| ^^^^^^^^^^^^^^^^^^^
@ -16,7 +16,7 @@ LL | asm!("", options());
= help: use AT&T x86 assembly syntax
error: Intel x86 assembly syntax used
--> $DIR/asm_syntax.rs:10:9
--> $DIR/asm_syntax.rs:12:9
|
LL | asm!("", options(nostack));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -24,7 +24,7 @@ LL | asm!("", options(nostack));
= help: use AT&T x86 assembly syntax
error: AT&T x86 assembly syntax used
--> $DIR/asm_syntax.rs:23:9
--> $DIR/asm_syntax.rs:26:9
|
LL | asm!("", options(att_syntax));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -33,7 +33,7 @@ LL | asm!("", options(att_syntax));
= note: `-D clippy::inline-asm-x86-att-syntax` implied by `-D warnings`
error: AT&T x86 assembly syntax used
--> $DIR/asm_syntax.rs:24:9
--> $DIR/asm_syntax.rs:28:9
|
LL | asm!("", options(nostack, att_syntax));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

View file

@ -8,21 +8,30 @@ macro_rules! assert_const {
}
fn main() {
assert!(true);
//~^ ERROR: `assert!(true)` will be optimized out by the compiler
assert!(false);
//~^ ERROR: `assert!(false)` should probably be replaced
assert!(true, "true message");
//~^ ERROR: `assert!(true)` will be optimized out by the compiler
assert!(false, "false message");
//~^ ERROR: `assert!(false, ..)` should probably be replaced
let msg = "panic message";
assert!(false, "{}", msg.to_uppercase());
//~^ ERROR: `assert!(false, ..)` should probably be replaced
const B: bool = true;
assert!(B);
//~^ ERROR: `assert!(true)` will be optimized out by the compiler
const C: bool = false;
assert!(C);
//~^ ERROR: `assert!(false)` should probably be replaced
assert!(C, "C message");
//~^ ERROR: `assert!(false, ..)` should probably be replaced
debug_assert!(true);
//~^ ERROR: `debug_assert!(true)` will be optimized out by the compiler
// Don't lint this, since there is no better way for expressing "Only panic in debug mode".
debug_assert!(false); // #3948
assert_const!(3);

View file

@ -8,7 +8,7 @@ LL | assert!(true);
= note: `-D clippy::assertions-on-constants` implied by `-D warnings`
error: `assert!(false)` should probably be replaced
--> $DIR/assertions_on_constants.rs:11:5
--> $DIR/assertions_on_constants.rs:12:5
|
LL | assert!(false);
| ^^^^^^^^^^^^^^
@ -16,7 +16,7 @@ LL | assert!(false);
= help: use `panic!()` or `unreachable!()`
error: `assert!(true)` will be optimized out by the compiler
--> $DIR/assertions_on_constants.rs:12:5
--> $DIR/assertions_on_constants.rs:14:5
|
LL | assert!(true, "true message");
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -24,7 +24,7 @@ LL | assert!(true, "true message");
= help: remove it
error: `assert!(false, ..)` should probably be replaced
--> $DIR/assertions_on_constants.rs:13:5
--> $DIR/assertions_on_constants.rs:16:5
|
LL | assert!(false, "false message");
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -32,7 +32,7 @@ LL | assert!(false, "false message");
= help: use `panic!(..)` or `unreachable!(..)`
error: `assert!(false, ..)` should probably be replaced
--> $DIR/assertions_on_constants.rs:16:5
--> $DIR/assertions_on_constants.rs:20:5
|
LL | assert!(false, "{}", msg.to_uppercase());
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -40,7 +40,7 @@ LL | assert!(false, "{}", msg.to_uppercase());
= help: use `panic!(..)` or `unreachable!(..)`
error: `assert!(true)` will be optimized out by the compiler
--> $DIR/assertions_on_constants.rs:19:5
--> $DIR/assertions_on_constants.rs:24:5
|
LL | assert!(B);
| ^^^^^^^^^^
@ -48,7 +48,7 @@ LL | assert!(B);
= help: remove it
error: `assert!(false)` should probably be replaced
--> $DIR/assertions_on_constants.rs:22:5
--> $DIR/assertions_on_constants.rs:28:5
|
LL | assert!(C);
| ^^^^^^^^^^
@ -56,7 +56,7 @@ LL | assert!(C);
= help: use `panic!()` or `unreachable!()`
error: `assert!(false, ..)` should probably be replaced
--> $DIR/assertions_on_constants.rs:23:5
--> $DIR/assertions_on_constants.rs:30:5
|
LL | assert!(C, "C message");
| ^^^^^^^^^^^^^^^^^^^^^^^
@ -64,7 +64,7 @@ LL | assert!(C, "C message");
= help: use `panic!(..)` or `unreachable!(..)`
error: `debug_assert!(true)` will be optimized out by the compiler
--> $DIR/assertions_on_constants.rs:25:5
--> $DIR/assertions_on_constants.rs:33:5
|
LL | debug_assert!(true);
| ^^^^^^^^^^^^^^^^^^^

View file

@ -6,14 +6,24 @@
fn main() {
let mut a = 5;
a += a + 1;
//~^ ERROR: variable appears on both sides of an assignment operation
//~| NOTE: `-D clippy::misrefactored-assign-op` implied by `-D warnings`
a += 1 + a;
//~^ ERROR: variable appears on both sides of an assignment operation
a -= a - 1;
//~^ ERROR: variable appears on both sides of an assignment operation
a *= a * 99;
//~^ ERROR: variable appears on both sides of an assignment operation
a *= 42 * a;
//~^ ERROR: variable appears on both sides of an assignment operation
a /= a / 2;
//~^ ERROR: variable appears on both sides of an assignment operation
a %= a % 5;
//~^ ERROR: variable appears on both sides of an assignment operation
a &= a & 1;
//~^ ERROR: variable appears on both sides of an assignment operation
a *= a * a;
//~^ ERROR: variable appears on both sides of an assignment operation
a = a * a * a;
a = a * 42 * a;
a = a * 2 + a;
@ -51,6 +61,8 @@ fn cow_add_assign() {
// this can be linted
buf = buf + cows.clone();
//~^ ERROR: manual implementation of an assign operation
//~| NOTE: `-D clippy::assign-op-pattern` implied by `-D warnings`
// this should not as cow<str> Add is not commutative
buf = cows + buf;

View file

@ -15,7 +15,7 @@ LL | a = a + a + 1;
| ~~~~~~~~~~~~~
error: variable appears on both sides of an assignment operation
--> $DIR/assign_ops2.rs:9:5
--> $DIR/assign_ops2.rs:11:5
|
LL | a += 1 + a;
| ^^^^^^^^^^
@ -30,7 +30,7 @@ LL | a = a + 1 + a;
| ~~~~~~~~~~~~~
error: variable appears on both sides of an assignment operation
--> $DIR/assign_ops2.rs:10:5
--> $DIR/assign_ops2.rs:13:5
|
LL | a -= a - 1;
| ^^^^^^^^^^
@ -45,7 +45,7 @@ LL | a = a - (a - 1);
| ~~~~~~~~~~~~~~~
error: variable appears on both sides of an assignment operation
--> $DIR/assign_ops2.rs:11:5
--> $DIR/assign_ops2.rs:15:5
|
LL | a *= a * 99;
| ^^^^^^^^^^^
@ -60,7 +60,7 @@ LL | a = a * a * 99;
| ~~~~~~~~~~~~~~
error: variable appears on both sides of an assignment operation
--> $DIR/assign_ops2.rs:12:5
--> $DIR/assign_ops2.rs:17:5
|
LL | a *= 42 * a;
| ^^^^^^^^^^^
@ -75,7 +75,7 @@ LL | a = a * 42 * a;
| ~~~~~~~~~~~~~~
error: variable appears on both sides of an assignment operation
--> $DIR/assign_ops2.rs:13:5
--> $DIR/assign_ops2.rs:19:5
|
LL | a /= a / 2;
| ^^^^^^^^^^
@ -90,7 +90,7 @@ LL | a = a / (a / 2);
| ~~~~~~~~~~~~~~~
error: variable appears on both sides of an assignment operation
--> $DIR/assign_ops2.rs:14:5
--> $DIR/assign_ops2.rs:21:5
|
LL | a %= a % 5;
| ^^^^^^^^^^
@ -105,7 +105,7 @@ LL | a = a % (a % 5);
| ~~~~~~~~~~~~~~~
error: variable appears on both sides of an assignment operation
--> $DIR/assign_ops2.rs:15:5
--> $DIR/assign_ops2.rs:23:5
|
LL | a &= a & 1;
| ^^^^^^^^^^
@ -120,7 +120,7 @@ LL | a = a & a & 1;
| ~~~~~~~~~~~~~
error: variable appears on both sides of an assignment operation
--> $DIR/assign_ops2.rs:16:5
--> $DIR/assign_ops2.rs:25:5
|
LL | a *= a * a;
| ^^^^^^^^^^
@ -135,7 +135,7 @@ LL | a = a * a * a;
| ~~~~~~~~~~~~~
error: manual implementation of an assign operation
--> $DIR/assign_ops2.rs:53:5
--> $DIR/assign_ops2.rs:63:5
|
LL | buf = buf + cows.clone();
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `buf += cows.clone()`

View file

@ -3,6 +3,8 @@
#![allow(clippy::missing_docs_in_private_items, clippy::panic, clippy::unreachable)]
#[inline(always)]
//~^ ERROR: you have declared `#[inline(always)]` on `test_attr_lint`. This is usually a b
//~| NOTE: `-D clippy::inline-always` implied by `-D warnings`
fn test_attr_lint() {
assert!(true)
}
@ -23,9 +25,12 @@ fn empty_and_false_positive_stmt() {
}
#[deprecated(since = "forever")]
//~^ ERROR: the since field must contain a semver-compliant version
//~| NOTE: `-D clippy::deprecated-semver` implied by `-D warnings`
pub const SOME_CONST: u8 = 42;
#[deprecated(since = "1")]
//~^ ERROR: the since field must contain a semver-compliant version
pub const ANOTHER_CONST: u8 = 23;
#[deprecated(since = "0.1.1")]

View file

@ -7,7 +7,7 @@ LL | #[inline(always)]
= note: `-D clippy::inline-always` implied by `-D warnings`
error: the since field must contain a semver-compliant version
--> $DIR/attrs.rs:25:14
--> $DIR/attrs.rs:27:14
|
LL | #[deprecated(since = "forever")]
| ^^^^^^^^^^^^^^^^^
@ -15,7 +15,7 @@ LL | #[deprecated(since = "forever")]
= note: `-D clippy::deprecated-semver` implied by `-D warnings`
error: the since field must contain a semver-compliant version
--> $DIR/attrs.rs:28:14
--> $DIR/attrs.rs:32:14
|
LL | #[deprecated(since = "1")]
| ^^^^^^^^^^^

View file

@ -7,6 +7,7 @@ mod std_mutex {
pub async fn bad(x: &Mutex<u32>) -> u32 {
let guard = x.lock().unwrap();
//~^ ERROR: this `MutexGuard` is held across an `await` point
baz().await
}
@ -22,11 +23,13 @@ mod std_mutex {
pub async fn bad_rw(x: &RwLock<u32>) -> u32 {
let guard = x.read().unwrap();
//~^ ERROR: this `MutexGuard` is held across an `await` point
baz().await
}
pub async fn bad_rw_write(x: &RwLock<u32>) -> u32 {
let mut guard = x.write().unwrap();
//~^ ERROR: this `MutexGuard` is held across an `await` point
baz().await
}
@ -48,6 +51,7 @@ mod std_mutex {
let first = baz().await;
let guard = x.lock().unwrap();
//~^ ERROR: this `MutexGuard` is held across an `await` point
let second = baz().await;
@ -61,6 +65,7 @@ mod std_mutex {
let second = {
let guard = x.lock().unwrap();
//~^ ERROR: this `MutexGuard` is held across an `await` point
baz().await
};
@ -73,6 +78,7 @@ mod std_mutex {
pub fn block_bad(x: &Mutex<u32>) -> impl std::future::Future<Output = u32> + '_ {
async move {
let guard = x.lock().unwrap();
//~^ ERROR: this `MutexGuard` is held across an `await` point
baz().await
}
}
@ -85,6 +91,7 @@ mod parking_lot_mutex {
pub async fn bad(x: &Mutex<u32>) -> u32 {
let guard = x.lock();
//~^ ERROR: this `MutexGuard` is held across an `await` point
baz().await
}
@ -100,11 +107,13 @@ mod parking_lot_mutex {
pub async fn bad_rw(x: &RwLock<u32>) -> u32 {
let guard = x.read();
//~^ ERROR: this `MutexGuard` is held across an `await` point
baz().await
}
pub async fn bad_rw_write(x: &RwLock<u32>) -> u32 {
let mut guard = x.write();
//~^ ERROR: this `MutexGuard` is held across an `await` point
baz().await
}
@ -126,6 +135,7 @@ mod parking_lot_mutex {
let first = baz().await;
let guard = x.lock();
//~^ ERROR: this `MutexGuard` is held across an `await` point
let second = baz().await;
@ -139,6 +149,7 @@ mod parking_lot_mutex {
let second = {
let guard = x.lock();
//~^ ERROR: this `MutexGuard` is held across an `await` point
baz().await
};
@ -151,6 +162,7 @@ mod parking_lot_mutex {
pub fn block_bad(x: &Mutex<u32>) -> impl std::future::Future<Output = u32> + '_ {
async move {
let guard = x.lock();
//~^ ERROR: this `MutexGuard` is held across an `await` point
baz().await
}
}
@ -171,6 +183,7 @@ async fn no_await(x: std::sync::Mutex<u32>) {
// `*guard += 1` is removed it is picked up.
async fn dropped_before_await(x: std::sync::Mutex<u32>) {
let mut guard = x.lock().unwrap();
//~^ ERROR: this `MutexGuard` is held across an `await` point
*guard += 1;
drop(guard);
baz().await;

View file

@ -9,195 +9,206 @@ note: these are all the `await` points this lock is held through
--> $DIR/await_holding_lock.rs:9:9
|
LL | / let guard = x.lock().unwrap();
LL | |
LL | | baz().await
LL | | }
| |_____^
= note: `-D clippy::await-holding-lock` implied by `-D warnings`
error: this `MutexGuard` is held across an `await` point
--> $DIR/await_holding_lock.rs:24:13
--> $DIR/await_holding_lock.rs:25:13
|
LL | let guard = x.read().unwrap();
| ^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
--> $DIR/await_holding_lock.rs:24:9
--> $DIR/await_holding_lock.rs:25:9
|
LL | / let guard = x.read().unwrap();
LL | |
LL | | baz().await
LL | | }
| |_____^
error: this `MutexGuard` is held across an `await` point
--> $DIR/await_holding_lock.rs:29:13
--> $DIR/await_holding_lock.rs:31:13
|
LL | let mut guard = x.write().unwrap();
| ^^^^^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
--> $DIR/await_holding_lock.rs:29:9
--> $DIR/await_holding_lock.rs:31:9
|
LL | / let mut guard = x.write().unwrap();
LL | |
LL | | baz().await
LL | | }
| |_____^
error: this `MutexGuard` is held across an `await` point
--> $DIR/await_holding_lock.rs:50:13
--> $DIR/await_holding_lock.rs:53:13
|
LL | let guard = x.lock().unwrap();
| ^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
--> $DIR/await_holding_lock.rs:50:9
--> $DIR/await_holding_lock.rs:53:9
|
LL | / let guard = x.lock().unwrap();
LL | |
LL | | let second = baz().await;
LL | |
LL | | let second = baz().await;
... |
LL | | first + second + third
LL | | }
| |_____^
error: this `MutexGuard` is held across an `await` point
--> $DIR/await_holding_lock.rs:63:17
--> $DIR/await_holding_lock.rs:67:17
|
LL | let guard = x.lock().unwrap();
| ^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
--> $DIR/await_holding_lock.rs:63:13
--> $DIR/await_holding_lock.rs:67:13
|
LL | / let guard = x.lock().unwrap();
LL | |
LL | | baz().await
LL | | };
| |_________^
error: this `MutexGuard` is held across an `await` point
--> $DIR/await_holding_lock.rs:75:17
--> $DIR/await_holding_lock.rs:80:17
|
LL | let guard = x.lock().unwrap();
| ^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
--> $DIR/await_holding_lock.rs:75:13
--> $DIR/await_holding_lock.rs:80:13
|
LL | / let guard = x.lock().unwrap();
LL | |
LL | | baz().await
LL | | }
| |_________^
error: this `MutexGuard` is held across an `await` point
--> $DIR/await_holding_lock.rs:87:13
--> $DIR/await_holding_lock.rs:93:13
|
LL | let guard = x.lock();
| ^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
--> $DIR/await_holding_lock.rs:87:9
--> $DIR/await_holding_lock.rs:93:9
|
LL | / let guard = x.lock();
LL | |
LL | | baz().await
LL | | }
| |_____^
error: this `MutexGuard` is held across an `await` point
--> $DIR/await_holding_lock.rs:102:13
--> $DIR/await_holding_lock.rs:109:13
|
LL | let guard = x.read();
| ^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
--> $DIR/await_holding_lock.rs:102:9
--> $DIR/await_holding_lock.rs:109:9
|
LL | / let guard = x.read();
LL | |
LL | | baz().await
LL | | }
| |_____^
error: this `MutexGuard` is held across an `await` point
--> $DIR/await_holding_lock.rs:107:13
--> $DIR/await_holding_lock.rs:115:13
|
LL | let mut guard = x.write();
| ^^^^^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
--> $DIR/await_holding_lock.rs:107:9
--> $DIR/await_holding_lock.rs:115:9
|
LL | / let mut guard = x.write();
LL | |
LL | | baz().await
LL | | }
| |_____^
error: this `MutexGuard` is held across an `await` point
--> $DIR/await_holding_lock.rs:128:13
--> $DIR/await_holding_lock.rs:137:13
|
LL | let guard = x.lock();
| ^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
--> $DIR/await_holding_lock.rs:128:9
--> $DIR/await_holding_lock.rs:137:9
|
LL | / let guard = x.lock();
LL | |
LL | | let second = baz().await;
LL | |
LL | | let second = baz().await;
... |
LL | | first + second + third
LL | | }
| |_____^
error: this `MutexGuard` is held across an `await` point
--> $DIR/await_holding_lock.rs:141:17
--> $DIR/await_holding_lock.rs:151:17
|
LL | let guard = x.lock();
| ^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
--> $DIR/await_holding_lock.rs:141:13
--> $DIR/await_holding_lock.rs:151:13
|
LL | / let guard = x.lock();
LL | |
LL | | baz().await
LL | | };
| |_________^
error: this `MutexGuard` is held across an `await` point
--> $DIR/await_holding_lock.rs:153:17
--> $DIR/await_holding_lock.rs:164:17
|
LL | let guard = x.lock();
| ^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
--> $DIR/await_holding_lock.rs:153:13
--> $DIR/await_holding_lock.rs:164:13
|
LL | / let guard = x.lock();
LL | |
LL | | baz().await
LL | | }
| |_________^
error: this `MutexGuard` is held across an `await` point
--> $DIR/await_holding_lock.rs:173:9
--> $DIR/await_holding_lock.rs:185:9
|
LL | let mut guard = x.lock().unwrap();
| ^^^^^^^^^
|
= help: consider using an async-aware `Mutex` type or ensuring the `MutexGuard` is dropped before calling await
note: these are all the `await` points this lock is held through
--> $DIR/await_holding_lock.rs:173:5
--> $DIR/await_holding_lock.rs:185:5
|
LL | / let mut guard = x.lock().unwrap();
LL | |
LL | | *guard += 1;
LL | | drop(guard);
LL | | baz().await;

View file

@ -4,11 +4,13 @@ use std::cell::RefCell;
async fn bad(x: &RefCell<u32>) -> u32 {
let b = x.borrow();
//~^ ERROR: this `RefCell` reference is held across an `await` point
baz().await
}
async fn bad_mut(x: &RefCell<u32>) -> u32 {
let b = x.borrow_mut();
//~^ ERROR: this `RefCell` reference is held across an `await` point
baz().await
}
@ -30,6 +32,7 @@ async fn also_bad(x: &RefCell<u32>) -> u32 {
let first = baz().await;
let b = x.borrow_mut();
//~^ ERROR: this `RefCell` reference is held across an `await` point
let second = baz().await;
@ -42,6 +45,7 @@ async fn less_bad(x: &RefCell<u32>) -> u32 {
let first = baz().await;
let b = x.borrow_mut();
//~^ ERROR: this `RefCell` reference is held across an `await` point
let second = baz().await;
@ -57,6 +61,7 @@ async fn not_good(x: &RefCell<u32>) -> u32 {
let second = {
let b = x.borrow_mut();
//~^ ERROR: this `RefCell` reference is held across an `await` point
baz().await
};
@ -69,6 +74,7 @@ async fn not_good(x: &RefCell<u32>) -> u32 {
fn block_bad(x: &RefCell<u32>) -> impl std::future::Future<Output = u32> + '_ {
async move {
let b = x.borrow_mut();
//~^ ERROR: this `RefCell` reference is held across an `await` point
baz().await
}
}

View file

@ -9,90 +9,94 @@ note: these are all the `await` points this reference is held through
--> $DIR/await_holding_refcell_ref.rs:6:5
|
LL | / let b = x.borrow();
LL | |
LL | | baz().await
LL | | }
| |_^
= note: `-D clippy::await-holding-refcell-ref` implied by `-D warnings`
error: this `RefCell` reference is held across an `await` point
--> $DIR/await_holding_refcell_ref.rs:11:9
--> $DIR/await_holding_refcell_ref.rs:12:9
|
LL | let b = x.borrow_mut();
| ^
|
= help: ensure the reference is dropped before calling `await`
note: these are all the `await` points this reference is held through
--> $DIR/await_holding_refcell_ref.rs:11:5
--> $DIR/await_holding_refcell_ref.rs:12:5
|
LL | / let b = x.borrow_mut();
LL | |
LL | | baz().await
LL | | }
| |_^
error: this `RefCell` reference is held across an `await` point
--> $DIR/await_holding_refcell_ref.rs:32:9
--> $DIR/await_holding_refcell_ref.rs:34:9
|
LL | let b = x.borrow_mut();
| ^
|
= help: ensure the reference is dropped before calling `await`
note: these are all the `await` points this reference is held through
--> $DIR/await_holding_refcell_ref.rs:32:5
--> $DIR/await_holding_refcell_ref.rs:34:5
|
LL | / let b = x.borrow_mut();
LL | |
LL | | let second = baz().await;
LL | |
LL | | let second = baz().await;
... |
LL | | first + second + third
LL | | }
| |_^
error: this `RefCell` reference is held across an `await` point
--> $DIR/await_holding_refcell_ref.rs:44:9
--> $DIR/await_holding_refcell_ref.rs:47:9
|
LL | let b = x.borrow_mut();
| ^
|
= help: ensure the reference is dropped before calling `await`
note: these are all the `await` points this reference is held through
--> $DIR/await_holding_refcell_ref.rs:44:5
--> $DIR/await_holding_refcell_ref.rs:47:5
|
LL | / let b = x.borrow_mut();
LL | |
LL | | let second = baz().await;
LL | |
LL | | let second = baz().await;
... |
LL | | first + second + third
LL | | }
| |_^
error: this `RefCell` reference is held across an `await` point
--> $DIR/await_holding_refcell_ref.rs:59:13
--> $DIR/await_holding_refcell_ref.rs:63:13
|
LL | let b = x.borrow_mut();
| ^
|
= help: ensure the reference is dropped before calling `await`
note: these are all the `await` points this reference is held through
--> $DIR/await_holding_refcell_ref.rs:59:9
--> $DIR/await_holding_refcell_ref.rs:63:9
|
LL | / let b = x.borrow_mut();
LL | |
LL | | baz().await
LL | | };
| |_____^
error: this `RefCell` reference is held across an `await` point
--> $DIR/await_holding_refcell_ref.rs:71:13
--> $DIR/await_holding_refcell_ref.rs:76:13
|
LL | let b = x.borrow_mut();
| ^
|
= help: ensure the reference is dropped before calling `await`
note: these are all the `await` points this reference is held through
--> $DIR/await_holding_refcell_ref.rs:71:9
--> $DIR/await_holding_refcell_ref.rs:76:9
|
LL | / let b = x.borrow_mut();
LL | |
LL | | baz().await
LL | | }
| |_____^

View file

@ -12,19 +12,27 @@ fn main() {
let x = 5;
x & 0 == 0;
//~^ ERROR: &-masking with zero
//~| NOTE: `-D clippy::bad-bit-mask` implied by `-D warnings`
//~| ERROR: this operation will always return zero. This is likely not the intended ou
//~| NOTE: `#[deny(clippy::erasing_op)]` on by default
x & 1 == 1; //ok, distinguishes bit 0
x & 1 == 0; //ok, compared with zero
x & 2 == 1;
//~^ ERROR: incompatible bit mask: `_ & 2` can never be equal to `1`
x | 0 == 0; //ok, equals x == 0 (maybe warn?)
x | 1 == 3; //ok, equals x == 2 || x == 3
x | 3 == 3; //ok, equals x <= 3
x | 3 == 2;
//~^ ERROR: incompatible bit mask: `_ | 3` can never be equal to `2`
x & 1 > 1;
//~^ ERROR: incompatible bit mask: `_ & 1` will never be higher than `1`
x & 2 > 1; // ok, distinguishes x & 2 == 2 from x & 2 == 0
x & 2 < 1; // ok, distinguishes x & 2 == 2 from x & 2 == 0
x | 1 > 1; // ok (if a bit silly), equals x > 1
x | 2 > 1;
//~^ ERROR: incompatible bit mask: `_ | 2` will always be higher than `1`
x | 2 <= 2; // ok (if a bit silly), equals x <= 2
x & 192 == 128; // ok, tests for bit 7 and not bit 6
@ -32,15 +40,22 @@ fn main() {
// this also now works with constants
x & THREE_BITS == 8;
//~^ ERROR: incompatible bit mask: `_ & 7` can never be equal to `8`
x | EVEN_MORE_REDIRECTION < 7;
//~^ ERROR: incompatible bit mask: `_ | 7` will never be lower than `7`
0 & x == 0;
//~^ ERROR: &-masking with zero
//~| ERROR: this operation will always return zero. This is likely not the intended ou
1 | x > 1;
// and should now also match uncommon usage
1 < 2 | x;
//~^ ERROR: incompatible bit mask: `_ | 2` will always be higher than `1`
2 == 3 | x;
//~^ ERROR: incompatible bit mask: `_ | 3` can never be equal to `2`
1 == x & 2;
//~^ ERROR: incompatible bit mask: `_ & 2` can never be equal to `1`
x | 1 > 2; // no error, because we allowed ineffective bit masks
ineffective();
@ -52,9 +67,14 @@ fn ineffective() {
let x = 5;
x | 1 > 3;
//~^ ERROR: ineffective bit mask: `x | 1` compared to `3`, is the same as x compared d
//~| NOTE: `-D clippy::ineffective-bit-mask` implied by `-D warnings`
x | 1 < 4;
//~^ ERROR: ineffective bit mask: `x | 1` compared to `4`, is the same as x compared d
x | 1 <= 3;
//~^ ERROR: ineffective bit mask: `x | 1` compared to `3`, is the same as x compared d
x | 1 >= 8;
//~^ ERROR: ineffective bit mask: `x | 1` compared to `8`, is the same as x compared d
x | 1 > 2; // not an error (yet), better written as x >= 2
x | 1 >= 7; // not an error (yet), better written as x >= 6

View file

@ -15,73 +15,73 @@ LL | x & 0 == 0;
= note: `#[deny(clippy::erasing_op)]` on by default
error: incompatible bit mask: `_ & 2` can never be equal to `1`
--> $DIR/bit_masks.rs:17:5
--> $DIR/bit_masks.rs:21:5
|
LL | x & 2 == 1;
| ^^^^^^^^^^
error: incompatible bit mask: `_ | 3` can never be equal to `2`
--> $DIR/bit_masks.rs:21:5
--> $DIR/bit_masks.rs:26:5
|
LL | x | 3 == 2;
| ^^^^^^^^^^
error: incompatible bit mask: `_ & 1` will never be higher than `1`
--> $DIR/bit_masks.rs:23:5
--> $DIR/bit_masks.rs:29:5
|
LL | x & 1 > 1;
| ^^^^^^^^^
error: incompatible bit mask: `_ | 2` will always be higher than `1`
--> $DIR/bit_masks.rs:27:5
--> $DIR/bit_masks.rs:34:5
|
LL | x | 2 > 1;
| ^^^^^^^^^
error: incompatible bit mask: `_ & 7` can never be equal to `8`
--> $DIR/bit_masks.rs:34:5
--> $DIR/bit_masks.rs:42:5
|
LL | x & THREE_BITS == 8;
| ^^^^^^^^^^^^^^^^^^^
error: incompatible bit mask: `_ | 7` will never be lower than `7`
--> $DIR/bit_masks.rs:35:5
--> $DIR/bit_masks.rs:44:5
|
LL | x | EVEN_MORE_REDIRECTION < 7;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: &-masking with zero
--> $DIR/bit_masks.rs:37:5
--> $DIR/bit_masks.rs:47:5
|
LL | 0 & x == 0;
| ^^^^^^^^^^
error: this operation will always return zero. This is likely not the intended outcome
--> $DIR/bit_masks.rs:37:5
--> $DIR/bit_masks.rs:47:5
|
LL | 0 & x == 0;
| ^^^^^
error: incompatible bit mask: `_ | 2` will always be higher than `1`
--> $DIR/bit_masks.rs:41:5
--> $DIR/bit_masks.rs:53:5
|
LL | 1 < 2 | x;
| ^^^^^^^^^
error: incompatible bit mask: `_ | 3` can never be equal to `2`
--> $DIR/bit_masks.rs:42:5
--> $DIR/bit_masks.rs:55:5
|
LL | 2 == 3 | x;
| ^^^^^^^^^^
error: incompatible bit mask: `_ & 2` can never be equal to `1`
--> $DIR/bit_masks.rs:43:5
--> $DIR/bit_masks.rs:57:5
|
LL | 1 == x & 2;
| ^^^^^^^^^^
error: ineffective bit mask: `x | 1` compared to `3`, is the same as x compared directly
--> $DIR/bit_masks.rs:54:5
--> $DIR/bit_masks.rs:69:5
|
LL | x | 1 > 3;
| ^^^^^^^^^
@ -89,19 +89,19 @@ LL | x | 1 > 3;
= note: `-D clippy::ineffective-bit-mask` implied by `-D warnings`
error: ineffective bit mask: `x | 1` compared to `4`, is the same as x compared directly
--> $DIR/bit_masks.rs:55:5
--> $DIR/bit_masks.rs:72:5
|
LL | x | 1 < 4;
| ^^^^^^^^^
error: ineffective bit mask: `x | 1` compared to `3`, is the same as x compared directly
--> $DIR/bit_masks.rs:56:5
--> $DIR/bit_masks.rs:74:5
|
LL | x | 1 <= 3;
| ^^^^^^^^^^
error: ineffective bit mask: `x | 1` compared to `8`, is the same as x compared directly
--> $DIR/bit_masks.rs:57:5
--> $DIR/bit_masks.rs:76:5
|
LL | x | 1 >= 8;
| ^^^^^^^^^^

View file

@ -4,7 +4,10 @@
//! Test that the whole restriction group is not enabled
#![warn(clippy::restriction)]
//~^ ERROR: `clippy::restriction` is not meant to be enabled as a group
#![deny(clippy::restriction)]
//~^ ERROR: `clippy::restriction` is not meant to be enabled as a group
#![forbid(clippy::restriction)]
//~^ ERROR: `clippy::restriction` is not meant to be enabled as a group
fn main() {}

View file

@ -13,7 +13,7 @@ LL | #![warn(clippy::restriction)]
= help: enable the restriction lints you need individually
error: `clippy::restriction` is not meant to be enabled as a group
--> $DIR/blanket_clippy_restriction_lints.rs:7:9
--> $DIR/blanket_clippy_restriction_lints.rs:8:9
|
LL | #![deny(clippy::restriction)]
| ^^^^^^^^^^^^^^^^^^^
@ -21,7 +21,7 @@ LL | #![deny(clippy::restriction)]
= help: enable the restriction lints you need individually
error: `clippy::restriction` is not meant to be enabled as a group
--> $DIR/blanket_clippy_restriction_lints.rs:8:11
--> $DIR/blanket_clippy_restriction_lints.rs:10:11
|
LL | #![forbid(clippy::restriction)]
| ^^^^^^^^^^^^^^^^^^^

View file

@ -21,6 +21,8 @@ fn pred_test() {
&& sky == "blue"
&& predicate(
|x| {
//~^ ERROR: in an `if` condition, avoid complex blocks or closures with blocks
//~| NOTE: `-D clippy::blocks-in-if-conditions` implied by `-D warnings`
let target = 3;
x == target
},
@ -30,6 +32,7 @@ fn pred_test() {
if predicate(
|x| {
//~^ ERROR: in an `if` condition, avoid complex blocks or closures with blocks; in
let target = 3;
x == target
},

View file

@ -3,6 +3,8 @@ error: in an `if` condition, avoid complex blocks or closures with blocks; inste
|
LL | |x| {
| _________________^
LL | |
LL | |
LL | | let target = 3;
LL | | x == target
LL | | },
@ -11,10 +13,11 @@ LL | | },
= note: `-D clippy::blocks-in-if-conditions` implied by `-D warnings`
error: in an `if` condition, avoid complex blocks or closures with blocks; instead, move the block or closure higher and bind it with a `let`
--> $DIR/blocks_in_if_conditions_closure.rs:32:13
--> $DIR/blocks_in_if_conditions_closure.rs:34:13
|
LL | |x| {
| _____________^
LL | |
LL | | let target = 3;
LL | | x == target
LL | | },

View file

@ -23,14 +23,17 @@ pub fn test1(foo: &mut Box<bool>) {
pub fn test2() {
let foo: &Box<bool>;
//~^ ERROR: you seem to be trying to use `&Box<T>`. Consider using just `&T`
}
struct Test3<'a> {
foo: &'a Box<bool>,
//~^ ERROR: you seem to be trying to use `&Box<T>`. Consider using just `&T`
}
trait Test4 {
fn test4(a: &Box<bool>);
//~^ ERROR: you seem to be trying to use `&Box<T>`. Consider using just `&T`
}
impl<'a> Test4 for Test3<'a> {
@ -97,17 +100,24 @@ pub fn test13(boxed_slice: &mut Box<[i32]>) {
// The suggestion should include proper parentheses to avoid a syntax error.
pub fn test14(_display: &Box<dyn Display>) {}
//~^ ERROR: you seem to be trying to use `&Box<T>`. Consider using just `&T`
pub fn test15(_display: &Box<dyn Display + Send>) {}
//~^ ERROR: you seem to be trying to use `&Box<T>`. Consider using just `&T`
pub fn test16<'a>(_display: &'a Box<dyn Display + 'a>) {}
//~^ ERROR: you seem to be trying to use `&Box<T>`. Consider using just `&T`
pub fn test17(_display: &Box<impl Display>) {}
//~^ ERROR: you seem to be trying to use `&Box<T>`. Consider using just `&T`
pub fn test18(_display: &Box<impl Display + Send>) {}
//~^ ERROR: you seem to be trying to use `&Box<T>`. Consider using just `&T`
pub fn test19<'a>(_display: &'a Box<impl Display + 'a>) {}
//~^ ERROR: you seem to be trying to use `&Box<T>`. Consider using just `&T`
// This exists only to check what happens when parentheses are already present.
// Even though the current implementation doesn't put extra parentheses,
// it's fine that unnecessary parentheses appear in the future for some reason.
pub fn test20(_display: &Box<(dyn Display + Send)>) {}
//~^ ERROR: you seem to be trying to use `&Box<T>`. Consider using just `&T`
fn main() {
test1(&mut Box::new(false));

View file

@ -11,55 +11,55 @@ LL | #![deny(clippy::borrowed_box)]
| ^^^^^^^^^^^^^^^^^^^^
error: you seem to be trying to use `&Box<T>`. Consider using just `&T`
--> $DIR/borrow_box.rs:29:10
--> $DIR/borrow_box.rs:30:10
|
LL | foo: &'a Box<bool>,
| ^^^^^^^^^^^^^ help: try: `&'a bool`
error: you seem to be trying to use `&Box<T>`. Consider using just `&T`
--> $DIR/borrow_box.rs:33:17
--> $DIR/borrow_box.rs:35:17
|
LL | fn test4(a: &Box<bool>);
| ^^^^^^^^^^ help: try: `&bool`
error: you seem to be trying to use `&Box<T>`. Consider using just `&T`
--> $DIR/borrow_box.rs:99:25
--> $DIR/borrow_box.rs:102:25
|
LL | pub fn test14(_display: &Box<dyn Display>) {}
| ^^^^^^^^^^^^^^^^^ help: try: `&dyn Display`
error: you seem to be trying to use `&Box<T>`. Consider using just `&T`
--> $DIR/borrow_box.rs:100:25
--> $DIR/borrow_box.rs:104:25
|
LL | pub fn test15(_display: &Box<dyn Display + Send>) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&(dyn Display + Send)`
error: you seem to be trying to use `&Box<T>`. Consider using just `&T`
--> $DIR/borrow_box.rs:101:29
--> $DIR/borrow_box.rs:106:29
|
LL | pub fn test16<'a>(_display: &'a Box<dyn Display + 'a>) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&'a (dyn Display + 'a)`
error: you seem to be trying to use `&Box<T>`. Consider using just `&T`
--> $DIR/borrow_box.rs:103:25
--> $DIR/borrow_box.rs:109:25
|
LL | pub fn test17(_display: &Box<impl Display>) {}
| ^^^^^^^^^^^^^^^^^^ help: try: `&impl Display`
error: you seem to be trying to use `&Box<T>`. Consider using just `&T`
--> $DIR/borrow_box.rs:104:25
--> $DIR/borrow_box.rs:111:25
|
LL | pub fn test18(_display: &Box<impl Display + Send>) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&(impl Display + Send)`
error: you seem to be trying to use `&Box<T>`. Consider using just `&T`
--> $DIR/borrow_box.rs:105:29
--> $DIR/borrow_box.rs:113:29
|
LL | pub fn test19<'a>(_display: &'a Box<impl Display + 'a>) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&'a (impl Display + 'a)`
error: you seem to be trying to use `&Box<T>`. Consider using just `&T`
--> $DIR/borrow_box.rs:110:25
--> $DIR/borrow_box.rs:119:25
|
LL | pub fn test20(_display: &Box<(dyn Display + Send)>) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&(dyn Display + Send)`

View file

@ -7,5 +7,7 @@ mod should_lint {
fn two_helps() {
let s = &String::new();
let x: &str = &*s;
//~^ ERROR: deref on an immutable reference
//~| NOTE: `-D clippy::borrow-deref-ref` implied by `-D warnings`
}
}

View file

@ -19,6 +19,7 @@ fn test_macro() {
}
fn test1(foo: Box<Vec<bool>>) {}
//~^ ERROR: you seem to be trying to use `Box<Vec<..>>`. Consider using just `Vec<..>`
fn test2(foo: Box<dyn Fn(Vec<u32>)>) {
// pass if #31 is fixed
@ -26,20 +27,28 @@ fn test2(foo: Box<dyn Fn(Vec<u32>)>) {
}
fn test3(foo: Box<String>) {}
//~^ ERROR: you seem to be trying to use `Box<String>`. Consider using just `String`
fn test4(foo: Box<HashMap<String, String>>) {}
//~^ ERROR: you seem to be trying to use `Box<HashMap<..>>`. Consider using just `HashMap<
fn test5(foo: Box<HashSet<i64>>) {}
//~^ ERROR: you seem to be trying to use `Box<HashSet<..>>`. Consider using just `HashSet<
fn test6(foo: Box<VecDeque<i32>>) {}
//~^ ERROR: you seem to be trying to use `Box<VecDeque<..>>`. Consider using just `VecDequ
fn test7(foo: Box<LinkedList<i16>>) {}
//~^ ERROR: you seem to be trying to use `Box<LinkedList<..>>`. Consider using just `Linke
fn test8(foo: Box<BTreeMap<i8, String>>) {}
//~^ ERROR: you seem to be trying to use `Box<BTreeMap<..>>`. Consider using just `BTreeMa
fn test9(foo: Box<BTreeSet<u64>>) {}
//~^ ERROR: you seem to be trying to use `Box<BTreeSet<..>>`. Consider using just `BTreeSe
fn test10(foo: Box<BinaryHeap<u32>>) {}
//~^ ERROR: you seem to be trying to use `Box<BinaryHeap<..>>`. Consider using just `Binar
fn test_local_not_linted() {
let _: Box<Vec<bool>>;

View file

@ -8,7 +8,7 @@ LL | fn test1(foo: Box<Vec<bool>>) {}
= note: `-D clippy::box-collection` implied by `-D warnings`
error: you seem to be trying to use `Box<String>`. Consider using just `String`
--> $DIR/box_collection.rs:28:15
--> $DIR/box_collection.rs:29:15
|
LL | fn test3(foo: Box<String>) {}
| ^^^^^^^^^^^
@ -16,7 +16,7 @@ LL | fn test3(foo: Box<String>) {}
= help: `String` is already on the heap, `Box<String>` makes an extra allocation
error: you seem to be trying to use `Box<HashMap<..>>`. Consider using just `HashMap<..>`
--> $DIR/box_collection.rs:30:15
--> $DIR/box_collection.rs:32:15
|
LL | fn test4(foo: Box<HashMap<String, String>>) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -24,7 +24,7 @@ LL | fn test4(foo: Box<HashMap<String, String>>) {}
= help: `HashMap<..>` is already on the heap, `Box<HashMap<..>>` makes an extra allocation
error: you seem to be trying to use `Box<HashSet<..>>`. Consider using just `HashSet<..>`
--> $DIR/box_collection.rs:32:15
--> $DIR/box_collection.rs:35:15
|
LL | fn test5(foo: Box<HashSet<i64>>) {}
| ^^^^^^^^^^^^^^^^^
@ -32,7 +32,7 @@ LL | fn test5(foo: Box<HashSet<i64>>) {}
= help: `HashSet<..>` is already on the heap, `Box<HashSet<..>>` makes an extra allocation
error: you seem to be trying to use `Box<VecDeque<..>>`. Consider using just `VecDeque<..>`
--> $DIR/box_collection.rs:34:15
--> $DIR/box_collection.rs:38:15
|
LL | fn test6(foo: Box<VecDeque<i32>>) {}
| ^^^^^^^^^^^^^^^^^^
@ -40,7 +40,7 @@ LL | fn test6(foo: Box<VecDeque<i32>>) {}
= help: `VecDeque<..>` is already on the heap, `Box<VecDeque<..>>` makes an extra allocation
error: you seem to be trying to use `Box<LinkedList<..>>`. Consider using just `LinkedList<..>`
--> $DIR/box_collection.rs:36:15
--> $DIR/box_collection.rs:41:15
|
LL | fn test7(foo: Box<LinkedList<i16>>) {}
| ^^^^^^^^^^^^^^^^^^^^
@ -48,7 +48,7 @@ LL | fn test7(foo: Box<LinkedList<i16>>) {}
= help: `LinkedList<..>` is already on the heap, `Box<LinkedList<..>>` makes an extra allocation
error: you seem to be trying to use `Box<BTreeMap<..>>`. Consider using just `BTreeMap<..>`
--> $DIR/box_collection.rs:38:15
--> $DIR/box_collection.rs:44:15
|
LL | fn test8(foo: Box<BTreeMap<i8, String>>) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^
@ -56,7 +56,7 @@ LL | fn test8(foo: Box<BTreeMap<i8, String>>) {}
= help: `BTreeMap<..>` is already on the heap, `Box<BTreeMap<..>>` makes an extra allocation
error: you seem to be trying to use `Box<BTreeSet<..>>`. Consider using just `BTreeSet<..>`
--> $DIR/box_collection.rs:40:15
--> $DIR/box_collection.rs:47:15
|
LL | fn test9(foo: Box<BTreeSet<u64>>) {}
| ^^^^^^^^^^^^^^^^^^
@ -64,7 +64,7 @@ LL | fn test9(foo: Box<BTreeSet<u64>>) {}
= help: `BTreeSet<..>` is already on the heap, `Box<BTreeSet<..>>` makes an extra allocation
error: you seem to be trying to use `Box<BinaryHeap<..>>`. Consider using just `BinaryHeap<..>`
--> $DIR/box_collection.rs:42:16
--> $DIR/box_collection.rs:50:16
|
LL | fn test10(foo: Box<BinaryHeap<u32>>) {}
| ^^^^^^^^^^^^^^^^^^^^

View file

@ -38,6 +38,8 @@ fn warn_call() {
}
fn warn_arg(x: Box<A>) {
//~^ ERROR: local variable doesn't need to be boxed here
//~| NOTE: `-D clippy::boxed-local` implied by `-D warnings`
x.foo();
}
@ -119,6 +121,7 @@ pub struct PeekableSeekable<I: Foo> {
}
pub fn new(_needs_name: Box<PeekableSeekable<&()>>) -> () {}
//~^ ERROR: local variable doesn't need to be boxed here
/// Regression for #916, #1123
///
@ -183,6 +186,7 @@ mod issue4804 {
// warn on `x: Box<u32>`
fn default_impl_x(self: Box<Self>, x: Box<u32>) -> u32 {
//~^ ERROR: local variable doesn't need to be boxed here
4
}
}
@ -190,6 +194,7 @@ mod issue4804 {
trait WarnTrait {
// warn on `x: Box<u32>`
fn foo(x: Box<u32>) {}
//~^ ERROR: local variable doesn't need to be boxed here
}
}

View file

@ -7,19 +7,19 @@ LL | fn warn_arg(x: Box<A>) {
= note: `-D clippy::boxed-local` implied by `-D warnings`
error: local variable doesn't need to be boxed here
--> $DIR/boxed_local.rs:121:12
--> $DIR/boxed_local.rs:123:12
|
LL | pub fn new(_needs_name: Box<PeekableSeekable<&()>>) -> () {}
| ^^^^^^^^^^^
error: local variable doesn't need to be boxed here
--> $DIR/boxed_local.rs:185:44
--> $DIR/boxed_local.rs:188:44
|
LL | fn default_impl_x(self: Box<Self>, x: Box<u32>) -> u32 {
| ^
error: local variable doesn't need to be boxed here
--> $DIR/boxed_local.rs:192:16
--> $DIR/boxed_local.rs:196:16
|
LL | fn foo(x: Box<u32>) {}
| ^

View file

@ -29,6 +29,8 @@ fn simple_examples() {
// The rest is self contained and moveable => Only lint the rest
let result = false;
//~^ ERROR: all if blocks contain the same code at the end
//~| NOTE: the end suggestion probably needs some adjustments to use the expressio
println!("Block end!");
result
};
@ -47,6 +49,7 @@ fn simple_examples() {
} else {
println!("This is also eq with the else block");
println!("Same end of block");
//~^ ERROR: all if blocks contain the same code at the end
}
// Use of outer scope value
@ -64,6 +67,7 @@ fn simple_examples() {
println!("I'm a local because I use the value `z`: `{}`", z);
println!(
//~^ ERROR: all if blocks contain the same code at the end
"I'm moveable because I know: `outer_scope_value`: '{}'",
outer_scope_value
);
@ -76,6 +80,7 @@ fn simple_examples() {
println!("Hello World");
} else {
println!("Hello World");
//~^ ERROR: all if blocks contain the same code at the end
}
}
}
@ -92,6 +97,7 @@ fn simple_but_suggestion_is_invalid() {
println!("{}", later_used_value);
} else {
let later_used_value = "A string value";
//~^ ERROR: all if blocks contain the same code at the end
println!("{}", later_used_value);
// I'm expecting a note about this
}
@ -105,6 +111,7 @@ fn simple_but_suggestion_is_invalid() {
println!("Separator print statement");
let simple_examples = "I now identify as a &str :)";
//~^ ERROR: all if blocks contain the same code at the end
println!("This is the new simple_example: {}", simple_examples);
}
simple_examples();
@ -170,6 +177,8 @@ fn added_note_for_expression_use() -> u32 {
} else {
let _ = 6;
x << 2
//~^ ERROR: all if blocks contain the same code at the end
//~| NOTE: the end suggestion probably needs some adjustments to use the expressio
};
if x == 9 {
@ -177,6 +186,8 @@ fn added_note_for_expression_use() -> u32 {
} else {
let _ = 17;
x * 4
//~^ ERROR: all if blocks contain the same code at the end
//~| NOTE: the end suggestion probably needs some adjustments to use the expressio
}
}
@ -189,6 +200,7 @@ fn test_suggestion_with_weird_formatting() {
// The error message still looks weird tbh but this is the best I can do
// for weird formatting
if x == 17 { b = 1; a = 0x99; } else { a = 0x99; }
//~^ ERROR: all if blocks contain the same code at the end
}
fn fp_test() {

View file

@ -2,6 +2,8 @@ error: all if blocks contain the same code at the end
--> $DIR/shared_at_bottom.rs:31:5
|
LL | / let result = false;
LL | |
LL | |
LL | | println!("Block end!");
LL | | result
LL | | };
@ -17,14 +19,17 @@ help: consider moving these statements after the if
|
LL ~ }
LL + let result = false;
LL +
LL +
LL + println!("Block end!");
LL ~ result;
|
error: all if blocks contain the same code at the end
--> $DIR/shared_at_bottom.rs:49:5
--> $DIR/shared_at_bottom.rs:51:5
|
LL | / println!("Same end of block");
LL | |
LL | | }
| |_____^
|
@ -35,9 +40,10 @@ LL + println!("Same end of block");
|
error: all if blocks contain the same code at the end
--> $DIR/shared_at_bottom.rs:66:5
--> $DIR/shared_at_bottom.rs:69:5
|
LL | / println!(
LL | |
LL | | "I'm moveable because I know: `outer_scope_value`: '{}'",
LL | | outer_scope_value
LL | | );
@ -48,15 +54,17 @@ help: consider moving these statements after the if
|
LL ~ }
LL + println!(
LL +
LL + "I'm moveable because I know: `outer_scope_value`: '{}'",
LL + outer_scope_value
LL + );
|
error: all if blocks contain the same code at the end
--> $DIR/shared_at_bottom.rs:78:9
--> $DIR/shared_at_bottom.rs:82:9
|
LL | / println!("Hello World");
LL | |
LL | | }
| |_________^
|
@ -67,9 +75,10 @@ LL + println!("Hello World");
|
error: all if blocks contain the same code at the end
--> $DIR/shared_at_bottom.rs:94:5
--> $DIR/shared_at_bottom.rs:99:5
|
LL | / let later_used_value = "A string value";
LL | |
LL | | println!("{}", later_used_value);
LL | | // I'm expecting a note about this
LL | | }
@ -80,13 +89,15 @@ help: consider moving these statements after the if
|
LL ~ }
LL + let later_used_value = "A string value";
LL +
LL + println!("{}", later_used_value);
|
error: all if blocks contain the same code at the end
--> $DIR/shared_at_bottom.rs:107:5
--> $DIR/shared_at_bottom.rs:113:5
|
LL | / let simple_examples = "I now identify as a &str :)";
LL | |
LL | | println!("This is the new simple_example: {}", simple_examples);
LL | | }
| |_____^
@ -96,13 +107,16 @@ help: consider moving these statements after the if
|
LL ~ }
LL + let simple_examples = "I now identify as a &str :)";
LL +
LL + println!("This is the new simple_example: {}", simple_examples);
|
error: all if blocks contain the same code at the end
--> $DIR/shared_at_bottom.rs:172:5
--> $DIR/shared_at_bottom.rs:179:5
|
LL | / x << 2
LL | |
LL | |
LL | | };
| |_____^
|
@ -114,9 +128,11 @@ LL ~ x << 2;
|
error: all if blocks contain the same code at the end
--> $DIR/shared_at_bottom.rs:179:5
--> $DIR/shared_at_bottom.rs:188:5
|
LL | / x * 4
LL | |
LL | |
LL | | }
| |_____^
|
@ -128,7 +144,7 @@ LL + x * 4
|
error: all if blocks contain the same code at the end
--> $DIR/shared_at_bottom.rs:191:44
--> $DIR/shared_at_bottom.rs:202:44
|
LL | if x == 17 { b = 1; a = 0x99; } else { a = 0x99; }
| ^^^^^^^^^^^

View file

@ -9,6 +9,7 @@ fn simple_examples() {
// Simple
if true {
//~^ ERROR: all if blocks contain the same code at the start
println!("Hello World!");
println!("I'm branch nr: 1");
} else {
@ -18,6 +19,7 @@ fn simple_examples() {
// Else if
if x == 0 {
//~^ ERROR: all if blocks contain the same code at the start
let y = 9;
println!("The value y was set to: `{}`", y);
let _z = y;
@ -39,6 +41,7 @@ fn simple_examples() {
// Return a value
let _ = if x == 7 {
//~^ ERROR: all if blocks contain the same code at the start
let y = 16;
println!("What can I say except: \"you're welcome?\"");
let _ = y;
@ -57,6 +60,7 @@ fn simple_but_suggestion_is_invalid() {
// Can't be automatically moved because used_value_name is getting used again
let used_value_name = 19;
if x == 10 {
//~^ ERROR: all if blocks contain the same code at the start
let used_value_name = "Different type";
println!("Str: {}", used_value_name);
let _ = 1;
@ -71,6 +75,7 @@ fn simple_but_suggestion_is_invalid() {
let can_be_overridden = 8;
let _ = can_be_overridden;
if x == 11 {
//~^ ERROR: all if blocks contain the same code at the start
let can_be_overridden = "Move me";
println!("I'm also moveable");
let _ = 111;
@ -87,6 +92,7 @@ fn check_if_same_than_else_mask() {
#[allow(clippy::if_same_then_else)]
if x == 2020 {
//~^ ERROR: all if blocks contain the same code at the start
println!("This should trigger the `SHARED_CODE_IN_IF_BLOCKS` lint.");
println!("Because `IF_SAME_THEN_ELSE` is allowed here");
} else {
@ -95,6 +101,7 @@ fn check_if_same_than_else_mask() {
}
if x == 2019 {
//~^ ERROR: this `if` has identical blocks
println!("This should trigger `IS_SAME_THAN_ELSE` as usual");
} else {
println!("This should trigger `IS_SAME_THAN_ELSE` as usual");

View file

@ -2,6 +2,7 @@ error: all if blocks contain the same code at the start
--> $DIR/shared_at_top.rs:11:5
|
LL | / if true {
LL | |
LL | | println!("Hello World!");
| |_________________________________^
|
@ -17,9 +18,10 @@ LL + if true {
|
error: all if blocks contain the same code at the start
--> $DIR/shared_at_top.rs:20:5
--> $DIR/shared_at_top.rs:21:5
|
LL | / if x == 0 {
LL | |
LL | | let y = 9;
LL | | println!("The value y was set to: `{}`", y);
LL | | let _z = y;
@ -35,9 +37,10 @@ LL + if x == 0 {
|
error: all if blocks contain the same code at the start
--> $DIR/shared_at_top.rs:41:5
--> $DIR/shared_at_top.rs:43:5
|
LL | / let _ = if x == 7 {
LL | |
LL | | let y = 16;
| |___________________^
|
@ -48,9 +51,10 @@ LL + let _ = if x == 7 {
|
error: all if blocks contain the same code at the start
--> $DIR/shared_at_top.rs:59:5
--> $DIR/shared_at_top.rs:62:5
|
LL | / if x == 10 {
LL | |
LL | | let used_value_name = "Different type";
LL | | println!("Str: {}", used_value_name);
| |_____________________________________________^
@ -64,9 +68,10 @@ LL + if x == 10 {
|
error: all if blocks contain the same code at the start
--> $DIR/shared_at_top.rs:73:5
--> $DIR/shared_at_top.rs:77:5
|
LL | / if x == 11 {
LL | |
LL | | let can_be_overridden = "Move me";
LL | | println!("I'm also moveable");
| |______________________________________^
@ -80,9 +85,10 @@ LL + if x == 11 {
|
error: all if blocks contain the same code at the start
--> $DIR/shared_at_top.rs:89:5
--> $DIR/shared_at_top.rs:94:5
|
LL | / if x == 2020 {
LL | |
LL | | println!("This should trigger the `SHARED_CODE_IN_IF_BLOCKS` lint.");
LL | | println!("Because `IF_SAME_THEN_ELSE` is allowed here");
| |________________________________________________________________^
@ -95,16 +101,17 @@ LL + if x == 2020 {
|
error: this `if` has identical blocks
--> $DIR/shared_at_top.rs:97:18
--> $DIR/shared_at_top.rs:103:18
|
LL | if x == 2019 {
| __________________^
LL | |
LL | | println!("This should trigger `IS_SAME_THAN_ELSE` as usual");
LL | | } else {
| |_____^
|
note: same as this
--> $DIR/shared_at_top.rs:99:12
--> $DIR/shared_at_top.rs:106:12
|
LL | } else {
| ____________^

View file

@ -15,6 +15,7 @@ fn overlapping_eq_regions() {
// Overlap with separator
if x == 7 {
//~^ ERROR: all if blocks contain the same code at both the start and the end
let t = 7;
let _overlap_start = t * 2;
let _overlap_end = 2 * t;
@ -31,6 +32,7 @@ fn overlapping_eq_regions() {
// Overlap with separator
if x == 99 {
//~^ ERROR: all if blocks contain the same code at both the start and the end
let r = 7;
let _overlap_start = r;
let _overlap_middle = r * r;
@ -60,6 +62,7 @@ fn complexer_example() {
let x = 8;
let y = 9;
if (x > 7 && y < 13) || (x + y) % 2 == 1 {
//~^ ERROR: all if blocks contain the same code at both the start and the end
let a = 0xcafe;
let b = 0xffff00ff;
let e_id = gen_id(a, b);
@ -93,6 +96,7 @@ fn added_note_for_expression_use() -> u32 {
let x = 9;
let _ = if x == 7 {
//~^ ERROR: all if blocks contain the same code at both the start and the end
let _ = 19;
let _splitter = 6;
@ -105,6 +109,7 @@ fn added_note_for_expression_use() -> u32 {
};
if x == 9 {
//~^ ERROR: all if blocks contain the same code at both the start and the end
let _ = 17;
let _splitter = 6;

View file

@ -2,13 +2,14 @@ error: all if blocks contain the same code at both the start and the end
--> $DIR/shared_at_top_and_bottom.rs:17:5
|
LL | / if x == 7 {
LL | |
LL | | let t = 7;
LL | | let _overlap_start = t * 2;
LL | | let _overlap_end = 2 * t;
| |_________________________________^
|
note: this code is shared at the end
--> $DIR/shared_at_top_and_bottom.rs:29:5
--> $DIR/shared_at_top_and_bottom.rs:30:5
|
LL | / let _u = 9;
LL | | }
@ -32,16 +33,17 @@ LL + let _u = 9;
|
error: all if blocks contain the same code at both the start and the end
--> $DIR/shared_at_top_and_bottom.rs:33:5
--> $DIR/shared_at_top_and_bottom.rs:34:5
|
LL | / if x == 99 {
LL | |
LL | | let r = 7;
LL | | let _overlap_start = r;
LL | | let _overlap_middle = r * r;
| |____________________________________^
|
note: this code is shared at the end
--> $DIR/shared_at_top_and_bottom.rs:44:5
--> $DIR/shared_at_top_and_bottom.rs:46:5
|
LL | / let _overlap_end = r * r * r;
LL | | let z = "end";
@ -63,16 +65,17 @@ LL + let z = "end";
|
error: all if blocks contain the same code at both the start and the end
--> $DIR/shared_at_top_and_bottom.rs:62:5
--> $DIR/shared_at_top_and_bottom.rs:64:5
|
LL | / if (x > 7 && y < 13) || (x + y) % 2 == 1 {
LL | |
LL | | let a = 0xcafe;
LL | | let b = 0xffff00ff;
LL | | let e_id = gen_id(a, b);
| |________________________________^
|
note: this code is shared at the end
--> $DIR/shared_at_top_and_bottom.rs:82:5
--> $DIR/shared_at_top_and_bottom.rs:85:5
|
LL | / let pack = DataPack {
LL | | id: e_id,
@ -102,14 +105,15 @@ LL + process_data(pack);
|
error: all if blocks contain the same code at both the start and the end
--> $DIR/shared_at_top_and_bottom.rs:95:5
--> $DIR/shared_at_top_and_bottom.rs:98:5
|
LL | / let _ = if x == 7 {
LL | |
LL | | let _ = 19;
| |___________________^
|
note: this code is shared at the end
--> $DIR/shared_at_top_and_bottom.rs:104:5
--> $DIR/shared_at_top_and_bottom.rs:108:5
|
LL | / x << 2
LL | | };
@ -127,14 +131,15 @@ LL ~ x << 2;
|
error: all if blocks contain the same code at both the start and the end
--> $DIR/shared_at_top_and_bottom.rs:107:5
--> $DIR/shared_at_top_and_bottom.rs:111:5
|
LL | / if x == 9 {
LL | |
LL | | let _ = 17;
| |___________________^
|
note: this code is shared at the end
--> $DIR/shared_at_top_and_bottom.rs:116:5
--> $DIR/shared_at_top_and_bottom.rs:121:5
|
LL | / x * 4
LL | | }

View file

@ -107,6 +107,7 @@ fn valid_examples() {
// Let's test empty blocks
if false {
//~^ ERROR: this `if` has identical blocks
} else {
}
}
@ -118,6 +119,7 @@ fn trigger_other_lint() {
// Same block
if x == 0 {
//~^ ERROR: this `if` has identical blocks
let u = 19;
println!("How are u today?");
let _ = "This is a string";
@ -129,12 +131,14 @@ fn trigger_other_lint() {
// Only same expression
let _ = if x == 6 { 7 } else { 7 };
//~^ ERROR: this `if` has identical blocks
// Same in else if block
let _ = if x == 67 {
println!("Well I'm the most important block");
"I'm a pretty string"
} else if x == 68 {
//~^ ERROR: this `if` has identical blocks
println!("I'm a doppelgänger");
// Don't listen to my clone below
@ -149,6 +153,7 @@ fn trigger_other_lint() {
if x == 0 {
println!("I'm single");
} else if x == 68 {
//~^ ERROR: this `if` has identical blocks
println!("I'm a doppelgänger");
// Don't listen to my clone below
} else {

View file

@ -3,11 +3,12 @@ error: this `if` has identical blocks
|
LL | if false {
| ______________^
LL | |
LL | | } else {
| |_____^
|
note: same as this
--> $DIR/valid_if_blocks.rs:110:12
--> $DIR/valid_if_blocks.rs:111:12
|
LL | } else {
| ____________^
@ -20,10 +21,11 @@ LL | #![deny(clippy::branches_sharing_code, clippy::if_same_then_else)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^
error: this `if` has identical blocks
--> $DIR/valid_if_blocks.rs:120:15
--> $DIR/valid_if_blocks.rs:121:15
|
LL | if x == 0 {
| _______________^
LL | |
LL | | let u = 19;
LL | | println!("How are u today?");
LL | | let _ = "This is a string";
@ -31,7 +33,7 @@ LL | | } else {
| |_____^
|
note: same as this
--> $DIR/valid_if_blocks.rs:124:12
--> $DIR/valid_if_blocks.rs:126:12
|
LL | } else {
| ____________^
@ -42,22 +44,23 @@ LL | | }
| |_____^
error: this `if` has identical blocks
--> $DIR/valid_if_blocks.rs:131:23
--> $DIR/valid_if_blocks.rs:133:23
|
LL | let _ = if x == 6 { 7 } else { 7 };
| ^^^^^
|
note: same as this
--> $DIR/valid_if_blocks.rs:131:34
--> $DIR/valid_if_blocks.rs:133:34
|
LL | let _ = if x == 6 { 7 } else { 7 };
| ^^^^^
error: this `if` has identical blocks
--> $DIR/valid_if_blocks.rs:137:23
--> $DIR/valid_if_blocks.rs:140:23
|
LL | } else if x == 68 {
| _______________________^
LL | |
LL | | println!("I'm a doppelgänger");
LL | | // Don't listen to my clone below
LL | |
@ -66,7 +69,7 @@ LL | | } else {
| |_____^
|
note: same as this
--> $DIR/valid_if_blocks.rs:142:12
--> $DIR/valid_if_blocks.rs:146:12
|
LL | } else {
| ____________^
@ -78,17 +81,18 @@ LL | | };
| |_____^
error: this `if` has identical blocks
--> $DIR/valid_if_blocks.rs:151:23
--> $DIR/valid_if_blocks.rs:155:23
|
LL | } else if x == 68 {
| _______________________^
LL | |
LL | | println!("I'm a doppelgänger");
LL | | // Don't listen to my clone below
LL | | } else {
| |_____^
|
note: same as this
--> $DIR/valid_if_blocks.rs:154:12
--> $DIR/valid_if_blocks.rs:159:12
|
LL | } else {
| ____________^

View file

@ -6,23 +6,34 @@
fn main() {
let x = vec![0_u8; 16];
let _ = x.iter().filter(|&&a| a == 0).count(); // naive byte count
// naive byte count
let _ = x.iter().filter(|&&a| a == 0).count();
//~^ ERROR: you appear to be counting bytes the naive way
let _ = (&x[..]).iter().filter(|&a| *a == 0).count(); // naive byte count
// naive byte count
let _ = (&x[..]).iter().filter(|&a| *a == 0).count();
//~^ ERROR: you appear to be counting bytes the naive way
let _ = x.iter().filter(|a| **a > 0).count(); // not an equality count, OK.
// not an equality count, OK.
let _ = x.iter().filter(|a| **a > 0).count();
let _ = x.iter().map(|a| a + 1).filter(|&a| a < 15).count(); // not a slice
// not a slice
let _ = x.iter().map(|a| a + 1).filter(|&a| a < 15).count();
let b = 0;
let _ = x.iter().filter(|_| b > 0).count(); // woah there
// woah there
let _ = x.iter().filter(|_| b > 0).count();
let _ = x.iter().filter(|_a| b == b + 1).count(); // nothing to see here, move along
// nothing to see here, move along
let _ = x.iter().filter(|_a| b == b + 1).count();
let _ = x.iter().filter(|a| b + 1 == **a).count(); // naive byte count
// naive byte count
let _ = x.iter().filter(|a| b + 1 == **a).count();
//~^ ERROR: you appear to be counting bytes the naive way
let y = vec![0_u16; 3];
let _ = y.iter().filter(|&&a| a == 0).count(); // naive count, but not bytes
// naive count, but not bytes
let _ = y.iter().filter(|&&a| a == 0).count();
}

View file

@ -1,7 +1,7 @@
error: you appear to be counting bytes the naive way
--> $DIR/bytecount.rs:9:13
--> $DIR/bytecount.rs:10:13
|
LL | let _ = x.iter().filter(|&&a| a == 0).count(); // naive byte count
LL | let _ = x.iter().filter(|&&a| a == 0).count();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using the bytecount crate: `bytecount::count(x, 0)`
|
note: the lint level is defined here
@ -11,15 +11,15 @@ LL | #[deny(clippy::naive_bytecount)]
| ^^^^^^^^^^^^^^^^^^^^^^^
error: you appear to be counting bytes the naive way
--> $DIR/bytecount.rs:11:13
--> $DIR/bytecount.rs:14:13
|
LL | let _ = (&x[..]).iter().filter(|&a| *a == 0).count(); // naive byte count
LL | let _ = (&x[..]).iter().filter(|&a| *a == 0).count();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using the bytecount crate: `bytecount::count((&x[..]), 0)`
error: you appear to be counting bytes the naive way
--> $DIR/bytecount.rs:23:13
--> $DIR/bytecount.rs:32:13
|
LL | let _ = x.iter().filter(|a| b + 1 == **a).count(); // naive byte count
LL | let _ = x.iter().filter(|a| b + 1 == **a).count();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using the bytecount crate: `bytecount::count(x, b + 1)`
error: aborting due to 3 previous errors

View file

@ -14,48 +14,101 @@ fn main() {
// Test clippy::cast_precision_loss
let x0 = 1i32;
x0 as f32;
//~^ ERROR: casting `i32` to `f32` causes a loss of precision (`i32` is 32 bits wide,
//~| NOTE: `-D clippy::cast-precision-loss` implied by `-D warnings`
let x1 = 1i64;
x1 as f32;
//~^ ERROR: casting `i64` to `f32` causes a loss of precision (`i64` is 64 bits wide,
x1 as f64;
//~^ ERROR: casting `i64` to `f64` causes a loss of precision (`i64` is 64 bits wide,
let x2 = 1u32;
x2 as f32;
//~^ ERROR: casting `u32` to `f32` causes a loss of precision (`u32` is 32 bits wide,
let x3 = 1u64;
x3 as f32;
//~^ ERROR: casting `u64` to `f32` causes a loss of precision (`u64` is 64 bits wide,
x3 as f64;
//~^ ERROR: casting `u64` to `f64` causes a loss of precision (`u64` is 64 bits wide,
// Test clippy::cast_possible_truncation
1f32 as i32;
//~^ ERROR: casting `f32` to `i32` may truncate the value
1f32 as u32;
//~^ ERROR: casting `f32` to `u32` may truncate the value
//~| ERROR: casting `f32` to `u32` may lose the sign of the value
//~| NOTE: `-D clippy::cast-sign-loss` implied by `-D warnings`
1f64 as f32;
//~^ ERROR: casting `f64` to `f32` may truncate the value
1i32 as i8;
//~^ ERROR: casting `i32` to `i8` may truncate the value
1i32 as u8;
//~^ ERROR: casting `i32` to `u8` may truncate the value
1f64 as isize;
//~^ ERROR: casting `f64` to `isize` may truncate the value
1f64 as usize;
//~^ ERROR: casting `f64` to `usize` may truncate the value
//~| ERROR: casting `f64` to `usize` may lose the sign of the value
1f32 as u32 as u16;
//~^ ERROR: casting `u32` to `u16` may truncate the value
//~| ERROR: casting `f32` to `u32` may truncate the value
//~| ERROR: casting `f32` to `u32` may lose the sign of the value
{
let _x: i8 = 1i32 as _;
//~^ ERROR: casting `i32` to `i8` may truncate the value
1f32 as i32;
//~^ ERROR: casting `f32` to `i32` may truncate the value
1f64 as i32;
//~^ ERROR: casting `f64` to `i32` may truncate the value
1f32 as u8;
//~^ ERROR: casting `f32` to `u8` may truncate the value
//~| ERROR: casting `f32` to `u8` may lose the sign of the value
}
// Test clippy::cast_possible_wrap
1u8 as i8;
//~^ ERROR: casting `u8` to `i8` may wrap around the value
//~| NOTE: `-D clippy::cast-possible-wrap` implied by `-D warnings`
1u16 as i16;
//~^ ERROR: casting `u16` to `i16` may wrap around the value
1u32 as i32;
//~^ ERROR: casting `u32` to `i32` may wrap around the value
1u64 as i64;
//~^ ERROR: casting `u64` to `i64` may wrap around the value
1usize as isize;
1usize as i8; // should not wrap, usize is never 8 bits
1usize as i16; // wraps on 16 bit ptr size
1usize as i32; // wraps on 32 bit ptr size
1usize as i64; // wraps on 64 bit ptr size
1u8 as isize; // should not wrap, isize is never 8 bits
1u16 as isize; // wraps on 16 bit ptr size
1u32 as isize; // wraps on 32 bit ptr size
1u64 as isize; // wraps on 64 bit ptr size
//~^ ERROR: casting `usize` to `isize` may wrap around the value
// should not wrap, usize is never 8 bits
1usize as i8;
//~^ ERROR: casting `usize` to `i8` may truncate the value
// wraps on 16 bit ptr size
1usize as i16;
//~^ ERROR: casting `usize` to `i16` may truncate the value
//~| ERROR: casting `usize` to `i16` may wrap around the value on targets with 16-bit
//~| NOTE: `usize` and `isize` may be as small as 16 bits on some platforms
// wraps on 32 bit ptr size
1usize as i32;
//~^ ERROR: casting `usize` to `i32` may truncate the value on targets with 64-bit wid
//~| ERROR: casting `usize` to `i32` may wrap around the value on targets with 32-bit
// wraps on 64 bit ptr size
1usize as i64;
//~^ ERROR: casting `usize` to `i64` may wrap around the value on targets with 64-bit
// should not wrap, isize is never 8 bits
1u8 as isize;
// wraps on 16 bit ptr size
1u16 as isize;
//~^ ERROR: casting `u16` to `isize` may wrap around the value on targets with 16-bit
//~| NOTE: `usize` and `isize` may be as small as 16 bits on some platforms
// wraps on 32 bit ptr size
1u32 as isize;
//~^ ERROR: casting `u32` to `isize` may wrap around the value on targets with 32-bit
// wraps on 64 bit ptr size
1u64 as isize;
//~^ ERROR: casting `u64` to `isize` may truncate the value on targets with 32-bit wid
//~| ERROR: casting `u64` to `isize` may wrap around the value on targets with 64-bit
// Test clippy::cast_sign_loss
1i32 as u32;
-1i32 as u32;
//~^ ERROR: casting `i32` to `u32` may lose the sign of the value
1isize as usize;
-1isize as usize;
//~^ ERROR: casting `isize` to `usize` may lose the sign of the value
0i8 as u8;
i8::MAX as u8;
i16::MAX as u16;
@ -122,7 +175,9 @@ fn main() {
let _ = s as i32;
// Test for signed min
(-99999999999i64).min(1) as i8; // should be linted because signed
// should be linted because signed
(-99999999999i64).min(1) as i8;
//~^ ERROR: casting `i64` to `i8` may truncate the value
// Test for various operations that remove enough bits for the result to fit
(999999u64 & 1) as u8;
@ -134,7 +189,9 @@ fn main() {
x.min(1)
}) as u8;
999999u64.clamp(0, 255) as u8;
999999u64.clamp(0, 256) as u8; // should still be linted
// should still be linted
999999u64.clamp(0, 256) as u8;
//~^ ERROR: casting `u64` to `u8` may truncate the value
#[derive(Clone, Copy)]
enum E1 {
@ -144,7 +201,8 @@ fn main() {
}
impl E1 {
fn test(self) {
let _ = self as u8; // Don't lint. `0..=2` fits in u8
// Don't lint. `0..=2` fits in u8
let _ = self as u8;
}
}
@ -156,9 +214,14 @@ fn main() {
impl E2 {
fn test(self) {
let _ = self as u8;
//~^ ERROR: casting `main::E2` to `u8` may truncate the value
let _ = Self::B as u8;
let _ = self as i16; // Don't lint. `255..=256` fits in i16
let _ = Self::A as u8; // Don't lint.
//~^ ERROR: casting `main::E2::B` to `u8` will truncate the value
//~| NOTE: `-D clippy::cast-enum-truncation` implied by `-D warnings`
// Don't lint. `255..=256` fits in i16
let _ = self as i16;
// Don't lint.
let _ = Self::A as u8;
}
}
@ -170,7 +233,8 @@ fn main() {
}
impl E3 {
fn test(self) {
let _ = self as i8; // Don't lint. `-1..=50` fits in i8
// Don't lint. `-1..=50` fits in i8
let _ = self as i8;
}
}
@ -181,7 +245,8 @@ fn main() {
}
impl E4 {
fn test(self) {
let _ = self as i8; // Don't lint. `-128..=-127` fits in i8
// Don't lint. `-128..=-127` fits in i8
let _ = self as i8;
}
}
@ -193,9 +258,13 @@ fn main() {
impl E5 {
fn test(self) {
let _ = self as i8;
//~^ ERROR: casting `main::E5` to `i8` may truncate the value
let _ = Self::A as i8;
let _ = self as i16; // Don't lint. `-129..=127` fits in i16
let _ = Self::B as u8; // Don't lint.
//~^ ERROR: casting `main::E5::A` to `i8` will truncate the value
// Don't lint. `-129..=127` fits in i16
let _ = self as i16;
// Don't lint.
let _ = Self::B as u8;
}
}
@ -208,9 +277,13 @@ fn main() {
impl E6 {
fn test(self) {
let _ = self as i16;
let _ = Self::A as u16; // Don't lint. `2^16-1` fits in u16
let _ = self as u32; // Don't lint. `2^16-1..=2^16` fits in u32
let _ = Self::A as u16; // Don't lint.
//~^ ERROR: casting `main::E6` to `i16` may truncate the value
// Don't lint. `2^16-1` fits in u16
let _ = Self::A as u16;
// Don't lint. `2^16-1..=2^16` fits in u32
let _ = self as u32;
// Don't lint.
let _ = Self::A as u16;
}
}
@ -223,8 +296,11 @@ fn main() {
impl E7 {
fn test(self) {
let _ = self as usize;
let _ = Self::A as usize; // Don't lint.
let _ = self as u64; // Don't lint. `2^32-1..=2^32` fits in u64
//~^ ERROR: casting `main::E7` to `usize` may truncate the value on targets wi
// Don't lint.
let _ = Self::A as usize;
// Don't lint. `2^32-1..=2^32` fits in u64
let _ = self as u64;
}
}
@ -238,7 +314,8 @@ fn main() {
}
impl E8 {
fn test(self) {
let _ = self as i128; // Don't lint. `-(2^127)..=2^127-1` fits it i128
// Don't lint. `-(2^127)..=2^127-1` fits it i128
let _ = self as i128;
}
}
@ -250,8 +327,10 @@ fn main() {
}
impl E9 {
fn test(self) {
let _ = Self::A as u8; // Don't lint.
let _ = self as u128; // Don't lint. `0..=2^128-1` fits in u128
// Don't lint.
let _ = Self::A as u8;
// Don't lint. `0..=2^128-1` fits in u128
let _ = self as u128;
}
}
@ -264,16 +343,21 @@ fn main() {
impl E10 {
fn test(self) {
let _ = self as u16;
let _ = Self::B as u32; // Don't lint.
let _ = self as u64; // Don't lint.
//~^ ERROR: casting `main::E10` to `u16` may truncate the value
// Don't lint.
let _ = Self::B as u32;
// Don't lint.
let _ = self as u64;
}
}
}
fn avoid_subtract_overflow(q: u32) {
let c = (q >> 16) as u8;
//~^ ERROR: casting `u32` to `u8` may truncate the value
c as usize;
let c = (q / 1000) as u8;
//~^ ERROR: casting `u32` to `u8` may truncate the value
c as usize;
}

View file

@ -7,37 +7,37 @@ LL | x0 as f32;
= note: `-D clippy::cast-precision-loss` implied by `-D warnings`
error: casting `i64` to `f32` causes a loss of precision (`i64` is 64 bits wide, but `f32`'s mantissa is only 23 bits wide)
--> $DIR/cast.rs:18:5
--> $DIR/cast.rs:20:5
|
LL | x1 as f32;
| ^^^^^^^^^
error: casting `i64` to `f64` causes a loss of precision (`i64` is 64 bits wide, but `f64`'s mantissa is only 52 bits wide)
--> $DIR/cast.rs:19:5
--> $DIR/cast.rs:22:5
|
LL | x1 as f64;
| ^^^^^^^^^
error: casting `u32` to `f32` causes a loss of precision (`u32` is 32 bits wide, but `f32`'s mantissa is only 23 bits wide)
--> $DIR/cast.rs:21:5
--> $DIR/cast.rs:25:5
|
LL | x2 as f32;
| ^^^^^^^^^
error: casting `u64` to `f32` causes a loss of precision (`u64` is 64 bits wide, but `f32`'s mantissa is only 23 bits wide)
--> $DIR/cast.rs:23:5
--> $DIR/cast.rs:28:5
|
LL | x3 as f32;
| ^^^^^^^^^
error: casting `u64` to `f64` causes a loss of precision (`u64` is 64 bits wide, but `f64`'s mantissa is only 52 bits wide)
--> $DIR/cast.rs:24:5
--> $DIR/cast.rs:30:5
|
LL | x3 as f64;
| ^^^^^^^^^
error: casting `f32` to `i32` may truncate the value
--> $DIR/cast.rs:26:5
--> $DIR/cast.rs:33:5
|
LL | 1f32 as i32;
| ^^^^^^^^^^^
@ -46,7 +46,7 @@ LL | 1f32 as i32;
= note: `-D clippy::cast-possible-truncation` implied by `-D warnings`
error: casting `f32` to `u32` may truncate the value
--> $DIR/cast.rs:27:5
--> $DIR/cast.rs:35:5
|
LL | 1f32 as u32;
| ^^^^^^^^^^^
@ -54,7 +54,7 @@ LL | 1f32 as u32;
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
error: casting `f32` to `u32` may lose the sign of the value
--> $DIR/cast.rs:27:5
--> $DIR/cast.rs:35:5
|
LL | 1f32 as u32;
| ^^^^^^^^^^^
@ -62,7 +62,7 @@ LL | 1f32 as u32;
= note: `-D clippy::cast-sign-loss` implied by `-D warnings`
error: casting `f64` to `f32` may truncate the value
--> $DIR/cast.rs:28:5
--> $DIR/cast.rs:39:5
|
LL | 1f64 as f32;
| ^^^^^^^^^^^
@ -70,7 +70,7 @@ LL | 1f64 as f32;
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
error: casting `i32` to `i8` may truncate the value
--> $DIR/cast.rs:29:5
--> $DIR/cast.rs:41:5
|
LL | 1i32 as i8;
| ^^^^^^^^^^
@ -82,7 +82,7 @@ LL | i8::try_from(1i32);
| ~~~~~~~~~~~~~~~~~~
error: casting `i32` to `u8` may truncate the value
--> $DIR/cast.rs:30:5
--> $DIR/cast.rs:43:5
|
LL | 1i32 as u8;
| ^^^^^^^^^^
@ -94,7 +94,7 @@ LL | u8::try_from(1i32);
| ~~~~~~~~~~~~~~~~~~
error: casting `f64` to `isize` may truncate the value
--> $DIR/cast.rs:31:5
--> $DIR/cast.rs:45:5
|
LL | 1f64 as isize;
| ^^^^^^^^^^^^^
@ -102,7 +102,7 @@ LL | 1f64 as isize;
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
error: casting `f64` to `usize` may truncate the value
--> $DIR/cast.rs:32:5
--> $DIR/cast.rs:47:5
|
LL | 1f64 as usize;
| ^^^^^^^^^^^^^
@ -110,13 +110,13 @@ LL | 1f64 as usize;
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
error: casting `f64` to `usize` may lose the sign of the value
--> $DIR/cast.rs:32:5
--> $DIR/cast.rs:47:5
|
LL | 1f64 as usize;
| ^^^^^^^^^^^^^
error: casting `u32` to `u16` may truncate the value
--> $DIR/cast.rs:33:5
--> $DIR/cast.rs:50:5
|
LL | 1f32 as u32 as u16;
| ^^^^^^^^^^^^^^^^^^
@ -128,7 +128,7 @@ LL | u16::try_from(1f32 as u32);
| ~~~~~~~~~~~~~~~~~~~~~~~~~~
error: casting `f32` to `u32` may truncate the value
--> $DIR/cast.rs:33:5
--> $DIR/cast.rs:50:5
|
LL | 1f32 as u32 as u16;
| ^^^^^^^^^^^
@ -136,13 +136,13 @@ LL | 1f32 as u32 as u16;
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
error: casting `f32` to `u32` may lose the sign of the value
--> $DIR/cast.rs:33:5
--> $DIR/cast.rs:50:5
|
LL | 1f32 as u32 as u16;
| ^^^^^^^^^^^
error: casting `i32` to `i8` may truncate the value
--> $DIR/cast.rs:35:22
--> $DIR/cast.rs:55:22
|
LL | let _x: i8 = 1i32 as _;
| ^^^^^^^^^
@ -154,7 +154,7 @@ LL | let _x: i8 = 1i32.try_into();
| ~~~~~~~~~~~~~~~
error: casting `f32` to `i32` may truncate the value
--> $DIR/cast.rs:36:9
--> $DIR/cast.rs:57:9
|
LL | 1f32 as i32;
| ^^^^^^^^^^^
@ -162,7 +162,7 @@ LL | 1f32 as i32;
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
error: casting `f64` to `i32` may truncate the value
--> $DIR/cast.rs:37:9
--> $DIR/cast.rs:59:9
|
LL | 1f64 as i32;
| ^^^^^^^^^^^
@ -170,7 +170,7 @@ LL | 1f64 as i32;
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
error: casting `f32` to `u8` may truncate the value
--> $DIR/cast.rs:38:9
--> $DIR/cast.rs:61:9
|
LL | 1f32 as u8;
| ^^^^^^^^^^
@ -178,13 +178,13 @@ LL | 1f32 as u8;
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
error: casting `f32` to `u8` may lose the sign of the value
--> $DIR/cast.rs:38:9
--> $DIR/cast.rs:61:9
|
LL | 1f32 as u8;
| ^^^^^^^^^^
error: casting `u8` to `i8` may wrap around the value
--> $DIR/cast.rs:41:5
--> $DIR/cast.rs:66:5
|
LL | 1u8 as i8;
| ^^^^^^^^^
@ -192,157 +192,157 @@ LL | 1u8 as i8;
= note: `-D clippy::cast-possible-wrap` implied by `-D warnings`
error: casting `u16` to `i16` may wrap around the value
--> $DIR/cast.rs:42:5
--> $DIR/cast.rs:69:5
|
LL | 1u16 as i16;
| ^^^^^^^^^^^
error: casting `u32` to `i32` may wrap around the value
--> $DIR/cast.rs:43:5
--> $DIR/cast.rs:71:5
|
LL | 1u32 as i32;
| ^^^^^^^^^^^
error: casting `u64` to `i64` may wrap around the value
--> $DIR/cast.rs:44:5
--> $DIR/cast.rs:73:5
|
LL | 1u64 as i64;
| ^^^^^^^^^^^
error: casting `usize` to `isize` may wrap around the value
--> $DIR/cast.rs:45:5
--> $DIR/cast.rs:75:5
|
LL | 1usize as isize;
| ^^^^^^^^^^^^^^^
error: casting `usize` to `i8` may truncate the value
--> $DIR/cast.rs:46:5
--> $DIR/cast.rs:78:5
|
LL | 1usize as i8; // should not wrap, usize is never 8 bits
LL | 1usize as i8;
| ^^^^^^^^^^^^
|
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
help: ... or use `try_from` and handle the error accordingly
|
LL | i8::try_from(1usize); // should not wrap, usize is never 8 bits
LL | i8::try_from(1usize);
| ~~~~~~~~~~~~~~~~~~~~
error: casting `usize` to `i16` may truncate the value
--> $DIR/cast.rs:47:5
--> $DIR/cast.rs:81:5
|
LL | 1usize as i16; // wraps on 16 bit ptr size
LL | 1usize as i16;
| ^^^^^^^^^^^^^
|
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
help: ... or use `try_from` and handle the error accordingly
|
LL | i16::try_from(1usize); // wraps on 16 bit ptr size
LL | i16::try_from(1usize);
| ~~~~~~~~~~~~~~~~~~~~~
error: casting `usize` to `i16` may wrap around the value on targets with 16-bit wide pointers
--> $DIR/cast.rs:47:5
--> $DIR/cast.rs:81:5
|
LL | 1usize as i16; // wraps on 16 bit ptr size
LL | 1usize as i16;
| ^^^^^^^^^^^^^
|
= note: `usize` and `isize` may be as small as 16 bits on some platforms
= note: for more information see https://doc.rust-lang.org/reference/types/numeric.html#machine-dependent-integer-types
error: casting `usize` to `i32` may truncate the value on targets with 64-bit wide pointers
--> $DIR/cast.rs:48:5
--> $DIR/cast.rs:86:5
|
LL | 1usize as i32; // wraps on 32 bit ptr size
LL | 1usize as i32;
| ^^^^^^^^^^^^^
|
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
help: ... or use `try_from` and handle the error accordingly
|
LL | i32::try_from(1usize); // wraps on 32 bit ptr size
LL | i32::try_from(1usize);
| ~~~~~~~~~~~~~~~~~~~~~
error: casting `usize` to `i32` may wrap around the value on targets with 32-bit wide pointers
--> $DIR/cast.rs:48:5
--> $DIR/cast.rs:86:5
|
LL | 1usize as i32; // wraps on 32 bit ptr size
LL | 1usize as i32;
| ^^^^^^^^^^^^^
error: casting `usize` to `i64` may wrap around the value on targets with 64-bit wide pointers
--> $DIR/cast.rs:49:5
--> $DIR/cast.rs:90:5
|
LL | 1usize as i64; // wraps on 64 bit ptr size
LL | 1usize as i64;
| ^^^^^^^^^^^^^
error: casting `u16` to `isize` may wrap around the value on targets with 16-bit wide pointers
--> $DIR/cast.rs:51:5
--> $DIR/cast.rs:95:5
|
LL | 1u16 as isize; // wraps on 16 bit ptr size
LL | 1u16 as isize;
| ^^^^^^^^^^^^^
|
= note: `usize` and `isize` may be as small as 16 bits on some platforms
= note: for more information see https://doc.rust-lang.org/reference/types/numeric.html#machine-dependent-integer-types
error: casting `u32` to `isize` may wrap around the value on targets with 32-bit wide pointers
--> $DIR/cast.rs:52:5
--> $DIR/cast.rs:99:5
|
LL | 1u32 as isize; // wraps on 32 bit ptr size
LL | 1u32 as isize;
| ^^^^^^^^^^^^^
error: casting `u64` to `isize` may truncate the value on targets with 32-bit wide pointers
--> $DIR/cast.rs:53:5
--> $DIR/cast.rs:102:5
|
LL | 1u64 as isize; // wraps on 64 bit ptr size
LL | 1u64 as isize;
| ^^^^^^^^^^^^^
|
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
help: ... or use `try_from` and handle the error accordingly
|
LL | isize::try_from(1u64); // wraps on 64 bit ptr size
LL | isize::try_from(1u64);
| ~~~~~~~~~~~~~~~~~~~~~
error: casting `u64` to `isize` may wrap around the value on targets with 64-bit wide pointers
--> $DIR/cast.rs:53:5
--> $DIR/cast.rs:102:5
|
LL | 1u64 as isize; // wraps on 64 bit ptr size
LL | 1u64 as isize;
| ^^^^^^^^^^^^^
error: casting `i32` to `u32` may lose the sign of the value
--> $DIR/cast.rs:56:5
--> $DIR/cast.rs:107:5
|
LL | -1i32 as u32;
| ^^^^^^^^^^^^
error: casting `isize` to `usize` may lose the sign of the value
--> $DIR/cast.rs:58:5
--> $DIR/cast.rs:110:5
|
LL | -1isize as usize;
| ^^^^^^^^^^^^^^^^
error: casting `i64` to `i8` may truncate the value
--> $DIR/cast.rs:125:5
--> $DIR/cast.rs:179:5
|
LL | (-99999999999i64).min(1) as i8; // should be linted because signed
LL | (-99999999999i64).min(1) as i8;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
help: ... or use `try_from` and handle the error accordingly
|
LL | i8::try_from((-99999999999i64).min(1)); // should be linted because signed
LL | i8::try_from((-99999999999i64).min(1));
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
error: casting `u64` to `u8` may truncate the value
--> $DIR/cast.rs:137:5
--> $DIR/cast.rs:193:5
|
LL | 999999u64.clamp(0, 256) as u8; // should still be linted
LL | 999999u64.clamp(0, 256) as u8;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
help: ... or use `try_from` and handle the error accordingly
|
LL | u8::try_from(999999u64.clamp(0, 256)); // should still be linted
LL | u8::try_from(999999u64.clamp(0, 256));
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
error: casting `main::E2` to `u8` may truncate the value
--> $DIR/cast.rs:158:21
--> $DIR/cast.rs:216:21
|
LL | let _ = self as u8;
| ^^^^^^^^^^
@ -354,7 +354,7 @@ LL | let _ = u8::try_from(self);
| ~~~~~~~~~~~~~~~~~~
error: casting `main::E2::B` to `u8` will truncate the value
--> $DIR/cast.rs:159:21
--> $DIR/cast.rs:218:21
|
LL | let _ = Self::B as u8;
| ^^^^^^^^^^^^^
@ -362,7 +362,7 @@ LL | let _ = Self::B as u8;
= note: `-D clippy::cast-enum-truncation` implied by `-D warnings`
error: casting `main::E5` to `i8` may truncate the value
--> $DIR/cast.rs:195:21
--> $DIR/cast.rs:260:21
|
LL | let _ = self as i8;
| ^^^^^^^^^^
@ -374,13 +374,13 @@ LL | let _ = i8::try_from(self);
| ~~~~~~~~~~~~~~~~~~
error: casting `main::E5::A` to `i8` will truncate the value
--> $DIR/cast.rs:196:21
--> $DIR/cast.rs:262:21
|
LL | let _ = Self::A as i8;
| ^^^^^^^^^^^^^
error: casting `main::E6` to `i16` may truncate the value
--> $DIR/cast.rs:210:21
--> $DIR/cast.rs:279:21
|
LL | let _ = self as i16;
| ^^^^^^^^^^^
@ -392,7 +392,7 @@ LL | let _ = i16::try_from(self);
| ~~~~~~~~~~~~~~~~~~~
error: casting `main::E7` to `usize` may truncate the value on targets with 32-bit wide pointers
--> $DIR/cast.rs:225:21
--> $DIR/cast.rs:298:21
|
LL | let _ = self as usize;
| ^^^^^^^^^^^^^
@ -404,7 +404,7 @@ LL | let _ = usize::try_from(self);
| ~~~~~~~~~~~~~~~~~~~~~
error: casting `main::E10` to `u16` may truncate the value
--> $DIR/cast.rs:266:21
--> $DIR/cast.rs:345:21
|
LL | let _ = self as u16;
| ^^^^^^^^^^^
@ -416,7 +416,7 @@ LL | let _ = u16::try_from(self);
| ~~~~~~~~~~~~~~~~~~~
error: casting `u32` to `u8` may truncate the value
--> $DIR/cast.rs:274:13
--> $DIR/cast.rs:356:13
|
LL | let c = (q >> 16) as u8;
| ^^^^^^^^^^^^^^^
@ -428,7 +428,7 @@ LL | let c = u8::try_from(q >> 16);
| ~~~~~~~~~~~~~~~~~~~~~
error: casting `u32` to `u8` may truncate the value
--> $DIR/cast.rs:277:13
--> $DIR/cast.rs:360:13
|
LL | let c = (q / 1000) as u8;
| ^^^^^^^^^^^^^^^^

View file

@ -17,11 +17,16 @@ fn main() {
// cast to more-strictly-aligned type
(&1u8 as *const u8) as *const u16;
//~^ ERROR: casting from `*const u8` to a more-strictly-aligned pointer (`*const u16`)
//~| NOTE: `-D clippy::cast-ptr-alignment` implied by `-D warnings`
(&mut 1u8 as *mut u8) as *mut u16;
//~^ ERROR: casting from `*mut u8` to a more-strictly-aligned pointer (`*mut u16`) (1
// cast to more-strictly-aligned type, but with the `pointer::cast` function.
(&1u8 as *const u8).cast::<u16>();
//~^ ERROR: casting from `*const u8` to a more-strictly-aligned pointer (`*const u16`)
(&mut 1u8 as *mut u8).cast::<u16>();
//~^ ERROR: casting from `*mut u8` to a more-strictly-aligned pointer (`*mut u16`) (1
/* These should be ok */

View file

@ -7,19 +7,19 @@ LL | (&1u8 as *const u8) as *const u16;
= note: `-D clippy::cast-ptr-alignment` implied by `-D warnings`
error: casting from `*mut u8` to a more-strictly-aligned pointer (`*mut u16`) (1 < 2 bytes)
--> $DIR/cast_alignment.rs:20:5
--> $DIR/cast_alignment.rs:22:5
|
LL | (&mut 1u8 as *mut u8) as *mut u16;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: casting from `*const u8` to a more-strictly-aligned pointer (`*const u16`) (1 < 2 bytes)
--> $DIR/cast_alignment.rs:23:5
--> $DIR/cast_alignment.rs:26:5
|
LL | (&1u8 as *const u8).cast::<u16>();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: casting from `*mut u8` to a more-strictly-aligned pointer (`*mut u16`) (1 < 2 bytes)
--> $DIR/cast_alignment.rs:24:5
--> $DIR/cast_alignment.rs:28:5
|
LL | (&mut 1u8 as *mut u8).cast::<u16>();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

View file

@ -11,7 +11,10 @@ fn main() {
}
let _ = Foo::Y as usize;
//~^ ERROR: cast of an enum tuple constructor to an integer
//~| NOTE: `-D clippy::cast-enum-constructor` implied by `-D warnings`
let _ = Foo::Y as isize;
//~^ ERROR: cast of an enum tuple constructor to an integer
let _ = Foo::Y as fn(u32) -> Foo;
let _ = Bar::X as usize;
}

View file

@ -7,7 +7,7 @@ LL | let _ = Foo::Y as usize;
= note: `-D clippy::cast-enum-constructor` implied by `-D warnings`
error: cast of an enum tuple constructor to an integer
--> $DIR/cast_enum_constructor.rs:14:13
--> $DIR/cast_enum_constructor.rs:16:13
|
LL | let _ = Foo::Y as isize;
| ^^^^^^^^^^^^^^^

View file

@ -3,12 +3,24 @@
fn main() {
let _ = (0.0_f32 / -0.0) as usize;
//~^ ERROR: casting a known NaN to usize
//~| NOTE: this always evaluates to 0
let _ = (f64::INFINITY * -0.0) as usize;
//~^ ERROR: casting a known NaN to usize
//~| NOTE: this always evaluates to 0
let _ = (0.0 * f32::INFINITY) as usize;
//~^ ERROR: casting a known NaN to usize
//~| NOTE: this always evaluates to 0
let _ = (f64::INFINITY + f64::NEG_INFINITY) as usize;
//~^ ERROR: casting a known NaN to usize
//~| NOTE: this always evaluates to 0
let _ = (f32::INFINITY - f32::INFINITY) as usize;
//~^ ERROR: casting a known NaN to usize
//~| NOTE: this always evaluates to 0
let _ = (f32::INFINITY / f32::NEG_INFINITY) as usize;
//~^ ERROR: casting a known NaN to usize
//~| NOTE: this always evaluates to 0
// those won't be linted:
let _ = (1.0_f32 / 0.0) as usize;

View file

@ -8,7 +8,7 @@ LL | let _ = (0.0_f32 / -0.0) as usize;
= note: `-D clippy::cast-nan-to-int` implied by `-D warnings`
error: casting a known NaN to usize
--> $DIR/cast_nan_to_int.rs:6:13
--> $DIR/cast_nan_to_int.rs:8:13
|
LL | let _ = (f64::INFINITY * -0.0) as usize;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -16,7 +16,7 @@ LL | let _ = (f64::INFINITY * -0.0) as usize;
= note: this always evaluates to 0
error: casting a known NaN to usize
--> $DIR/cast_nan_to_int.rs:7:13
--> $DIR/cast_nan_to_int.rs:11:13
|
LL | let _ = (0.0 * f32::INFINITY) as usize;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -24,7 +24,7 @@ LL | let _ = (0.0 * f32::INFINITY) as usize;
= note: this always evaluates to 0
error: casting a known NaN to usize
--> $DIR/cast_nan_to_int.rs:9:13
--> $DIR/cast_nan_to_int.rs:15:13
|
LL | let _ = (f64::INFINITY + f64::NEG_INFINITY) as usize;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -32,7 +32,7 @@ LL | let _ = (f64::INFINITY + f64::NEG_INFINITY) as usize;
= note: this always evaluates to 0
error: casting a known NaN to usize
--> $DIR/cast_nan_to_int.rs:10:13
--> $DIR/cast_nan_to_int.rs:18:13
|
LL | let _ = (f32::INFINITY - f32::INFINITY) as usize;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -40,7 +40,7 @@ LL | let _ = (f32::INFINITY - f32::INFINITY) as usize;
= note: this always evaluates to 0
error: casting a known NaN to usize
--> $DIR/cast_nan_to_int.rs:11:13
--> $DIR/cast_nan_to_int.rs:21:13
|
LL | let _ = (f32::INFINITY / f32::NEG_INFINITY) as usize;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

View file

@ -10,27 +10,47 @@
fn main() {
// Casting from *size
1isize as i8;
//~^ ERROR: casting `isize` to `i8` may truncate the value
let x0 = 1isize;
let x1 = 1usize;
x0 as f64;
//~^ ERROR: casting `isize` to `f64` causes a loss of precision on targets with 64-bit
//~| NOTE: `-D clippy::cast-precision-loss` implied by `-D warnings`
x1 as f64;
//~^ ERROR: casting `usize` to `f64` causes a loss of precision on targets with 64-bit
x0 as f32;
//~^ ERROR: casting `isize` to `f32` causes a loss of precision (`isize` is 32 or 64 b
x1 as f32;
//~^ ERROR: casting `usize` to `f32` causes a loss of precision (`usize` is 32 or 64 b
1isize as i32;
//~^ ERROR: casting `isize` to `i32` may truncate the value on targets with 64-bit wid
1isize as u32;
//~^ ERROR: casting `isize` to `u32` may truncate the value on targets with 64-bit wid
1usize as u32;
//~^ ERROR: casting `usize` to `u32` may truncate the value on targets with 64-bit wid
1usize as i32;
//~^ ERROR: casting `usize` to `i32` may truncate the value on targets with 64-bit wid
//~| ERROR: casting `usize` to `i32` may wrap around the value on targets with 32-bit
//~| NOTE: `-D clippy::cast-possible-wrap` implied by `-D warnings`
// Casting to *size
1i64 as isize;
//~^ ERROR: casting `i64` to `isize` may truncate the value on targets with 32-bit wid
1i64 as usize;
//~^ ERROR: casting `i64` to `usize` may truncate the value on targets with 32-bit wid
1u64 as isize;
//~^ ERROR: casting `u64` to `isize` may truncate the value on targets with 32-bit wid
//~| ERROR: casting `u64` to `isize` may wrap around the value on targets with 64-bit
1u64 as usize;
//~^ ERROR: casting `u64` to `usize` may truncate the value on targets with 32-bit wid
1u32 as isize;
//~^ ERROR: casting `u32` to `isize` may wrap around the value on targets with 32-bit
1u32 as usize; // Should not trigger any lint
1i32 as isize; // Neither should this
1i32 as usize;
// Big integer literal to float
999_999_999 as f32;
//~^ ERROR: casting `i32` to `f32` causes a loss of precision (`i32` is 32 bits wide,
9_999_999_999_999_999usize as f64;
//~^ ERROR: casting `usize` to `f64` causes a loss of precision on targets with 64-bit
}
//@no-rustfix

View file

@ -12,7 +12,7 @@ LL | i8::try_from(1isize);
| ~~~~~~~~~~~~~~~~~~~~
error: casting `isize` to `f64` causes a loss of precision on targets with 64-bit wide pointers (`isize` is 64 bits wide, but `f64`'s mantissa is only 52 bits wide)
--> $DIR/cast_size.rs:15:5
--> $DIR/cast_size.rs:16:5
|
LL | x0 as f64;
| ^^^^^^^^^
@ -20,25 +20,25 @@ LL | x0 as f64;
= note: `-D clippy::cast-precision-loss` implied by `-D warnings`
error: casting `usize` to `f64` causes a loss of precision on targets with 64-bit wide pointers (`usize` is 64 bits wide, but `f64`'s mantissa is only 52 bits wide)
--> $DIR/cast_size.rs:16:5
--> $DIR/cast_size.rs:19:5
|
LL | x1 as f64;
| ^^^^^^^^^
error: casting `isize` to `f32` causes a loss of precision (`isize` is 32 or 64 bits wide, but `f32`'s mantissa is only 23 bits wide)
--> $DIR/cast_size.rs:17:5
--> $DIR/cast_size.rs:21:5
|
LL | x0 as f32;
| ^^^^^^^^^
error: casting `usize` to `f32` causes a loss of precision (`usize` is 32 or 64 bits wide, but `f32`'s mantissa is only 23 bits wide)
--> $DIR/cast_size.rs:18:5
--> $DIR/cast_size.rs:23:5
|
LL | x1 as f32;
| ^^^^^^^^^
error: casting `isize` to `i32` may truncate the value on targets with 64-bit wide pointers
--> $DIR/cast_size.rs:19:5
--> $DIR/cast_size.rs:25:5
|
LL | 1isize as i32;
| ^^^^^^^^^^^^^
@ -50,7 +50,7 @@ LL | i32::try_from(1isize);
| ~~~~~~~~~~~~~~~~~~~~~
error: casting `isize` to `u32` may truncate the value on targets with 64-bit wide pointers
--> $DIR/cast_size.rs:20:5
--> $DIR/cast_size.rs:27:5
|
LL | 1isize as u32;
| ^^^^^^^^^^^^^
@ -62,7 +62,7 @@ LL | u32::try_from(1isize);
| ~~~~~~~~~~~~~~~~~~~~~
error: casting `usize` to `u32` may truncate the value on targets with 64-bit wide pointers
--> $DIR/cast_size.rs:21:5
--> $DIR/cast_size.rs:29:5
|
LL | 1usize as u32;
| ^^^^^^^^^^^^^
@ -74,7 +74,7 @@ LL | u32::try_from(1usize);
| ~~~~~~~~~~~~~~~~~~~~~
error: casting `usize` to `i32` may truncate the value on targets with 64-bit wide pointers
--> $DIR/cast_size.rs:22:5
--> $DIR/cast_size.rs:31:5
|
LL | 1usize as i32;
| ^^^^^^^^^^^^^
@ -86,7 +86,7 @@ LL | i32::try_from(1usize);
| ~~~~~~~~~~~~~~~~~~~~~
error: casting `usize` to `i32` may wrap around the value on targets with 32-bit wide pointers
--> $DIR/cast_size.rs:22:5
--> $DIR/cast_size.rs:31:5
|
LL | 1usize as i32;
| ^^^^^^^^^^^^^
@ -94,7 +94,7 @@ LL | 1usize as i32;
= note: `-D clippy::cast-possible-wrap` implied by `-D warnings`
error: casting `i64` to `isize` may truncate the value on targets with 32-bit wide pointers
--> $DIR/cast_size.rs:24:5
--> $DIR/cast_size.rs:36:5
|
LL | 1i64 as isize;
| ^^^^^^^^^^^^^
@ -106,7 +106,7 @@ LL | isize::try_from(1i64);
| ~~~~~~~~~~~~~~~~~~~~~
error: casting `i64` to `usize` may truncate the value on targets with 32-bit wide pointers
--> $DIR/cast_size.rs:25:5
--> $DIR/cast_size.rs:38:5
|
LL | 1i64 as usize;
| ^^^^^^^^^^^^^
@ -118,7 +118,7 @@ LL | usize::try_from(1i64);
| ~~~~~~~~~~~~~~~~~~~~~
error: casting `u64` to `isize` may truncate the value on targets with 32-bit wide pointers
--> $DIR/cast_size.rs:26:5
--> $DIR/cast_size.rs:40:5
|
LL | 1u64 as isize;
| ^^^^^^^^^^^^^
@ -130,13 +130,13 @@ LL | isize::try_from(1u64);
| ~~~~~~~~~~~~~~~~~~~~~
error: casting `u64` to `isize` may wrap around the value on targets with 64-bit wide pointers
--> $DIR/cast_size.rs:26:5
--> $DIR/cast_size.rs:40:5
|
LL | 1u64 as isize;
| ^^^^^^^^^^^^^
error: casting `u64` to `usize` may truncate the value on targets with 32-bit wide pointers
--> $DIR/cast_size.rs:27:5
--> $DIR/cast_size.rs:43:5
|
LL | 1u64 as usize;
| ^^^^^^^^^^^^^
@ -148,19 +148,19 @@ LL | usize::try_from(1u64);
| ~~~~~~~~~~~~~~~~~~~~~
error: casting `u32` to `isize` may wrap around the value on targets with 32-bit wide pointers
--> $DIR/cast_size.rs:28:5
--> $DIR/cast_size.rs:45:5
|
LL | 1u32 as isize;
| ^^^^^^^^^^^^^
error: casting `i32` to `f32` causes a loss of precision (`i32` is 32 bits wide, but `f32`'s mantissa is only 23 bits wide)
--> $DIR/cast_size.rs:33:5
--> $DIR/cast_size.rs:51:5
|
LL | 999_999_999 as f32;
| ^^^^^^^^^^^^^^^^^^
error: casting `usize` to `f64` causes a loss of precision on targets with 64-bit wide pointers (`usize` is 64 bits wide, but `f64`'s mantissa is only 52 bits wide)
--> $DIR/cast_size.rs:34:5
--> $DIR/cast_size.rs:53:5
|
LL | 9_999_999_999_999_999usize as f64;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

View file

@ -10,26 +10,47 @@
fn main() {
// Casting from *size
1isize as i8;
//~^ ERROR: casting `isize` to `i8` may truncate the value
let x0 = 1isize;
let x1 = 1usize;
x0 as f64;
//~^ ERROR: casting `isize` to `f64` causes a loss of precision on targets with 64-bit
//~| NOTE: `-D clippy::cast-precision-loss` implied by `-D warnings`
x1 as f64;
//~^ ERROR: casting `usize` to `f64` causes a loss of precision on targets with 64-bit
x0 as f32;
//~^ ERROR: casting `isize` to `f32` causes a loss of precision (`isize` is 32 or 64 b
x1 as f32;
//~^ ERROR: casting `usize` to `f32` causes a loss of precision (`usize` is 32 or 64 b
1isize as i32;
//~^ ERROR: casting `isize` to `i32` may truncate the value on targets with 64-bit wid
1isize as u32;
//~^ ERROR: casting `isize` to `u32` may truncate the value on targets with 64-bit wid
1usize as u32;
//~^ ERROR: casting `usize` to `u32` may truncate the value on targets with 64-bit wid
1usize as i32;
//~^ ERROR: casting `usize` to `i32` may truncate the value on targets with 64-bit wid
//~| ERROR: casting `usize` to `i32` may wrap around the value on targets with 32-bit
//~| NOTE: `-D clippy::cast-possible-wrap` implied by `-D warnings`
// Casting to *size
1i64 as isize;
//~^ ERROR: casting `i64` to `isize` may truncate the value on targets with 32-bit wid
1i64 as usize;
//~^ ERROR: casting `i64` to `usize` may truncate the value on targets with 32-bit wid
1u64 as isize;
//~^ ERROR: casting `u64` to `isize` may truncate the value on targets with 32-bit wid
//~| ERROR: casting `u64` to `isize` may wrap around the value on targets with 64-bit
1u64 as usize;
//~^ ERROR: casting `u64` to `usize` may truncate the value on targets with 32-bit wid
1u32 as isize;
//~^ ERROR: casting `u32` to `isize` may wrap around the value on targets with 32-bit
1u32 as usize; // Should not trigger any lint
1i32 as isize; // Neither should this
1i32 as usize;
// Big integer literal to float
999_999_999 as f32;
//~^ ERROR: casting `i32` to `f32` causes a loss of precision (`i32` is 32 bits wide,
3_999_999_999usize as f64;
//~^ ERROR: casting integer literal to `f64` is unnecessary
//~| NOTE: `-D clippy::unnecessary-cast` implied by `-D warnings`
}

View file

@ -8,10 +8,14 @@ fn main() {
// Because it's separate, it does not check the cast back to something of the same size
let a = r_x as *const [i32];
let b = a as *const [u8];
//~^ ERROR: casting between raw pointers to `[i32]` (element size 4) and `[u8]` (eleme
//~| NOTE: `#[deny(clippy::cast_slice_different_sizes)]` on by default
let c = b as *const [u32];
//~^ ERROR: casting between raw pointers to `[u8]` (element size 1) and `[u32]` (eleme
// loses data
let loss = r_x as *const [i32] as *const [u8];
//~^ ERROR: casting between raw pointers to `[i32]` (element size 4) and `[u8]` (eleme
// Cast back to same size but different type loses no data, just type conversion
// This is weird code but there's no reason for this lint specifically to fire *twice* on it
@ -19,7 +23,9 @@ fn main() {
// Check casting through blocks is detected
let loss_block_1 = { r_x as *const [i32] } as *const [u8];
//~^ ERROR: casting between raw pointers to `[i32]` (element size 4) and `[u8]` (eleme
let loss_block_2 = {
//~^ ERROR: casting between raw pointers to `[i32]` (element size 4) and `[u8]` (eleme
let _ = ();
r_x as *const [i32]
} as *const [u8];
@ -37,6 +43,7 @@ fn main() {
// Check that the result of a long chain of casts is detected
let long_chain_loss = r_x as *const [i32] as *const [u32] as *const [u16] as *const [i8] as *const [u8];
//~^ ERROR: casting between raw pointers to `[i32]` (element size 4) and `[u8]` (eleme
let long_chain_restore =
r_x as *const [i32] as *const [u32] as *const [u16] as *const [i8] as *const [u8] as *const [u32];
}
@ -52,32 +59,40 @@ fn foo2(x: *mut [u8]) -> *mut [u8] {
// Test that casts as part of function returns work
fn bar(x: *mut [u16]) -> *mut [u8] {
//~^ ERROR: casting between raw pointers to `[u16]` (element size 2) and `[u8]` (element s
x as *mut [u8]
}
fn uwu(x: *mut [u16]) -> *mut [u8] {
//~^ ERROR: casting between raw pointers to `[u16]` (element size 2) and `[u8]` (element s
x as *mut _
}
fn bar2(x: *mut [u16]) -> *mut [u8] {
//~^ ERROR: casting between raw pointers to `[u16]` (element size 2) and `[u8]` (element s
x as _
}
// constify
fn bar3(x: *mut [u16]) -> *const [u8] {
//~^ ERROR: casting between raw pointers to `[u16]` (element size 2) and `[u8]` (element s
x as _
}
// unconstify
fn bar4(x: *const [u16]) -> *mut [u8] {
//~^ ERROR: casting between raw pointers to `[u16]` (element size 2) and `[u8]` (element s
x as _
}
// function returns plus blocks
fn blocks(x: *mut [u16]) -> *mut [u8] {
//~^ ERROR: casting between raw pointers to `[u16]` (element size 2) and `[u8]` (element s
({ x }) as _
}
fn more_blocks(x: *mut [u16]) -> *mut [u8] {
//~^ ERROR: casting between raw pointers to `[u16]` (element size 2) and `[u8]` (element s
{ ({ x }) as _ }
//~^ ERROR: casting between raw pointers to `[u16]` (element size 2) and `[u8]` (eleme
}

View file

@ -7,28 +7,29 @@ LL | let b = a as *const [u8];
= note: `#[deny(clippy::cast_slice_different_sizes)]` on by default
error: casting between raw pointers to `[u8]` (element size 1) and `[u32]` (element size 4) does not adjust the count
--> $DIR/cast_slice_different_sizes.rs:11:13
--> $DIR/cast_slice_different_sizes.rs:13:13
|
LL | let c = b as *const [u32];
| ^^^^^^^^^^^^^^^^^ help: replace with `ptr::slice_from_raw_parts`: `core::ptr::slice_from_raw_parts(b as *const u32, ..)`
error: casting between raw pointers to `[i32]` (element size 4) and `[u8]` (element size 1) does not adjust the count
--> $DIR/cast_slice_different_sizes.rs:14:16
--> $DIR/cast_slice_different_sizes.rs:17:16
|
LL | let loss = r_x as *const [i32] as *const [u8];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with `ptr::slice_from_raw_parts`: `core::ptr::slice_from_raw_parts(r_x as *const [i32] as *const u8, ..)`
error: casting between raw pointers to `[i32]` (element size 4) and `[u8]` (element size 1) does not adjust the count
--> $DIR/cast_slice_different_sizes.rs:21:24
--> $DIR/cast_slice_different_sizes.rs:25:24
|
LL | let loss_block_1 = { r_x as *const [i32] } as *const [u8];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with `ptr::slice_from_raw_parts`: `core::ptr::slice_from_raw_parts({ r_x as *const [i32] } as *const u8, ..)`
error: casting between raw pointers to `[i32]` (element size 4) and `[u8]` (element size 1) does not adjust the count
--> $DIR/cast_slice_different_sizes.rs:22:24
--> $DIR/cast_slice_different_sizes.rs:27:24
|
LL | let loss_block_2 = {
| ________________________^
LL | |
LL | | let _ = ();
LL | | r_x as *const [i32]
LL | | } as *const [u8];
@ -37,58 +38,44 @@ LL | | } as *const [u8];
help: replace with `ptr::slice_from_raw_parts`
|
LL ~ let loss_block_2 = core::ptr::slice_from_raw_parts({
LL +
LL + let _ = ();
LL + r_x as *const [i32]
LL ~ } as *const u8, ..);
|
error: casting between raw pointers to `[i32]` (element size 4) and `[u8]` (element size 1) does not adjust the count
--> $DIR/cast_slice_different_sizes.rs:39:27
--> $DIR/cast_slice_different_sizes.rs:45:27
|
LL | let long_chain_loss = r_x as *const [i32] as *const [u32] as *const [u16] as *const [i8] as *const [u8];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with `ptr::slice_from_raw_parts`: `core::ptr::slice_from_raw_parts(r_x as *const [i32] as *const u8, ..)`
error: casting between raw pointers to `[u16]` (element size 2) and `[u8]` (element size 1) does not adjust the count
--> $DIR/cast_slice_different_sizes.rs:54:36
--> $DIR/cast_slice_different_sizes.rs:61:36
|
LL | fn bar(x: *mut [u16]) -> *mut [u8] {
| ____________________________________^
LL | |
LL | | x as *mut [u8]
LL | | }
| |_^ help: replace with `ptr::slice_from_raw_parts_mut`: `core::ptr::slice_from_raw_parts_mut(x as *mut u8, ..)`
error: casting between raw pointers to `[u16]` (element size 2) and `[u8]` (element size 1) does not adjust the count
--> $DIR/cast_slice_different_sizes.rs:58:36
--> $DIR/cast_slice_different_sizes.rs:66:36
|
LL | fn uwu(x: *mut [u16]) -> *mut [u8] {
| ____________________________________^
LL | |
LL | | x as *mut _
LL | | }
| |_^ help: replace with `ptr::slice_from_raw_parts_mut`: `core::ptr::slice_from_raw_parts_mut(x as *mut u8, ..)`
error: casting between raw pointers to `[u16]` (element size 2) and `[u8]` (element size 1) does not adjust the count
--> $DIR/cast_slice_different_sizes.rs:62:37
--> $DIR/cast_slice_different_sizes.rs:71:37
|
LL | fn bar2(x: *mut [u16]) -> *mut [u8] {
| _____________________________________^
LL | | x as _
LL | | }
| |_^ help: replace with `ptr::slice_from_raw_parts_mut`: `core::ptr::slice_from_raw_parts_mut(x as *mut u8, ..)`
error: casting between raw pointers to `[u16]` (element size 2) and `[u8]` (element size 1) does not adjust the count
--> $DIR/cast_slice_different_sizes.rs:67:39
|
LL | fn bar3(x: *mut [u16]) -> *const [u8] {
| _______________________________________^
LL | | x as _
LL | | }
| |_^ help: replace with `ptr::slice_from_raw_parts`: `core::ptr::slice_from_raw_parts(x as *const u8, ..)`
error: casting between raw pointers to `[u16]` (element size 2) and `[u8]` (element size 1) does not adjust the count
--> $DIR/cast_slice_different_sizes.rs:72:39
|
LL | fn bar4(x: *const [u16]) -> *mut [u8] {
| _______________________________________^
LL | |
LL | | x as _
LL | | }
| |_^ help: replace with `ptr::slice_from_raw_parts_mut`: `core::ptr::slice_from_raw_parts_mut(x as *mut u8, ..)`
@ -96,23 +83,46 @@ LL | | }
error: casting between raw pointers to `[u16]` (element size 2) and `[u8]` (element size 1) does not adjust the count
--> $DIR/cast_slice_different_sizes.rs:77:39
|
LL | fn bar3(x: *mut [u16]) -> *const [u8] {
| _______________________________________^
LL | |
LL | | x as _
LL | | }
| |_^ help: replace with `ptr::slice_from_raw_parts`: `core::ptr::slice_from_raw_parts(x as *const u8, ..)`
error: casting between raw pointers to `[u16]` (element size 2) and `[u8]` (element size 1) does not adjust the count
--> $DIR/cast_slice_different_sizes.rs:83:39
|
LL | fn bar4(x: *const [u16]) -> *mut [u8] {
| _______________________________________^
LL | |
LL | | x as _
LL | | }
| |_^ help: replace with `ptr::slice_from_raw_parts_mut`: `core::ptr::slice_from_raw_parts_mut(x as *mut u8, ..)`
error: casting between raw pointers to `[u16]` (element size 2) and `[u8]` (element size 1) does not adjust the count
--> $DIR/cast_slice_different_sizes.rs:89:39
|
LL | fn blocks(x: *mut [u16]) -> *mut [u8] {
| _______________________________________^
LL | |
LL | | ({ x }) as _
LL | | }
| |_^ help: replace with `ptr::slice_from_raw_parts_mut`: `core::ptr::slice_from_raw_parts_mut(({ x }) as *mut u8, ..)`
error: casting between raw pointers to `[u16]` (element size 2) and `[u8]` (element size 1) does not adjust the count
--> $DIR/cast_slice_different_sizes.rs:81:44
--> $DIR/cast_slice_different_sizes.rs:94:44
|
LL | fn more_blocks(x: *mut [u16]) -> *mut [u8] {
| ____________________________________________^
LL | |
LL | | { ({ x }) as _ }
LL | |
LL | | }
| |_^ help: replace with `ptr::slice_from_raw_parts_mut`: `core::ptr::slice_from_raw_parts_mut(({ x }) as *mut u8, ..)`
error: casting between raw pointers to `[u16]` (element size 2) and `[u8]` (element size 1) does not adjust the count
--> $DIR/cast_slice_different_sizes.rs:82:5
--> $DIR/cast_slice_different_sizes.rs:96:5
|
LL | { ({ x }) as _ }
| ^^^^^^^^^^^^^^^^ help: replace with `ptr::slice_from_raw_parts_mut`: `core::ptr::slice_from_raw_parts_mut(({ x }) as *mut u8, ..)`

View file

@ -2,11 +2,16 @@
fn main() {
#[cfg(feature = "not-really-a-feature")]
//~^ ERROR: feature may misspelled as features
//~| NOTE: `-D clippy::maybe-misused-cfg` implied by `-D warnings`
let _ = 1 + 2;
#[cfg(all(feature = "right", feature = "wrong"))]
//~^ ERROR: feature may misspelled as features
let _ = 1 + 2;
#[cfg(all(feature = "wrong1", any(feature = "right", feature = "wrong2", feature, features)))]
//~^ ERROR: feature may misspelled as features
//~| ERROR: feature may misspelled as features
let _ = 1 + 2;
}

View file

@ -2,11 +2,16 @@
fn main() {
#[cfg(features = "not-really-a-feature")]
//~^ ERROR: feature may misspelled as features
//~| NOTE: `-D clippy::maybe-misused-cfg` implied by `-D warnings`
let _ = 1 + 2;
#[cfg(all(feature = "right", features = "wrong"))]
//~^ ERROR: feature may misspelled as features
let _ = 1 + 2;
#[cfg(all(features = "wrong1", any(feature = "right", features = "wrong2", feature, features)))]
//~^ ERROR: feature may misspelled as features
//~| ERROR: feature may misspelled as features
let _ = 1 + 2;
}

View file

@ -7,19 +7,19 @@ LL | #[cfg(features = "not-really-a-feature")]
= note: `-D clippy::maybe-misused-cfg` implied by `-D warnings`
error: feature may misspelled as features
--> $DIR/cfg_features.rs:7:34
--> $DIR/cfg_features.rs:9:34
|
LL | #[cfg(all(feature = "right", features = "wrong"))]
| ^^^^^^^^^^^^^^^^^^ help: use: `feature = "wrong"`
error: feature may misspelled as features
--> $DIR/cfg_features.rs:10:15
--> $DIR/cfg_features.rs:13:15
|
LL | #[cfg(all(features = "wrong1", any(feature = "right", features = "wrong2", feature, features)))]
| ^^^^^^^^^^^^^^^^^^^ help: use: `feature = "wrong1"`
error: feature may misspelled as features
--> $DIR/cfg_features.rs:10:59
--> $DIR/cfg_features.rs:13:59
|
LL | #[cfg(all(features = "wrong1", any(feature = "right", features = "wrong2", feature, features)))]
| ^^^^^^^^^^^^^^^^^^^ help: use: `feature = "wrong2"`

View file

@ -1,5 +1,8 @@
#![warn(clippy::char_lit_as_u8)]
fn main() {
let _ = '❤' as u8; // no suggestion, since a byte literal won't work.
// no suggestion, since a byte literal won't work.
let _ = '❤' as u8;
//~^ ERROR: casting a character literal to `u8` truncates
//~| NOTE: `char` is four bytes wide, but `u8` is a single byte
}

View file

@ -1,7 +1,7 @@
error: casting a character literal to `u8` truncates
--> $DIR/char_lit_as_u8.rs:4:13
--> $DIR/char_lit_as_u8.rs:5:13
|
LL | let _ = '❤' as u8; // no suggestion, since a byte literal won't work.
LL | let _ = '❤' as u8;
| ^^^^^^^^^
|
= note: `char` is four bytes wide, but `u8` is a single byte

View file

@ -9,10 +9,18 @@ fn test_complex_conditions() {
let x: Result<(), ()> = Ok(());
let y: Result<(), ()> = Ok(());
if x.is_ok() && y.is_err() {
x.unwrap(); // unnecessary
x.unwrap_err(); // will panic
y.unwrap(); // will panic
y.unwrap_err(); // unnecessary
// unnecessary
x.unwrap();
//~^ ERROR: called `unwrap` on `x` after checking its variant with `is_ok`
// will panic
x.unwrap_err();
//~^ ERROR: this call to `unwrap_err()` will always panic
// will panic
y.unwrap();
//~^ ERROR: this call to `unwrap()` will always panic
// unnecessary
y.unwrap_err();
//~^ ERROR: called `unwrap_err` on `y` after checking its variant with `is_err`
} else {
// not statically determinable whether any of the following will always succeed or always fail:
x.unwrap();
@ -26,19 +34,39 @@ fn test_complex_conditions() {
x.unwrap();
y.unwrap();
} else {
x.unwrap(); // will panic
x.unwrap_err(); // unnecessary
y.unwrap(); // will panic
y.unwrap_err(); // unnecessary
// will panic
x.unwrap();
//~^ ERROR: this call to `unwrap()` will always panic
// unnecessary
x.unwrap_err();
//~^ ERROR: called `unwrap_err` on `x` after checking its variant with `is_ok`
// will panic
y.unwrap();
//~^ ERROR: this call to `unwrap()` will always panic
// unnecessary
y.unwrap_err();
//~^ ERROR: called `unwrap_err` on `y` after checking its variant with `is_ok`
}
let z: Result<(), ()> = Ok(());
if x.is_ok() && !(y.is_ok() || z.is_err()) {
x.unwrap(); // unnecessary
x.unwrap_err(); // will panic
y.unwrap(); // will panic
y.unwrap_err(); // unnecessary
z.unwrap(); // unnecessary
z.unwrap_err(); // will panic
// unnecessary
x.unwrap();
//~^ ERROR: called `unwrap` on `x` after checking its variant with `is_ok`
// will panic
x.unwrap_err();
//~^ ERROR: this call to `unwrap_err()` will always panic
// will panic
y.unwrap();
//~^ ERROR: this call to `unwrap()` will always panic
// unnecessary
y.unwrap_err();
//~^ ERROR: called `unwrap_err` on `y` after checking its variant with `is_ok`
// unnecessary
z.unwrap();
//~^ ERROR: called `unwrap` on `z` after checking its variant with `is_err`
// will panic
z.unwrap_err();
//~^ ERROR: this call to `unwrap_err()` will always panic
}
if x.is_ok() || !(y.is_ok() && z.is_err()) {
// not statically determinable whether any of the following will always succeed or always fail:
@ -46,12 +74,24 @@ fn test_complex_conditions() {
y.unwrap();
z.unwrap();
} else {
x.unwrap(); // will panic
x.unwrap_err(); // unnecessary
y.unwrap(); // unnecessary
y.unwrap_err(); // will panic
z.unwrap(); // will panic
z.unwrap_err(); // unnecessary
// will panic
x.unwrap();
//~^ ERROR: this call to `unwrap()` will always panic
// unnecessary
x.unwrap_err();
//~^ ERROR: called `unwrap_err` on `x` after checking its variant with `is_ok`
// unnecessary
y.unwrap();
//~^ ERROR: called `unwrap` on `y` after checking its variant with `is_ok`
// will panic
y.unwrap_err();
//~^ ERROR: this call to `unwrap_err()` will always panic
// will panic
z.unwrap();
//~^ ERROR: this call to `unwrap()` will always panic
// unnecessary
z.unwrap_err();
//~^ ERROR: called `unwrap_err` on `z` after checking its variant with `is_err`
}
}

View file

@ -1,9 +1,10 @@
error: called `unwrap` on `x` after checking its variant with `is_ok`
--> $DIR/complex_conditionals.rs:12:9
--> $DIR/complex_conditionals.rs:13:9
|
LL | if x.is_ok() && y.is_err() {
| --------- the check is happening here
LL | x.unwrap(); // unnecessary
LL | // unnecessary
LL | x.unwrap();
| ^^^^^^^^^^
|
= help: try using `if let` or `match`
@ -14,12 +15,12 @@ LL | #![deny(clippy::panicking_unwrap, clippy::unnecessary_unwrap)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
error: this call to `unwrap_err()` will always panic
--> $DIR/complex_conditionals.rs:13:9
--> $DIR/complex_conditionals.rs:16:9
|
LL | if x.is_ok() && y.is_err() {
| --------- because of this check
LL | x.unwrap(); // unnecessary
LL | x.unwrap_err(); // will panic
...
LL | x.unwrap_err();
| ^^^^^^^^^^^^^^
|
note: the lint level is defined here
@ -29,180 +30,181 @@ LL | #![deny(clippy::panicking_unwrap, clippy::unnecessary_unwrap)]
| ^^^^^^^^^^^^^^^^^^^^^^^^
error: this call to `unwrap()` will always panic
--> $DIR/complex_conditionals.rs:14:9
--> $DIR/complex_conditionals.rs:19:9
|
LL | if x.is_ok() && y.is_err() {
| ---------- because of this check
...
LL | y.unwrap(); // will panic
LL | y.unwrap();
| ^^^^^^^^^^
error: called `unwrap_err` on `y` after checking its variant with `is_err`
--> $DIR/complex_conditionals.rs:15:9
--> $DIR/complex_conditionals.rs:22:9
|
LL | if x.is_ok() && y.is_err() {
| ---------- the check is happening here
...
LL | y.unwrap_err(); // unnecessary
LL | y.unwrap_err();
| ^^^^^^^^^^^^^^
|
= help: try using `if let` or `match`
error: this call to `unwrap()` will always panic
--> $DIR/complex_conditionals.rs:29:9
--> $DIR/complex_conditionals.rs:38:9
|
LL | if x.is_ok() || y.is_ok() {
| --------- because of this check
...
LL | x.unwrap(); // will panic
LL | x.unwrap();
| ^^^^^^^^^^
error: called `unwrap_err` on `x` after checking its variant with `is_ok`
--> $DIR/complex_conditionals.rs:30:9
--> $DIR/complex_conditionals.rs:41:9
|
LL | if x.is_ok() || y.is_ok() {
| --------- the check is happening here
...
LL | x.unwrap_err(); // unnecessary
LL | x.unwrap_err();
| ^^^^^^^^^^^^^^
|
= help: try using `if let` or `match`
error: this call to `unwrap()` will always panic
--> $DIR/complex_conditionals.rs:31:9
--> $DIR/complex_conditionals.rs:44:9
|
LL | if x.is_ok() || y.is_ok() {
| --------- because of this check
...
LL | y.unwrap(); // will panic
LL | y.unwrap();
| ^^^^^^^^^^
error: called `unwrap_err` on `y` after checking its variant with `is_ok`
--> $DIR/complex_conditionals.rs:32:9
--> $DIR/complex_conditionals.rs:47:9
|
LL | if x.is_ok() || y.is_ok() {
| --------- the check is happening here
...
LL | y.unwrap_err(); // unnecessary
LL | y.unwrap_err();
| ^^^^^^^^^^^^^^
|
= help: try using `if let` or `match`
error: called `unwrap` on `x` after checking its variant with `is_ok`
--> $DIR/complex_conditionals.rs:36:9
--> $DIR/complex_conditionals.rs:53:9
|
LL | if x.is_ok() && !(y.is_ok() || z.is_err()) {
| --------- the check is happening here
LL | x.unwrap(); // unnecessary
LL | // unnecessary
LL | x.unwrap();
| ^^^^^^^^^^
|
= help: try using `if let` or `match`
error: this call to `unwrap_err()` will always panic
--> $DIR/complex_conditionals.rs:37:9
--> $DIR/complex_conditionals.rs:56:9
|
LL | if x.is_ok() && !(y.is_ok() || z.is_err()) {
| --------- because of this check
LL | x.unwrap(); // unnecessary
LL | x.unwrap_err(); // will panic
...
LL | x.unwrap_err();
| ^^^^^^^^^^^^^^
error: this call to `unwrap()` will always panic
--> $DIR/complex_conditionals.rs:38:9
--> $DIR/complex_conditionals.rs:59:9
|
LL | if x.is_ok() && !(y.is_ok() || z.is_err()) {
| --------- because of this check
...
LL | y.unwrap(); // will panic
LL | y.unwrap();
| ^^^^^^^^^^
error: called `unwrap_err` on `y` after checking its variant with `is_ok`
--> $DIR/complex_conditionals.rs:39:9
--> $DIR/complex_conditionals.rs:62:9
|
LL | if x.is_ok() && !(y.is_ok() || z.is_err()) {
| --------- the check is happening here
...
LL | y.unwrap_err(); // unnecessary
LL | y.unwrap_err();
| ^^^^^^^^^^^^^^
|
= help: try using `if let` or `match`
error: called `unwrap` on `z` after checking its variant with `is_err`
--> $DIR/complex_conditionals.rs:40:9
--> $DIR/complex_conditionals.rs:65:9
|
LL | if x.is_ok() && !(y.is_ok() || z.is_err()) {
| ---------- the check is happening here
...
LL | z.unwrap(); // unnecessary
LL | z.unwrap();
| ^^^^^^^^^^
|
= help: try using `if let` or `match`
error: this call to `unwrap_err()` will always panic
--> $DIR/complex_conditionals.rs:41:9
--> $DIR/complex_conditionals.rs:68:9
|
LL | if x.is_ok() && !(y.is_ok() || z.is_err()) {
| ---------- because of this check
...
LL | z.unwrap_err(); // will panic
LL | z.unwrap_err();
| ^^^^^^^^^^^^^^
error: this call to `unwrap()` will always panic
--> $DIR/complex_conditionals.rs:49:9
--> $DIR/complex_conditionals.rs:78:9
|
LL | if x.is_ok() || !(y.is_ok() && z.is_err()) {
| --------- because of this check
...
LL | x.unwrap(); // will panic
LL | x.unwrap();
| ^^^^^^^^^^
error: called `unwrap_err` on `x` after checking its variant with `is_ok`
--> $DIR/complex_conditionals.rs:50:9
--> $DIR/complex_conditionals.rs:81:9
|
LL | if x.is_ok() || !(y.is_ok() && z.is_err()) {
| --------- the check is happening here
...
LL | x.unwrap_err(); // unnecessary
LL | x.unwrap_err();
| ^^^^^^^^^^^^^^
|
= help: try using `if let` or `match`
error: called `unwrap` on `y` after checking its variant with `is_ok`
--> $DIR/complex_conditionals.rs:51:9
--> $DIR/complex_conditionals.rs:84:9
|
LL | if x.is_ok() || !(y.is_ok() && z.is_err()) {
| --------- the check is happening here
...
LL | y.unwrap(); // unnecessary
LL | y.unwrap();
| ^^^^^^^^^^
|
= help: try using `if let` or `match`
error: this call to `unwrap_err()` will always panic
--> $DIR/complex_conditionals.rs:52:9
--> $DIR/complex_conditionals.rs:87:9
|
LL | if x.is_ok() || !(y.is_ok() && z.is_err()) {
| --------- because of this check
...
LL | y.unwrap_err(); // will panic
LL | y.unwrap_err();
| ^^^^^^^^^^^^^^
error: this call to `unwrap()` will always panic
--> $DIR/complex_conditionals.rs:53:9
--> $DIR/complex_conditionals.rs:90:9
|
LL | if x.is_ok() || !(y.is_ok() && z.is_err()) {
| ---------- because of this check
...
LL | z.unwrap(); // will panic
LL | z.unwrap();
| ^^^^^^^^^^
error: called `unwrap_err` on `z` after checking its variant with `is_err`
--> $DIR/complex_conditionals.rs:54:9
--> $DIR/complex_conditionals.rs:93:9
|
LL | if x.is_ok() || !(y.is_ok() && z.is_err()) {
| ---------- the check is happening here
...
LL | z.unwrap_err(); // unnecessary
LL | z.unwrap_err();
| ^^^^^^^^^^^^^^
|
= help: try using `if let` or `match`

View file

@ -9,9 +9,13 @@ fn test_nested() {
fn nested() {
let x = Some(());
if x.is_some() {
x.unwrap(); // unnecessary
// unnecessary
x.unwrap();
//~^ ERROR: called `unwrap` on `x` after checking its variant with `is_some`
} else {
x.unwrap(); // will panic
// will panic
x.unwrap();
//~^ ERROR: this call to `unwrap()` will always panic
}
}
}

View file

@ -1,9 +1,10 @@
error: called `unwrap` on `x` after checking its variant with `is_some`
--> $DIR/complex_conditionals_nested.rs:12:13
--> $DIR/complex_conditionals_nested.rs:13:13
|
LL | if x.is_some() {
| -------------- help: try: `if let Some(..) = x`
LL | x.unwrap(); // unnecessary
LL | // unnecessary
LL | x.unwrap();
| ^^^^^^^^^^
|
note: the lint level is defined here
@ -13,12 +14,12 @@ LL | #![deny(clippy::panicking_unwrap, clippy::unnecessary_unwrap)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
error: this call to `unwrap()` will always panic
--> $DIR/complex_conditionals_nested.rs:14:13
--> $DIR/complex_conditionals_nested.rs:17:13
|
LL | if x.is_some() {
| ----------- because of this check
...
LL | x.unwrap(); // will panic
LL | x.unwrap();
| ^^^^^^^^^^
|
note: the lint level is defined here

View file

@ -10,7 +10,8 @@
macro_rules! m {
($a:expr) => {
if $a.is_some() {
$a.unwrap(); // unnecessary
// unnecessary
$a.unwrap();
}
};
}
@ -42,37 +43,72 @@ macro_rules! checks_some {
fn main() {
let x = Some(());
if x.is_some() {
x.unwrap(); // unnecessary
x.expect("an error message"); // unnecessary
// unnecessary
x.unwrap();
//~^ ERROR: called `unwrap` on `x` after checking its variant with `is_some`
// unnecessary
x.expect("an error message");
//~^ ERROR: called `expect` on `x` after checking its variant with `is_some`
} else {
x.unwrap(); // will panic
x.expect("an error message"); // will panic
// will panic
x.unwrap();
//~^ ERROR: this call to `unwrap()` will always panic
// will panic
x.expect("an error message");
//~^ ERROR: this call to `expect()` will always panic
}
if x.is_none() {
x.unwrap(); // will panic
// will panic
x.unwrap();
//~^ ERROR: this call to `unwrap()` will always panic
} else {
x.unwrap(); // unnecessary
// unnecessary
x.unwrap();
//~^ ERROR: called `unwrap` on `x` after checking its variant with `is_none`
}
m!(x);
checks_in_param!(x.is_some(), x.unwrap()); // ok
checks_unwrap!(x, x.unwrap()); // ok
checks_some!(x.is_some(), x); // ok
// ok
checks_in_param!(x.is_some(), x.unwrap());
// ok
checks_unwrap!(x, x.unwrap());
// ok
checks_some!(x.is_some(), x);
let mut x: Result<(), ()> = Ok(());
if x.is_ok() {
x.unwrap(); // unnecessary
x.expect("an error message"); // unnecessary
x.unwrap_err(); // will panic
// unnecessary
x.unwrap();
//~^ ERROR: called `unwrap` on `x` after checking its variant with `is_ok`
// unnecessary
x.expect("an error message");
//~^ ERROR: called `expect` on `x` after checking its variant with `is_ok`
// will panic
x.unwrap_err();
//~^ ERROR: this call to `unwrap_err()` will always panic
} else {
x.unwrap(); // will panic
x.expect("an error message"); // will panic
x.unwrap_err(); // unnecessary
// will panic
x.unwrap();
//~^ ERROR: this call to `unwrap()` will always panic
// will panic
x.expect("an error message");
//~^ ERROR: this call to `expect()` will always panic
// unnecessary
x.unwrap_err();
//~^ ERROR: called `unwrap_err` on `x` after checking its variant with `is_ok`
}
if x.is_err() {
x.unwrap(); // will panic
x.unwrap_err(); // unnecessary
// will panic
x.unwrap();
//~^ ERROR: this call to `unwrap()` will always panic
// unnecessary
x.unwrap_err();
//~^ ERROR: called `unwrap_err` on `x` after checking its variant with `is_err`
} else {
x.unwrap(); // unnecessary
x.unwrap_err(); // will panic
// unnecessary
x.unwrap();
//~^ ERROR: called `unwrap` on `x` after checking its variant with `is_err`
// will panic
x.unwrap_err();
//~^ ERROR: this call to `unwrap_err()` will always panic
}
if x.is_ok() {
x = Err(());
@ -88,20 +124,25 @@ fn main() {
x.unwrap_err();
}
assert!(x.is_ok(), "{:?}", x.unwrap_err()); // ok, it's a common test pattern
// ok, it's a common test pattern
assert!(x.is_ok(), "{:?}", x.unwrap_err());
}
fn check_expect() {
let x = Some(());
if x.is_some() {
#[expect(clippy::unnecessary_unwrap)]
x.unwrap(); // unnecessary
// unnecessary
x.unwrap();
#[expect(clippy::unnecessary_unwrap)]
x.expect("an error message"); // unnecessary
// unnecessary
x.expect("an error message");
} else {
#[expect(clippy::panicking_unwrap)]
x.unwrap(); // will panic
// will panic
x.unwrap();
#[expect(clippy::panicking_unwrap)]
x.expect("an error message"); // will panic
// will panic
x.expect("an error message");
}
}

View file

@ -1,9 +1,10 @@
error: called `unwrap` on `x` after checking its variant with `is_some`
--> $DIR/simple_conditionals.rs:45:9
--> $DIR/simple_conditionals.rs:47:9
|
LL | if x.is_some() {
| -------------- help: try: `if let Some(..) = x`
LL | x.unwrap(); // unnecessary
LL | // unnecessary
LL | x.unwrap();
| ^^^^^^^^^^
|
note: the lint level is defined here
@ -13,21 +14,21 @@ LL | #![deny(clippy::panicking_unwrap, clippy::unnecessary_unwrap)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
error: called `expect` on `x` after checking its variant with `is_some`
--> $DIR/simple_conditionals.rs:46:9
--> $DIR/simple_conditionals.rs:50:9
|
LL | if x.is_some() {
| -------------- help: try: `if let Some(..) = x`
LL | x.unwrap(); // unnecessary
LL | x.expect("an error message"); // unnecessary
...
LL | x.expect("an error message");
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: this call to `unwrap()` will always panic
--> $DIR/simple_conditionals.rs:48:9
--> $DIR/simple_conditionals.rs:54:9
|
LL | if x.is_some() {
| ----------- because of this check
...
LL | x.unwrap(); // will panic
LL | x.unwrap();
| ^^^^^^^^^^
|
note: the lint level is defined here
@ -37,37 +38,39 @@ LL | #![deny(clippy::panicking_unwrap, clippy::unnecessary_unwrap)]
| ^^^^^^^^^^^^^^^^^^^^^^^^
error: this call to `expect()` will always panic
--> $DIR/simple_conditionals.rs:49:9
--> $DIR/simple_conditionals.rs:57:9
|
LL | if x.is_some() {
| ----------- because of this check
...
LL | x.expect("an error message"); // will panic
LL | x.expect("an error message");
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: this call to `unwrap()` will always panic
--> $DIR/simple_conditionals.rs:52:9
--> $DIR/simple_conditionals.rs:62:9
|
LL | if x.is_none() {
| ----------- because of this check
LL | x.unwrap(); // will panic
LL | // will panic
LL | x.unwrap();
| ^^^^^^^^^^
error: called `unwrap` on `x` after checking its variant with `is_none`
--> $DIR/simple_conditionals.rs:54:9
--> $DIR/simple_conditionals.rs:66:9
|
LL | if x.is_none() {
| -------------- help: try: `if let Some(..) = x`
...
LL | x.unwrap(); // unnecessary
LL | x.unwrap();
| ^^^^^^^^^^
error: called `unwrap` on `x` after checking its variant with `is_some`
--> $DIR/simple_conditionals.rs:13:13
--> $DIR/simple_conditionals.rs:14:13
|
LL | if $a.is_some() {
| --------------- help: try: `if let Some(..) = x`
LL | $a.unwrap(); // unnecessary
LL | // unnecessary
LL | $a.unwrap();
| ^^^^^^^^^^^
...
LL | m!(x);
@ -76,91 +79,93 @@ LL | m!(x);
= note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info)
error: called `unwrap` on `x` after checking its variant with `is_ok`
--> $DIR/simple_conditionals.rs:62:9
--> $DIR/simple_conditionals.rs:79:9
|
LL | if x.is_ok() {
| ------------ help: try: `if let Ok(..) = x`
LL | x.unwrap(); // unnecessary
LL | // unnecessary
LL | x.unwrap();
| ^^^^^^^^^^
error: called `expect` on `x` after checking its variant with `is_ok`
--> $DIR/simple_conditionals.rs:63:9
--> $DIR/simple_conditionals.rs:82:9
|
LL | if x.is_ok() {
| ------------ help: try: `if let Ok(..) = x`
LL | x.unwrap(); // unnecessary
LL | x.expect("an error message"); // unnecessary
...
LL | x.expect("an error message");
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: this call to `unwrap_err()` will always panic
--> $DIR/simple_conditionals.rs:64:9
--> $DIR/simple_conditionals.rs:85:9
|
LL | if x.is_ok() {
| --------- because of this check
...
LL | x.unwrap_err(); // will panic
LL | x.unwrap_err();
| ^^^^^^^^^^^^^^
error: this call to `unwrap()` will always panic
--> $DIR/simple_conditionals.rs:66:9
--> $DIR/simple_conditionals.rs:89:9
|
LL | if x.is_ok() {
| --------- because of this check
...
LL | x.unwrap(); // will panic
LL | x.unwrap();
| ^^^^^^^^^^
error: this call to `expect()` will always panic
--> $DIR/simple_conditionals.rs:67:9
--> $DIR/simple_conditionals.rs:92:9
|
LL | if x.is_ok() {
| --------- because of this check
...
LL | x.expect("an error message"); // will panic
LL | x.expect("an error message");
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: called `unwrap_err` on `x` after checking its variant with `is_ok`
--> $DIR/simple_conditionals.rs:68:9
--> $DIR/simple_conditionals.rs:95:9
|
LL | if x.is_ok() {
| ------------ help: try: `if let Err(..) = x`
...
LL | x.unwrap_err(); // unnecessary
LL | x.unwrap_err();
| ^^^^^^^^^^^^^^
error: this call to `unwrap()` will always panic
--> $DIR/simple_conditionals.rs:71:9
--> $DIR/simple_conditionals.rs:100:9
|
LL | if x.is_err() {
| ---------- because of this check
LL | x.unwrap(); // will panic
LL | // will panic
LL | x.unwrap();
| ^^^^^^^^^^
error: called `unwrap_err` on `x` after checking its variant with `is_err`
--> $DIR/simple_conditionals.rs:72:9
--> $DIR/simple_conditionals.rs:103:9
|
LL | if x.is_err() {
| ------------- help: try: `if let Err(..) = x`
LL | x.unwrap(); // will panic
LL | x.unwrap_err(); // unnecessary
...
LL | x.unwrap_err();
| ^^^^^^^^^^^^^^
error: called `unwrap` on `x` after checking its variant with `is_err`
--> $DIR/simple_conditionals.rs:74:9
--> $DIR/simple_conditionals.rs:107:9
|
LL | if x.is_err() {
| ------------- help: try: `if let Ok(..) = x`
...
LL | x.unwrap(); // unnecessary
LL | x.unwrap();
| ^^^^^^^^^^
error: this call to `unwrap_err()` will always panic
--> $DIR/simple_conditionals.rs:75:9
--> $DIR/simple_conditionals.rs:110:9
|
LL | if x.is_err() {
| ---------- because of this check
...
LL | x.unwrap_err(); // will panic
LL | x.unwrap_err();
| ^^^^^^^^^^^^^^
error: aborting due to 17 previous errors

View file

@ -7,11 +7,14 @@ fn main() {
let x = 0;
let p: *const usize = &x;
if p == ptr::null() {
//~^ ERROR: comparing with null is better expressed by the `.is_null()` method
//~| NOTE: `-D clippy::cmp-null` implied by `-D warnings`
println!("This is surprising!");
}
let mut y = 0;
let mut m: *mut usize = &mut y;
if m == ptr::null_mut() {
//~^ ERROR: comparing with null is better expressed by the `.is_null()` method
println!("This is surprising, too!");
}
}

View file

@ -7,7 +7,7 @@ LL | if p == ptr::null() {
= note: `-D clippy::cmp-null` implied by `-D warnings`
error: comparing with null is better expressed by the `.is_null()` method
--> $DIR/cmp_null.rs:14:8
--> $DIR/cmp_null.rs:16:8
|
LL | if m == ptr::null_mut() {
| ^^^^^^^^^^^^^^^^^^^^

View file

@ -5,10 +5,13 @@ fn main() {
let x = &Baz;
let y = &Baz;
y.to_owned() == *x;
//~^ ERROR: this creates an owned instance just for comparison
//~| NOTE: `-D clippy::cmp-owned` implied by `-D warnings`
let x = &&Baz;
let y = &Baz;
y.to_owned() == **x;
//~^ ERROR: this creates an owned instance just for comparison
let x = 0u32;
let y = U32Wrapper(x);
@ -20,6 +23,7 @@ struct Foo;
impl PartialEq for Foo {
fn eq(&self, other: &Self) -> bool {
self.to_owned() == *other
//~^ ERROR: this creates an owned instance just for comparison
}
}

View file

@ -7,13 +7,13 @@ LL | y.to_owned() == *x;
= note: `-D clippy::cmp-owned` implied by `-D warnings`
error: this creates an owned instance just for comparison
--> $DIR/without_suggestion.rs:11:5
--> $DIR/without_suggestion.rs:13:5
|
LL | y.to_owned() == **x;
| ^^^^^^^^^^^^^^^^^^^ try implementing the comparison without allocating
error: this creates an owned instance just for comparison
--> $DIR/without_suggestion.rs:22:9
--> $DIR/without_suggestion.rs:25:9
|
LL | self.to_owned() == *other
| ^^^^^^^^^^^^^^^^^^^^^^^^^ try implementing the comparison without allocating

View file

@ -4,6 +4,7 @@
#[rustfmt::skip]
fn main() {
//~^ ERROR: the function has a cognitive complexity of (28/25)
if true {
println!("a");
}
@ -89,6 +90,7 @@ fn main() {
#[clippy::cognitive_complexity = "1"]
fn kaboom() {
//~^ ERROR: the function has a cognitive complexity of (7/1)
let n = 0;
'a: for i in 0..20 {
'b: for j in i..20 {
@ -147,7 +149,9 @@ fn lots_of_short_circuits2() -> bool {
#[clippy::cognitive_complexity = "1"]
fn baa() {
//~^ ERROR: the function has a cognitive complexity of (2/1)
let x = || match 99 {
//~^ ERROR: the function has a cognitive complexity of (2/1)
0 => 0,
1 => 1,
2 => 2,
@ -165,6 +169,7 @@ fn baa() {
#[clippy::cognitive_complexity = "1"]
fn bar() {
//~^ ERROR: the function has a cognitive complexity of (2/1)
match 99 {
0 => println!("hi"),
_ => println!("bye"),
@ -176,6 +181,7 @@ fn bar() {
/// Tests are usually complex but simple at the same time. `clippy::cognitive_complexity` used to
/// give lots of false-positives in tests.
fn dont_warn_on_tests() {
//~^ ERROR: the function has a cognitive complexity of (2/1)
match 99 {
0 => println!("hi"),
_ => println!("bye"),
@ -184,6 +190,7 @@ fn dont_warn_on_tests() {
#[clippy::cognitive_complexity = "1"]
fn barr() {
//~^ ERROR: the function has a cognitive complexity of (2/1)
match 99 {
0 => println!("hi"),
1 => println!("bla"),
@ -194,6 +201,7 @@ fn barr() {
#[clippy::cognitive_complexity = "1"]
fn barr2() {
//~^ ERROR: the function has a cognitive complexity of (3/1)
match 99 {
0 => println!("hi"),
1 => println!("bla"),
@ -210,6 +218,7 @@ fn barr2() {
#[clippy::cognitive_complexity = "1"]
fn barrr() {
//~^ ERROR: the function has a cognitive complexity of (2/1)
match 99 {
0 => println!("hi"),
1 => panic!("bla"),
@ -220,6 +229,7 @@ fn barrr() {
#[clippy::cognitive_complexity = "1"]
fn barrr2() {
//~^ ERROR: the function has a cognitive complexity of (3/1)
match 99 {
0 => println!("hi"),
1 => panic!("bla"),
@ -236,6 +246,7 @@ fn barrr2() {
#[clippy::cognitive_complexity = "1"]
fn barrrr() {
//~^ ERROR: the function has a cognitive complexity of (2/1)
match 99 {
0 => println!("hi"),
1 => println!("bla"),
@ -246,6 +257,7 @@ fn barrrr() {
#[clippy::cognitive_complexity = "1"]
fn barrrr2() {
//~^ ERROR: the function has a cognitive complexity of (3/1)
match 99 {
0 => println!("hi"),
1 => println!("bla"),
@ -262,6 +274,7 @@ fn barrrr2() {
#[clippy::cognitive_complexity = "1"]
fn cake() {
//~^ ERROR: the function has a cognitive complexity of (2/1)
if 4 == 5 {
println!("yea");
} else {
@ -272,6 +285,7 @@ fn cake() {
#[clippy::cognitive_complexity = "1"]
pub fn read_file(input_path: &str) -> String {
//~^ ERROR: the function has a cognitive complexity of (4/1)
use std::fs::File;
use std::io::{Read, Write};
use std::path::Path;
@ -303,6 +317,7 @@ enum Void {}
#[clippy::cognitive_complexity = "1"]
fn void(void: Void) {
//~^ ERROR: the function has a cognitive complexity of (2/1)
if true {
match void {}
}
@ -354,6 +369,7 @@ fn early() -> Result<i32, &'static str> {
#[rustfmt::skip]
#[clippy::cognitive_complexity = "1"]
fn early_ret() -> i32 {
//~^ ERROR: the function has a cognitive complexity of (8/1)
let a = if true { 42 } else { return 0; };
let a = if a < 99 { 42 } else { return 0; };
let a = if a < 99 { 42 } else { return 0; };
@ -375,6 +391,7 @@ fn early_ret() -> i32 {
#[clippy::cognitive_complexity = "1"]
fn closures() {
let x = |a: i32, b: i32| -> i32 {
//~^ ERROR: the function has a cognitive complexity of (2/1)
if true {
println!("moo");
}
@ -388,6 +405,7 @@ struct Moo;
#[clippy::cognitive_complexity = "1"]
impl Moo {
fn moo(&self) {
//~^ ERROR: the function has a cognitive complexity of (2/1)
if true {
println!("moo");
}
@ -397,6 +415,7 @@ impl Moo {
#[clippy::cognitive_complexity = "1"]
mod issue9300 {
async fn a() {
//~^ ERROR: the function has a cognitive complexity of (2/1)
let a = 0;
if a == 0 {}
}
@ -404,6 +423,7 @@ mod issue9300 {
pub struct S;
impl S {
pub async fn async_method() {
//~^ ERROR: the function has a cognitive complexity of (2/1)
let a = 0;
if a == 0 {}
}

View file

@ -8,7 +8,7 @@ LL | fn main() {
= note: `-D clippy::cognitive-complexity` implied by `-D warnings`
error: the function has a cognitive complexity of (7/1)
--> $DIR/cognitive_complexity.rs:91:4
--> $DIR/cognitive_complexity.rs:92:4
|
LL | fn kaboom() {
| ^^^^^^
@ -16,7 +16,7 @@ LL | fn kaboom() {
= help: you could split it up into multiple smaller functions
error: the function has a cognitive complexity of (2/1)
--> $DIR/cognitive_complexity.rs:149:4
--> $DIR/cognitive_complexity.rs:151:4
|
LL | fn baa() {
| ^^^
@ -24,7 +24,7 @@ LL | fn baa() {
= help: you could split it up into multiple smaller functions
error: the function has a cognitive complexity of (2/1)
--> $DIR/cognitive_complexity.rs:150:13
--> $DIR/cognitive_complexity.rs:153:13
|
LL | let x = || match 99 {
| ^^
@ -32,7 +32,7 @@ LL | let x = || match 99 {
= help: you could split it up into multiple smaller functions
error: the function has a cognitive complexity of (2/1)
--> $DIR/cognitive_complexity.rs:167:4
--> $DIR/cognitive_complexity.rs:171:4
|
LL | fn bar() {
| ^^^
@ -40,7 +40,7 @@ LL | fn bar() {
= help: you could split it up into multiple smaller functions
error: the function has a cognitive complexity of (2/1)
--> $DIR/cognitive_complexity.rs:178:4
--> $DIR/cognitive_complexity.rs:183:4
|
LL | fn dont_warn_on_tests() {
| ^^^^^^^^^^^^^^^^^^
@ -48,7 +48,7 @@ LL | fn dont_warn_on_tests() {
= help: you could split it up into multiple smaller functions
error: the function has a cognitive complexity of (2/1)
--> $DIR/cognitive_complexity.rs:186:4
--> $DIR/cognitive_complexity.rs:192:4
|
LL | fn barr() {
| ^^^^
@ -56,7 +56,7 @@ LL | fn barr() {
= help: you could split it up into multiple smaller functions
error: the function has a cognitive complexity of (3/1)
--> $DIR/cognitive_complexity.rs:196:4
--> $DIR/cognitive_complexity.rs:203:4
|
LL | fn barr2() {
| ^^^^^
@ -64,7 +64,7 @@ LL | fn barr2() {
= help: you could split it up into multiple smaller functions
error: the function has a cognitive complexity of (2/1)
--> $DIR/cognitive_complexity.rs:212:4
--> $DIR/cognitive_complexity.rs:220:4
|
LL | fn barrr() {
| ^^^^^
@ -72,7 +72,7 @@ LL | fn barrr() {
= help: you could split it up into multiple smaller functions
error: the function has a cognitive complexity of (3/1)
--> $DIR/cognitive_complexity.rs:222:4
--> $DIR/cognitive_complexity.rs:231:4
|
LL | fn barrr2() {
| ^^^^^^
@ -80,7 +80,7 @@ LL | fn barrr2() {
= help: you could split it up into multiple smaller functions
error: the function has a cognitive complexity of (2/1)
--> $DIR/cognitive_complexity.rs:238:4
--> $DIR/cognitive_complexity.rs:248:4
|
LL | fn barrrr() {
| ^^^^^^
@ -88,7 +88,7 @@ LL | fn barrrr() {
= help: you could split it up into multiple smaller functions
error: the function has a cognitive complexity of (3/1)
--> $DIR/cognitive_complexity.rs:248:4
--> $DIR/cognitive_complexity.rs:259:4
|
LL | fn barrrr2() {
| ^^^^^^^
@ -96,7 +96,7 @@ LL | fn barrrr2() {
= help: you could split it up into multiple smaller functions
error: the function has a cognitive complexity of (2/1)
--> $DIR/cognitive_complexity.rs:264:4
--> $DIR/cognitive_complexity.rs:276:4
|
LL | fn cake() {
| ^^^^
@ -104,7 +104,7 @@ LL | fn cake() {
= help: you could split it up into multiple smaller functions
error: the function has a cognitive complexity of (4/1)
--> $DIR/cognitive_complexity.rs:274:8
--> $DIR/cognitive_complexity.rs:287:8
|
LL | pub fn read_file(input_path: &str) -> String {
| ^^^^^^^^^
@ -112,7 +112,7 @@ LL | pub fn read_file(input_path: &str) -> String {
= help: you could split it up into multiple smaller functions
error: the function has a cognitive complexity of (2/1)
--> $DIR/cognitive_complexity.rs:305:4
--> $DIR/cognitive_complexity.rs:319:4
|
LL | fn void(void: Void) {
| ^^^^
@ -120,7 +120,7 @@ LL | fn void(void: Void) {
= help: you could split it up into multiple smaller functions
error: the function has a cognitive complexity of (8/1)
--> $DIR/cognitive_complexity.rs:356:4
--> $DIR/cognitive_complexity.rs:371:4
|
LL | fn early_ret() -> i32 {
| ^^^^^^^^^
@ -128,7 +128,7 @@ LL | fn early_ret() -> i32 {
= help: you could split it up into multiple smaller functions
error: the function has a cognitive complexity of (2/1)
--> $DIR/cognitive_complexity.rs:377:13
--> $DIR/cognitive_complexity.rs:393:13
|
LL | let x = |a: i32, b: i32| -> i32 {
| ^^^^^^^^^^^^^^^^
@ -136,7 +136,7 @@ LL | let x = |a: i32, b: i32| -> i32 {
= help: you could split it up into multiple smaller functions
error: the function has a cognitive complexity of (2/1)
--> $DIR/cognitive_complexity.rs:390:8
--> $DIR/cognitive_complexity.rs:407:8
|
LL | fn moo(&self) {
| ^^^
@ -144,7 +144,7 @@ LL | fn moo(&self) {
= help: you could split it up into multiple smaller functions
error: the function has a cognitive complexity of (2/1)
--> $DIR/cognitive_complexity.rs:399:14
--> $DIR/cognitive_complexity.rs:417:14
|
LL | async fn a() {
| ^
@ -152,7 +152,7 @@ LL | async fn a() {
= help: you could split it up into multiple smaller functions
error: the function has a cognitive complexity of (2/1)
--> $DIR/cognitive_complexity.rs:406:22
--> $DIR/cognitive_complexity.rs:425:22
|
LL | pub async fn async_method() {
| ^^^^^^^^^^^^

View file

@ -7,6 +7,7 @@ fn main() {
#[clippy::cognitive_complexity = "0"]
fn kaboom() {
//~^ ERROR: the function has a cognitive complexity of (3/0)
if 42 == 43 {
panic!();
} else if "cake" == "lie" {

View file

@ -11,6 +11,7 @@ fn lint_cases(opt_opt: Option<Option<u32>>, res_opt: Result<Option<u32>, String>
// match without block
match res_opt {
Ok(val) => match val {
//~^ ERROR: this `match` can be collapsed into the outer `match`
Some(n) => foo(n),
_ => return,
},
@ -20,6 +21,7 @@ fn lint_cases(opt_opt: Option<Option<u32>>, res_opt: Result<Option<u32>, String>
// match with block
match res_opt {
Ok(val) => match val {
//~^ ERROR: this `match` can be collapsed into the outer `match`
Some(n) => foo(n),
_ => return,
},
@ -29,6 +31,7 @@ fn lint_cases(opt_opt: Option<Option<u32>>, res_opt: Result<Option<u32>, String>
// if let, if let
if let Ok(val) = res_opt {
if let Some(n) = val {
//~^ ERROR: this `if let` can be collapsed into the outer `if let`
take(n);
}
}
@ -36,6 +39,7 @@ fn lint_cases(opt_opt: Option<Option<u32>>, res_opt: Result<Option<u32>, String>
// if let else, if let else
if let Ok(val) = res_opt {
if let Some(n) = val {
//~^ ERROR: this `if let` can be collapsed into the outer `if let`
take(n);
} else {
return;
@ -47,6 +51,7 @@ fn lint_cases(opt_opt: Option<Option<u32>>, res_opt: Result<Option<u32>, String>
// if let, match
if let Ok(val) = res_opt {
match val {
//~^ ERROR: this `match` can be collapsed into the outer `if let`
Some(n) => foo(n),
_ => (),
}
@ -56,6 +61,7 @@ fn lint_cases(opt_opt: Option<Option<u32>>, res_opt: Result<Option<u32>, String>
match res_opt {
Ok(val) => {
if let Some(n) = val {
//~^ ERROR: this `if let` can be collapsed into the outer `match`
take(n);
}
},
@ -65,6 +71,7 @@ fn lint_cases(opt_opt: Option<Option<u32>>, res_opt: Result<Option<u32>, String>
// if let else, match
if let Ok(val) = res_opt {
match val {
//~^ ERROR: this `match` can be collapsed into the outer `if let`
Some(n) => foo(n),
_ => return,
}
@ -76,6 +83,7 @@ fn lint_cases(opt_opt: Option<Option<u32>>, res_opt: Result<Option<u32>, String>
match res_opt {
Ok(val) => {
if let Some(n) = val {
//~^ ERROR: this `if let` can be collapsed into the outer `match`
take(n);
} else {
return;
@ -87,6 +95,7 @@ fn lint_cases(opt_opt: Option<Option<u32>>, res_opt: Result<Option<u32>, String>
// None in inner match same as outer wild branch
match res_opt {
Ok(val) => match val {
//~^ ERROR: this `match` can be collapsed into the outer `match`
Some(n) => foo(n),
None => return,
},
@ -96,6 +105,7 @@ fn lint_cases(opt_opt: Option<Option<u32>>, res_opt: Result<Option<u32>, String>
// None in outer match same as inner wild branch
match opt_opt {
Some(val) => match val {
//~^ ERROR: this `match` can be collapsed into the outer `match`
Some(n) => foo(n),
_ => return,
},
@ -261,6 +271,7 @@ pub enum Issue9647 {
pub fn test_1(x: Issue9647) {
if let Issue9647::A { a, .. } = x {
if let Some(u) = a {
//~^ ERROR: this `if let` can be collapsed into the outer `if let`
println!("{u:?}")
}
}
@ -269,6 +280,7 @@ pub fn test_1(x: Issue9647) {
pub fn test_2(x: Issue9647) {
if let Issue9647::A { a: Some(a), .. } = x {
if let Some(u) = a {
//~^ ERROR: this `if let` can be collapsed into the outer `if let`
println!("{u}")
}
}

View file

@ -3,6 +3,7 @@ error: this `match` can be collapsed into the outer `match`
|
LL | Ok(val) => match val {
| ____________________^
LL | |
LL | | Some(n) => foo(n),
LL | | _ => return,
LL | | },
@ -13,38 +14,42 @@ help: the outer pattern can be modified to include the inner pattern
|
LL | Ok(val) => match val {
| ^^^ replace this binding
LL |
LL | Some(n) => foo(n),
| ^^^^^^^ with this pattern
= note: `-D clippy::collapsible-match` implied by `-D warnings`
error: this `match` can be collapsed into the outer `match`
--> $DIR/collapsible_match.rs:22:20
--> $DIR/collapsible_match.rs:23:20
|
LL | Ok(val) => match val {
| ____________________^
LL | |
LL | | Some(n) => foo(n),
LL | | _ => return,
LL | | },
| |_________^
|
help: the outer pattern can be modified to include the inner pattern
--> $DIR/collapsible_match.rs:22:12
--> $DIR/collapsible_match.rs:23:12
|
LL | Ok(val) => match val {
| ^^^ replace this binding
LL |
LL | Some(n) => foo(n),
| ^^^^^^^ with this pattern
error: this `if let` can be collapsed into the outer `if let`
--> $DIR/collapsible_match.rs:31:9
--> $DIR/collapsible_match.rs:33:9
|
LL | / if let Some(n) = val {
LL | |
LL | | take(n);
LL | | }
| |_________^
|
help: the outer pattern can be modified to include the inner pattern
--> $DIR/collapsible_match.rs:30:15
--> $DIR/collapsible_match.rs:32:15
|
LL | if let Ok(val) = res_opt {
| ^^^ replace this binding
@ -52,9 +57,10 @@ LL | if let Some(n) = val {
| ^^^^^^^ with this pattern
error: this `if let` can be collapsed into the outer `if let`
--> $DIR/collapsible_match.rs:38:9
--> $DIR/collapsible_match.rs:41:9
|
LL | / if let Some(n) = val {
LL | |
LL | | take(n);
LL | | } else {
LL | | return;
@ -62,7 +68,7 @@ LL | | }
| |_________^
|
help: the outer pattern can be modified to include the inner pattern
--> $DIR/collapsible_match.rs:37:15
--> $DIR/collapsible_match.rs:40:15
|
LL | if let Ok(val) = res_opt {
| ^^^ replace this binding
@ -70,33 +76,35 @@ LL | if let Some(n) = val {
| ^^^^^^^ with this pattern
error: this `match` can be collapsed into the outer `if let`
--> $DIR/collapsible_match.rs:49:9
--> $DIR/collapsible_match.rs:53:9
|
LL | / match val {
LL | |
LL | | Some(n) => foo(n),
LL | | _ => (),
LL | | }
| |_________^
|
help: the outer pattern can be modified to include the inner pattern
--> $DIR/collapsible_match.rs:48:15
--> $DIR/collapsible_match.rs:52:15
|
LL | if let Ok(val) = res_opt {
| ^^^ replace this binding
LL | match val {
...
LL | Some(n) => foo(n),
| ^^^^^^^ with this pattern
error: this `if let` can be collapsed into the outer `match`
--> $DIR/collapsible_match.rs:58:13
--> $DIR/collapsible_match.rs:63:13
|
LL | / if let Some(n) = val {
LL | |
LL | | take(n);
LL | | }
| |_____________^
|
help: the outer pattern can be modified to include the inner pattern
--> $DIR/collapsible_match.rs:57:12
--> $DIR/collapsible_match.rs:62:12
|
LL | Ok(val) => {
| ^^^ replace this binding
@ -104,27 +112,29 @@ LL | if let Some(n) = val {
| ^^^^^^^ with this pattern
error: this `match` can be collapsed into the outer `if let`
--> $DIR/collapsible_match.rs:67:9
--> $DIR/collapsible_match.rs:73:9
|
LL | / match val {
LL | |
LL | | Some(n) => foo(n),
LL | | _ => return,
LL | | }
| |_________^
|
help: the outer pattern can be modified to include the inner pattern
--> $DIR/collapsible_match.rs:66:15
--> $DIR/collapsible_match.rs:72:15
|
LL | if let Ok(val) = res_opt {
| ^^^ replace this binding
LL | match val {
...
LL | Some(n) => foo(n),
| ^^^^^^^ with this pattern
error: this `if let` can be collapsed into the outer `match`
--> $DIR/collapsible_match.rs:78:13
--> $DIR/collapsible_match.rs:85:13
|
LL | / if let Some(n) = val {
LL | |
LL | | take(n);
LL | | } else {
LL | | return;
@ -132,7 +142,7 @@ LL | | }
| |_____________^
|
help: the outer pattern can be modified to include the inner pattern
--> $DIR/collapsible_match.rs:77:12
--> $DIR/collapsible_match.rs:84:12
|
LL | Ok(val) => {
| ^^^ replace this binding
@ -140,51 +150,56 @@ LL | if let Some(n) = val {
| ^^^^^^^ with this pattern
error: this `match` can be collapsed into the outer `match`
--> $DIR/collapsible_match.rs:89:20
--> $DIR/collapsible_match.rs:97:20
|
LL | Ok(val) => match val {
| ____________________^
LL | |
LL | | Some(n) => foo(n),
LL | | None => return,
LL | | },
| |_________^
|
help: the outer pattern can be modified to include the inner pattern
--> $DIR/collapsible_match.rs:89:12
--> $DIR/collapsible_match.rs:97:12
|
LL | Ok(val) => match val {
| ^^^ replace this binding
LL |
LL | Some(n) => foo(n),
| ^^^^^^^ with this pattern
error: this `match` can be collapsed into the outer `match`
--> $DIR/collapsible_match.rs:98:22
--> $DIR/collapsible_match.rs:107:22
|
LL | Some(val) => match val {
| ______________________^
LL | |
LL | | Some(n) => foo(n),
LL | | _ => return,
LL | | },
| |_________^
|
help: the outer pattern can be modified to include the inner pattern
--> $DIR/collapsible_match.rs:98:14
--> $DIR/collapsible_match.rs:107:14
|
LL | Some(val) => match val {
| ^^^ replace this binding
LL |
LL | Some(n) => foo(n),
| ^^^^^^^ with this pattern
error: this `if let` can be collapsed into the outer `if let`
--> $DIR/collapsible_match.rs:263:9
--> $DIR/collapsible_match.rs:273:9
|
LL | / if let Some(u) = a {
LL | |
LL | | println!("{u:?}")
LL | | }
| |_________^
|
help: the outer pattern can be modified to include the inner pattern
--> $DIR/collapsible_match.rs:262:27
--> $DIR/collapsible_match.rs:272:27
|
LL | if let Issue9647::A { a, .. } = x {
| ^ replace this binding
@ -192,15 +207,16 @@ LL | if let Some(u) = a {
| ^^^^^^^ with this pattern, prefixed by a:
error: this `if let` can be collapsed into the outer `if let`
--> $DIR/collapsible_match.rs:271:9
--> $DIR/collapsible_match.rs:282:9
|
LL | / if let Some(u) = a {
LL | |
LL | | println!("{u}")
LL | | }
| |_________^
|
help: the outer pattern can be modified to include the inner pattern
--> $DIR/collapsible_match.rs:270:35
--> $DIR/collapsible_match.rs:281:35
|
LL | if let Issue9647::A { a: Some(a), .. } = x {
| ^ replace this binding

View file

@ -11,6 +11,7 @@ fn lint_cases(opt_opt: Option<Option<u32>>, res_opt: Result<Option<u32>, String>
{
match res_opt {
Ok(val) if make() => match val {
//~^ ERROR: this `match` can be collapsed into the outer `match`
Some(n) => foo(n),
_ => return,
},
@ -18,6 +19,7 @@ fn lint_cases(opt_opt: Option<Option<u32>>, res_opt: Result<Option<u32>, String>
}
match res_opt {
Ok(val) => match val {
//~^ ERROR: this `match` can be collapsed into the outer `match`
Some(n) => foo(n),
_ => return,
},
@ -49,6 +51,7 @@ fn lint_cases(opt_opt: Option<Option<u32>>, res_opt: Result<Option<u32>, String>
// deref reference value
match Some(&[1]) {
Some(s) => match *s {
//~^ ERROR: this `match` can be collapsed into the outer `match`
[n] => foo(n),
_ => (),
},
@ -58,6 +61,7 @@ fn lint_cases(opt_opt: Option<Option<u32>>, res_opt: Result<Option<u32>, String>
// ref pattern and deref
match Some(&[1]) {
Some(ref s) => match s {
//~^ ERROR: this `match` can be collapsed into the outer `match`
[n] => foo(n),
_ => (),
},

View file

@ -3,6 +3,7 @@ error: this `match` can be collapsed into the outer `match`
|
LL | Ok(val) if make() => match val {
| __________________________________^
LL | |
LL | | Some(n) => foo(n),
LL | | _ => return,
LL | | },
@ -13,30 +14,33 @@ help: the outer pattern can be modified to include the inner pattern
|
LL | Ok(val) if make() => match val {
| ^^^ replace this binding
LL |
LL | Some(n) => foo(n),
| ^^^^^^^ with this pattern
= note: `-D clippy::collapsible-match` implied by `-D warnings`
error: this `match` can be collapsed into the outer `match`
--> $DIR/collapsible_match2.rs:20:24
--> $DIR/collapsible_match2.rs:21:24
|
LL | Ok(val) => match val {
| ________________________^
LL | |
LL | | Some(n) => foo(n),
LL | | _ => return,
LL | | },
| |_____________^
|
help: the outer pattern can be modified to include the inner pattern
--> $DIR/collapsible_match2.rs:20:16
--> $DIR/collapsible_match2.rs:21:16
|
LL | Ok(val) => match val {
| ^^^ replace this binding
LL |
LL | Some(n) => foo(n),
| ^^^^^^^ with this pattern
error: this `match` can be collapsed into the outer `match`
--> $DIR/collapsible_match2.rs:34:29
--> $DIR/collapsible_match2.rs:36:29
|
LL | $pat => match $e {
| _____________________________^
@ -49,7 +53,7 @@ LL | mac!(res_opt => Ok(val), val => Some(n), foo(n));
| ------------------------------------------------ in this macro invocation
|
help: the outer pattern can be modified to include the inner pattern
--> $DIR/collapsible_match2.rs:46:28
--> $DIR/collapsible_match2.rs:48:28
|
LL | mac!(res_opt => Ok(val), val => Some(n), foo(n));
| ^^^ ^^^^^^^ with this pattern
@ -58,38 +62,42 @@ LL | mac!(res_opt => Ok(val), val => Some(n), foo(n));
= note: this error originates in the macro `mac` (in Nightly builds, run with -Z macro-backtrace for more info)
error: this `match` can be collapsed into the outer `match`
--> $DIR/collapsible_match2.rs:51:20
--> $DIR/collapsible_match2.rs:53:20
|
LL | Some(s) => match *s {
| ____________________^
LL | |
LL | | [n] => foo(n),
LL | | _ => (),
LL | | },
| |_________^
|
help: the outer pattern can be modified to include the inner pattern
--> $DIR/collapsible_match2.rs:51:14
--> $DIR/collapsible_match2.rs:53:14
|
LL | Some(s) => match *s {
| ^ replace this binding
LL |
LL | [n] => foo(n),
| ^^^ with this pattern
error: this `match` can be collapsed into the outer `match`
--> $DIR/collapsible_match2.rs:60:24
--> $DIR/collapsible_match2.rs:63:24
|
LL | Some(ref s) => match s {
| ________________________^
LL | |
LL | | [n] => foo(n),
LL | | _ => (),
LL | | },
| |_________^
|
help: the outer pattern can be modified to include the inner pattern
--> $DIR/collapsible_match2.rs:60:14
--> $DIR/collapsible_match2.rs:63:14
|
LL | Some(ref s) => match s {
| ^^^^^ replace this binding
LL |
LL | [n] => foo(n),
| ^^^ with this pattern

View file

@ -18,7 +18,9 @@ fn no_access_at_all() {
fn write_without_read() {
// The main use case for `collection_is_never_read`.
let mut x = HashMap::new(); // WARNING
let mut x = HashMap::new();
//~^ ERROR: collection is never read
//~| NOTE: `-D clippy::collection-is-never-read` implied by `-D warnings`
x.insert(1, 2);
}
@ -57,7 +59,8 @@ fn read_in_closure() {
}
fn write_in_closure() {
let mut x = vec![1, 2, 3]; // WARNING
let mut x = vec![1, 2, 3];
//~^ ERROR: collection is never read
let _ = || {
x.push(4);
};
@ -72,12 +75,14 @@ fn read_in_format() {
fn shadowing_1() {
let x = HashMap::<usize, usize>::new(); // Ok
let _ = x.len();
let mut x = HashMap::new(); // WARNING
let mut x = HashMap::new();
//~^ ERROR: collection is never read
x.insert(1, 2);
}
fn shadowing_2() {
let mut x = HashMap::new(); // WARNING
let mut x = HashMap::new();
//~^ ERROR: collection is never read
x.insert(1, 2);
let x = HashMap::<usize, usize>::new(); // Ok
let _ = x.len();
@ -85,26 +90,30 @@ fn shadowing_2() {
#[allow(clippy::let_unit_value)]
fn fake_read_1() {
let mut x = vec![1, 2, 3]; // WARNING
let mut x = vec![1, 2, 3];
//~^ ERROR: collection is never read
x.reverse();
let _: () = x.clear();
}
fn fake_read_2() {
let mut x = vec![1, 2, 3]; // WARNING
let mut x = vec![1, 2, 3];
//~^ ERROR: collection is never read
x.reverse();
println!("{:?}", x.push(5));
}
fn assignment() {
let mut x = vec![1, 2, 3]; // WARNING
let mut x = vec![1, 2, 3];
//~^ ERROR: collection is never read
let y = vec![4, 5, 6]; // Ok
x = y;
}
#[allow(clippy::self_assignment)]
fn self_assignment() {
let mut x = vec![1, 2, 3]; // WARNING
let mut x = vec![1, 2, 3];
//~^ ERROR: collection is never read
x = x;
}
@ -121,7 +130,8 @@ fn method_argument_but_not_target() {
}
fn insert_is_not_a_read() {
let mut x = HashSet::new(); // WARNING
let mut x = HashSet::new();
//~^ ERROR: collection is never read
x.insert(5);
}
@ -135,7 +145,8 @@ fn insert_is_a_read() {
fn not_read_if_return_value_not_used() {
// `is_empty` does not modify the set, so it's a query. But since the return value is not used, the
// lint does not consider it a read here.
let x = vec![1, 2, 3]; // WARNING
let x = vec![1, 2, 3];
//~^ ERROR: collection is never read
x.is_empty();
}
@ -170,34 +181,44 @@ fn function_argument() {
}
fn supported_types() {
let mut x = std::collections::BTreeMap::new(); // WARNING
let mut x = std::collections::BTreeMap::new();
//~^ ERROR: collection is never read
x.insert(true, 1);
let mut x = std::collections::BTreeSet::new(); // WARNING
let mut x = std::collections::BTreeSet::new();
//~^ ERROR: collection is never read
x.insert(1);
let mut x = std::collections::BinaryHeap::new(); // WARNING
let mut x = std::collections::BinaryHeap::new();
//~^ ERROR: collection is never read
x.push(1);
let mut x = std::collections::HashMap::new(); // WARNING
let mut x = std::collections::HashMap::new();
//~^ ERROR: collection is never read
x.insert(1, 2);
let mut x = std::collections::HashSet::new(); // WARNING
let mut x = std::collections::HashSet::new();
//~^ ERROR: collection is never read
x.insert(1);
let mut x = std::collections::LinkedList::new(); // WARNING
let mut x = std::collections::LinkedList::new();
//~^ ERROR: collection is never read
x.push_front(1);
let mut x = Some(true); // WARNING
let mut x = Some(true);
//~^ ERROR: collection is never read
x.insert(false);
let mut x = String::from("hello"); // WARNING
let mut x = String::from("hello");
//~^ ERROR: collection is never read
x.push('!');
let mut x = Vec::new(); // WARNING
let mut x = Vec::new();
//~^ ERROR: collection is never read
x.clear();
x.push(1);
let mut x = std::collections::VecDeque::new(); // WARNING
let mut x = std::collections::VecDeque::new();
//~^ ERROR: collection is never read
x.push_front(1);
}

View file

@ -1,123 +1,123 @@
error: collection is never read
--> $DIR/collection_is_never_read.rs:21:5
|
LL | let mut x = HashMap::new(); // WARNING
LL | let mut x = HashMap::new();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `-D clippy::collection-is-never-read` implied by `-D warnings`
error: collection is never read
--> $DIR/collection_is_never_read.rs:60:5
--> $DIR/collection_is_never_read.rs:62:5
|
LL | let mut x = vec![1, 2, 3]; // WARNING
LL | let mut x = vec![1, 2, 3];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
error: collection is never read
--> $DIR/collection_is_never_read.rs:75:5
--> $DIR/collection_is_never_read.rs:78:5
|
LL | let mut x = HashMap::new(); // WARNING
LL | let mut x = HashMap::new();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: collection is never read
--> $DIR/collection_is_never_read.rs:80:5
--> $DIR/collection_is_never_read.rs:84:5
|
LL | let mut x = HashMap::new(); // WARNING
LL | let mut x = HashMap::new();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: collection is never read
--> $DIR/collection_is_never_read.rs:88:5
--> $DIR/collection_is_never_read.rs:93:5
|
LL | let mut x = vec![1, 2, 3]; // WARNING
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
error: collection is never read
--> $DIR/collection_is_never_read.rs:94:5
|
LL | let mut x = vec![1, 2, 3]; // WARNING
LL | let mut x = vec![1, 2, 3];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
error: collection is never read
--> $DIR/collection_is_never_read.rs:100:5
|
LL | let mut x = vec![1, 2, 3]; // WARNING
LL | let mut x = vec![1, 2, 3];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
error: collection is never read
--> $DIR/collection_is_never_read.rs:107:5
|
LL | let mut x = vec![1, 2, 3]; // WARNING
LL | let mut x = vec![1, 2, 3];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
error: collection is never read
--> $DIR/collection_is_never_read.rs:124:5
--> $DIR/collection_is_never_read.rs:115:5
|
LL | let mut x = HashSet::new(); // WARNING
LL | let mut x = vec![1, 2, 3];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
error: collection is never read
--> $DIR/collection_is_never_read.rs:133:5
|
LL | let mut x = HashSet::new();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: collection is never read
--> $DIR/collection_is_never_read.rs:138:5
--> $DIR/collection_is_never_read.rs:148:5
|
LL | let x = vec![1, 2, 3]; // WARNING
LL | let x = vec![1, 2, 3];
| ^^^^^^^^^^^^^^^^^^^^^^
error: collection is never read
--> $DIR/collection_is_never_read.rs:173:5
--> $DIR/collection_is_never_read.rs:184:5
|
LL | let mut x = std::collections::BTreeMap::new(); // WARNING
LL | let mut x = std::collections::BTreeMap::new();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: collection is never read
--> $DIR/collection_is_never_read.rs:176:5
|
LL | let mut x = std::collections::BTreeSet::new(); // WARNING
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: collection is never read
--> $DIR/collection_is_never_read.rs:179:5
|
LL | let mut x = std::collections::BinaryHeap::new(); // WARNING
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: collection is never read
--> $DIR/collection_is_never_read.rs:182:5
|
LL | let mut x = std::collections::HashMap::new(); // WARNING
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: collection is never read
--> $DIR/collection_is_never_read.rs:185:5
|
LL | let mut x = std::collections::HashSet::new(); // WARNING
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: collection is never read
--> $DIR/collection_is_never_read.rs:188:5
|
LL | let mut x = std::collections::LinkedList::new(); // WARNING
LL | let mut x = std::collections::BTreeSet::new();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: collection is never read
--> $DIR/collection_is_never_read.rs:192:5
|
LL | let mut x = std::collections::BinaryHeap::new();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: collection is never read
--> $DIR/collection_is_never_read.rs:191:5
--> $DIR/collection_is_never_read.rs:196:5
|
LL | let mut x = Some(true); // WARNING
LL | let mut x = std::collections::HashMap::new();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: collection is never read
--> $DIR/collection_is_never_read.rs:200:5
|
LL | let mut x = std::collections::HashSet::new();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: collection is never read
--> $DIR/collection_is_never_read.rs:204:5
|
LL | let mut x = std::collections::LinkedList::new();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: collection is never read
--> $DIR/collection_is_never_read.rs:208:5
|
LL | let mut x = Some(true);
| ^^^^^^^^^^^^^^^^^^^^^^^
error: collection is never read
--> $DIR/collection_is_never_read.rs:194:5
--> $DIR/collection_is_never_read.rs:212:5
|
LL | let mut x = String::from("hello"); // WARNING
LL | let mut x = String::from("hello");
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: collection is never read
--> $DIR/collection_is_never_read.rs:197:5
--> $DIR/collection_is_never_read.rs:216:5
|
LL | let mut x = Vec::new(); // WARNING
LL | let mut x = Vec::new();
| ^^^^^^^^^^^^^^^^^^^^^^^
error: collection is never read
--> $DIR/collection_is_never_read.rs:201:5
--> $DIR/collection_is_never_read.rs:221:5
|
LL | let mut x = std::collections::VecDeque::new(); // WARNING
LL | let mut x = std::collections::VecDeque::new();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to 20 previous errors

View file

@ -12,6 +12,7 @@ fn f(x: u8, y: u8, z: u8) {
}
if x > y {
//~^ ERROR: `if` chain can be rewritten with `match`
a()
} else if x < y {
b()
@ -25,6 +26,7 @@ fn f(x: u8, y: u8, z: u8) {
}
if x > y {
//~^ ERROR: `if` chain can be rewritten with `match`
a()
} else if x < y {
b()
@ -33,6 +35,7 @@ fn f(x: u8, y: u8, z: u8) {
}
if x > y {
//~^ ERROR: `if` chain can be rewritten with `match`
a()
} else if y > x {
b()
@ -41,6 +44,7 @@ fn f(x: u8, y: u8, z: u8) {
}
if x > 1 {
//~^ ERROR: `if` chain can be rewritten with `match`
a()
} else if x < 1 {
b()
@ -115,12 +119,14 @@ fn g(x: f64, y: f64, z: f64) {
fn h<T: Ord>(x: T, y: T, z: T) {
if x > y {
//~^ ERROR: `if` chain can be rewritten with `match`
a()
} else if x < y {
b()
}
if x > y {
//~^ ERROR: `if` chain can be rewritten with `match`
a()
} else if x < y {
b()
@ -129,6 +135,7 @@ fn h<T: Ord>(x: T, y: T, z: T) {
}
if x > y {
//~^ ERROR: `if` chain can be rewritten with `match`
a()
} else if y > x {
b()

View file

@ -2,6 +2,7 @@ error: `if` chain can be rewritten with `match`
--> $DIR/comparison_chain.rs:14:5
|
LL | / if x > y {
LL | |
LL | | a()
LL | | } else if x < y {
LL | | b()
@ -12,13 +13,13 @@ LL | | }
= note: `-D clippy::comparison-chain` implied by `-D warnings`
error: `if` chain can be rewritten with `match`
--> $DIR/comparison_chain.rs:27:5
--> $DIR/comparison_chain.rs:28:5
|
LL | / if x > y {
LL | |
LL | | a()
LL | | } else if x < y {
LL | | b()
LL | | } else {
... |
LL | | c()
LL | | }
| |_____^
@ -26,13 +27,13 @@ LL | | }
= help: consider rewriting the `if` chain to use `cmp` and `match`
error: `if` chain can be rewritten with `match`
--> $DIR/comparison_chain.rs:35:5
--> $DIR/comparison_chain.rs:37:5
|
LL | / if x > y {
LL | |
LL | | a()
LL | | } else if y > x {
LL | | b()
LL | | } else {
... |
LL | | c()
LL | | }
| |_____^
@ -40,13 +41,13 @@ LL | | }
= help: consider rewriting the `if` chain to use `cmp` and `match`
error: `if` chain can be rewritten with `match`
--> $DIR/comparison_chain.rs:43:5
--> $DIR/comparison_chain.rs:46:5
|
LL | / if x > 1 {
LL | |
LL | | a()
LL | | } else if x < 1 {
LL | | b()
LL | | } else if x == 1 {
... |
LL | | c()
LL | | }
| |_____^
@ -54,9 +55,10 @@ LL | | }
= help: consider rewriting the `if` chain to use `cmp` and `match`
error: `if` chain can be rewritten with `match`
--> $DIR/comparison_chain.rs:117:5
--> $DIR/comparison_chain.rs:121:5
|
LL | / if x > y {
LL | |
LL | | a()
LL | | } else if x < y {
LL | | b()
@ -66,13 +68,13 @@ LL | | }
= help: consider rewriting the `if` chain to use `cmp` and `match`
error: `if` chain can be rewritten with `match`
--> $DIR/comparison_chain.rs:123:5
--> $DIR/comparison_chain.rs:128:5
|
LL | / if x > y {
LL | |
LL | | a()
LL | | } else if x < y {
LL | | b()
LL | | } else {
... |
LL | | c()
LL | | }
| |_____^
@ -80,13 +82,13 @@ LL | | }
= help: consider rewriting the `if` chain to use `cmp` and `match`
error: `if` chain can be rewritten with `match`
--> $DIR/comparison_chain.rs:131:5
--> $DIR/comparison_chain.rs:137:5
|
LL | / if x > y {
LL | |
LL | | a()
LL | | } else if y > x {
LL | | b()
LL | | } else {
... |
LL | | c()
LL | | }
| |_____^

View file

@ -40,54 +40,111 @@ fn main() {
let status_code = 500; // Value doesn't matter for the lint
let status = Status { code: status_code };
status_code >= 400 && status_code < 500; // Correct
// Correct
status_code >= 400 && status_code < 500;
status_code <= 400 && status_code > 500;
//~^ ERROR: boolean expression will never evaluate to 'true'
//~| NOTE: since `400` < `500`, the expression evaluates to false for any value of `st
status_code > 500 && status_code < 400;
//~^ ERROR: boolean expression will never evaluate to 'true'
//~| NOTE: since `500` > `400`, the expression evaluates to false for any value of `st
status_code < 500 && status_code > 500;
//~^ ERROR: boolean expression will never evaluate to 'true'
//~| NOTE: `status_code` cannot simultaneously be greater than and less than `500`
// More complex expressions
status_code < { 400 } && status_code > { 500 };
//~^ ERROR: boolean expression will never evaluate to 'true'
//~| NOTE: since `{ 400 }` < `{ 500 }`, the expression evaluates to false for any valu
status_code < STATUS_BAD_REQUEST && status_code > STATUS_SERVER_ERROR;
//~^ ERROR: boolean expression will never evaluate to 'true'
//~| NOTE: since `STATUS_BAD_REQUEST` < `STATUS_SERVER_ERROR`, the expression evaluate
status_code <= u16::MIN + 1 && status_code > STATUS_SERVER_ERROR;
//~^ ERROR: boolean expression will never evaluate to 'true'
//~| NOTE: since `u16::MIN + 1` < `STATUS_SERVER_ERROR`, the expression evaluates to f
status_code < STATUS_SERVER_ERROR && status_code > STATUS_SERVER_ERROR;
//~^ ERROR: boolean expression will never evaluate to 'true'
//~| NOTE: `status_code` cannot simultaneously be greater than and less than `STATUS_S
// Comparing two different types, via the `impl PartialOrd<u16> for Status`
status < { 400 } && status > { 500 };
//~^ ERROR: boolean expression will never evaluate to 'true'
//~| NOTE: since `{ 400 }` < `{ 500 }`, the expression evaluates to false for any valu
status < STATUS_BAD_REQUEST && status > STATUS_SERVER_ERROR;
//~^ ERROR: boolean expression will never evaluate to 'true'
//~| NOTE: since `STATUS_BAD_REQUEST` < `STATUS_SERVER_ERROR`, the expression evaluate
status <= u16::MIN + 1 && status > STATUS_SERVER_ERROR;
//~^ ERROR: boolean expression will never evaluate to 'true'
//~| NOTE: since `u16::MIN + 1` < `STATUS_SERVER_ERROR`, the expression evaluates to f
status < STATUS_SERVER_ERROR && status > STATUS_SERVER_ERROR;
//~^ ERROR: boolean expression will never evaluate to 'true'
//~| NOTE: `status` cannot simultaneously be greater than and less than `STATUS_SERVER
// Yoda conditions
500 <= status_code && 600 > status_code; // Correct
500 <= status_code && status_code <= 600; // Correct
500 >= status_code && 600 < status_code; // Incorrect
500 >= status_code && status_code > 600; // Incorrect
// Correct
500 <= status_code && 600 > status_code;
// Correct
500 <= status_code && status_code <= 600;
// Incorrect
500 >= status_code && 600 < status_code;
//~^ ERROR: boolean expression will never evaluate to 'true'
//~| NOTE: since `500` < `600`, the expression evaluates to false for any value of `st
// Incorrect
500 >= status_code && status_code > 600;
//~^ ERROR: boolean expression will never evaluate to 'true'
//~| NOTE: since `500` < `600`, the expression evaluates to false for any value of `st
// Yoda conditions, comparing two different types
500 <= status && 600 > status; // Correct
500 <= status && status <= 600; // Correct
500 >= status && 600 < status; // Incorrect
500 >= status && status > 600; // Incorrect
// Correct
500 <= status && 600 > status;
// Correct
500 <= status && status <= 600;
// Incorrect
500 >= status && 600 < status;
//~^ ERROR: boolean expression will never evaluate to 'true'
//~| NOTE: since `500` < `600`, the expression evaluates to false for any value of `st
// Incorrect
500 >= status && status > 600;
//~^ ERROR: boolean expression will never evaluate to 'true'
//~| NOTE: since `500` < `600`, the expression evaluates to false for any value of `st
// Expressions where one of the sides has no effect
status_code < 200 && status_code <= 299;
//~^ ERROR: right-hand side of `&&` operator has no effect
status_code > 200 && status_code >= 299;
//~^ ERROR: left-hand side of `&&` operator has no effect
status_code >= 500 && status_code > 500; // Useless left
status_code > 500 && status_code >= 500; // Useless right
status_code <= 500 && status_code < 500; // Useless left
status_code < 500 && status_code <= 500; // Useless right
// Useless left
status_code >= 500 && status_code > 500;
//~^ ERROR: left-hand side of `&&` operator has no effect
// Useless right
status_code > 500 && status_code >= 500;
//~^ ERROR: right-hand side of `&&` operator has no effect
// Useless left
status_code <= 500 && status_code < 500;
//~^ ERROR: left-hand side of `&&` operator has no effect
// Useless right
status_code < 500 && status_code <= 500;
//~^ ERROR: right-hand side of `&&` operator has no effect
// Other types
let name = "Steve";
name < "Jennifer" && name > "Shannon";
//~^ ERROR: boolean expression will never evaluate to 'true'
//~| NOTE: since `"Jennifer"` < `"Shannon"`, the expression evaluates to false for any
let numbers = [1, 2];
numbers < [3, 4] && numbers > [5, 6];
//~^ ERROR: boolean expression will never evaluate to 'true'
//~| NOTE: since `[3, 4]` < `[5, 6]`, the expression evaluates to false for any value
let letter = 'a';
letter < 'b' && letter > 'c';
//~^ ERROR: boolean expression will never evaluate to 'true'
//~| NOTE: since `'b'` < `'c'`, the expression evaluates to false for any value of `le
let area = 42.0;
area < std::f32::consts::E && area > std::f32::consts::PI;
//~^ ERROR: boolean expression will never evaluate to 'true'
//~| NOTE: since `std::f32::consts::E` < `std::f32::consts::PI`, the expression evalua
}

View file

@ -1,5 +1,5 @@
error: boolean expression will never evaluate to 'true'
--> $DIR/const_comparisons.rs:44:5
--> $DIR/const_comparisons.rs:45:5
|
LL | status_code <= 400 && status_code > 500;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -8,7 +8,7 @@ LL | status_code <= 400 && status_code > 500;
= note: `-D clippy::impossible-comparisons` implied by `-D warnings`
error: boolean expression will never evaluate to 'true'
--> $DIR/const_comparisons.rs:45:5
--> $DIR/const_comparisons.rs:48:5
|
LL | status_code > 500 && status_code < 400;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -16,7 +16,7 @@ LL | status_code > 500 && status_code < 400;
= note: since `500` > `400`, the expression evaluates to false for any value of `status_code`
error: boolean expression will never evaluate to 'true'
--> $DIR/const_comparisons.rs:46:5
--> $DIR/const_comparisons.rs:51:5
|
LL | status_code < 500 && status_code > 500;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -24,7 +24,7 @@ LL | status_code < 500 && status_code > 500;
= note: `status_code` cannot simultaneously be greater than and less than `500`
error: boolean expression will never evaluate to 'true'
--> $DIR/const_comparisons.rs:49:5
--> $DIR/const_comparisons.rs:56:5
|
LL | status_code < { 400 } && status_code > { 500 };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -32,7 +32,7 @@ LL | status_code < { 400 } && status_code > { 500 };
= note: since `{ 400 }` < `{ 500 }`, the expression evaluates to false for any value of `status_code`
error: boolean expression will never evaluate to 'true'
--> $DIR/const_comparisons.rs:50:5
--> $DIR/const_comparisons.rs:59:5
|
LL | status_code < STATUS_BAD_REQUEST && status_code > STATUS_SERVER_ERROR;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -40,7 +40,7 @@ LL | status_code < STATUS_BAD_REQUEST && status_code > STATUS_SERVER_ERROR;
= note: since `STATUS_BAD_REQUEST` < `STATUS_SERVER_ERROR`, the expression evaluates to false for any value of `status_code`
error: boolean expression will never evaluate to 'true'
--> $DIR/const_comparisons.rs:51:5
--> $DIR/const_comparisons.rs:62:5
|
LL | status_code <= u16::MIN + 1 && status_code > STATUS_SERVER_ERROR;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -48,7 +48,7 @@ LL | status_code <= u16::MIN + 1 && status_code > STATUS_SERVER_ERROR;
= note: since `u16::MIN + 1` < `STATUS_SERVER_ERROR`, the expression evaluates to false for any value of `status_code`
error: boolean expression will never evaluate to 'true'
--> $DIR/const_comparisons.rs:52:5
--> $DIR/const_comparisons.rs:65:5
|
LL | status_code < STATUS_SERVER_ERROR && status_code > STATUS_SERVER_ERROR;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -56,7 +56,7 @@ LL | status_code < STATUS_SERVER_ERROR && status_code > STATUS_SERVER_ERROR;
= note: `status_code` cannot simultaneously be greater than and less than `STATUS_SERVER_ERROR`
error: boolean expression will never evaluate to 'true'
--> $DIR/const_comparisons.rs:55:5
--> $DIR/const_comparisons.rs:70:5
|
LL | status < { 400 } && status > { 500 };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -64,7 +64,7 @@ LL | status < { 400 } && status > { 500 };
= note: since `{ 400 }` < `{ 500 }`, the expression evaluates to false for any value of `status`
error: boolean expression will never evaluate to 'true'
--> $DIR/const_comparisons.rs:56:5
--> $DIR/const_comparisons.rs:73:5
|
LL | status < STATUS_BAD_REQUEST && status > STATUS_SERVER_ERROR;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -72,7 +72,7 @@ LL | status < STATUS_BAD_REQUEST && status > STATUS_SERVER_ERROR;
= note: since `STATUS_BAD_REQUEST` < `STATUS_SERVER_ERROR`, the expression evaluates to false for any value of `status`
error: boolean expression will never evaluate to 'true'
--> $DIR/const_comparisons.rs:57:5
--> $DIR/const_comparisons.rs:76:5
|
LL | status <= u16::MIN + 1 && status > STATUS_SERVER_ERROR;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -80,7 +80,7 @@ LL | status <= u16::MIN + 1 && status > STATUS_SERVER_ERROR;
= note: since `u16::MIN + 1` < `STATUS_SERVER_ERROR`, the expression evaluates to false for any value of `status`
error: boolean expression will never evaluate to 'true'
--> $DIR/const_comparisons.rs:58:5
--> $DIR/const_comparisons.rs:79:5
|
LL | status < STATUS_SERVER_ERROR && status > STATUS_SERVER_ERROR;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -88,112 +88,112 @@ LL | status < STATUS_SERVER_ERROR && status > STATUS_SERVER_ERROR;
= note: `status` cannot simultaneously be greater than and less than `STATUS_SERVER_ERROR`
error: boolean expression will never evaluate to 'true'
--> $DIR/const_comparisons.rs:63:5
--> $DIR/const_comparisons.rs:89:5
|
LL | 500 >= status_code && 600 < status_code; // Incorrect
LL | 500 >= status_code && 600 < status_code;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: since `500` < `600`, the expression evaluates to false for any value of `status_code`
error: boolean expression will never evaluate to 'true'
--> $DIR/const_comparisons.rs:64:5
--> $DIR/const_comparisons.rs:93:5
|
LL | 500 >= status_code && status_code > 600; // Incorrect
LL | 500 >= status_code && status_code > 600;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: since `500` < `600`, the expression evaluates to false for any value of `status_code`
error: boolean expression will never evaluate to 'true'
--> $DIR/const_comparisons.rs:69:5
--> $DIR/const_comparisons.rs:103:5
|
LL | 500 >= status && 600 < status; // Incorrect
LL | 500 >= status && 600 < status;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: since `500` < `600`, the expression evaluates to false for any value of `status`
error: boolean expression will never evaluate to 'true'
--> $DIR/const_comparisons.rs:70:5
--> $DIR/const_comparisons.rs:107:5
|
LL | 500 >= status && status > 600; // Incorrect
LL | 500 >= status && status > 600;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: since `500` < `600`, the expression evaluates to false for any value of `status`
error: right-hand side of `&&` operator has no effect
--> $DIR/const_comparisons.rs:73:5
--> $DIR/const_comparisons.rs:112:5
|
LL | status_code < 200 && status_code <= 299;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
note: `if `status_code < 200` evaluates to true, status_code <= 299` will always evaluate to true as well
--> $DIR/const_comparisons.rs:73:23
--> $DIR/const_comparisons.rs:112:23
|
LL | status_code < 200 && status_code <= 299;
| ^^^^^^^^^^^^^^^^^^^^^
= note: `-D clippy::redundant-comparisons` implied by `-D warnings`
error: left-hand side of `&&` operator has no effect
--> $DIR/const_comparisons.rs:74:5
--> $DIR/const_comparisons.rs:114:5
|
LL | status_code > 200 && status_code >= 299;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
note: `if `status_code >= 299` evaluates to true, status_code > 200` will always evaluate to true as well
--> $DIR/const_comparisons.rs:74:5
--> $DIR/const_comparisons.rs:114:5
|
LL | status_code > 200 && status_code >= 299;
| ^^^^^^^^^^^^^^^^^^^^^
error: left-hand side of `&&` operator has no effect
--> $DIR/const_comparisons.rs:76:5
--> $DIR/const_comparisons.rs:118:5
|
LL | status_code >= 500 && status_code > 500; // Useless left
LL | status_code >= 500 && status_code > 500;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
note: `if `status_code > 500` evaluates to true, status_code >= 500` will always evaluate to true as well
--> $DIR/const_comparisons.rs:76:5
--> $DIR/const_comparisons.rs:118:5
|
LL | status_code >= 500 && status_code > 500; // Useless left
LL | status_code >= 500 && status_code > 500;
| ^^^^^^^^^^^^^^^^^^^^^^
error: right-hand side of `&&` operator has no effect
--> $DIR/const_comparisons.rs:77:5
--> $DIR/const_comparisons.rs:121:5
|
LL | status_code > 500 && status_code >= 500; // Useless right
LL | status_code > 500 && status_code >= 500;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
note: `if `status_code > 500` evaluates to true, status_code >= 500` will always evaluate to true as well
--> $DIR/const_comparisons.rs:77:23
--> $DIR/const_comparisons.rs:121:23
|
LL | status_code > 500 && status_code >= 500; // Useless right
LL | status_code > 500 && status_code >= 500;
| ^^^^^^^^^^^^^^^^^^^^^
error: left-hand side of `&&` operator has no effect
--> $DIR/const_comparisons.rs:78:5
--> $DIR/const_comparisons.rs:124:5
|
LL | status_code <= 500 && status_code < 500; // Useless left
LL | status_code <= 500 && status_code < 500;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
note: `if `status_code < 500` evaluates to true, status_code <= 500` will always evaluate to true as well
--> $DIR/const_comparisons.rs:78:5
--> $DIR/const_comparisons.rs:124:5
|
LL | status_code <= 500 && status_code < 500; // Useless left
LL | status_code <= 500 && status_code < 500;
| ^^^^^^^^^^^^^^^^^^^^^^
error: right-hand side of `&&` operator has no effect
--> $DIR/const_comparisons.rs:79:5
--> $DIR/const_comparisons.rs:127:5
|
LL | status_code < 500 && status_code <= 500; // Useless right
LL | status_code < 500 && status_code <= 500;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
note: `if `status_code < 500` evaluates to true, status_code <= 500` will always evaluate to true as well
--> $DIR/const_comparisons.rs:79:23
--> $DIR/const_comparisons.rs:127:23
|
LL | status_code < 500 && status_code <= 500; // Useless right
LL | status_code < 500 && status_code <= 500;
| ^^^^^^^^^^^^^^^^^^^^^
error: boolean expression will never evaluate to 'true'
--> $DIR/const_comparisons.rs:83:5
--> $DIR/const_comparisons.rs:132:5
|
LL | name < "Jennifer" && name > "Shannon";
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -201,7 +201,7 @@ LL | name < "Jennifer" && name > "Shannon";
= note: since `"Jennifer"` < `"Shannon"`, the expression evaluates to false for any value of `name`
error: boolean expression will never evaluate to 'true'
--> $DIR/const_comparisons.rs:86:5
--> $DIR/const_comparisons.rs:137:5
|
LL | numbers < [3, 4] && numbers > [5, 6];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -209,7 +209,7 @@ LL | numbers < [3, 4] && numbers > [5, 6];
= note: since `[3, 4]` < `[5, 6]`, the expression evaluates to false for any value of `numbers`
error: boolean expression will never evaluate to 'true'
--> $DIR/const_comparisons.rs:89:5
--> $DIR/const_comparisons.rs:142:5
|
LL | letter < 'b' && letter > 'c';
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -217,7 +217,7 @@ LL | letter < 'b' && letter > 'c';
= note: since `'b'` < `'c'`, the expression evaluates to false for any value of `letter`
error: boolean expression will never evaluate to 'true'
--> $DIR/const_comparisons.rs:92:5
--> $DIR/const_comparisons.rs:147:5
|
LL | area < std::f32::consts::E && area > std::f32::consts::PI;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

View file

@ -4,6 +4,8 @@
struct Countdown(u8);
impl Iterator for Countdown {
//~^ ERROR: you are implementing `Iterator` on a `Copy` type
//~| NOTE: consider implementing `IntoIterator` instead
type Item = u8;
fn next(&mut self) -> Option<u8> {

View file

@ -2,9 +2,9 @@ error: you are implementing `Iterator` on a `Copy` type
--> $DIR/copy_iterator.rs:6:1
|
LL | / impl Iterator for Countdown {
LL | | type Item = u8;
LL | |
LL | | fn next(&mut self) -> Option<u8> {
LL | |
LL | | type Item = u8;
... |
LL | | }
LL | | }

View file

@ -1,3 +1,5 @@
fn zero() {
unsafe { 0 };
//~^ ERROR: unsafe block missing a safety comment
//~| NOTE: `-D clippy::undocumented-unsafe-blocks` implied by `-D warnings`
}

View file

@ -1,4 +1,8 @@
#![warn(clippy::unreadable_literal)]
fn f2() -> impl Sized { && 3.14159265358979323846E }
//@no-rustfix
fn f2() -> impl Sized { && 3.14159265358979323846E }
//~^ ERROR: expected at least one digit in exponent
//~| ERROR: long literal lacking separators
//~| NOTE: `-D clippy::unreadable-literal` implied by `-D warnings`
fn main() {}

View file

@ -1,11 +1,11 @@
error: expected at least one digit in exponent
--> $DIR/ice-10912.rs:2:28
--> $DIR/ice-10912.rs:3:28
|
LL | fn f2() -> impl Sized { && 3.14159265358979323846E }
| ^^^^^^^^^^^^^^^^^^^^^^^
error: long literal lacking separators
--> $DIR/ice-10912.rs:2:28
--> $DIR/ice-10912.rs:3:28
|
LL | fn f2() -> impl Sized { && 3.14159265358979323846E }
| ^^^^^^^^^^^^^^^^^^^^^^^ help: consider: `3.141_592_653_589_793_238_46`

View file

@ -13,6 +13,8 @@ pub struct Foo;
#[allow(clippy::implicit_hasher)]
// This should not cause a "cannot relate bound region" ICE.
pub fn add_barfoos_to_foos(bars: &HashSet<&Bar>) {
//~^ ERROR: the following explicit lifetimes could be elided: 'a
//~| NOTE: `-D clippy::needless-lifetimes` implied by `-D warnings`
let mut foos = HashSet::new();
foos.extend(bars.iter().map(|b| &b.foo));
}

View file

@ -13,6 +13,8 @@ pub struct Foo;
#[allow(clippy::implicit_hasher)]
// This should not cause a "cannot relate bound region" ICE.
pub fn add_barfoos_to_foos<'a>(bars: &HashSet<&'a Bar>) {
//~^ ERROR: the following explicit lifetimes could be elided: 'a
//~| NOTE: `-D clippy::needless-lifetimes` implied by `-D warnings`
let mut foos = HashSet::new();
foos.extend(bars.iter().map(|b| &b.foo));
}

View file

@ -3,10 +3,13 @@ fn main() {}
fn no_panic<T>(slice: &[T]) {
let mut iter = slice.iter();
loop {
//~^ ERROR: this loop could be written as a `while let` loop
//~| NOTE: `-D clippy::while-let-loop` implied by `-D warnings`
let _ = match iter.next() {
Some(ele) => ele,
None => break,
};
loop {}
//~^ ERROR: empty `loop {}` wastes CPU cycles
}
}

View file

@ -2,18 +2,18 @@ error: this loop could be written as a `while let` loop
--> $DIR/ice-360.rs:5:5
|
LL | / loop {
LL | |
LL | |
LL | | let _ = match iter.next() {
LL | | Some(ele) => ele,
LL | | None => break,
LL | | };
LL | | loop {}
... |
LL | |
LL | | }
| |_____^ help: try: `while let Some(ele) = iter.next() { .. }`
|
= note: `-D clippy::while-let-loop` implied by `-D warnings`
error: empty `loop {}` wastes CPU cycles
--> $DIR/ice-360.rs:10:9
--> $DIR/ice-360.rs:12:9
|
LL | loop {}
| ^^^^^^^

View file

@ -5,6 +5,7 @@ use std::collections::HashSet;
fn main() {}
pub fn ice_3717<S: ::std::hash::BuildHasher + Default>(_: &HashSet<usize, S>) {
//~^ ERROR: parameter of type `HashSet` should be generalized over different hashers
let _ = [0u8; 0];
let _: HashSet<usize> = HashSet::default();
}

View file

@ -5,6 +5,7 @@ use std::collections::HashSet;
fn main() {}
pub fn ice_3717(_: &HashSet<usize>) {
//~^ ERROR: parameter of type `HashSet` should be generalized over different hashers
let _ = [0u8; 0];
let _: HashSet<usize> = HashSet::new();
}

View file

@ -1,3 +1,4 @@
fn main() {
1x;
//~^ ERROR: invalid suffix `x` for number literal
}

View file

@ -18,10 +18,13 @@ struct Dst<X: ?Sized> {
struct TwoStrs(str, str)
where
str: Sized;
//~^ ERROR: trait bound str: std::marker::Sized does not depend on any type or lifetim
//~| NOTE: `-D trivial-bounds` implied by `-D warnings`
fn unsized_local()
where
for<'a> Dst<dyn A + 'a>: Sized,
//~^ ERROR: trait bound for<'a> Dst<(dyn A + 'a)>: std::marker::Sized does not depend
{
let x: Dst<dyn A> = *(Box::new(Dst { x: 1 }) as Box<Dst<dyn A>>);
}
@ -29,6 +32,7 @@ where
fn return_str() -> str
where
str: Sized,
//~^ ERROR: trait bound str: std::marker::Sized does not depend on any type or lifetim
{
*"Sized".to_string().into_boxed_str()
}
@ -36,6 +40,7 @@ where
fn use_op(s: String) -> String
where
String: ::std::ops::Neg<Output = String>,
//~^ ERROR: trait bound std::string::String: std::ops::Neg does not depend on any type
{
-s
}
@ -43,6 +48,7 @@ where
fn use_for()
where
i32: Iterator,
//~^ ERROR: trait bound i32: std::iter::Iterator does not depend on any type or lifeti
{
for _ in 2i32 {}
}

View file

@ -7,25 +7,25 @@ LL | str: Sized;
= note: `-D trivial-bounds` implied by `-D warnings`
error: trait bound for<'a> Dst<(dyn A + 'a)>: std::marker::Sized does not depend on any type or lifetime parameters
--> $DIR/ice-3969.rs:24:30
--> $DIR/ice-3969.rs:26:30
|
LL | for<'a> Dst<dyn A + 'a>: Sized,
| ^^^^^
error: trait bound str: std::marker::Sized does not depend on any type or lifetime parameters
--> $DIR/ice-3969.rs:31:10
--> $DIR/ice-3969.rs:34:10
|
LL | str: Sized,
| ^^^^^
error: trait bound std::string::String: std::ops::Neg does not depend on any type or lifetime parameters
--> $DIR/ice-3969.rs:38:13
--> $DIR/ice-3969.rs:42:13
|
LL | String: ::std::ops::Neg<Output = String>,
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: trait bound i32: std::iter::Iterator does not depend on any type or lifetime parameters
--> $DIR/ice-3969.rs:45:10
--> $DIR/ice-3969.rs:50:10
|
LL | i32: Iterator,
| ^^^^^^^^

View file

@ -1,6 +1,8 @@
#[rustfmt::skip]
pub struct Foo {
/// 位
//~^ ERROR: using tabs in doc comments is not recommended
//~| NOTE: `-D clippy::tabs-in-doc-comments` implied by `-D warnings`
/// ^ Do not remove this tab character.
/// It was required to trigger the ICE.
pub bar: u8,

View file

@ -1,6 +1,8 @@
#[rustfmt::skip]
pub struct Foo {
/// 位
//~^ ERROR: using tabs in doc comments is not recommended
//~| NOTE: `-D clippy::tabs-in-doc-comments` implied by `-D warnings`
/// ^ Do not remove this tab character.
/// It was required to trigger the ICE.
pub bar: u8,

View file

@ -2,4 +2,6 @@
fn main() {
let _ = vec![1, 2, 3].into_iter().next().is_none();
//~^ ERROR: avoid using `collect()` when not needed
//~| NOTE: `-D clippy::needless-collect` implied by `-D warnings`
}

View file

@ -2,4 +2,6 @@
fn main() {
let _ = vec![1, 2, 3].into_iter().collect::<Vec<_>>().is_empty();
//~^ ERROR: avoid using `collect()` when not needed
//~| NOTE: `-D clippy::needless-collect` implied by `-D warnings`
}

Some files were not shown because too many files have changed in this diff Show more