Add IMPLIED_BOUNDS_ENTAILMENT lint
This commit is contained in:
parent
4653c93e44
commit
96154d7fa7
8 changed files with 203 additions and 7 deletions
|
@ -3998,3 +3998,44 @@ declare_lint! {
|
|||
Warn,
|
||||
"named arguments in format used positionally"
|
||||
}
|
||||
|
||||
declare_lint! {
|
||||
/// The `implied_bounds_entailment` lint detects cases where the arguments of an impl method
|
||||
/// have stronger implied bounds than those from the trait method it's implementing.
|
||||
///
|
||||
/// ### Example
|
||||
///
|
||||
/// ```rust,compile_fail
|
||||
/// #![deny(implied_bounds_entailment)]
|
||||
///
|
||||
/// trait Trait {
|
||||
/// fn get<'s>(s: &'s str, _: &'static &'static ()) -> &'static str;
|
||||
/// }
|
||||
///
|
||||
/// impl Trait for () {
|
||||
/// fn get<'s>(s: &'s str, _: &'static &'s ()) -> &'static str {
|
||||
/// s
|
||||
/// }
|
||||
/// }
|
||||
///
|
||||
/// let val = <() as Trait>::get(&String::from("blah blah blah"), &&());
|
||||
/// println!("{}", val);
|
||||
/// ```
|
||||
///
|
||||
/// {{produces}}
|
||||
///
|
||||
/// ### Explanation
|
||||
///
|
||||
/// Neither the trait method, which provides no implied bounds about `'s`, nor the impl,
|
||||
/// which can't name `'s`, requires the main function to prove that 's: 'static, but the
|
||||
/// impl method is able to assume that 's: 'static within its own body.
|
||||
///
|
||||
/// This can be used to implement an unsound API if used incorrectly.
|
||||
pub IMPLIED_BOUNDS_ENTAILMENT,
|
||||
Deny,
|
||||
"impl method assumes more implied bounds than its corresponding trait method",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reference: "issue #105572 <https://github.com/rust-lang/rust/issues/105572>",
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorReportNow,
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue