Stop failing eagerly, and collect all opaque types even if some are erroneous.
This commit is contained in:
parent
326a9fa8e8
commit
41881aece2
3 changed files with 7 additions and 31 deletions
|
@ -1,5 +1,4 @@
|
||||||
use rustc_data_structures::fx::FxHashSet;
|
use rustc_data_structures::fx::FxHashSet;
|
||||||
use rustc_errors::ErrorGuaranteed;
|
|
||||||
use rustc_hir::{def::DefKind, def_id::LocalDefId};
|
use rustc_hir::{def::DefKind, def_id::LocalDefId};
|
||||||
use rustc_middle::query::Providers;
|
use rustc_middle::query::Providers;
|
||||||
use rustc_middle::ty::util::{CheckRegions, NotUniqueParam};
|
use rustc_middle::ty::util::{CheckRegions, NotUniqueParam};
|
||||||
|
@ -65,10 +64,9 @@ impl<'tcx> OpaqueTypeCollector<'tcx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> TypeVisitor<TyCtxt<'tcx>> for OpaqueTypeCollector<'tcx> {
|
impl<'tcx> TypeVisitor<TyCtxt<'tcx>> for OpaqueTypeCollector<'tcx> {
|
||||||
type BreakTy = ErrorGuaranteed;
|
|
||||||
|
|
||||||
#[instrument(skip(self), ret, level = "trace")]
|
#[instrument(skip(self), ret, level = "trace")]
|
||||||
fn visit_ty(&mut self, t: Ty<'tcx>) -> ControlFlow<ErrorGuaranteed> {
|
fn visit_ty(&mut self, t: Ty<'tcx>) -> ControlFlow<!> {
|
||||||
|
t.super_visit_with(self)?;
|
||||||
match t.kind() {
|
match t.kind() {
|
||||||
ty::Alias(ty::Opaque, alias_ty) if alias_ty.def_id.is_local() => {
|
ty::Alias(ty::Opaque, alias_ty) if alias_ty.def_id.is_local() => {
|
||||||
if !self.seen.insert(alias_ty.def_id.expect_local()) {
|
if !self.seen.insert(alias_ty.def_id.expect_local()) {
|
||||||
|
@ -91,24 +89,20 @@ impl<'tcx> TypeVisitor<TyCtxt<'tcx>> for OpaqueTypeCollector<'tcx> {
|
||||||
trace!(?pred);
|
trace!(?pred);
|
||||||
self.visit_spanned(span, pred);
|
self.visit_spanned(span, pred);
|
||||||
}
|
}
|
||||||
|
|
||||||
ControlFlow::Continue(())
|
|
||||||
}
|
}
|
||||||
Err(NotUniqueParam::NotParam(arg)) => {
|
Err(NotUniqueParam::NotParam(arg)) => {
|
||||||
let err = self.tcx.sess.emit_err(NotParam {
|
self.tcx.sess.emit_err(NotParam {
|
||||||
arg,
|
arg,
|
||||||
span: self.span(),
|
span: self.span(),
|
||||||
opaque_span: self.tcx.def_span(alias_ty.def_id),
|
opaque_span: self.tcx.def_span(alias_ty.def_id),
|
||||||
});
|
});
|
||||||
ControlFlow::Break(err)
|
|
||||||
}
|
}
|
||||||
Err(NotUniqueParam::DuplicateParam(arg)) => {
|
Err(NotUniqueParam::DuplicateParam(arg)) => {
|
||||||
let err = self.tcx.sess.emit_err(DuplicateArg {
|
self.tcx.sess.emit_err(DuplicateArg {
|
||||||
arg,
|
arg,
|
||||||
span: self.span(),
|
span: self.span(),
|
||||||
opaque_span: self.tcx.def_span(alias_ty.def_id),
|
opaque_span: self.tcx.def_span(alias_ty.def_id),
|
||||||
});
|
});
|
||||||
ControlFlow::Break(err)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -157,10 +151,10 @@ impl<'tcx> TypeVisitor<TyCtxt<'tcx>> for OpaqueTypeCollector<'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
t.super_visit_with(self)
|
|
||||||
}
|
}
|
||||||
_ => t.super_visit_with(self),
|
_ => {}
|
||||||
}
|
}
|
||||||
|
ControlFlow::Continue(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,6 @@ impl Foo for () {
|
||||||
//~^ ERROR non-defining opaque type use
|
//~^ ERROR non-defining opaque type use
|
||||||
((), ())
|
((), ())
|
||||||
//~^ ERROR mismatched types
|
//~^ ERROR mismatched types
|
||||||
//~| ERROR mismatched types
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,23 +27,6 @@ note: this item must have the opaque type in its signature in order to be able t
|
||||||
LL | fn foo() -> (Self::Bar<u32>, Self::Baz) {
|
LL | fn foo() -> (Self::Bar<u32>, Self::Baz) {
|
||||||
| ^^^
|
| ^^^
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
error: aborting due to 2 previous errors
|
||||||
--> $DIR/multi-error.rs:19:14
|
|
||||||
|
|
|
||||||
LL | type Baz = impl Sized;
|
|
||||||
| ---------- the expected opaque type
|
|
||||||
...
|
|
||||||
LL | ((), ())
|
|
||||||
| ^^ expected opaque type, found `()`
|
|
||||||
|
|
|
||||||
= note: expected opaque type `<() as Foo>::Baz`
|
|
||||||
found unit type `()`
|
|
||||||
note: this item must have the opaque type in its signature in order to be able to register hidden types
|
|
||||||
--> $DIR/multi-error.rs:17:8
|
|
||||||
|
|
|
||||||
LL | fn foo() -> (Self::Bar<u32>, Self::Baz) {
|
|
||||||
| ^^^
|
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0308`.
|
For more information about this error, try `rustc --explain E0308`.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue