mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 06:44:35 +00:00
Auto merge of #123676 - GuillaumeGomez:rollup-1hurixy, r=GuillaumeGomez
Rollup of 8 pull requests Successful merges: - #123254 (Do not allocate for ZST ThinBox (attempt 2 using const_allocate)) - #123626 (Add MC/DC support to coverage test tools) - #123638 (rustdoc: synthetic auto: filter out clauses from the implementor's ParamEnv) - #123653 (Split `non_local_definitions` lint tests in separate test files) - #123658 (Stop making any assumption about the projections applied to the upvars in the `ByMoveBody` pass) - #123662 (Don't rely on upvars being assigned just because coroutine-closure kind is assigned) - #123665 (Fix typo in `Future::poll()` docs) - #123672 (compiletest: unset `RUSTC_LOG_COLOR`) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
ff24ef91fc
@ -2231,7 +2231,7 @@ impl<'tcx> Ty<'tcx> {
|
||||
pub fn tuple_fields(self) -> &'tcx List<Ty<'tcx>> {
|
||||
match self.kind() {
|
||||
Tuple(args) => args,
|
||||
_ => bug!("tuple_fields called on non-tuple"),
|
||||
_ => bug!("tuple_fields called on non-tuple: {self:?}"),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -281,14 +281,14 @@ impl<'tcx> MutVisitor<'tcx> for MakeByMoveBody<'tcx> {
|
||||
if place.local == ty::CAPTURE_STRUCT_LOCAL
|
||||
&& let Some((&mir::ProjectionElem::Field(idx, _), projection)) =
|
||||
place.projection.split_first()
|
||||
&& let Some(&(remapped_idx, remapped_ty, needs_deref, additional_projections)) =
|
||||
&& let Some(&(remapped_idx, remapped_ty, needs_deref, bridging_projections)) =
|
||||
self.field_remapping.get(&idx)
|
||||
{
|
||||
// As noted before, if the parent closure captures a field by value, and
|
||||
// the child captures a field by ref, then for the by-move body we're
|
||||
// generating, we also are taking that field by value. Peel off a deref,
|
||||
// since a layer of reffing has now become redundant.
|
||||
let final_deref = if needs_deref {
|
||||
// since a layer of ref'ing has now become redundant.
|
||||
let final_projections = if needs_deref {
|
||||
let Some((mir::ProjectionElem::Deref, projection)) = projection.split_first()
|
||||
else {
|
||||
bug!(
|
||||
@ -302,20 +302,18 @@ impl<'tcx> MutVisitor<'tcx> for MakeByMoveBody<'tcx> {
|
||||
projection
|
||||
};
|
||||
|
||||
// The only thing that should be left is a deref, if the parent captured
|
||||
// an upvar by-ref.
|
||||
std::assert_matches::assert_matches!(final_deref, [] | [mir::ProjectionElem::Deref]);
|
||||
|
||||
// For all of the additional projections that come out of precise capturing,
|
||||
// re-apply these projections.
|
||||
let additional_projections =
|
||||
additional_projections.iter().map(|elem| match elem.kind {
|
||||
ProjectionKind::Deref => mir::ProjectionElem::Deref,
|
||||
ProjectionKind::Field(idx, VariantIdx::ZERO) => {
|
||||
mir::ProjectionElem::Field(idx, elem.ty)
|
||||
}
|
||||
_ => unreachable!("precise captures only through fields and derefs"),
|
||||
});
|
||||
// These projections are applied in order to "bridge" the local that we are
|
||||
// currently transforming *from* the old upvar that the by-ref coroutine used
|
||||
// to capture *to* the upvar of the parent coroutine-closure. For example, if
|
||||
// the parent captures `&s` but the child captures `&(s.field)`, then we will
|
||||
// apply a field projection.
|
||||
let bridging_projections = bridging_projections.iter().map(|elem| match elem.kind {
|
||||
ProjectionKind::Deref => mir::ProjectionElem::Deref,
|
||||
ProjectionKind::Field(idx, VariantIdx::ZERO) => {
|
||||
mir::ProjectionElem::Field(idx, elem.ty)
|
||||
}
|
||||
_ => unreachable!("precise captures only through fields and derefs"),
|
||||
});
|
||||
|
||||
// We start out with an adjusted field index (and ty), representing the
|
||||
// upvar that we get from our parent closure. We apply any of the additional
|
||||
@ -326,8 +324,8 @@ impl<'tcx> MutVisitor<'tcx> for MakeByMoveBody<'tcx> {
|
||||
projection: self.tcx.mk_place_elems_from_iter(
|
||||
[mir::ProjectionElem::Field(remapped_idx, remapped_ty)]
|
||||
.into_iter()
|
||||
.chain(additional_projections)
|
||||
.chain(final_deref.iter().copied()),
|
||||
.chain(bridging_projections)
|
||||
.chain(final_projections.iter().copied()),
|
||||
),
|
||||
};
|
||||
}
|
||||
|
@ -292,7 +292,9 @@ pub(in crate::solve) fn extract_tupled_inputs_and_output_from_callable<'tcx>(
|
||||
let kind_ty = args.kind_ty();
|
||||
let sig = args.coroutine_closure_sig().skip_binder();
|
||||
|
||||
let coroutine_ty = if let Some(closure_kind) = kind_ty.to_opt_closure_kind() {
|
||||
let coroutine_ty = if let Some(closure_kind) = kind_ty.to_opt_closure_kind()
|
||||
&& !args.tupled_upvars_ty().is_ty_var()
|
||||
{
|
||||
if !closure_kind.extends(goal_kind) {
|
||||
return Err(NoSolution);
|
||||
}
|
||||
@ -401,7 +403,9 @@ pub(in crate::solve) fn extract_tupled_inputs_and_output_from_async_callable<'tc
|
||||
let kind_ty = args.kind_ty();
|
||||
let sig = args.coroutine_closure_sig().skip_binder();
|
||||
let mut nested = vec![];
|
||||
let coroutine_ty = if let Some(closure_kind) = kind_ty.to_opt_closure_kind() {
|
||||
let coroutine_ty = if let Some(closure_kind) = kind_ty.to_opt_closure_kind()
|
||||
&& !args.tupled_upvars_ty().is_ty_var()
|
||||
{
|
||||
if !closure_kind.extends(goal_kind) {
|
||||
return Err(NoSolution);
|
||||
}
|
||||
|
@ -487,6 +487,11 @@ impl<'tcx> assembly::GoalKind<'tcx> for NormalizesTo<'tcx> {
|
||||
bug!();
|
||||
};
|
||||
|
||||
// Bail if the upvars haven't been constrained.
|
||||
if tupled_upvars_ty.expect_ty().is_ty_var() {
|
||||
return ecx.evaluate_added_goals_and_make_canonical_response(Certainty::AMBIGUOUS);
|
||||
}
|
||||
|
||||
let Some(closure_kind) = closure_fn_kind_ty.expect_ty().to_opt_closure_kind() else {
|
||||
// We don't need to worry about the self type being an infer var.
|
||||
return Err(NoSolution);
|
||||
|
@ -1601,7 +1601,10 @@ fn confirm_closure_candidate<'cx, 'tcx>(
|
||||
// If we know the kind and upvars, use that directly.
|
||||
// Otherwise, defer to `AsyncFnKindHelper::Upvars` to delay
|
||||
// the projection, like the `AsyncFn*` traits do.
|
||||
let output_ty = if let Some(_) = kind_ty.to_opt_closure_kind() {
|
||||
let output_ty = if let Some(_) = kind_ty.to_opt_closure_kind()
|
||||
// Fall back to projection if upvars aren't constrained
|
||||
&& !args.tupled_upvars_ty().is_ty_var()
|
||||
{
|
||||
sig.to_coroutine_given_kind_and_upvars(
|
||||
tcx,
|
||||
args.parent_args(),
|
||||
@ -1731,7 +1734,10 @@ fn confirm_async_closure_candidate<'cx, 'tcx>(
|
||||
|
||||
let term = match item_name {
|
||||
sym::CallOnceFuture | sym::CallRefFuture => {
|
||||
if let Some(closure_kind) = kind_ty.to_opt_closure_kind() {
|
||||
if let Some(closure_kind) = kind_ty.to_opt_closure_kind()
|
||||
// Fall back to projection if upvars aren't constrained
|
||||
&& !args.tupled_upvars_ty().is_ty_var()
|
||||
{
|
||||
if !closure_kind.extends(goal_kind) {
|
||||
bug!("we should not be confirming if the closure kind is not met");
|
||||
}
|
||||
|
@ -400,39 +400,36 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||
}
|
||||
}
|
||||
ty::CoroutineClosure(def_id, args) => {
|
||||
let args = args.as_coroutine_closure();
|
||||
let is_const = self.tcx().is_const_fn_raw(def_id);
|
||||
match self.infcx.closure_kind(self_ty) {
|
||||
Some(closure_kind) => {
|
||||
let no_borrows = match self
|
||||
.infcx
|
||||
.shallow_resolve(args.as_coroutine_closure().tupled_upvars_ty())
|
||||
.kind()
|
||||
{
|
||||
ty::Tuple(tys) => tys.is_empty(),
|
||||
ty::Error(_) => false,
|
||||
_ => bug!("tuple_fields called on non-tuple"),
|
||||
};
|
||||
// A coroutine-closure implements `FnOnce` *always*, since it may
|
||||
// always be called once. It additionally implements `Fn`/`FnMut`
|
||||
// only if it has no upvars (therefore no borrows from the closure
|
||||
// that would need to be represented with a lifetime) and if the
|
||||
// closure kind permits it.
|
||||
// FIXME(async_closures): Actually, it could also implement `Fn`/`FnMut`
|
||||
// if it takes all of its upvars by copy, and none by ref. This would
|
||||
// require us to record a bit more information during upvar analysis.
|
||||
if no_borrows && closure_kind.extends(kind) {
|
||||
candidates.vec.push(ClosureCandidate { is_const });
|
||||
} else if kind == ty::ClosureKind::FnOnce {
|
||||
candidates.vec.push(ClosureCandidate { is_const });
|
||||
}
|
||||
if let Some(closure_kind) = self.infcx.closure_kind(self_ty)
|
||||
// Ambiguity if upvars haven't been constrained yet
|
||||
&& !args.tupled_upvars_ty().is_ty_var()
|
||||
{
|
||||
let no_borrows = match args.tupled_upvars_ty().kind() {
|
||||
ty::Tuple(tys) => tys.is_empty(),
|
||||
ty::Error(_) => false,
|
||||
_ => bug!("tuple_fields called on non-tuple"),
|
||||
};
|
||||
// A coroutine-closure implements `FnOnce` *always*, since it may
|
||||
// always be called once. It additionally implements `Fn`/`FnMut`
|
||||
// only if it has no upvars (therefore no borrows from the closure
|
||||
// that would need to be represented with a lifetime) and if the
|
||||
// closure kind permits it.
|
||||
// FIXME(async_closures): Actually, it could also implement `Fn`/`FnMut`
|
||||
// if it takes all of its upvars by copy, and none by ref. This would
|
||||
// require us to record a bit more information during upvar analysis.
|
||||
if no_borrows && closure_kind.extends(kind) {
|
||||
candidates.vec.push(ClosureCandidate { is_const });
|
||||
} else if kind == ty::ClosureKind::FnOnce {
|
||||
candidates.vec.push(ClosureCandidate { is_const });
|
||||
}
|
||||
None => {
|
||||
if kind == ty::ClosureKind::FnOnce {
|
||||
candidates.vec.push(ClosureCandidate { is_const });
|
||||
} else {
|
||||
// This stays ambiguous until kind+upvars are determined.
|
||||
candidates.ambiguous = true;
|
||||
}
|
||||
} else {
|
||||
if kind == ty::ClosureKind::FnOnce {
|
||||
candidates.vec.push(ClosureCandidate { is_const });
|
||||
} else {
|
||||
// This stays ambiguous until kind+upvars are determined.
|
||||
candidates.ambiguous = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -4,10 +4,14 @@
|
||||
use crate::alloc::{self, Layout, LayoutError};
|
||||
use core::error::Error;
|
||||
use core::fmt::{self, Debug, Display, Formatter};
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
use core::intrinsics::const_allocate;
|
||||
use core::marker::PhantomData;
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
use core::marker::Unsize;
|
||||
use core::mem::{self, SizedTypeProperties};
|
||||
use core::mem;
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
use core::mem::SizedTypeProperties;
|
||||
use core::ops::{Deref, DerefMut};
|
||||
use core::ptr::Pointee;
|
||||
use core::ptr::{self, NonNull};
|
||||
@ -109,9 +113,14 @@ impl<Dyn: ?Sized> ThinBox<Dyn> {
|
||||
where
|
||||
T: Unsize<Dyn>,
|
||||
{
|
||||
let meta = ptr::metadata(&value as &Dyn);
|
||||
let ptr = WithOpaqueHeader::new(meta, value);
|
||||
ThinBox { ptr, _marker: PhantomData }
|
||||
if mem::size_of::<T>() == 0 {
|
||||
let ptr = WithOpaqueHeader::new_unsize_zst::<Dyn, T>(value);
|
||||
ThinBox { ptr, _marker: PhantomData }
|
||||
} else {
|
||||
let meta = ptr::metadata(&value as &Dyn);
|
||||
let ptr = WithOpaqueHeader::new(meta, value);
|
||||
ThinBox { ptr, _marker: PhantomData }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -200,6 +209,16 @@ impl WithOpaqueHeader {
|
||||
Self(ptr.0)
|
||||
}
|
||||
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
fn new_unsize_zst<Dyn, T>(value: T) -> Self
|
||||
where
|
||||
Dyn: ?Sized,
|
||||
T: Unsize<Dyn>,
|
||||
{
|
||||
let ptr = WithHeader::<<Dyn as Pointee>::Metadata>::new_unsize_zst::<Dyn, T>(value);
|
||||
Self(ptr.0)
|
||||
}
|
||||
|
||||
fn try_new<H, T>(header: H, value: T) -> Result<Self, core::alloc::AllocError> {
|
||||
WithHeader::try_new(header, value).map(|ptr| Self(ptr.0))
|
||||
}
|
||||
@ -288,6 +307,58 @@ impl<H> WithHeader<H> {
|
||||
}
|
||||
}
|
||||
|
||||
// `Dyn` is `?Sized` type like `[u32]`, and `T` is ZST type like `[u32; 0]`.
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
fn new_unsize_zst<Dyn, T>(value: T) -> WithHeader<H>
|
||||
where
|
||||
Dyn: Pointee<Metadata = H> + ?Sized,
|
||||
T: Unsize<Dyn>,
|
||||
{
|
||||
assert!(mem::size_of::<T>() == 0);
|
||||
|
||||
const fn max(a: usize, b: usize) -> usize {
|
||||
if a > b { a } else { b }
|
||||
}
|
||||
|
||||
// Compute a pointer to the right metadata. This will point to the beginning
|
||||
// of the header, past the padding, so the assigned type makes sense.
|
||||
// It also ensures that the address at the end of the header is sufficiently
|
||||
// aligned for T.
|
||||
let alloc: &<Dyn as Pointee>::Metadata = const {
|
||||
// FIXME: just call `WithHeader::alloc_layout` with size reset to 0.
|
||||
// Currently that's blocked on `Layout::extend` not being `const fn`.
|
||||
|
||||
let alloc_align =
|
||||
max(mem::align_of::<T>(), mem::align_of::<<Dyn as Pointee>::Metadata>());
|
||||
|
||||
let alloc_size =
|
||||
max(mem::align_of::<T>(), mem::size_of::<<Dyn as Pointee>::Metadata>());
|
||||
|
||||
unsafe {
|
||||
// SAFETY: align is power of two because it is the maximum of two alignments.
|
||||
let alloc: *mut u8 = const_allocate(alloc_size, alloc_align);
|
||||
|
||||
let metadata_offset =
|
||||
alloc_size.checked_sub(mem::size_of::<<Dyn as Pointee>::Metadata>()).unwrap();
|
||||
// SAFETY: adding offset within the allocation.
|
||||
let metadata_ptr: *mut <Dyn as Pointee>::Metadata =
|
||||
alloc.add(metadata_offset).cast();
|
||||
// SAFETY: `*metadata_ptr` is within the allocation.
|
||||
metadata_ptr.write(ptr::metadata::<Dyn>(ptr::dangling::<T>() as *const Dyn));
|
||||
|
||||
// SAFETY: we have just written the metadata.
|
||||
&*(metadata_ptr)
|
||||
}
|
||||
};
|
||||
|
||||
// SAFETY: `alloc` points to `<Dyn as Pointee>::Metadata`, so addition stays in-bounds.
|
||||
let value_ptr =
|
||||
unsafe { (alloc as *const <Dyn as Pointee>::Metadata).add(1) }.cast::<T>().cast_mut();
|
||||
debug_assert!(value_ptr.is_aligned());
|
||||
mem::forget(value);
|
||||
WithHeader(NonNull::new(value_ptr.cast()).unwrap(), PhantomData)
|
||||
}
|
||||
|
||||
// Safety:
|
||||
// - Assumes that either `value` can be dereferenced, or is the
|
||||
// `NonNull::dangling()` we use when both `T` and `H` are ZSTs.
|
||||
@ -300,20 +371,19 @@ impl<H> WithHeader<H> {
|
||||
|
||||
impl<H> Drop for DropGuard<H> {
|
||||
fn drop(&mut self) {
|
||||
// All ZST are allocated statically.
|
||||
if self.value_layout.size() == 0 {
|
||||
return;
|
||||
}
|
||||
|
||||
unsafe {
|
||||
// SAFETY: Layout must have been computable if we're in drop
|
||||
let (layout, value_offset) =
|
||||
WithHeader::<H>::alloc_layout(self.value_layout).unwrap_unchecked();
|
||||
|
||||
// Note: Don't deallocate if the layout size is zero, because the pointer
|
||||
// didn't come from the allocator.
|
||||
if layout.size() != 0 {
|
||||
alloc::dealloc(self.ptr.as_ptr().sub(value_offset), layout);
|
||||
} else {
|
||||
debug_assert!(
|
||||
value_offset == 0 && H::IS_ZST && self.value_layout.size() == 0
|
||||
);
|
||||
}
|
||||
// Since we only allocate for non-ZSTs, the layout size cannot be zero.
|
||||
debug_assert!(layout.size() != 0);
|
||||
alloc::dealloc(self.ptr.as_ptr().sub(value_offset), layout);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -108,8 +108,10 @@
|
||||
#![feature(const_box)]
|
||||
#![feature(const_cow_is_borrowed)]
|
||||
#![feature(const_eval_select)]
|
||||
#![feature(const_heap)]
|
||||
#![feature(const_maybe_uninit_as_mut_ptr)]
|
||||
#![feature(const_maybe_uninit_write)]
|
||||
#![feature(const_option)]
|
||||
#![feature(const_pin)]
|
||||
#![feature(const_refs_to_cell)]
|
||||
#![feature(const_size_of_val)]
|
||||
|
@ -81,7 +81,7 @@ pub trait Future {
|
||||
/// An implementation of `poll` should strive to return quickly, and should
|
||||
/// not block. Returning quickly prevents unnecessarily clogging up
|
||||
/// threads or event loops. If it is known ahead of time that a call to
|
||||
/// `poll` may end up taking awhile, the work should be offloaded to a
|
||||
/// `poll` may end up taking a while, the work should be offloaded to a
|
||||
/// thread pool (or something similar) to ensure that `poll` can return
|
||||
/// quickly.
|
||||
///
|
||||
|
@ -168,7 +168,7 @@ fn clean_param_env<'tcx>(
|
||||
|
||||
// FIXME(#111101): Incorporate the explicit predicates of the item here...
|
||||
let item_predicates: FxIndexSet<_> =
|
||||
tcx.predicates_of(item_def_id).predicates.iter().map(|(pred, _)| pred).collect();
|
||||
tcx.param_env(item_def_id).caller_bounds().iter().collect();
|
||||
let where_predicates = param_env
|
||||
.caller_bounds()
|
||||
.iter()
|
||||
|
@ -266,7 +266,7 @@ impl TestProps {
|
||||
aux_crates: vec![],
|
||||
revisions: vec![],
|
||||
rustc_env: vec![("RUSTC_ICE".to_string(), "0".to_string())],
|
||||
unset_rustc_env: vec![],
|
||||
unset_rustc_env: vec![("RUSTC_LOG_COLOR".to_string())],
|
||||
exec_env: vec![],
|
||||
unset_exec_env: vec![],
|
||||
build_aux_docs: false,
|
||||
|
@ -752,6 +752,19 @@ impl<'test> TestCx<'test> {
|
||||
Lazy::new(|| Regex::new(r"(?m:^)(?<prefix>(?: \|)+ Branch \()[0-9]+:").unwrap());
|
||||
let coverage = BRANCH_LINE_NUMBER_RE.replace_all(&coverage, "${prefix}LL:");
|
||||
|
||||
// ` |---> MC/DC Decision Region (1:30) to (2:` => ` |---> MC/DC Decision Region (LL:30) to (LL:`
|
||||
static MCDC_DECISION_LINE_NUMBER_RE: Lazy<Regex> = Lazy::new(|| {
|
||||
Regex::new(r"(?m:^)(?<prefix>(?: \|)+---> MC/DC Decision Region \()[0-9]+:(?<middle>[0-9]+\) to \()[0-9]+:").unwrap()
|
||||
});
|
||||
let coverage =
|
||||
MCDC_DECISION_LINE_NUMBER_RE.replace_all(&coverage, "${prefix}LL:${middle}LL:");
|
||||
|
||||
// ` | Condition C1 --> (1:` => ` | Condition C1 --> (LL:`
|
||||
static MCDC_CONDITION_LINE_NUMBER_RE: Lazy<Regex> = Lazy::new(|| {
|
||||
Regex::new(r"(?m:^)(?<prefix>(?: \|)+ Condition C[0-9]+ --> \()[0-9]+:").unwrap()
|
||||
});
|
||||
let coverage = MCDC_CONDITION_LINE_NUMBER_RE.replace_all(&coverage, "${prefix}LL:");
|
||||
|
||||
coverage.into_owned()
|
||||
}
|
||||
|
||||
|
@ -50,72 +50,68 @@ fn normalize_platform_differences() {
|
||||
}
|
||||
|
||||
/// Test for anonymizing line numbers in coverage reports, especially for
|
||||
/// branch regions.
|
||||
/// MC/DC regions.
|
||||
///
|
||||
/// FIXME(#119681): This test can be removed when we have examples of branch
|
||||
/// FIXME(#123409): This test can be removed when we have examples of MC/DC
|
||||
/// coverage in the actual coverage test suite.
|
||||
#[test]
|
||||
fn anonymize_coverage_line_numbers() {
|
||||
let anon = |coverage| TestCx::anonymize_coverage_line_numbers(coverage);
|
||||
|
||||
let input = r#"
|
||||
6| 3|fn print_size<T>() {
|
||||
7| 3| if std::mem::size_of::<T>() > 4 {
|
||||
7| 2|fn mcdc_check_neither(a: bool, b: bool) {
|
||||
8| 2| if a && b {
|
||||
^0
|
||||
------------------
|
||||
| Branch (7:8): [True: 0, False: 1]
|
||||
| Branch (7:8): [True: 0, False: 1]
|
||||
| Branch (7:8): [True: 1, False: 0]
|
||||
|---> MC/DC Decision Region (8:8) to (8:14)
|
||||
|
|
||||
| Number of Conditions: 2
|
||||
| Condition C1 --> (8:8)
|
||||
| Condition C2 --> (8:13)
|
||||
|
|
||||
| Executed MC/DC Test Vectors:
|
||||
|
|
||||
| C1, C2 Result
|
||||
| 1 { F, - = F }
|
||||
|
|
||||
| C1-Pair: not covered
|
||||
| C2-Pair: not covered
|
||||
| MC/DC Coverage for Decision: 0.00%
|
||||
|
|
||||
------------------
|
||||
8| 1| println!("size > 4");
|
||||
9| 0| say("a and b");
|
||||
10| 2| } else {
|
||||
11| 2| say("not both");
|
||||
12| 2| }
|
||||
13| 2|}
|
||||
"#;
|
||||
|
||||
let expected = r#"
|
||||
LL| 3|fn print_size<T>() {
|
||||
LL| 3| if std::mem::size_of::<T>() > 4 {
|
||||
LL| 2|fn mcdc_check_neither(a: bool, b: bool) {
|
||||
LL| 2| if a && b {
|
||||
^0
|
||||
------------------
|
||||
| Branch (LL:8): [True: 0, False: 1]
|
||||
| Branch (LL:8): [True: 0, False: 1]
|
||||
| Branch (LL:8): [True: 1, False: 0]
|
||||
------------------
|
||||
LL| 1| println!("size > 4");
|
||||
"#;
|
||||
|
||||
assert_eq!(anon(input), expected);
|
||||
|
||||
//////////
|
||||
|
||||
let input = r#"
|
||||
12| 3|}
|
||||
------------------
|
||||
| branch_generics::print_size::<()>:
|
||||
| 6| 1|fn print_size<T>() {
|
||||
| 7| 1| if std::mem::size_of::<T>() > 4 {
|
||||
| ------------------
|
||||
| | Branch (7:8): [True: 0, False: 1]
|
||||
| ------------------
|
||||
| 8| 0| println!("size > 4");
|
||||
| 9| 1| } else {
|
||||
| 10| 1| println!("size <= 4");
|
||||
| 11| 1| }
|
||||
| 12| 1|}
|
||||
------------------
|
||||
"#;
|
||||
|
||||
let expected = r#"
|
||||
LL| 3|}
|
||||
------------------
|
||||
| branch_generics::print_size::<()>:
|
||||
| LL| 1|fn print_size<T>() {
|
||||
| LL| 1| if std::mem::size_of::<T>() > 4 {
|
||||
| ------------------
|
||||
| | Branch (LL:8): [True: 0, False: 1]
|
||||
| ------------------
|
||||
| LL| 0| println!("size > 4");
|
||||
| LL| 1| } else {
|
||||
| LL| 1| println!("size <= 4");
|
||||
| LL| 1| }
|
||||
| LL| 1|}
|
||||
|---> MC/DC Decision Region (LL:8) to (LL:14)
|
||||
|
|
||||
| Number of Conditions: 2
|
||||
| Condition C1 --> (LL:8)
|
||||
| Condition C2 --> (LL:13)
|
||||
|
|
||||
| Executed MC/DC Test Vectors:
|
||||
|
|
||||
| C1, C2 Result
|
||||
| 1 { F, - = F }
|
||||
|
|
||||
| C1-Pair: not covered
|
||||
| C2-Pair: not covered
|
||||
| MC/DC Coverage for Decision: 0.00%
|
||||
|
|
||||
------------------
|
||||
LL| 0| say("a and b");
|
||||
LL| 2| } else {
|
||||
LL| 2| say("not both");
|
||||
LL| 2| }
|
||||
LL| 2|}
|
||||
"#;
|
||||
|
||||
assert_eq!(anon(input), expected);
|
||||
|
@ -70,7 +70,8 @@ pub(crate) fn dump_covfun_mappings(
|
||||
}
|
||||
// If the mapping is a branch region, print both of its arms
|
||||
// in resolved form (even if they aren't expressions).
|
||||
MappingKind::Branch { r#true, r#false } => {
|
||||
MappingKind::Branch { r#true, r#false }
|
||||
| MappingKind::MCDCBranch { r#true, r#false, .. } => {
|
||||
println!(" true = {}", expression_resolver.format_term(r#true));
|
||||
println!(" false = {}", expression_resolver.format_term(r#false));
|
||||
}
|
||||
@ -164,6 +165,26 @@ impl<'a> Parser<'a> {
|
||||
let r#false = self.read_simple_term()?;
|
||||
Ok(MappingKind::Branch { r#true, r#false })
|
||||
}
|
||||
5 => {
|
||||
let bitmap_idx = self.read_uleb128_u32()?;
|
||||
let conditions_num = self.read_uleb128_u32()?;
|
||||
Ok(MappingKind::MCDCDecision { bitmap_idx, conditions_num })
|
||||
}
|
||||
6 => {
|
||||
let r#true = self.read_simple_term()?;
|
||||
let r#false = self.read_simple_term()?;
|
||||
let condition_id = self.read_uleb128_u32()?;
|
||||
let true_next_id = self.read_uleb128_u32()?;
|
||||
let false_next_id = self.read_uleb128_u32()?;
|
||||
Ok(MappingKind::MCDCBranch {
|
||||
r#true,
|
||||
r#false,
|
||||
condition_id,
|
||||
true_next_id,
|
||||
false_next_id,
|
||||
})
|
||||
}
|
||||
|
||||
_ => Err(anyhow!("unknown mapping kind: {raw_mapping_kind:#x}")),
|
||||
}
|
||||
}
|
||||
@ -224,7 +245,28 @@ enum MappingKind {
|
||||
// Using raw identifiers here makes the dump output a little bit nicer
|
||||
// (via the derived Debug), at the expense of making this tool's source
|
||||
// code a little bit uglier.
|
||||
Branch { r#true: CovTerm, r#false: CovTerm },
|
||||
Branch {
|
||||
r#true: CovTerm,
|
||||
r#false: CovTerm,
|
||||
},
|
||||
MCDCBranch {
|
||||
r#true: CovTerm,
|
||||
r#false: CovTerm,
|
||||
// These attributes are printed in Debug but not used directly.
|
||||
#[allow(dead_code)]
|
||||
condition_id: u32,
|
||||
#[allow(dead_code)]
|
||||
true_next_id: u32,
|
||||
#[allow(dead_code)]
|
||||
false_next_id: u32,
|
||||
},
|
||||
MCDCDecision {
|
||||
// These attributes are printed in Debug but not used directly.
|
||||
#[allow(dead_code)]
|
||||
bitmap_idx: u32,
|
||||
#[allow(dead_code)]
|
||||
conditions_num: u32,
|
||||
},
|
||||
}
|
||||
|
||||
struct MappingRegion {
|
||||
|
14
tests/rustdoc/synthetic_auto/supertrait-bounds.rs
Normal file
14
tests/rustdoc/synthetic_auto/supertrait-bounds.rs
Normal file
@ -0,0 +1,14 @@
|
||||
// Check that we don't add bounds to synthetic auto trait impls that are
|
||||
// already implied by the item (like supertrait bounds).
|
||||
|
||||
// In this case we don't want to add the bounds `T: Copy` and `T: 'static`
|
||||
// to the auto trait impl because they're implied by the bound `T: Bound`
|
||||
// on the implementor `Type`.
|
||||
|
||||
pub struct Type<T: Bound>(T);
|
||||
|
||||
// @has supertrait_bounds/struct.Type.html
|
||||
// @has - '//*[@id="synthetic-implementations-list"]//*[@class="impl"]//h3[@class="code-header"]' \
|
||||
// "impl<T> Send for Type<T>where T: Send,"
|
||||
|
||||
pub trait Bound: Copy + 'static {}
|
@ -0,0 +1,27 @@
|
||||
//@ edition: 2021
|
||||
//@ check-pass
|
||||
//@ revisions: current next
|
||||
//@ ignore-compare-mode-next-solver (explicit revisions)
|
||||
//@[next] compile-flags: -Znext-solver
|
||||
|
||||
#![feature(async_closure)]
|
||||
|
||||
fn constrain<T: async FnOnce()>(t: T) -> T {
|
||||
t
|
||||
}
|
||||
|
||||
fn call_once<T>(f: impl FnOnce() -> T) -> T {
|
||||
f()
|
||||
}
|
||||
|
||||
async fn async_call_once<T>(f: impl async FnOnce() -> T) -> T {
|
||||
f().await
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let c = constrain(async || {});
|
||||
call_once(c);
|
||||
|
||||
let c = constrain(async || {});
|
||||
async_call_once(c);
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
//@ edition: 2021
|
||||
//@ check-pass
|
||||
|
||||
#![feature(async_closure)]
|
||||
|
||||
pub struct Struct {
|
||||
pub path: String,
|
||||
}
|
||||
|
||||
// In `upvar.rs`, `truncate_capture_for_optimization` means that we don't actually
|
||||
// capture `&(*s.path)` here, but instead just `&(*s)`, but ONLY when the upvar is
|
||||
// immutable. This means that the assumption we have in `ByMoveBody` pass is wrong.
|
||||
pub fn test(s: &Struct) {
|
||||
let c = async move || { let path = &s.path; };
|
||||
}
|
||||
|
||||
fn main() {}
|
20
tests/ui/lint/non-local-defs/cargo-update.rs
Normal file
20
tests/ui/lint/non-local-defs/cargo-update.rs
Normal file
@ -0,0 +1,20 @@
|
||||
//@ check-pass
|
||||
//@ edition:2021
|
||||
//@ aux-build:non_local_macro.rs
|
||||
//
|
||||
// To suggest any Cargo specific help/note rustc wants
|
||||
// the `CARGO_CRATE_NAME` env to be set, so we set it
|
||||
//@ rustc-env:CARGO_CRATE_NAME=non_local_def
|
||||
//
|
||||
// and since we specifically want to check the presence
|
||||
// of the `cargo update` suggestion we assert it here.
|
||||
//@ error-pattern: `cargo update -p non_local_macro`
|
||||
|
||||
extern crate non_local_macro;
|
||||
|
||||
struct LocalStruct;
|
||||
|
||||
non_local_macro::non_local_impl!(LocalStruct);
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
fn main() {}
|
16
tests/ui/lint/non-local-defs/cargo-update.stderr
Normal file
16
tests/ui/lint/non-local-defs/cargo-update.stderr
Normal file
@ -0,0 +1,16 @@
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/cargo-update.rs:17:1
|
||||
|
|
||||
LL | non_local_macro::non_local_impl!(LocalStruct);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current constant `_IMPL_DEBUG`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
= note: the macro `non_local_macro::non_local_impl` may come from an old version of the `non_local_macro` crate, try updating your dependency with `cargo update -p non_local_macro`
|
||||
= note: `#[warn(non_local_definitions)]` on by default
|
||||
= note: this warning originates in the macro `non_local_macro::non_local_impl` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
warning: 1 warning emitted
|
||||
|
88
tests/ui/lint/non-local-defs/consts.rs
Normal file
88
tests/ui/lint/non-local-defs/consts.rs
Normal file
@ -0,0 +1,88 @@
|
||||
//@ check-pass
|
||||
//@ edition:2021
|
||||
//@ rustc-env:CARGO_CRATE_NAME=non_local_def
|
||||
|
||||
#![feature(inline_const)]
|
||||
|
||||
struct Test;
|
||||
|
||||
trait Uto {}
|
||||
const Z: () = {
|
||||
trait Uto1 {}
|
||||
|
||||
impl Uto1 for Test {} // the trait is local, don't lint
|
||||
|
||||
impl Uto for &Test {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
};
|
||||
|
||||
trait Ano {}
|
||||
const _: () = {
|
||||
impl Ano for &Test {} // ignored since the parent is an anon-const
|
||||
};
|
||||
|
||||
trait Uto2 {}
|
||||
static A: u32 = {
|
||||
impl Uto2 for Test {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
1
|
||||
};
|
||||
|
||||
trait Uto3 {}
|
||||
const B: u32 = {
|
||||
impl Uto3 for Test {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
trait Uto4 {}
|
||||
impl Uto4 for Test {}
|
||||
|
||||
1
|
||||
};
|
||||
|
||||
trait Uto5 {}
|
||||
fn main() {
|
||||
impl Test {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn foo() {}
|
||||
}
|
||||
|
||||
|
||||
const {
|
||||
impl Test {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn hoo() {}
|
||||
}
|
||||
|
||||
1
|
||||
};
|
||||
|
||||
const _: u32 = {
|
||||
impl Test {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn foo2() {}
|
||||
}
|
||||
|
||||
1
|
||||
};
|
||||
}
|
||||
|
||||
trait Uto9 {}
|
||||
trait Uto10 {}
|
||||
const _: u32 = {
|
||||
let _a = || {
|
||||
impl Uto9 for Test {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
1
|
||||
};
|
||||
|
||||
type A = [u32; {
|
||||
impl Uto10 for Test {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
1
|
||||
}];
|
||||
|
||||
1
|
||||
};
|
103
tests/ui/lint/non-local-defs/consts.stderr
Normal file
103
tests/ui/lint/non-local-defs/consts.stderr
Normal file
@ -0,0 +1,103 @@
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/consts.rs:15:5
|
||||
|
|
||||
LL | const Z: () = {
|
||||
| - help: use a const-anon item to suppress this lint: `_`
|
||||
...
|
||||
LL | impl Uto for &Test {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current constant `Z`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
= note: `#[warn(non_local_definitions)]` on by default
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/consts.rs:26:5
|
||||
|
|
||||
LL | impl Uto2 for Test {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current static `A`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/consts.rs:34:5
|
||||
|
|
||||
LL | impl Uto3 for Test {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current constant `B`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/consts.rs:45:5
|
||||
|
|
||||
LL | / impl Test {
|
||||
LL | |
|
||||
LL | | fn foo() {}
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/consts.rs:52:9
|
||||
|
|
||||
LL | / impl Test {
|
||||
LL | |
|
||||
LL | | fn hoo() {}
|
||||
LL | | }
|
||||
| |_________^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current inline constant `<unnameable>` and up 2 bodies
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/consts.rs:61:9
|
||||
|
|
||||
LL | / impl Test {
|
||||
LL | |
|
||||
LL | | fn foo2() {}
|
||||
LL | | }
|
||||
| |_________^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current constant `_` and up 2 bodies
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/consts.rs:74:9
|
||||
|
|
||||
LL | impl Uto9 for Test {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current closure `<unnameable>` and up 2 bodies
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/consts.rs:81:9
|
||||
|
|
||||
LL | impl Uto10 for Test {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current constant expression `<unnameable>` and up 2 bodies
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: 8 warnings emitted
|
||||
|
48
tests/ui/lint/non-local-defs/exhaustive-trait.rs
Normal file
48
tests/ui/lint/non-local-defs/exhaustive-trait.rs
Normal file
@ -0,0 +1,48 @@
|
||||
//@ check-pass
|
||||
//@ edition:2021
|
||||
|
||||
struct Dog;
|
||||
|
||||
fn main() {
|
||||
impl PartialEq<()> for Dog {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn eq(&self, _: &()) -> bool {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
impl PartialEq<()> for &Dog {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn eq(&self, _: &()) -> bool {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
impl PartialEq<Dog> for () {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn eq(&self, _: &Dog) -> bool {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
impl PartialEq<&Dog> for () {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn eq(&self, _: &&Dog) -> bool {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
impl PartialEq<Dog> for &Dog {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn eq(&self, _: &Dog) -> bool {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
impl PartialEq<&Dog> for &Dog {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn eq(&self, _: &&Dog) -> bool {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
}
|
99
tests/ui/lint/non-local-defs/exhaustive-trait.stderr
Normal file
99
tests/ui/lint/non-local-defs/exhaustive-trait.stderr
Normal file
@ -0,0 +1,99 @@
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/exhaustive-trait.rs:7:5
|
||||
|
|
||||
LL | / impl PartialEq<()> for Dog {
|
||||
LL | |
|
||||
LL | | fn eq(&self, _: &()) -> bool {
|
||||
LL | | todo!()
|
||||
LL | | }
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
= note: `#[warn(non_local_definitions)]` on by default
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/exhaustive-trait.rs:14:5
|
||||
|
|
||||
LL | / impl PartialEq<()> for &Dog {
|
||||
LL | |
|
||||
LL | | fn eq(&self, _: &()) -> bool {
|
||||
LL | | todo!()
|
||||
LL | | }
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/exhaustive-trait.rs:21:5
|
||||
|
|
||||
LL | / impl PartialEq<Dog> for () {
|
||||
LL | |
|
||||
LL | | fn eq(&self, _: &Dog) -> bool {
|
||||
LL | | todo!()
|
||||
LL | | }
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/exhaustive-trait.rs:28:5
|
||||
|
|
||||
LL | / impl PartialEq<&Dog> for () {
|
||||
LL | |
|
||||
LL | | fn eq(&self, _: &&Dog) -> bool {
|
||||
LL | | todo!()
|
||||
LL | | }
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/exhaustive-trait.rs:35:5
|
||||
|
|
||||
LL | / impl PartialEq<Dog> for &Dog {
|
||||
LL | |
|
||||
LL | | fn eq(&self, _: &Dog) -> bool {
|
||||
LL | | todo!()
|
||||
LL | | }
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/exhaustive-trait.rs:42:5
|
||||
|
|
||||
LL | / impl PartialEq<&Dog> for &Dog {
|
||||
LL | |
|
||||
LL | | fn eq(&self, _: &&Dog) -> bool {
|
||||
LL | | todo!()
|
||||
LL | | }
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: 6 warnings emitted
|
||||
|
84
tests/ui/lint/non-local-defs/exhaustive.rs
Normal file
84
tests/ui/lint/non-local-defs/exhaustive.rs
Normal file
@ -0,0 +1,84 @@
|
||||
//@ check-pass
|
||||
//@ edition:2021
|
||||
|
||||
use std::fmt::Display;
|
||||
|
||||
trait Trait {}
|
||||
struct Test;
|
||||
|
||||
fn main() {
|
||||
impl Test {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn foo() {}
|
||||
}
|
||||
|
||||
impl Display for Test {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn fmt(&self, _f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
impl dyn Trait {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
impl<T: Trait> Trait for Vec<T> { }
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
impl Trait for &dyn Trait {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
impl Trait for *mut Test {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
impl Trait for *mut [Test] {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
impl Trait for [Test; 8] {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
impl Trait for (Test,) {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
impl Trait for fn(Test) -> () {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
impl Trait for fn() -> Test {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
let _a = || {
|
||||
impl Trait for Test {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
1
|
||||
};
|
||||
|
||||
struct InsideMain;
|
||||
|
||||
impl Trait for *mut InsideMain {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
impl Trait for *mut [InsideMain] {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
impl Trait for [InsideMain; 8] {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
impl Trait for (InsideMain,) {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
impl Trait for fn(InsideMain) -> () {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
impl Trait for fn() -> InsideMain {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
fn inside_inside() {
|
||||
impl Display for InsideMain {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn fmt(&self, _f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
impl InsideMain {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn bar() {}
|
||||
}
|
||||
}
|
||||
}
|
239
tests/ui/lint/non-local-defs/exhaustive.stderr
Normal file
239
tests/ui/lint/non-local-defs/exhaustive.stderr
Normal file
@ -0,0 +1,239 @@
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/exhaustive.rs:10:5
|
||||
|
|
||||
LL | / impl Test {
|
||||
LL | |
|
||||
LL | | fn foo() {}
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
= note: `#[warn(non_local_definitions)]` on by default
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/exhaustive.rs:15:5
|
||||
|
|
||||
LL | / impl Display for Test {
|
||||
LL | |
|
||||
LL | | fn fmt(&self, _f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
LL | | todo!()
|
||||
LL | | }
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/exhaustive.rs:22:5
|
||||
|
|
||||
LL | impl dyn Trait {}
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/exhaustive.rs:25:5
|
||||
|
|
||||
LL | impl<T: Trait> Trait for Vec<T> { }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/exhaustive.rs:28:5
|
||||
|
|
||||
LL | impl Trait for &dyn Trait {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/exhaustive.rs:31:5
|
||||
|
|
||||
LL | impl Trait for *mut Test {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/exhaustive.rs:34:5
|
||||
|
|
||||
LL | impl Trait for *mut [Test] {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/exhaustive.rs:37:5
|
||||
|
|
||||
LL | impl Trait for [Test; 8] {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/exhaustive.rs:40:5
|
||||
|
|
||||
LL | impl Trait for (Test,) {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/exhaustive.rs:43:5
|
||||
|
|
||||
LL | impl Trait for fn(Test) -> () {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/exhaustive.rs:46:5
|
||||
|
|
||||
LL | impl Trait for fn() -> Test {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/exhaustive.rs:50:9
|
||||
|
|
||||
LL | impl Trait for Test {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current closure `<unnameable>` and up 2 bodies
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/exhaustive.rs:58:5
|
||||
|
|
||||
LL | impl Trait for *mut InsideMain {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/exhaustive.rs:60:5
|
||||
|
|
||||
LL | impl Trait for *mut [InsideMain] {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/exhaustive.rs:62:5
|
||||
|
|
||||
LL | impl Trait for [InsideMain; 8] {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/exhaustive.rs:64:5
|
||||
|
|
||||
LL | impl Trait for (InsideMain,) {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/exhaustive.rs:66:5
|
||||
|
|
||||
LL | impl Trait for fn(InsideMain) -> () {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/exhaustive.rs:68:5
|
||||
|
|
||||
LL | impl Trait for fn() -> InsideMain {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/exhaustive.rs:72:9
|
||||
|
|
||||
LL | / impl Display for InsideMain {
|
||||
LL | |
|
||||
LL | | fn fmt(&self, _f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
LL | | todo!()
|
||||
LL | | }
|
||||
LL | | }
|
||||
| |_________^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `inside_inside` and up 2 bodies
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/exhaustive.rs:79:9
|
||||
|
|
||||
LL | / impl InsideMain {
|
||||
LL | |
|
||||
LL | | fn bar() {}
|
||||
LL | | }
|
||||
| |_________^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `inside_inside` and up 2 bodies
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: 20 warnings emitted
|
||||
|
103
tests/ui/lint/non-local-defs/from-local-for-global.rs
Normal file
103
tests/ui/lint/non-local-defs/from-local-for-global.rs
Normal file
@ -0,0 +1,103 @@
|
||||
//@ check-pass
|
||||
//@ edition:2021
|
||||
|
||||
#![feature(inline_const)]
|
||||
|
||||
struct Cat;
|
||||
struct Wrap<T>(T);
|
||||
|
||||
fn main() {
|
||||
impl From<Cat> for () {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn from(_: Cat) -> () {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
struct Elephant;
|
||||
|
||||
impl From<Wrap<Wrap<Elephant>>> for () {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn from(_: Wrap<Wrap<Elephant>>) -> Self {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub trait StillNonLocal {}
|
||||
|
||||
impl StillNonLocal for &str {}
|
||||
|
||||
fn only_global() {
|
||||
struct Foo;
|
||||
impl StillNonLocal for &Foo {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
}
|
||||
|
||||
struct GlobalSameFunction;
|
||||
|
||||
fn same_function() {
|
||||
struct Local1(GlobalSameFunction);
|
||||
impl From<Local1> for GlobalSameFunction {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn from(x: Local1) -> GlobalSameFunction {
|
||||
x.0
|
||||
}
|
||||
}
|
||||
|
||||
struct Local2(GlobalSameFunction);
|
||||
impl From<Local2> for GlobalSameFunction {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn from(x: Local2) -> GlobalSameFunction {
|
||||
x.0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct GlobalDifferentFunction;
|
||||
|
||||
fn diff_function_1() {
|
||||
struct Local(GlobalDifferentFunction);
|
||||
|
||||
impl From<Local> for GlobalDifferentFunction {
|
||||
// FIXME(Urgau): Should warn but doesn't since we currently consider
|
||||
// the other impl to be "global", but that's not the case for the type-system
|
||||
fn from(x: Local) -> GlobalDifferentFunction {
|
||||
x.0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn diff_function_2() {
|
||||
struct Local(GlobalDifferentFunction);
|
||||
|
||||
impl From<Local> for GlobalDifferentFunction {
|
||||
// FIXME(Urgau): Should warn but doesn't since we currently consider
|
||||
// the other impl to be "global", but that's not the case for the type-system
|
||||
fn from(x: Local) -> GlobalDifferentFunction {
|
||||
x.0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// https://github.com/rust-lang/rust/issues/121621#issuecomment-1976826895
|
||||
fn commonly_reported() {
|
||||
struct Local(u8);
|
||||
impl From<Local> for u8 {
|
||||
fn from(x: Local) -> u8 {
|
||||
x.0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// https://github.com/rust-lang/rust/issues/121621#issue-2153187542
|
||||
pub trait Serde {}
|
||||
|
||||
impl Serde for &[u8] {}
|
||||
impl Serde for &str {}
|
||||
|
||||
fn serde() {
|
||||
struct Thing;
|
||||
impl Serde for &Thing {}
|
||||
}
|
78
tests/ui/lint/non-local-defs/from-local-for-global.stderr
Normal file
78
tests/ui/lint/non-local-defs/from-local-for-global.stderr
Normal file
@ -0,0 +1,78 @@
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/from-local-for-global.rs:10:5
|
||||
|
|
||||
LL | / impl From<Cat> for () {
|
||||
LL | |
|
||||
LL | | fn from(_: Cat) -> () {
|
||||
LL | | todo!()
|
||||
LL | | }
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
= note: `#[warn(non_local_definitions)]` on by default
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/from-local-for-global.rs:20:5
|
||||
|
|
||||
LL | / impl From<Wrap<Wrap<Elephant>>> for () {
|
||||
LL | |
|
||||
LL | | fn from(_: Wrap<Wrap<Elephant>>) -> Self {
|
||||
LL | | todo!()
|
||||
LL | | }
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/from-local-for-global.rs:34:5
|
||||
|
|
||||
LL | impl StillNonLocal for &Foo {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `only_global`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/from-local-for-global.rs:42:5
|
||||
|
|
||||
LL | / impl From<Local1> for GlobalSameFunction {
|
||||
LL | |
|
||||
LL | | fn from(x: Local1) -> GlobalSameFunction {
|
||||
LL | | x.0
|
||||
LL | | }
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `same_function`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/from-local-for-global.rs:50:5
|
||||
|
|
||||
LL | / impl From<Local2> for GlobalSameFunction {
|
||||
LL | |
|
||||
LL | | fn from(x: Local2) -> GlobalSameFunction {
|
||||
LL | | x.0
|
||||
LL | | }
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `same_function`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: 5 warnings emitted
|
||||
|
88
tests/ui/lint/non-local-defs/generics.rs
Normal file
88
tests/ui/lint/non-local-defs/generics.rs
Normal file
@ -0,0 +1,88 @@
|
||||
//@ check-pass
|
||||
//@ edition:2021
|
||||
|
||||
trait Global {}
|
||||
|
||||
fn main() {
|
||||
trait Local {};
|
||||
|
||||
impl<T: Local> Global for Vec<T> { }
|
||||
//~^ WARN non-local `impl` definition
|
||||
}
|
||||
|
||||
trait Uto7 {}
|
||||
trait Uto8 {}
|
||||
|
||||
struct Test;
|
||||
|
||||
fn bad() {
|
||||
struct Local;
|
||||
impl Uto7 for Test where Local: std::any::Any {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
impl<T> Uto8 for T {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
}
|
||||
|
||||
struct UwU<T>(T);
|
||||
|
||||
fn fun() {
|
||||
#[derive(Debug)]
|
||||
struct OwO;
|
||||
impl Default for UwU<OwO> {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn default() -> Self {
|
||||
UwU(OwO)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn meow() {
|
||||
#[derive(Debug)]
|
||||
struct Cat;
|
||||
impl AsRef<Cat> for () {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn as_ref(&self) -> &Cat { &Cat }
|
||||
}
|
||||
}
|
||||
|
||||
struct G;
|
||||
|
||||
fn fun2() {
|
||||
#[derive(Debug, Default)]
|
||||
struct B;
|
||||
impl PartialEq<B> for G {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn eq(&self, _: &B) -> bool {
|
||||
true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct Wrap<T>(T);
|
||||
|
||||
impl Wrap<Wrap<Wrap<()>>> {}
|
||||
|
||||
fn rawr() {
|
||||
struct Lion;
|
||||
|
||||
impl From<Wrap<Wrap<Lion>>> for () {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn from(_: Wrap<Wrap<Lion>>) -> Self {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
impl From<()> for Wrap<Lion> {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn from(_: ()) -> Self {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn side_effects() {
|
||||
dbg!(().as_ref()); // prints `Cat`
|
||||
dbg!(UwU::default().0);
|
||||
let _ = G::eq(&G, dbg!(&<_>::default()));
|
||||
}
|
114
tests/ui/lint/non-local-defs/generics.stderr
Normal file
114
tests/ui/lint/non-local-defs/generics.stderr
Normal file
@ -0,0 +1,114 @@
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/generics.rs:9:5
|
||||
|
|
||||
LL | impl<T: Local> Global for Vec<T> { }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
= note: `#[warn(non_local_definitions)]` on by default
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/generics.rs:20:5
|
||||
|
|
||||
LL | impl Uto7 for Test where Local: std::any::Any {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `bad`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/generics.rs:23:5
|
||||
|
|
||||
LL | impl<T> Uto8 for T {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `bad`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/generics.rs:32:5
|
||||
|
|
||||
LL | / impl Default for UwU<OwO> {
|
||||
LL | |
|
||||
LL | | fn default() -> Self {
|
||||
LL | | UwU(OwO)
|
||||
LL | | }
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `fun`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/generics.rs:43:5
|
||||
|
|
||||
LL | / impl AsRef<Cat> for () {
|
||||
LL | |
|
||||
LL | | fn as_ref(&self) -> &Cat { &Cat }
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `meow`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/generics.rs:54:5
|
||||
|
|
||||
LL | / impl PartialEq<B> for G {
|
||||
LL | |
|
||||
LL | | fn eq(&self, _: &B) -> bool {
|
||||
LL | | true
|
||||
LL | | }
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `fun2`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/generics.rs:69:5
|
||||
|
|
||||
LL | / impl From<Wrap<Wrap<Lion>>> for () {
|
||||
LL | |
|
||||
LL | | fn from(_: Wrap<Wrap<Lion>>) -> Self {
|
||||
LL | | todo!()
|
||||
LL | | }
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `rawr`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/generics.rs:76:5
|
||||
|
|
||||
LL | / impl From<()> for Wrap<Lion> {
|
||||
LL | |
|
||||
LL | | fn from(_: ()) -> Self {
|
||||
LL | | todo!()
|
||||
LL | | }
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `rawr`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: 8 warnings emitted
|
||||
|
17
tests/ui/lint/non-local-defs/inside-macro_rules.rs
Normal file
17
tests/ui/lint/non-local-defs/inside-macro_rules.rs
Normal file
@ -0,0 +1,17 @@
|
||||
//@ check-pass
|
||||
//@ edition:2021
|
||||
|
||||
macro_rules! m {
|
||||
() => {
|
||||
trait MacroTrait {}
|
||||
struct OutsideStruct;
|
||||
fn my_func() {
|
||||
impl MacroTrait for OutsideStruct {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
m!();
|
||||
|
||||
fn main() {}
|
18
tests/ui/lint/non-local-defs/inside-macro_rules.stderr
Normal file
18
tests/ui/lint/non-local-defs/inside-macro_rules.stderr
Normal file
@ -0,0 +1,18 @@
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/inside-macro_rules.rs:9:13
|
||||
|
|
||||
LL | impl MacroTrait for OutsideStruct {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
...
|
||||
LL | m!();
|
||||
| ---- in this macro invocation
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `my_func`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
= note: `#[warn(non_local_definitions)]` on by default
|
||||
= note: this warning originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
warning: 1 warning emitted
|
||||
|
53
tests/ui/lint/non-local-defs/local.rs
Normal file
53
tests/ui/lint/non-local-defs/local.rs
Normal file
@ -0,0 +1,53 @@
|
||||
//@ check-pass
|
||||
//@ edition:2021
|
||||
|
||||
use std::fmt::Debug;
|
||||
|
||||
trait GlobalTrait {}
|
||||
|
||||
fn main() {
|
||||
struct InsideMain;
|
||||
|
||||
impl InsideMain {
|
||||
fn foo() {}
|
||||
}
|
||||
|
||||
impl GlobalTrait for InsideMain {}
|
||||
|
||||
impl Debug for InsideMain {
|
||||
fn fmt(&self, _f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
impl PartialEq<()> for InsideMain {
|
||||
fn eq(&self, _: &()) -> bool {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn dyn_weirdness() {
|
||||
trait LocalTrait {}
|
||||
impl dyn LocalTrait {}
|
||||
impl GlobalTrait for dyn LocalTrait {}
|
||||
}
|
||||
|
||||
struct Test;
|
||||
mod do_not_lint_mod {
|
||||
pub trait Tait {}
|
||||
|
||||
impl super::Test {
|
||||
fn hugo() {}
|
||||
}
|
||||
|
||||
impl Tait for super::Test {}
|
||||
}
|
||||
|
||||
fn bitflags() {
|
||||
struct Flags;
|
||||
|
||||
const _: () = {
|
||||
impl Flags {}
|
||||
};
|
||||
}
|
33
tests/ui/lint/non-local-defs/macro_rules.rs
Normal file
33
tests/ui/lint/non-local-defs/macro_rules.rs
Normal file
@ -0,0 +1,33 @@
|
||||
//@ check-pass
|
||||
//@ edition:2021
|
||||
//@ aux-build:non_local_macro.rs
|
||||
//@ rustc-env:CARGO_CRATE_NAME=non_local_def
|
||||
|
||||
extern crate non_local_macro;
|
||||
|
||||
const B: u32 = {
|
||||
#[macro_export]
|
||||
macro_rules! m0 { () => { } };
|
||||
//~^ WARN non-local `macro_rules!` definition
|
||||
|
||||
1
|
||||
};
|
||||
|
||||
non_local_macro::non_local_macro_rules!(my_macro);
|
||||
//~^ WARN non-local `macro_rules!` definition
|
||||
|
||||
fn main() {
|
||||
#[macro_export]
|
||||
macro_rules! m { () => { } };
|
||||
//~^ WARN non-local `macro_rules!` definition
|
||||
|
||||
struct InsideMain;
|
||||
|
||||
impl InsideMain {
|
||||
fn bar() {
|
||||
#[macro_export]
|
||||
macro_rules! m2 { () => { } };
|
||||
//~^ WARN non-local `macro_rules!` definition
|
||||
}
|
||||
}
|
||||
}
|
49
tests/ui/lint/non-local-defs/macro_rules.stderr
Normal file
49
tests/ui/lint/non-local-defs/macro_rules.stderr
Normal file
@ -0,0 +1,49 @@
|
||||
warning: non-local `macro_rules!` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/macro_rules.rs:10:5
|
||||
|
|
||||
LL | macro_rules! m0 { () => { } };
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: remove the `#[macro_export]` or move this `macro_rules!` outside the of the current constant `B`
|
||||
= note: a `macro_rules!` definition is non-local if it is nested inside an item and has a `#[macro_export]` attribute
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
= note: `#[warn(non_local_definitions)]` on by default
|
||||
|
||||
warning: non-local `macro_rules!` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/macro_rules.rs:16:1
|
||||
|
|
||||
LL | non_local_macro::non_local_macro_rules!(my_macro);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: remove the `#[macro_export]` or move this `macro_rules!` outside the of the current constant `_MACRO_EXPORT`
|
||||
= note: a `macro_rules!` definition is non-local if it is nested inside an item and has a `#[macro_export]` attribute
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
= note: the macro `non_local_macro::non_local_macro_rules` may come from an old version of the `non_local_macro` crate, try updating your dependency with `cargo update -p non_local_macro`
|
||||
= note: this warning originates in the macro `non_local_macro::non_local_macro_rules` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
warning: non-local `macro_rules!` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/macro_rules.rs:21:5
|
||||
|
|
||||
LL | macro_rules! m { () => { } };
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: remove the `#[macro_export]` or move this `macro_rules!` outside the of the current function `main`
|
||||
= note: a `macro_rules!` definition is non-local if it is nested inside an item and has a `#[macro_export]` attribute
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `macro_rules!` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/macro_rules.rs:29:13
|
||||
|
|
||||
LL | macro_rules! m2 { () => { } };
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: remove the `#[macro_export]` or move this `macro_rules!` outside the of the current associated function `bar` and up 2 bodies
|
||||
= note: a `macro_rules!` definition is non-local if it is nested inside an item and has a `#[macro_export]` attribute
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: 4 warnings emitted
|
||||
|
53
tests/ui/lint/non-local-defs/weird-exprs.rs
Normal file
53
tests/ui/lint/non-local-defs/weird-exprs.rs
Normal file
@ -0,0 +1,53 @@
|
||||
//@ check-pass
|
||||
//@ edition:2021
|
||||
|
||||
trait Uto {}
|
||||
struct Test;
|
||||
|
||||
type A = [u32; {
|
||||
impl Uto for *mut Test {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
1
|
||||
}];
|
||||
|
||||
enum Enum {
|
||||
Discr = {
|
||||
impl Uto for Test {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
1
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let _array = [0i32; {
|
||||
impl Test {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn bar() {}
|
||||
}
|
||||
|
||||
1
|
||||
}];
|
||||
|
||||
type A = [u32; {
|
||||
impl Uto for &Test {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
1
|
||||
}];
|
||||
|
||||
fn a(_: [u32; {
|
||||
impl Uto for &(Test,) {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
1
|
||||
}]) {}
|
||||
|
||||
fn b() -> [u32; {
|
||||
impl Uto for &(Test,Test) {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
1
|
||||
}] { todo!() }
|
||||
}
|
72
tests/ui/lint/non-local-defs/weird-exprs.stderr
Normal file
72
tests/ui/lint/non-local-defs/weird-exprs.stderr
Normal file
@ -0,0 +1,72 @@
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/weird-exprs.rs:8:5
|
||||
|
|
||||
LL | impl Uto for *mut Test {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current constant expression `<unnameable>`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
= note: `#[warn(non_local_definitions)]` on by default
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/weird-exprs.rs:16:9
|
||||
|
|
||||
LL | impl Uto for Test {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current constant expression `<unnameable>`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/weird-exprs.rs:25:9
|
||||
|
|
||||
LL | / impl Test {
|
||||
LL | |
|
||||
LL | | fn bar() {}
|
||||
LL | | }
|
||||
| |_________^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current constant expression `<unnameable>` and up 2 bodies
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/weird-exprs.rs:34:9
|
||||
|
|
||||
LL | impl Uto for &Test {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current constant expression `<unnameable>` and up 2 bodies
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/weird-exprs.rs:41:9
|
||||
|
|
||||
LL | impl Uto for &(Test,) {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current constant expression `<unnameable>` and up 2 bodies
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/weird-exprs.rs:48:9
|
||||
|
|
||||
LL | impl Uto for &(Test,Test) {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current constant expression `<unnameable>` and up 2 bodies
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: 6 warnings emitted
|
||||
|
@ -1,491 +0,0 @@
|
||||
//@ check-pass
|
||||
//@ edition:2021
|
||||
//@ aux-build:non_local_macro.rs
|
||||
//@ rustc-env:CARGO_CRATE_NAME=non_local_def
|
||||
|
||||
#![feature(inline_const)]
|
||||
|
||||
extern crate non_local_macro;
|
||||
|
||||
use std::fmt::{Debug, Display};
|
||||
|
||||
struct Test;
|
||||
|
||||
impl Debug for Test {
|
||||
fn fmt(&self, _f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
mod do_not_lint_mod {
|
||||
pub trait Tait {}
|
||||
|
||||
impl super::Test {
|
||||
fn hugo() {}
|
||||
}
|
||||
|
||||
impl Tait for super::Test {}
|
||||
}
|
||||
|
||||
trait Uto {}
|
||||
const Z: () = {
|
||||
trait Uto1 {}
|
||||
|
||||
impl Uto1 for Test {} // the trait is local, don't lint
|
||||
|
||||
impl Uto for &Test {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
};
|
||||
|
||||
trait Ano {}
|
||||
const _: () = {
|
||||
impl Ano for &Test {} // ignored since the parent is an anon-const
|
||||
};
|
||||
|
||||
type A = [u32; {
|
||||
impl Uto for *mut Test {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
1
|
||||
}];
|
||||
|
||||
enum Enum {
|
||||
Discr = {
|
||||
impl Uto for Test {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
1
|
||||
}
|
||||
}
|
||||
|
||||
trait Uto2 {}
|
||||
static A: u32 = {
|
||||
impl Uto2 for Test {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
1
|
||||
};
|
||||
|
||||
trait Uto3 {}
|
||||
const B: u32 = {
|
||||
impl Uto3 for Test {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! m0 { () => { } };
|
||||
//~^ WARN non-local `macro_rules!` definition
|
||||
|
||||
trait Uto4 {}
|
||||
impl Uto4 for Test {}
|
||||
|
||||
1
|
||||
};
|
||||
|
||||
trait Uto5 {}
|
||||
fn main() {
|
||||
#[macro_export]
|
||||
macro_rules! m { () => { } };
|
||||
//~^ WARN non-local `macro_rules!` definition
|
||||
|
||||
impl Test {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn foo() {}
|
||||
}
|
||||
|
||||
let _array = [0i32; {
|
||||
impl Test {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn bar() {}
|
||||
}
|
||||
|
||||
1
|
||||
}];
|
||||
|
||||
const {
|
||||
impl Test {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn hoo() {}
|
||||
}
|
||||
|
||||
1
|
||||
};
|
||||
|
||||
const _: u32 = {
|
||||
impl Test {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn foo2() {}
|
||||
}
|
||||
|
||||
1
|
||||
};
|
||||
|
||||
impl Display for Test {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn fmt(&self, _f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
impl dyn Uto5 {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
impl<T: Uto5> Uto5 for Vec<T> { }
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
impl Uto5 for &dyn Uto5 {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
impl Uto5 for *mut Test {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
impl Uto5 for *mut [Test] {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
impl Uto5 for [Test; 8] {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
impl Uto5 for (Test,) {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
impl Uto5 for fn(Test) -> () {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
impl Uto5 for fn() -> Test {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
let _a = || {
|
||||
impl Uto5 for Test {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
1
|
||||
};
|
||||
|
||||
type A = [u32; {
|
||||
impl Uto5 for &Test {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
1
|
||||
}];
|
||||
|
||||
fn a(_: [u32; {
|
||||
impl Uto5 for &(Test,) {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
1
|
||||
}]) {}
|
||||
|
||||
fn b() -> [u32; {
|
||||
impl Uto5 for &(Test,Test) {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
1
|
||||
}] { todo!() }
|
||||
|
||||
struct InsideMain;
|
||||
|
||||
impl Uto5 for *mut InsideMain {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
impl Uto5 for *mut [InsideMain] {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
impl Uto5 for [InsideMain; 8] {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
impl Uto5 for (InsideMain,) {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
impl Uto5 for fn(InsideMain) -> () {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
impl Uto5 for fn() -> InsideMain {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
impl Debug for InsideMain {
|
||||
fn fmt(&self, _f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
impl InsideMain {
|
||||
fn foo() {}
|
||||
}
|
||||
|
||||
fn inside_inside() {
|
||||
impl Display for InsideMain {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn fmt(&self, _f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
impl InsideMain {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn bar() {
|
||||
#[macro_export]
|
||||
macro_rules! m2 { () => { } };
|
||||
//~^ WARN non-local `macro_rules!` definition
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
trait Uto6 {}
|
||||
impl dyn Uto6 {}
|
||||
impl Uto5 for dyn Uto6 {}
|
||||
|
||||
impl<T: Uto6> Uto3 for Vec<T> { }
|
||||
//~^ WARN non-local `impl` definition
|
||||
}
|
||||
|
||||
trait Uto7 {}
|
||||
trait Uto8 {}
|
||||
|
||||
fn bad() {
|
||||
struct Local;
|
||||
impl Uto7 for Test where Local: std::any::Any {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
impl<T> Uto8 for T {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
}
|
||||
|
||||
trait Uto9 {}
|
||||
trait Uto10 {}
|
||||
const _: u32 = {
|
||||
let _a = || {
|
||||
impl Uto9 for Test {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
1
|
||||
};
|
||||
|
||||
type A = [u32; {
|
||||
impl Uto10 for Test {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
1
|
||||
}];
|
||||
|
||||
1
|
||||
};
|
||||
|
||||
struct UwU<T>(T);
|
||||
|
||||
fn fun() {
|
||||
#[derive(Debug)]
|
||||
struct OwO;
|
||||
impl Default for UwU<OwO> {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn default() -> Self {
|
||||
UwU(OwO)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct Cat;
|
||||
|
||||
fn meow() {
|
||||
impl From<Cat> for () {
|
||||
fn from(_: Cat) -> () {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
struct Cat;
|
||||
impl AsRef<Cat> for () {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn as_ref(&self) -> &Cat { &Cat }
|
||||
}
|
||||
}
|
||||
|
||||
struct G;
|
||||
|
||||
fn fun2() {
|
||||
#[derive(Debug, Default)]
|
||||
struct B;
|
||||
impl PartialEq<B> for G {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn eq(&self, _: &B) -> bool {
|
||||
true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn side_effects() {
|
||||
dbg!(().as_ref()); // prints `Cat`
|
||||
dbg!(UwU::default().0);
|
||||
let _ = G::eq(&G, dbg!(&<_>::default()));
|
||||
}
|
||||
|
||||
struct Dog;
|
||||
|
||||
fn woof() {
|
||||
impl PartialEq<Dog> for &Dog {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn eq(&self, _: &Dog) -> bool {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
impl PartialEq<()> for Dog {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn eq(&self, _: &()) -> bool {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
impl PartialEq<()> for &Dog {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn eq(&self, _: &()) -> bool {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
impl PartialEq<Dog> for () {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn eq(&self, _: &Dog) -> bool {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
struct Test;
|
||||
impl PartialEq<Dog> for Test {
|
||||
fn eq(&self, _: &Dog) -> bool {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct Wrap<T>(T);
|
||||
|
||||
impl Wrap<Wrap<Wrap<()>>> {}
|
||||
|
||||
fn rawr() {
|
||||
struct Lion;
|
||||
|
||||
impl From<Wrap<Wrap<Lion>>> for () {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn from(_: Wrap<Wrap<Lion>>) -> Self {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
impl From<()> for Wrap<Lion> {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn from(_: ()) -> Self {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
struct Elephant;
|
||||
|
||||
impl From<Wrap<Wrap<Elephant>>> for () {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn from(_: Wrap<Wrap<Elephant>>) -> Self {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub trait StillNonLocal {}
|
||||
|
||||
impl StillNonLocal for &str {}
|
||||
|
||||
fn only_global() {
|
||||
struct Foo;
|
||||
impl StillNonLocal for &Foo {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
}
|
||||
|
||||
struct GlobalSameFunction;
|
||||
|
||||
fn same_function() {
|
||||
struct Local1(GlobalSameFunction);
|
||||
impl From<Local1> for GlobalSameFunction {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn from(x: Local1) -> GlobalSameFunction {
|
||||
x.0
|
||||
}
|
||||
}
|
||||
|
||||
struct Local2(GlobalSameFunction);
|
||||
impl From<Local2> for GlobalSameFunction {
|
||||
//~^ WARN non-local `impl` definition
|
||||
fn from(x: Local2) -> GlobalSameFunction {
|
||||
x.0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct GlobalDifferentFunction;
|
||||
|
||||
fn diff_foo() {
|
||||
struct Local(GlobalDifferentFunction);
|
||||
|
||||
impl From<Local> for GlobalDifferentFunction {
|
||||
// FIXME(Urgau): Should warn but doesn't since we currently consider
|
||||
// the other impl to be "global", but that's not the case for the type-system
|
||||
fn from(x: Local) -> GlobalDifferentFunction {
|
||||
x.0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn diff_bar() {
|
||||
struct Local(GlobalDifferentFunction);
|
||||
|
||||
impl From<Local> for GlobalDifferentFunction {
|
||||
// FIXME(Urgau): Should warn but doesn't since we currently consider
|
||||
// the other impl to be "global", but that's not the case for the type-system
|
||||
fn from(x: Local) -> GlobalDifferentFunction {
|
||||
x.0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
macro_rules! m {
|
||||
() => {
|
||||
trait MacroTrait {}
|
||||
struct OutsideStruct;
|
||||
fn my_func() {
|
||||
impl MacroTrait for OutsideStruct {}
|
||||
//~^ WARN non-local `impl` definition
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
m!();
|
||||
|
||||
struct CargoUpdate;
|
||||
|
||||
non_local_macro::non_local_impl!(CargoUpdate);
|
||||
//~^ WARN non-local `impl` definition
|
||||
|
||||
non_local_macro::non_local_macro_rules!(my_macro);
|
||||
//~^ WARN non-local `macro_rules!` definition
|
||||
|
||||
fn bitflags() {
|
||||
struct Flags;
|
||||
|
||||
const _: () = {
|
||||
impl Flags {}
|
||||
};
|
||||
}
|
||||
|
||||
// https://github.com/rust-lang/rust/issues/121621#issuecomment-1976826895
|
||||
fn commonly_reported() {
|
||||
struct Local(u8);
|
||||
impl From<Local> for u8 {
|
||||
fn from(x: Local) -> u8 {
|
||||
x.0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// https://github.com/rust-lang/rust/issues/121621#issue-2153187542
|
||||
pub trait Serde {}
|
||||
|
||||
impl Serde for &[u8] {}
|
||||
impl Serde for &str {}
|
||||
|
||||
fn serde() {
|
||||
struct Thing;
|
||||
impl Serde for &Thing {}
|
||||
}
|
@ -1,705 +0,0 @@
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:36:5
|
||||
|
|
||||
LL | const Z: () = {
|
||||
| - help: use a const-anon item to suppress this lint: `_`
|
||||
...
|
||||
LL | impl Uto for &Test {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current constant `Z`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
= note: `#[warn(non_local_definitions)]` on by default
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:46:5
|
||||
|
|
||||
LL | impl Uto for *mut Test {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current constant expression `<unnameable>`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:54:9
|
||||
|
|
||||
LL | impl Uto for Test {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current constant expression `<unnameable>`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:63:5
|
||||
|
|
||||
LL | impl Uto2 for Test {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current static `A`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:71:5
|
||||
|
|
||||
LL | impl Uto3 for Test {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current constant `B`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `macro_rules!` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:75:5
|
||||
|
|
||||
LL | macro_rules! m0 { () => { } };
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: remove the `#[macro_export]` or move this `macro_rules!` outside the of the current constant `B`
|
||||
= note: a `macro_rules!` definition is non-local if it is nested inside an item and has a `#[macro_export]` attribute
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `macro_rules!` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:87:5
|
||||
|
|
||||
LL | macro_rules! m { () => { } };
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: remove the `#[macro_export]` or move this `macro_rules!` outside the of the current function `main`
|
||||
= note: a `macro_rules!` definition is non-local if it is nested inside an item and has a `#[macro_export]` attribute
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:90:5
|
||||
|
|
||||
LL | / impl Test {
|
||||
LL | |
|
||||
LL | | fn foo() {}
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:96:9
|
||||
|
|
||||
LL | / impl Test {
|
||||
LL | |
|
||||
LL | | fn bar() {}
|
||||
LL | | }
|
||||
| |_________^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current constant expression `<unnameable>` and up 2 bodies
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:105:9
|
||||
|
|
||||
LL | / impl Test {
|
||||
LL | |
|
||||
LL | | fn hoo() {}
|
||||
LL | | }
|
||||
| |_________^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current inline constant `<unnameable>` and up 2 bodies
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:114:9
|
||||
|
|
||||
LL | / impl Test {
|
||||
LL | |
|
||||
LL | | fn foo2() {}
|
||||
LL | | }
|
||||
| |_________^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current constant `_` and up 2 bodies
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:122:5
|
||||
|
|
||||
LL | / impl Display for Test {
|
||||
LL | |
|
||||
LL | | fn fmt(&self, _f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
LL | | todo!()
|
||||
LL | | }
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:129:5
|
||||
|
|
||||
LL | impl dyn Uto5 {}
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:132:5
|
||||
|
|
||||
LL | impl<T: Uto5> Uto5 for Vec<T> { }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:135:5
|
||||
|
|
||||
LL | impl Uto5 for &dyn Uto5 {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:138:5
|
||||
|
|
||||
LL | impl Uto5 for *mut Test {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:141:5
|
||||
|
|
||||
LL | impl Uto5 for *mut [Test] {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:144:5
|
||||
|
|
||||
LL | impl Uto5 for [Test; 8] {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:147:5
|
||||
|
|
||||
LL | impl Uto5 for (Test,) {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:150:5
|
||||
|
|
||||
LL | impl Uto5 for fn(Test) -> () {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:153:5
|
||||
|
|
||||
LL | impl Uto5 for fn() -> Test {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:157:9
|
||||
|
|
||||
LL | impl Uto5 for Test {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current closure `<unnameable>` and up 2 bodies
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:164:9
|
||||
|
|
||||
LL | impl Uto5 for &Test {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current constant expression `<unnameable>` and up 2 bodies
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:171:9
|
||||
|
|
||||
LL | impl Uto5 for &(Test,) {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current constant expression `<unnameable>` and up 2 bodies
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:178:9
|
||||
|
|
||||
LL | impl Uto5 for &(Test,Test) {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current constant expression `<unnameable>` and up 2 bodies
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:186:5
|
||||
|
|
||||
LL | impl Uto5 for *mut InsideMain {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:188:5
|
||||
|
|
||||
LL | impl Uto5 for *mut [InsideMain] {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:190:5
|
||||
|
|
||||
LL | impl Uto5 for [InsideMain; 8] {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:192:5
|
||||
|
|
||||
LL | impl Uto5 for (InsideMain,) {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:194:5
|
||||
|
|
||||
LL | impl Uto5 for fn(InsideMain) -> () {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:196:5
|
||||
|
|
||||
LL | impl Uto5 for fn() -> InsideMain {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:210:9
|
||||
|
|
||||
LL | / impl Display for InsideMain {
|
||||
LL | |
|
||||
LL | | fn fmt(&self, _f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
LL | | todo!()
|
||||
LL | | }
|
||||
LL | | }
|
||||
| |_________^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `inside_inside` and up 2 bodies
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:217:9
|
||||
|
|
||||
LL | / impl InsideMain {
|
||||
LL | |
|
||||
LL | | fn bar() {
|
||||
LL | | #[macro_export]
|
||||
... |
|
||||
LL | | }
|
||||
LL | | }
|
||||
| |_________^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `inside_inside` and up 2 bodies
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `macro_rules!` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:221:17
|
||||
|
|
||||
LL | macro_rules! m2 { () => { } };
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: remove the `#[macro_export]` or move this `macro_rules!` outside the of the current associated function `bar` and up 3 bodies
|
||||
= note: a `macro_rules!` definition is non-local if it is nested inside an item and has a `#[macro_export]` attribute
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:231:5
|
||||
|
|
||||
LL | impl<T: Uto6> Uto3 for Vec<T> { }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `main`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:240:5
|
||||
|
|
||||
LL | impl Uto7 for Test where Local: std::any::Any {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `bad`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:243:5
|
||||
|
|
||||
LL | impl<T> Uto8 for T {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `bad`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:251:9
|
||||
|
|
||||
LL | impl Uto9 for Test {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current closure `<unnameable>` and up 2 bodies
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:258:9
|
||||
|
|
||||
LL | impl Uto10 for Test {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current constant expression `<unnameable>` and up 2 bodies
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:272:5
|
||||
|
|
||||
LL | / impl Default for UwU<OwO> {
|
||||
LL | |
|
||||
LL | | fn default() -> Self {
|
||||
LL | | UwU(OwO)
|
||||
LL | | }
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `fun`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:291:5
|
||||
|
|
||||
LL | / impl AsRef<Cat> for () {
|
||||
LL | |
|
||||
LL | | fn as_ref(&self) -> &Cat { &Cat }
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `meow`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:302:5
|
||||
|
|
||||
LL | / impl PartialEq<B> for G {
|
||||
LL | |
|
||||
LL | | fn eq(&self, _: &B) -> bool {
|
||||
LL | | true
|
||||
LL | | }
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `fun2`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:319:5
|
||||
|
|
||||
LL | / impl PartialEq<Dog> for &Dog {
|
||||
LL | |
|
||||
LL | | fn eq(&self, _: &Dog) -> bool {
|
||||
LL | | todo!()
|
||||
LL | | }
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `woof`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:326:5
|
||||
|
|
||||
LL | / impl PartialEq<()> for Dog {
|
||||
LL | |
|
||||
LL | | fn eq(&self, _: &()) -> bool {
|
||||
LL | | todo!()
|
||||
LL | | }
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `woof`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:333:5
|
||||
|
|
||||
LL | / impl PartialEq<()> for &Dog {
|
||||
LL | |
|
||||
LL | | fn eq(&self, _: &()) -> bool {
|
||||
LL | | todo!()
|
||||
LL | | }
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `woof`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:340:5
|
||||
|
|
||||
LL | / impl PartialEq<Dog> for () {
|
||||
LL | |
|
||||
LL | | fn eq(&self, _: &Dog) -> bool {
|
||||
LL | | todo!()
|
||||
LL | | }
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `woof`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:362:5
|
||||
|
|
||||
LL | / impl From<Wrap<Wrap<Lion>>> for () {
|
||||
LL | |
|
||||
LL | | fn from(_: Wrap<Wrap<Lion>>) -> Self {
|
||||
LL | | todo!()
|
||||
LL | | }
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `rawr`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:369:5
|
||||
|
|
||||
LL | / impl From<()> for Wrap<Lion> {
|
||||
LL | |
|
||||
LL | | fn from(_: ()) -> Self {
|
||||
LL | | todo!()
|
||||
LL | | }
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `rawr`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:379:5
|
||||
|
|
||||
LL | / impl From<Wrap<Wrap<Elephant>>> for () {
|
||||
LL | |
|
||||
LL | | fn from(_: Wrap<Wrap<Elephant>>) -> Self {
|
||||
LL | | todo!()
|
||||
LL | | }
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `rawr`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:393:5
|
||||
|
|
||||
LL | impl StillNonLocal for &Foo {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `only_global`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:401:5
|
||||
|
|
||||
LL | / impl From<Local1> for GlobalSameFunction {
|
||||
LL | |
|
||||
LL | | fn from(x: Local1) -> GlobalSameFunction {
|
||||
LL | | x.0
|
||||
LL | | }
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `same_function`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:409:5
|
||||
|
|
||||
LL | / impl From<Local2> for GlobalSameFunction {
|
||||
LL | |
|
||||
LL | | fn from(x: Local2) -> GlobalSameFunction {
|
||||
LL | | x.0
|
||||
LL | | }
|
||||
LL | | }
|
||||
| |_____^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `same_function`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:448:13
|
||||
|
|
||||
LL | impl MacroTrait for OutsideStruct {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
...
|
||||
LL | m!();
|
||||
| ---- in this macro invocation
|
||||
|
|
||||
= help: move this `impl` block outside the of the current function `my_func`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
= note: this warning originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
warning: non-local `impl` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:458:1
|
||||
|
|
||||
LL | non_local_macro::non_local_impl!(CargoUpdate);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: move this `impl` block outside the of the current constant `_IMPL_DEBUG`
|
||||
= note: an `impl` definition is non-local if it is nested inside an item and may impact type checking outside of that item. This can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module and anon-const at the same nesting as the trait or type
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
= note: the macro `non_local_macro::non_local_impl` may come from an old version of the `non_local_macro` crate, try updating your dependency with `cargo update -p non_local_macro`
|
||||
= note: this warning originates in the macro `non_local_macro::non_local_impl` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
warning: non-local `macro_rules!` definition, they should be avoided as they go against expectation
|
||||
--> $DIR/non_local_definitions.rs:461:1
|
||||
|
|
||||
LL | non_local_macro::non_local_macro_rules!(my_macro);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: remove the `#[macro_export]` or move this `macro_rules!` outside the of the current constant `_MACRO_EXPORT`
|
||||
= note: a `macro_rules!` definition is non-local if it is nested inside an item and has a `#[macro_export]` attribute
|
||||
= note: one exception to the rule are anon-const (`const _: () = { ... }`) at top-level module
|
||||
= note: this lint may become deny-by-default in the edition 2024 and higher, see the tracking issue <https://github.com/rust-lang/rust/issues/120363>
|
||||
= note: the macro `non_local_macro::non_local_macro_rules` may come from an old version of the `non_local_macro` crate, try updating your dependency with `cargo update -p non_local_macro`
|
||||
= note: this warning originates in the macro `non_local_macro::non_local_macro_rules` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
warning: 55 warnings emitted
|
||||
|
Loading…
Reference in New Issue
Block a user