Skip to content

Clippy wrongly suggests replacing &mut String with &mut str #9542

Closed

Description

Summary

In egui crate the TextEdit widget constructor signature is as follows:

    pub fn singleline(text: &'t mut dyn TextBuffer) -> Self {
        Self {
            desired_height_rows: 1,
            multiline: false,
            ..Self::multiline(text)
        }
    }

TextBuffer is implemented as modifiable for String and as non-modifiable for &'_ str.

I want to have modifiable text buffer but in my project I have to use indirection to use singleline method. Clippy seems to trigger false positive for my use case, as changing &mut String to &mut str doesn't even compile. I'm attaching reproductible example below. Playground link: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=fec4899f9c23ecbb68c8e49aca409782

Lint Name

ptr_arg

Reproducer

I tried this code:

use std::marker::PhantomData;

trait DoAThing {
    fn a_thing(&mut self);
}

impl<'a> DoAThing for &'a str {
    fn a_thing(&mut self) {
        todo!()
    }
}

impl DoAThing for String {
    fn a_thing(&mut self) {
        todo!()
    }
}

struct Create<'t> {
    _phantom: PhantomData<&'t ()>,
}

impl<'t> Create<'t> {
    fn a_method(thing: &'t mut dyn DoAThing) -> Self {
        thing.a_thing();
        Self {
            _phantom: Default::default(),
        }
    }
}

fn external_attempt(src: &mut String) {
    Create::a_method(src);
}


fn main() {

}

I saw this happen:

warning: writing `&mut String` instead of `&mut str` involves a new object where a slice will do
  --> src/main.rs:32:26
   |
32 | fn external_attempt(src: &mut String) {
   |                          ^^^^^^^^^^^ help: change this to: `&mut str`
   |
   = note: `#[warn(clippy::ptr_arg)]` on by default
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_arg

I expected this to compile without warnings.

Version

rustc 1.63.0 (4b91a6ea7 2022-08-08)
binary: rustc
commit-hash: 4b91a6ea7258a947e59c6522cd5898e7c0a6a88f
commit-date: 2022-08-08
host: x86_64-unknown-linux-gnu
release: 1.63.0
LLVM version: 14.0.5

Additional Labels

No response

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Assignees

No one assigned

    Labels

    C-bugCategory: Clippy is not doing the correct thingI-false-positiveIssue: The lint was triggered on code it shouldn't have

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions