diff --git a/gcc/rust/checks/lints/unused/rust-unused-checker.cc b/gcc/rust/checks/lints/unused/rust-unused-checker.cc index 0d091e6473a1..6704bc9a1b0e 100644 --- a/gcc/rust/checks/lints/unused/rust-unused-checker.cc +++ b/gcc/rust/checks/lints/unused/rust-unused-checker.cc @@ -347,5 +347,24 @@ UnusedChecker::visit (HIR::LetStmt &stmt) walk (stmt); } +void +UnusedChecker::visit (HIR::TypeAlias &type_alias) +{ + bool has_bounds = type_alias.has_where_clause (); + for (auto ¶m : type_alias.get_generic_params ()) + if (param->get_kind () == HIR::GenericParam::GenericKind::TYPE) + { + auto &type_param = static_cast (*param); + if (type_param.has_type_param_bounds ()) + has_bounds = true; + } + + if (has_bounds) + rust_warning_at (type_alias.get_locus (), OPT_Wunused, + "bounds on generic parameters in type aliases are not " + "enforced"); + walk (type_alias); +} + } // namespace Analysis } // namespace Rust diff --git a/gcc/rust/checks/lints/unused/rust-unused-checker.h b/gcc/rust/checks/lints/unused/rust-unused-checker.h index 46e012e79076..2b20046322b8 100644 --- a/gcc/rust/checks/lints/unused/rust-unused-checker.h +++ b/gcc/rust/checks/lints/unused/rust-unused-checker.h @@ -52,6 +52,7 @@ class UnusedChecker : public HIR::DefaultHIRVisitor virtual void visit (HIR::MatchExpr &expr) override; virtual void visit (HIR::ExternBlock &block) override; virtual void visit (HIR::LetStmt &stmt) override; + virtual void visit (HIR::TypeAlias &type_alias) override; virtual void visit_loop_label (HIR::LoopLabel &label) override; }; } // namespace Analysis diff --git a/gcc/rust/rust-lang.cc b/gcc/rust/rust-lang.cc index dde3ef204ce0..dc39bc053d0e 100644 --- a/gcc/rust/rust-lang.cc +++ b/gcc/rust/rust-lang.cc @@ -136,6 +136,8 @@ grs_langhook_init_options_struct (struct gcc_options *opts) /* We need to warn on unused variables by default */ opts->x_warn_unused_variable = 1; + /* Experimental lints under -frust-unused-check-2.0 warn by default */ + opts->x_warn_unused = 1; /* For const variables too */ opts->x_warn_unused_const_variable = 1; /* And finally unused result for #[must_use] */ diff --git a/gcc/testsuite/rust/compile/type-alias-bounds_0.rs b/gcc/testsuite/rust/compile/type-alias-bounds_0.rs new file mode 100644 index 000000000000..d8eda144bab2 --- /dev/null +++ b/gcc/testsuite/rust/compile/type-alias-bounds_0.rs @@ -0,0 +1,11 @@ +// { dg-additional-options "-frust-unused-check-2.0" } +#![feature(no_core, lang_items)] +#![no_core] + +#[lang = "sized"] +pub trait Sized {} + +pub trait Foo {} + +pub type Alias = T; +// { dg-warning "bounds on generic parameters in type aliases are not enforced" "" { target *-*-* } .-1 }