-
Notifications
You must be signed in to change notification settings - Fork 1.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Auto merge of #12930 - DaniPopes:missing-const-for-fn-suggestion, r=J…
…archo [`missing_const_for_fn`]: add machine-applicable suggestion Add a machine-applicable suggestion to the `missing_const_for_fn` lint. changelog: [`missing_const_for_fn`]: add machine-applicable suggestion
- Loading branch information
Showing
3 changed files
with
275 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,173 @@ | ||
#![warn(clippy::missing_const_for_fn)] | ||
#![allow(incomplete_features, clippy::let_and_return, clippy::missing_transmute_annotations)] | ||
#![feature(const_mut_refs)] | ||
#![feature(const_trait_impl)] | ||
|
||
use std::mem::transmute; | ||
|
||
struct Game { | ||
guess: i32, | ||
} | ||
|
||
impl Game { | ||
// Could be const | ||
pub const fn new() -> Self { | ||
//~^ ERROR: this could be a `const fn` | ||
//~| NOTE: `-D clippy::missing-const-for-fn` implied by `-D warnings` | ||
Self { guess: 42 } | ||
} | ||
|
||
const fn const_generic_params<'a, T, const N: usize>(&self, b: &'a [T; N]) -> &'a [T; N] { | ||
//~^ ERROR: this could be a `const fn` | ||
b | ||
} | ||
} | ||
|
||
// Could be const | ||
const fn one() -> i32 { | ||
//~^ ERROR: this could be a `const fn` | ||
1 | ||
} | ||
|
||
// Could also be const | ||
const fn two() -> i32 { | ||
//~^ ERROR: this could be a `const fn` | ||
let abc = 2; | ||
abc | ||
} | ||
|
||
// Could be const (since Rust 1.39) | ||
const fn string() -> String { | ||
//~^ ERROR: this could be a `const fn` | ||
String::new() | ||
} | ||
|
||
// Could be const | ||
const unsafe fn four() -> i32 { | ||
//~^ ERROR: this could be a `const fn` | ||
4 | ||
} | ||
|
||
// Could also be const | ||
const fn generic<T>(t: T) -> T { | ||
//~^ ERROR: this could be a `const fn` | ||
t | ||
} | ||
|
||
fn sub(x: u32) -> usize { | ||
unsafe { transmute(&x) } | ||
} | ||
|
||
const fn generic_arr<T: Copy>(t: [T; 1]) -> T { | ||
//~^ ERROR: this could be a `const fn` | ||
t[0] | ||
} | ||
|
||
mod with_drop { | ||
pub struct A; | ||
pub struct B; | ||
impl Drop for A { | ||
fn drop(&mut self) {} | ||
} | ||
|
||
impl B { | ||
// This can be const, because `a` is passed by reference | ||
pub const fn b(self, a: &A) -> B { | ||
//~^ ERROR: this could be a `const fn` | ||
B | ||
} | ||
} | ||
} | ||
|
||
#[clippy::msrv = "1.47.0"] | ||
mod const_fn_stabilized_before_msrv { | ||
// This could be const because `u8::is_ascii_digit` is a stable const function in 1.47. | ||
const fn const_fn_stabilized_before_msrv(byte: u8) { | ||
//~^ ERROR: this could be a `const fn` | ||
byte.is_ascii_digit(); | ||
} | ||
} | ||
|
||
#[clippy::msrv = "1.45"] | ||
fn msrv_1_45() -> i32 { | ||
45 | ||
} | ||
|
||
#[clippy::msrv = "1.46"] | ||
const fn msrv_1_46() -> i32 { | ||
//~^ ERROR: this could be a `const fn` | ||
46 | ||
} | ||
|
||
// Should not be const | ||
fn main() {} | ||
|
||
struct D; | ||
|
||
impl const Drop for D { | ||
fn drop(&mut self) { | ||
todo!(); | ||
} | ||
} | ||
|
||
// Lint this, since it can be dropped in const contexts | ||
// FIXME(effects) | ||
fn d(this: D) {} | ||
|
||
mod msrv { | ||
struct Foo(*const u8, &'static u8); | ||
|
||
impl Foo { | ||
#[clippy::msrv = "1.58"] | ||
const fn deref_ptr_can_be_const(self) -> usize { | ||
//~^ ERROR: this could be a `const fn` | ||
unsafe { *self.0 as usize } | ||
} | ||
|
||
const fn deref_copied_val(self) -> usize { | ||
//~^ ERROR: this could be a `const fn` | ||
*self.1 as usize | ||
} | ||
} | ||
|
||
union Bar { | ||
val: u8, | ||
} | ||
|
||
#[clippy::msrv = "1.56"] | ||
const fn union_access_can_be_const() { | ||
//~^ ERROR: this could be a `const fn` | ||
let bar = Bar { val: 1 }; | ||
let _ = unsafe { bar.val }; | ||
} | ||
} | ||
|
||
mod issue12677 { | ||
pub struct Wrapper { | ||
pub strings: Vec<String>, | ||
} | ||
|
||
impl Wrapper { | ||
#[must_use] | ||
pub const fn new(strings: Vec<String>) -> Self { | ||
Self { strings } | ||
} | ||
|
||
#[must_use] | ||
pub const fn empty() -> Self { | ||
Self { strings: Vec::new() } | ||
} | ||
} | ||
|
||
pub struct Other { | ||
pub text: String, | ||
pub vec: Vec<String>, | ||
} | ||
|
||
impl Other { | ||
pub const fn new(text: String) -> Self { | ||
let vec = Vec::new(); | ||
Self { text, vec } | ||
} | ||
} | ||
} |
Oops, something went wrong.