From: Lucas Ly Ba <[email protected]>
Warn when a generic parameter has an explicit `Drop` bound, which is
most likely a mistake since it does not constrain the parameter in a
useful way.
gcc/rust/ChangeLog:
* typecheck/rust-hir-type-check-base.cc
(TypeCheckBase::resolve_generic_params):
Warn on `Drop` bounds on generic parameters.
gcc/testsuite/ChangeLog:
* rust/compile/drop-bounds_0.rs: New test.
Signed-off-by: Lucas Ly Ba <[email protected]>
---
This change was merged into the gccrs repository and is posted here for
upstream visibility and potential drive-by review, as requested by GCC
release managers.
Each commit email contains a link to its details on github from where you can
find the Pull-Request and associated discussions.
Commit on github:
https://github.com/Rust-GCC/gccrs/commit/a7e108ec48c1b52393bc6e71b9f13ef0824663d2
The commit has NOT been mentioned in any issue.
The commit has been mentioned in the following pull-request(s):
- https://github.com/Rust-GCC/gccrs/pull/4636
gcc/rust/typecheck/rust-hir-type-check-base.cc | 13 +++++++++++++
gcc/testsuite/rust/compile/drop-bounds_0.rs | 14 ++++++++++++++
2 files changed, 27 insertions(+)
create mode 100644 gcc/testsuite/rust/compile/drop-bounds_0.rs
diff --git a/gcc/rust/typecheck/rust-hir-type-check-base.cc
b/gcc/rust/typecheck/rust-hir-type-check-base.cc
index ade16808e..8b6b4d6f5 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-base.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-base.cc
@@ -17,6 +17,7 @@
// <http://www.gnu.org/licenses/>.
#include "rust-hir-type-check-base.h"
+#include "options.h"
#include "rust-compile-base.h"
#include "rust-hir-item.h"
#include "rust-hir-type-check-expr.h"
@@ -715,6 +716,18 @@ TypeCheckBase::resolve_generic_params (
auto pty = static_cast<TyTy::ParamType *> (bpty);
TypeResolveGenericParam::ApplyAnyTraitBounds (type_param, pty);
+
+ // The drop_bounds lint: a `T: Drop` bound is most likely a mistake, as
+ // `Drop` bounds do not constrain a generic parameter in a useful way.
+ if (flag_unused_check_2_0)
+ if (auto drop = mappings.lookup_lang_item (LangItem::Kind::DROP))
+ for (auto &bound : pty->get_specified_bounds ())
+ if (bound.get_id () == drop.value ())
+ rust_warning_at (
+ type_param.get_locus (), OPT_Wunused_variable,
+ "bounds on %<Drop%> are most likely incorrect, "
+ "use %<core::mem::needs_drop%> to detect whether "
+ "a type has a destructor");
}
}
diff --git a/gcc/testsuite/rust/compile/drop-bounds_0.rs
b/gcc/testsuite/rust/compile/drop-bounds_0.rs
new file mode 100644
index 000000000..8a24a93ef
--- /dev/null
+++ b/gcc/testsuite/rust/compile/drop-bounds_0.rs
@@ -0,0 +1,14 @@
+// { dg-additional-options "-frust-unused-check-2.0" }
+#![feature(no_core, lang_items)]
+#![no_core]
+
+#[lang = "sized"]
+pub trait Sized {}
+
+#[lang = "drop"]
+pub trait Drop {
+ fn drop(&mut self);
+}
+
+pub fn f<T: Drop>(_x: T) {}
+// { dg-warning "bounds on .Drop. are most likely incorrect" "" { target *-*-*
} .-1 }
base-commit: 2c930e694e32886076ec2230789f52756ee4a997
--
2.54.0