diff --git a/CHANGELOG.md b/CHANGELOG.md
index c04735a495a7..6ec8eead579b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6565,6 +6565,7 @@ Released 2018-09-13
[`mut_mut`]: https://rust-lang.github.io/rust-clippy/master/index.html#mut_mut
[`mut_mutex_lock`]: https://rust-lang.github.io/rust-clippy/master/index.html#mut_mutex_lock
[`mut_range_bound`]: https://rust-lang.github.io/rust-clippy/master/index.html#mut_range_bound
+[`mutable_adt_argument_transmute`]: https://rust-lang.github.io/rust-clippy/master/index.html#mutable_adt_argument_transmute
[`mutable_key_type`]: https://rust-lang.github.io/rust-clippy/master/index.html#mutable_key_type
[`mutex_atomic`]: https://rust-lang.github.io/rust-clippy/master/index.html#mutex_atomic
[`mutex_integer`]: https://rust-lang.github.io/rust-clippy/master/index.html#mutex_integer
diff --git a/clippy_lints/src/declared_lints.rs b/clippy_lints/src/declared_lints.rs
index a754eea31165..3ce2b91ae4f4 100644
--- a/clippy_lints/src/declared_lints.rs
+++ b/clippy_lints/src/declared_lints.rs
@@ -715,6 +715,7 @@ pub static LINTS: &[&::declare_clippy_lint::LintInfo] = &[
crate::transmute::CROSSPOINTER_TRANSMUTE_INFO,
crate::transmute::EAGER_TRANSMUTE_INFO,
crate::transmute::MISSING_TRANSMUTE_ANNOTATIONS_INFO,
+ crate::transmute::MUTABLE_ADT_ARGUMENT_TRANSMUTE_INFO,
crate::transmute::TRANSMUTES_EXPRESSIBLE_AS_PTR_CASTS_INFO,
crate::transmute::TRANSMUTE_BYTES_TO_STR_INFO,
crate::transmute::TRANSMUTE_INT_TO_BOOL_INFO,
diff --git a/clippy_lints/src/transmute/mod.rs b/clippy_lints/src/transmute/mod.rs
index 5fda388259a6..70e0c87d5911 100644
--- a/clippy_lints/src/transmute/mod.rs
+++ b/clippy_lints/src/transmute/mod.rs
@@ -1,6 +1,7 @@
mod crosspointer_transmute;
mod eager_transmute;
mod missing_transmute_annotations;
+mod transmute_adt_argument;
mod transmute_int_to_bool;
mod transmute_int_to_non_zero;
mod transmute_null_to_fn;
@@ -44,6 +45,22 @@ declare_clippy_lint! {
correctness,
"transmutes that are confusing at best, undefined behavior at worst and always useless"
}
+declare_clippy_lint! {
+ /// ### What it does
+ /// Checks for transmutes between the same adt, where at least one of the type argument goes from &T to &mut T.
+ /// This is an a more complicated version of https://doc.rust-lang.org/rustc/lints/listing/deny-by-default.html#mutable-transmutes.
+ /// ### Example
+ ///
+ /// ```ignore
+ /// unsafe {
+ /// std::mem::transmute::