mirror of
https://github.com/rust-lang/rust-clippy
synced 2024-11-30 16:39:26 +00:00
add a few more test cases
This commit is contained in:
parent
26ac76c15f
commit
b0dfecd8c1
3 changed files with 61 additions and 10 deletions
|
@ -3,6 +3,19 @@
|
||||||
#![warn(clippy::type_id_on_box)]
|
#![warn(clippy::type_id_on_box)]
|
||||||
|
|
||||||
use std::any::{Any, TypeId};
|
use std::any::{Any, TypeId};
|
||||||
|
use std::ops::Deref;
|
||||||
|
|
||||||
|
type SomeBox = Box<dyn Any>;
|
||||||
|
|
||||||
|
struct BadBox(Box<dyn Any>);
|
||||||
|
|
||||||
|
impl Deref for BadBox {
|
||||||
|
type Target = Box<dyn Any>;
|
||||||
|
|
||||||
|
fn deref(&self) -> &Self::Target {
|
||||||
|
&self.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn existential() -> impl Any {
|
fn existential() -> impl Any {
|
||||||
Box::new(1) as Box<dyn Any>
|
Box::new(1) as Box<dyn Any>
|
||||||
|
@ -11,10 +24,17 @@ fn existential() -> impl Any {
|
||||||
fn main() {
|
fn main() {
|
||||||
let any_box: Box<dyn Any> = Box::new(0usize);
|
let any_box: Box<dyn Any> = Box::new(0usize);
|
||||||
let _ = (*any_box).type_id();
|
let _ = (*any_box).type_id();
|
||||||
let _ = TypeId::of::<Box<dyn Any>>(); // don't lint, user probably explicitly wants to do this
|
let _ = TypeId::of::<Box<dyn Any>>(); // Don't lint. We explicitly say "do this instead" if this is intentional
|
||||||
let _ = (*any_box).type_id();
|
let _ = (*any_box).type_id();
|
||||||
let any_box: &Box<dyn Any> = &(Box::new(0usize) as Box<dyn Any>);
|
let any_box: &Box<dyn Any> = &(Box::new(0usize) as Box<dyn Any>);
|
||||||
let _ = (**any_box).type_id(); // 2 derefs are needed here
|
let _ = (**any_box).type_id(); // 2 derefs are needed here to get to the `dyn Any`
|
||||||
|
|
||||||
let b = existential();
|
let b = existential();
|
||||||
let _ = b.type_id(); // don't lint
|
let _ = b.type_id(); // Don't lint.
|
||||||
|
|
||||||
|
let b: SomeBox = Box::new(0usize);
|
||||||
|
let _ = (*b).type_id();
|
||||||
|
|
||||||
|
let b = BadBox(Box::new(0usize));
|
||||||
|
let _ = b.type_id(); // Don't lint. This is a call to `<BadBox as Any>::type_id`. Not `std::boxed::Box`!
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,19 @@
|
||||||
#![warn(clippy::type_id_on_box)]
|
#![warn(clippy::type_id_on_box)]
|
||||||
|
|
||||||
use std::any::{Any, TypeId};
|
use std::any::{Any, TypeId};
|
||||||
|
use std::ops::Deref;
|
||||||
|
|
||||||
|
type SomeBox = Box<dyn Any>;
|
||||||
|
|
||||||
|
struct BadBox(Box<dyn Any>);
|
||||||
|
|
||||||
|
impl Deref for BadBox {
|
||||||
|
type Target = Box<dyn Any>;
|
||||||
|
|
||||||
|
fn deref(&self) -> &Self::Target {
|
||||||
|
&self.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn existential() -> impl Any {
|
fn existential() -> impl Any {
|
||||||
Box::new(1) as Box<dyn Any>
|
Box::new(1) as Box<dyn Any>
|
||||||
|
@ -11,10 +24,17 @@ fn existential() -> impl Any {
|
||||||
fn main() {
|
fn main() {
|
||||||
let any_box: Box<dyn Any> = Box::new(0usize);
|
let any_box: Box<dyn Any> = Box::new(0usize);
|
||||||
let _ = any_box.type_id();
|
let _ = any_box.type_id();
|
||||||
let _ = TypeId::of::<Box<dyn Any>>(); // don't lint, user probably explicitly wants to do this
|
let _ = TypeId::of::<Box<dyn Any>>(); // Don't lint. We explicitly say "do this instead" if this is intentional
|
||||||
let _ = (*any_box).type_id();
|
let _ = (*any_box).type_id();
|
||||||
let any_box: &Box<dyn Any> = &(Box::new(0usize) as Box<dyn Any>);
|
let any_box: &Box<dyn Any> = &(Box::new(0usize) as Box<dyn Any>);
|
||||||
let _ = any_box.type_id(); // 2 derefs are needed here
|
let _ = any_box.type_id(); // 2 derefs are needed here to get to the `dyn Any`
|
||||||
|
|
||||||
let b = existential();
|
let b = existential();
|
||||||
let _ = b.type_id(); // don't lint
|
let _ = b.type_id(); // Don't lint.
|
||||||
|
|
||||||
|
let b: SomeBox = Box::new(0usize);
|
||||||
|
let _ = b.type_id();
|
||||||
|
|
||||||
|
let b = BadBox(Box::new(0usize));
|
||||||
|
let _ = b.type_id(); // Don't lint. This is a call to `<BadBox as Any>::type_id`. Not `std::boxed::Box`!
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
error: calling `.type_id()` on a `Box<dyn Any>`
|
error: calling `.type_id()` on a `Box<dyn Any>`
|
||||||
--> $DIR/type_id_on_box.rs:13:13
|
--> $DIR/type_id_on_box.rs:26:13
|
||||||
|
|
|
|
||||||
LL | let _ = any_box.type_id();
|
LL | let _ = any_box.type_id();
|
||||||
| -------^^^^^^^^^^
|
| -------^^^^^^^^^^
|
||||||
|
@ -11,9 +11,9 @@ LL | let _ = any_box.type_id();
|
||||||
= note: `-D clippy::type-id-on-box` implied by `-D warnings`
|
= note: `-D clippy::type-id-on-box` implied by `-D warnings`
|
||||||
|
|
||||||
error: calling `.type_id()` on a `Box<dyn Any>`
|
error: calling `.type_id()` on a `Box<dyn Any>`
|
||||||
--> $DIR/type_id_on_box.rs:17:13
|
--> $DIR/type_id_on_box.rs:30:13
|
||||||
|
|
|
|
||||||
LL | let _ = any_box.type_id(); // 2 derefs are needed here
|
LL | let _ = any_box.type_id(); // 2 derefs are needed here to get to the `dyn Any`
|
||||||
| -------^^^^^^^^^^
|
| -------^^^^^^^^^^
|
||||||
| |
|
| |
|
||||||
| help: consider dereferencing first: `(**any_box)`
|
| help: consider dereferencing first: `(**any_box)`
|
||||||
|
@ -21,5 +21,16 @@ LL | let _ = any_box.type_id(); // 2 derefs are needed here
|
||||||
= note: this returns the type id of the literal type `Box<dyn Any>` instead of the type id of the boxed value, which is most likely not what you want
|
= note: this returns the type id of the literal type `Box<dyn Any>` instead of the type id of the boxed value, which is most likely not what you want
|
||||||
= note: if this is intentional, use `TypeId::of::<Box<dyn Any>>()` instead, which makes it more clear
|
= note: if this is intentional, use `TypeId::of::<Box<dyn Any>>()` instead, which makes it more clear
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: calling `.type_id()` on a `Box<dyn Any>`
|
||||||
|
--> $DIR/type_id_on_box.rs:36:13
|
||||||
|
|
|
||||||
|
LL | let _ = b.type_id();
|
||||||
|
| -^^^^^^^^^^
|
||||||
|
| |
|
||||||
|
| help: consider dereferencing first: `(*b)`
|
||||||
|
|
|
||||||
|
= note: this returns the type id of the literal type `Box<dyn Any>` instead of the type id of the boxed value, which is most likely not what you want
|
||||||
|
= note: if this is intentional, use `TypeId::of::<Box<dyn Any>>()` instead, which makes it more clear
|
||||||
|
|
||||||
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue