Skip to content

Commit

Permalink
Tests, suppress refine lint when errors
Browse files Browse the repository at this point in the history
  • Loading branch information
compiler-errors committed Apr 16, 2024
1 parent bcc488e commit 8ba97b6
Show file tree
Hide file tree
Showing 5 changed files with 75 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ use rustc_infer::infer::{outlives::env::OutlivesEnvironment, TyCtxtInferExt};
use rustc_lint_defs::builtin::{REFINING_IMPL_TRAIT_INTERNAL, REFINING_IMPL_TRAIT_REACHABLE};
use rustc_middle::traits::{ObligationCause, Reveal};
use rustc_middle::ty::{
self, Ty, TyCtxt, TypeFoldable, TypeFolder, TypeSuperVisitable, TypeVisitable, TypeVisitor,
self, Ty, TyCtxt, TypeFoldable, TypeFolder, TypeSuperVisitable, TypeVisitable,
TypeVisitableExt, TypeVisitor,
};
use rustc_span::Span;
use rustc_trait_selection::regions::InferCtxtRegionExt;
Expand Down Expand Up @@ -62,6 +63,10 @@ pub(super) fn check_refining_return_position_impl_trait_in_trait<'tcx>(
return;
};

if hidden_tys.items().any(|(_, &ty)| ty.skip_binder().references_error()) {
return;
}

let mut collector = ImplTraitInTraitCollector { tcx, types: FxIndexSet::default() };
trait_m_sig.visit_with(&mut collector);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#![feature(precise_capturing)]
//~^ WARN the feature `precise_capturing` is incomplete

struct Invariant<'a>(&'a mut &'a mut ());

trait Trait {
fn hello(self_: Invariant<'_>) -> impl use<Self> Sized;
}

impl Trait for () {
fn hello(self_: Invariant<'_>) -> impl use<'_> Sized {}
//~^ return type captures more lifetimes than trait definition
}

fn main() {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
warning: the feature `precise_capturing` is incomplete and may not be safe to use and/or cause compiler crashes
--> $DIR/rpitit-impl-captures-too-much.rs:1:12
|
LL | #![feature(precise_capturing)]
| ^^^^^^^^^^^^^^^^^
|
= note: see issue #123432 <https://github.com/rust-lang/rust/issues/123432> for more information
= note: `#[warn(incomplete_features)]` on by default

error: return type captures more lifetimes than trait definition
--> $DIR/rpitit-impl-captures-too-much.rs:11:39
|
LL | fn hello(self_: Invariant<'_>) -> impl use<'_> Sized {}
| -- ^^^^^^^^^^^^^^^^^^
| |
| this lifetime was captured
|
note: hidden type must only reference lifetimes captured by this impl trait
--> $DIR/rpitit-impl-captures-too-much.rs:7:39
|
LL | fn hello(self_: Invariant<'_>) -> impl use<Self> Sized;
| ^^^^^^^^^^^^^^^^^^^^
= note: hidden type inferred to be `impl Sized`

error: aborting due to 1 previous error; 1 warning emitted

17 changes: 17 additions & 0 deletions tests/ui/impl-trait/precise-capturing/rpitit.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
//@ check-pass

#![feature(precise_capturing)]
//~^ WARN the feature `precise_capturing` is incomplete

struct Invariant<'a>(&'a mut &'a mut ());

trait Trait {
fn hello(self_: Invariant<'_>) -> impl use<Self> Sized;
}

fn eq<'a, 'b, T: Trait>(x: Invariant<'a>, y: Invariant<'b>) {
let mut out = T::hello(x);
out = T::hello(y);
}

fn main() {}
11 changes: 11 additions & 0 deletions tests/ui/impl-trait/precise-capturing/rpitit.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
warning: the feature `precise_capturing` is incomplete and may not be safe to use and/or cause compiler crashes
--> $DIR/rpitit.rs:3:12
|
LL | #![feature(precise_capturing)]
| ^^^^^^^^^^^^^^^^^
|
= note: see issue #123432 <https://github.com/rust-lang/rust/issues/123432> for more information
= note: `#[warn(incomplete_features)]` on by default

warning: 1 warning emitted

0 comments on commit 8ba97b6

Please sign in to comment.