Split refining_impl_trait lint into _reachable, _internal variants
This commit is contained in:
parent
3c029725f5
commit
c121a26ab9
13 changed files with 239 additions and 33 deletions
|
@ -77,7 +77,8 @@ declare_lint_pass! {
|
|||
PROC_MACRO_BACK_COMPAT,
|
||||
PROC_MACRO_DERIVE_RESOLUTION_FALLBACK,
|
||||
PUB_USE_OF_PRIVATE_EXTERN_CRATE,
|
||||
REFINING_IMPL_TRAIT,
|
||||
REFINING_IMPL_TRAIT_INTERNAL,
|
||||
REFINING_IMPL_TRAIT_REACHABLE,
|
||||
RENAMED_AND_REMOVED_LINTS,
|
||||
REPR_TRANSPARENT_EXTERNAL_PRIVATE_FIELDS,
|
||||
RUST_2021_INCOMPATIBLE_CLOSURE_CAPTURES,
|
||||
|
@ -4310,8 +4311,10 @@ declare_lint! {
|
|||
}
|
||||
|
||||
declare_lint! {
|
||||
/// The `refining_impl_trait` lint detects usages of return-position impl
|
||||
/// traits in trait signatures which are refined by implementations.
|
||||
/// The `refining_impl_trait_reachable` lint detects `impl Trait` return
|
||||
/// types in method signatures that are refined by a publically reachable
|
||||
/// trait implementation, meaning the implementation adds information about
|
||||
/// the return type that is not present in the trait.
|
||||
///
|
||||
/// ### Example
|
||||
///
|
||||
|
@ -4333,7 +4336,7 @@ declare_lint! {
|
|||
/// fn main() {
|
||||
/// // users can observe that the return type of
|
||||
/// // `<&str as AsDisplay>::as_display()` is `&str`.
|
||||
/// let x: &str = "".as_display();
|
||||
/// let _x: &str = "".as_display();
|
||||
/// }
|
||||
/// ```
|
||||
///
|
||||
|
@ -4341,13 +4344,80 @@ declare_lint! {
|
|||
///
|
||||
/// ### Explanation
|
||||
///
|
||||
/// Return-position impl trait in traits (RPITITs) desugar to associated types,
|
||||
/// and callers of methods for types where the implementation is known are
|
||||
/// Callers of methods for types where the implementation is known are
|
||||
/// able to observe the types written in the impl signature. This may be
|
||||
/// intended behavior, but may also pose a semver hazard for authors of libraries
|
||||
/// who do not wish to make stronger guarantees about the types than what is
|
||||
/// written in the trait signature.
|
||||
pub REFINING_IMPL_TRAIT,
|
||||
/// intended behavior, but may also lead to implementation details being
|
||||
/// revealed unintentionally. In particular, it may pose a semver hazard
|
||||
/// for authors of libraries who do not wish to make stronger guarantees
|
||||
/// about the types than what is written in the trait signature.
|
||||
///
|
||||
/// `refining_impl_trait` is a lint group composed of two lints:
|
||||
///
|
||||
/// * `refining_impl_trait_reachable`, for refinements that are publically
|
||||
/// reachable outside a crate, and
|
||||
/// * `refining_impl_trait_internal`, for refinements that are only visible
|
||||
/// within a crate.
|
||||
///
|
||||
/// We are seeking feedback on each of these lints; see issue
|
||||
/// [#121718](https://github.com/rust-lang/rust/issues/121718) for more
|
||||
/// information.
|
||||
pub REFINING_IMPL_TRAIT_REACHABLE,
|
||||
Warn,
|
||||
"impl trait in impl method signature does not match trait method signature",
|
||||
}
|
||||
|
||||
declare_lint! {
|
||||
/// The `refining_impl_trait_internal` lint detects `impl Trait` return
|
||||
/// types in method signatures that are refined by a trait implementation,
|
||||
/// meaning the implementation adds information about the return type that
|
||||
/// is not present in the trait.
|
||||
///
|
||||
/// ### Example
|
||||
///
|
||||
/// ```rust,compile_fail
|
||||
/// #![deny(refining_impl_trait)]
|
||||
///
|
||||
/// use std::fmt::Display;
|
||||
///
|
||||
/// trait AsDisplay {
|
||||
/// fn as_display(&self) -> impl Display;
|
||||
/// }
|
||||
///
|
||||
/// impl<'s> AsDisplay for &'s str {
|
||||
/// fn as_display(&self) -> Self {
|
||||
/// *self
|
||||
/// }
|
||||
/// }
|
||||
///
|
||||
/// fn main() {
|
||||
/// // users can observe that the return type of
|
||||
/// // `<&str as AsDisplay>::as_display()` is `&str`.
|
||||
/// let _x: &str = "".as_display();
|
||||
/// }
|
||||
/// ```
|
||||
///
|
||||
/// {{produces}}
|
||||
///
|
||||
/// ### Explanation
|
||||
///
|
||||
/// Callers of methods for types where the implementation is known are
|
||||
/// able to observe the types written in the impl signature. This may be
|
||||
/// intended behavior, but may also lead to implementation details being
|
||||
/// revealed unintentionally. In particular, it may pose a semver hazard
|
||||
/// for authors of libraries who do not wish to make stronger guarantees
|
||||
/// about the types than what is written in the trait signature.
|
||||
///
|
||||
/// `refining_impl_trait` is a lint group composed of two lints:
|
||||
///
|
||||
/// * `refining_impl_trait_reachable`, for refinements that are publically
|
||||
/// reachable outside a crate, and
|
||||
/// * `refining_impl_trait_internal`, for refinements that are only visible
|
||||
/// within a crate.
|
||||
///
|
||||
/// We are seeking feedback on each of these lints; see issue
|
||||
/// [#121718](https://github.com/rust-lang/rust/issues/121718) for more
|
||||
/// information.
|
||||
pub REFINING_IMPL_TRAIT_INTERNAL,
|
||||
Warn,
|
||||
"impl trait in impl method signature does not match trait method signature",
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue